📚AI 编程官方教程中文版
🧠 从原理到实战

04 · 怎么和 AI 说话

提示词不是模板游戏,是信息密度游戏。同样意思不同表达,AI 输出天差地别——不是因为语气,是因为信息量。理解信息四件套(目标 / 上下文 / 边界 / 验收),你给的每条指令都会立刻不一样。

翔宇一开始也在网上搜最佳提示词模板,照着抄,有时有效有时没效。后来想明白了——模板不是重点,你给 AI 的信息才是。一旦把注意力从怎么措辞转到给什么信息,一切都清楚了。——翔宇

这一篇用 12 分钟换什么

理解了 01 位置、02 上下文、03 记忆,你已经知道 Claude Code 能看到什么。这一篇拆怎么让它做你想要的——不是措辞技巧,是信息工程。读透你会发现,所有提示词技巧都是同一件事:让信息密度更高

1. 一个 40 秒和一个 5 秒

你对 Claude Code 说:帮我优化这段代码

它改了。你一看——变量名全换了,加了一堆你不需要的注释,还把一个函数拆成了三个。方向完全不是你想要的。你重新解释,它再改,又错。来回 40 秒没办法继续干活

现在换一种说法:这段代码有内存泄漏问题,请找出泄漏点,重点关注数据库连接和文件句柄,给出修复方案,不要重命名变量也不要拆分函数

同一个 AI,同一段代码,这次的输出精准得像换了一个人。5 秒钟你就能继续往下干。

发生了什么?AI 没变,代码没变。唯一变了的是你输入的信息。第一次你给了一个模糊方向(优化),第二次你给了精确目标(找泄漏)+ 范围(数据库 / 文件句柄)+ 期望产出(修复方案)+ 边界(不重命名、不拆分)。

2. 模型不读心

如果只能记住一句话,记这一句:模型不读心

它没办法你脑子里那个具体场景。它只看到你输入的那些字。你脑子里清楚但没说的部分——它当成自由发挥的空间。

flowchart LR
    Brain["🧠 你脑子里<br/>真实想要的"]
    Words["⌨️ 你打出来的字<br/>只是一部分"]
    AI["🤖 模型基于字推断<br/>缺失部分用最可能的填"]
    Output["📦 输出<br/>跟你想要的差距 = 缺失部分"]

    Brain -.信息丢失.-> Words
    Words --> AI
    AI --> Output

    Brain -.->|对照差距| Output

    style Brain fill:#dcfce7,stroke:#22c55e
    style Words fill:#fef3c7,stroke:#f59e0b
    style AI fill:#dbeafe,stroke:#3b82f6
    style Output fill:#fee2e2,stroke:#ef4444

关键点

输出跟你想要的差距 = 你脑子里有但没说出来的部分。这跟模型聪不聪明无关——再聪明的同事,你说优化代码他也得问你优化什么。

这就是为什么信息越精确,输出越精准。不是提示词模板的功劳,是信息量的功劳。

3. 信息四件套

要让模型有能力做你想要的事,每条指令本质上要给 4 类信息。这 4 类构成一套可调的工程语言

Prop

Type

一句话理解

目标说做什么 + 上下文说从哪开始 + 边界说不碰什么 + 验收说怎么算完。4 件套齐了,输出方向就稳。

把开头那两个例子拆成四件套对比:

帮我优化这段代码

4 件套给了什么
🎯 目标优化 —— 模糊(重命名?重构?加注释?提速?)
📥 上下文这段代码 —— 不知道哪段
🚧 边界没说
验收没说

结果:模型自由发挥——通常会做最常见的几件事(重命名 + 加注释 + 拆函数)。你想要的(性能?可读性?测试覆盖?)模型不知道

这段代码有内存泄漏问题,请找出泄漏点,重点关注数据库连接和文件句柄,给出修复方案,不要重命名变量也不要拆分函数

4 件套给了什么
🎯 目标找出泄漏点 + 给出修复方案 —— 具体动词
📥 上下文内存泄漏问题 + 数据库连接和文件句柄 —— 范围明确
🚧 边界不重命名变量 + 不拆分函数 —— 显式排除
验收隐含修复方案(可执行)

结果:模型只走你画的路径,输出方向跟你脑子里想的对齐。

差别不在措辞——在信息量

4. 把模糊变具体的 3 个杠杆

知道了四件套,怎么让每件都变具体?三个杠杆:

杠杆 1 · 把抽象动词换成可验证动词

❌ 抽象✅ 可验证
优化代码找出 N+1 查询 + 改成 batch 查询
改进可读性变量名改驼峰 + 超过 50 行的函数拆成 ≤ 30 行
修复 buglogin.js:42 错误密码空白返回,加 1 条 e2e 测试
重构模块services/payment.ts 拆成 collector / processor / notifier 三个文件

判断标准:动词要能验证——做完了能不能客观判断完没完?模糊动词做不完,具体动词做完了能跑测试。

杠杆 2 · 给显式范围(路径 / 表 / 时间 / 数量)

含糊显式
看一下 webhookcontrollers/webhook.tshandleStripeEvent 函数
改一改测试tests/auth/login.test.ts 中标 @flaky 的 3 条 case
加点日志services/payment.ts 的 retry 分支加 logger.warn,含 transactionIdattempt 数字段
优化最近的代码优化最近 7 天 git diff 里的 hot path(用 git log --since="7 days ago" 找)

显式范围让模型不需要猜——它直接照着做。

杠杆 3 · 显式说出隐含约束

每个项目都有人人都知道但没人写下来的约定。模型没法靠常识猜出来。

  • 我们这个项目所有 API 必须返回 { data, error } 结构 → 写进 CLAUDE.md(03 篇)或临时说明
  • 测试不要 mock 数据库 → 写进 CLAUDE.md,否则每次都要提醒
  • 这个函数虽然看起来简单但有 3 个隐藏调用方 → 临时上下文必须写
  • 这段代码 2 周后要重构,临时方案别太完美 → 边界

每次纠正 Claude,都是在补这一类隐含约束。补一次写进 CLAUDE.md,比补十次省心。

5. 何时用结构化提示

正常对话——四件套用自然中文写下来,够了。

长指令、复杂任务、多步骤——结构化能让模型更稳定。

<task>修复支付回调幂等性 bug</task>

<context>
- 文件:controllers/webhook.ts、queue/retry.ts
- 现象:webhook 重试时 transaction 创建多次
- 已知线索:retry.ts 第 34 行没读 idempotency_key
</context>

<constraints>
- 不改 controllers/webhook.ts 的对外接口
- transaction 表 schema 不动
- 修复 diff < 100 行
</constraints>

<acceptance>
- 跑 tests/payment/retry.test.ts 全过
- 手动跑 scripts/replay-webhook.sh 重放 3 次只创建 1 个 transaction
- 不引入新依赖
</acceptance>

XML 标签是事实标准(Claude 系列对它训练得最熟)。4 个标签对应 4 件套——目标、上下文、边界、验收。

什么时候不用 XML:日常 1-2 句的对话不要用 XML 包裹(噪音大于信号)。指令长度超过 200 字、或要求 ≥ 3 个独立约束时,结构化才有收益。

6. 跟人说话 vs 跟 Claude 说话

很多人觉得跟 Claude 说话像跟实习生说话。这个比喻 80% 对——但有 20% 关键差异:

人会主动追问

  • 你说修一下,他问哪里?
  • 你说优化,他问怎么算优化好?
  • 你说不对,他问具体哪里不对?

人有沉默成本

  • 他每追问一次都暴露不专业
  • 所以会主动猜:你大概想让我重命名 + 加注释吧
  • 猜对了显得专业,猜错了再补救

人有项目记忆

  • 上周你说过 X,他记得
  • 团队风格他知道
  • 一些不成文规矩他懂

Claude 不主动追问

  • 你说修一下,它直接动手修一个它认为最可能的地方
  • 你说优化,它直接选最常见的几种优化做下去
  • 你说不对,它自己重新猜一遍方向

Claude 没有沉默成本

  • 它不在乎显不显得专业
  • 不知道就猜,猜错了你来纠正
  • 这是它的工作模式,不是缺陷

Claude 没有项目记忆(除非)

  • 上下文 ≠ 长期记忆(02 篇
  • 只有写进 CLAUDE.md 或 Auto Memory(03 篇)的它才记得
  • 团队不成文规矩 → 必须显式写出来

结论:跟 Claude 说话前置成本更高——你得提前说清楚,因为它不会问你。但你说一次,写进 CLAUDE.md,以后不用再说。这是值得的交易。

7. 一个反复有效的工作流

把上面所有内容串成一个可重复的工作流:

flowchart TD
    Start["📝 写一条指令"]
    Check{"4 件套<br/>都给了吗?"}
    Run["▶️ 跑一遍 Claude"]
    OK{"输出方向<br/>对吗?"}
    Done["✅ 收工"]
    Diag["🔍 诊断<br/>哪一件套缺了?"]
    Fix["✍️ 补缺失的"]
    Save{"是不是<br/>项目级规则?"}
    CLAUDE["📜 写进 CLAUDE.md"]

    Start --> Check
    Check -->|是| Run
    Check -->|否| Fix
    Run --> OK
    OK -->|对| Done
    OK -->|不对| Diag
    Diag --> Fix
    Fix --> Save
    Save -->|是| CLAUDE
    Save -->|否| Run
    CLAUDE --> Run

    style Done fill:#dcfce7,stroke:#22c55e
    style CLAUDE fill:#dbeafe,stroke:#3b82f6
    style Diag fill:#fef3c7,stroke:#f59e0b

第一次问 → 检查 4 件套齐不齐 → 跑 → 不对就诊断哪件套缺了 → 补 → 如果是项目级规则就写进 CLAUDE.md → 再跑。

跑通几个周期后,CLAUDE.md 越写越完整,你给 Claude 的指令会越来越短——因为公共上下文都已经在文件里了,每次只需要补这次任务特有的目标 + 范围 + 边界。

8. 检验你真懂了吗

#试着用自己的话回答对应章节
1有人说提示词技巧的本质是措辞——你能反驳吗?真正决定输出质量的是什么?§2 + §3
24 件套里最容易被忽略的是哪一件?为什么忽略它最容易翻车?举一个例子。§3
3你给 Claude 的指令越来越短意味着什么?背后是什么机制在变化?§7

过关标准

能用一句话说清——模型不读心,输出 = 输入信息密度的函数;4 件套(目标 / 上下文 / 边界 / 验收)是这个函数的可调字段。

接下来去哪

不用按顺序全读。挑你最好奇的那条线走就行。

On this page