向 AI 查一个 Shell 脚本,结果它先输出三段废话解释什么是 Shell,再给出一堆带注释的错误代码,最后还要礼貌地询问是否满意。这种低效的交互每天都在浪费时间。
根本原因是把 AI 当作了聊天对象,而不是一个执行引擎。
通过引入 Markdown 语法,可以强行将自然语言转化为 伪代码指令。使用 Markdown 结构化提示词后,AI 不再废话,直接吐出可执行的 YAML 配置或脚本,就像 Linux 终端接收到正确参数后直接执行任务一样干脆。
这种技术看起来很简单,但是,最近 Meta 想以 20 亿美元收购的 AI 公司 Manus,就是使用 Markdown 实现各种智能体的高手。
Tip
简化版的 Manus思路:使用三个 Markdown 文件解决使用 AI 时的上下文漂移。
1. task_plan.md: 像看板一样追踪任务进度 2. notes.md: 作为外部大脑存储中间数据 3. deliverable.md: 锚定最终交付目标。
借助这种思路,我们让 AI 使用起来像终端一样方便、高效、清晰。
最基础也是最关键的一步是让 AI 分清楚 指令 和 数据。
直接把报错日志粘贴到对话框里,AI 经常会把日志里的关键词误判为新的指令,导致逻辑混乱。在 Linux Shell 中,使用引号包裹变量是为了防止参数被误解析。在提示词工程中,代码块 起到同样的作用。
使用三个反引号包裹所有的日志、配置文件内容或参考代码。这不仅是格式美观的问题,更是为了建立 语义隔离区。
请分析以下 Nginx 报错日志:```text2023/10/27 10:00:00 [error] 1234#0: *1 open() "/usr/share/nginx/html/favicon.ico" failed```这样操作后,AI 能够明确知道反引号内的内容是 只读素材,反引号外的内容才是 处理逻辑。这能瞬间降低 AI 的幻觉概率,特别是在处理包含 SQL 语句或系统命令的日志时,防止 AI 试图执行或修改原始数据。
将提示词本身变成一份 Markdown 文档, 可以优化大模型的上下文。
不要堆砌长难句,AI 在处理长文本时注意力会衰减。使用 Markdown 的标题 # 和列表 - 来拆解需求,就像编写 Ansible Playbook 一样清晰。
使用二级标题明确上下文,利用列表定义具体的约束条件。
## Role你是一位资深 Linux 系统管理员,专注于 Shell 脚本自动化。## Task编写一个用于备份 MySQL 数据库的脚本。## Constraints- **禁止** 使用 mysqldump,必须使用 mydumper 工具。- **必须** 包含日志轮转功能,保留最近 7 天的日志。- 脚本执行完毕后 **必须** 发送简单的 curl 请求到监控端点。- **不要** 输出任何解释性文字,只输出代码本身。这种格式利用了 Markdown 的层级特性。标题 # 充当了锚点,告诉 AI 这是一个新的配置段落。列表项 - 则是具体的参数开关。尤其是配合 加粗 语法,能够显著提高 AI 对关键限制条件的遵循度。注意 不要 使用括号进行补充说明,直接把要求写死在列表项里。
在豆包中的得到的结果如下:
#!/bin/bash# 配置参数MYSQL_HOST="localhost"MYSQL_PORT="3306"MYSQL_USER="backup_user"MYSQL_PASSWORD="your_backup_password"BACKUP_BASE_DIR="/data/mysql_backups"LOG_BASE_DIR="/var/log/mysql_backup"MONITOR_ENDPOINT="https://monitor.example.com/mysql-backup-check"RETENTION_DAYS=7# 动态生成备份和日志文件名(基于时间戳)TIMESTAMP=$(date +%Y%m%d_%H%M%S)BACKUP_DIR="${BACKUP_BASE_DIR}/${TIMESTAMP}"LOG_FILE="${LOG_BASE_DIR}/mysql_backup_${TIMESTAMP}.log"# 创建必要目录mkdir -p "${BACKUP_BASE_DIR}" "${LOG_BASE_DIR}"# 日志轮转:删除超过7天的日志文件find "${LOG_BASE_DIR}" -name "mysql_backup_*.log" -type f -mtime +${RETENTION_DAYS} -delete >> "${LOG_FILE}" 2>&1# 开始备份并记录日志echo "[$(date +%Y-%m-%d\ %H:%M:%S)] Starting MySQL backup with mydumper" >> "${LOG_FILE}"mydumper \ -h "${MYSQL_HOST}" \ -P "${MYSQL_PORT}" \ -u "${MYSQL_USER}" \ -p "${MYSQL_PASSWORD}" \ -o "${BACKUP_DIR}" \ --threads=4 \ --compress \ --lock-all-tables \ >> "${LOG_FILE}" 2>&1# 检查备份执行状态BACKUP_EXIT_CODE=$?if [ ${BACKUP_EXIT_CODE} -eq 0 ]; then BACKUP_STATUS="success" echo "[$(date +%Y-%m-%d\ %H:%M:%S)] Backup completed successfully. Backup stored at: ${BACKUP_DIR}" >> "${LOG_FILE}"else BACKUP_STATUS="failed" echo "[$(date +%Y-%m-%d\ %H:%M:%S)] Backup failed with exit code: ${BACKUP_EXIT_CODE}" >> "${LOG_FILE}"fi# 发送监控请求curl -s -X POST "${MONITOR_ENDPOINT}" \ -H "Content-Type: application/json" \ -d "{\"status\":\"${BACKUP_STATUS}\",\"timestamp\":\"${TIMESTAMP}\",\"backup_dir\":\"${BACKUP_DIR}\"}" \ >> "${LOG_FILE}" 2>&1# 输出最终状态(供crontab等调用时查看)echo "Backup ${BACKUP_STATUS}. Log file: ${LOG_FILE}"exit ${BACKUP_EXIT_CODE}这是 90% 的人都不知道的高级技巧。
很多时候我们需要 AI 输出特定格式的 JSON 或 YAML 用于自动化管道。直接告诉它 请输出 JSON 往往不够,它还是会夹杂 Markdown 的解释文本。
这里运用了 Few-Shot Prompting(少样本提示) 的技巧,结合 Markdown 的 嵌套代码块。通过预设一个 yaml 的代码块结构,相当于给 AI 提供了一个填空题模板。AI 会自动忽略所有寒暄和废话,直接生成可以直接写入文件的配置代码。这完美复刻了 deliverable.md 的精神:明确、纯净、即插即用。
复制以下模板并在提示词中使用:
## Goal将用户的自然语言描述转换为 K8s Deployment 配置。## ExampleInput: 部署一个 nginx,使用 1.19 版本,2个副本。Output:```yamlapiVersion: apps/v1kind: Deploymentmetadata: name: nginx-deploymentspec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.19```## Current TaskInput: 部署一个 Redis,使用 6.0 版本,持久化存储挂载在 /data,限制内存 512Mi。Output:```yaml最后那个空的 ```yaml 是点睛之笔。它像一个未闭合的标签,强烈暗示 AI 立刻开始写代码,不要说话。
豆包中得到的结果截图:

虽然 Markdown 强大,但要避免 过度嵌套。不要在提示词里使用超过三级的标题,也不要搞复杂的引用块嵌套,这会消耗过多的 Token 并增加 AI 的推理负担。
简单的标题、列表、代码块组合,就是最高效的沟通协议。
从现在开始,可以把每一次向 AI 提问都当成是在编写一个微型的 Markdown 文档。
然后会发现,AI 的智商似乎突然翻倍了!
如果你有更实用的 Markdown 提示词模板,欢迎在评论区分享。
