---
title: "04 · 怎么和 AI 说话"
description: "提示词不是模板游戏，是信息密度游戏。同样意思不同表达，AI 输出天差地别——不是因为语气，是因为信息量。理解信息四件套（目标 / 上下文 / 边界 / 验收），你给的每条指令都会立刻不一样。"
canonical: "https://xiangyugongzuoliu.com/tag/claude-code"
verifiedAt: "2026-05-08"
---

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

> [!NOTE]
> **这一篇用 12 分钟换什么**：理解了 [01](/docs/claude-code/understanding/01-what-is-claude-code) 位置、[02](/docs/claude-code/understanding/02-context-window) 上下文、[03](/docs/claude-code/understanding/03-memory) 记忆，你已经知道 Claude Code **能看到什么**。这一篇拆**怎么让它做你想要的**——不是措辞技巧，是信息工程。读透你会发现，**所有提示词技巧都是同一件事：让信息密度更高**。

## 1. 一个 40 秒和一个 5 秒

你对 Claude Code 说：**帮我优化这段代码**。

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

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

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

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

## 2. 模型不读心

如果只能记住一句话，记这一句：**模型不读心**。

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

```mermaid
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
```

> [!WARNING]
> **关键点**：**输出跟你想要的差距 = 你脑子里有但没说出来的部分**。这跟模型聪不聪明无关——再聪明的同事，你说**优化代码**他也得问你优化什么。

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

## 3. 信息四件套

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

| 字段 | 必填 | 说明 | 例子 | 不给会怎样 |
|------|:--:|------|------|------|
| 🎯 **目标** | ✅ | 你要 Claude 做什么。动词必须具体——修复比处理好，找出泄漏点比看一下好 | `修复` / `找出` / `重写` / `加测试` | 模型自由发挥，做最常见的几件事（重命名 / 加注释 / 拆函数）|
| 📥 **上下文** | ✅ | 它需要先理解什么。代码片段、文件路径、错误信息、业务背景、已有约定（CLAUDE.md 之外的临时上下文）| `src/auth/login.js` + 用户错误密码后页面空白 | 模型扫整个仓库找线索，token 暴涨 + 命中率低 |
| 🔒 **边界** | — | 不要碰什么。文件范围、不能修改的接口、不能引入的依赖、风格约束。**这条最容易漏，也最容易翻车** | 不要重命名变量 / 只改 `controllers/` 下的 | 模型"顺便"做一堆你没要求的事——重构相邻模块、改公开 API、引入新依赖 |
| ✅ **验收** | — | 怎么算做完了。命令执行成功、测试通过、diff 在 N 行内、输出符合特定格式 | `pnpm test` 全过 / diff < 200 行 | 模型自己判断"差不多了"就停——可能跑通了简单测试就当完成 |

> [!TIP]
> **一句话理解**：**目标说做什么 + 上下文说从哪开始 + 边界说不碰什么 + 验收说怎么算完**。4 件套齐了，输出方向就稳。

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

<details>
<summary>❌ 模糊指令</summary>

> 帮我优化这段代码

| 4 件套 | 给了什么 |
|--------|---------|
| 🎯 **目标** | **优化** —— 模糊（重命名？重构？加注释？提速？）|
| 📥 **上下文** | **这段代码** —— 不知道哪段 |
| 🔒 **边界** | 没说 |
| ✅ **验收** | 没说 |

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

</details>

<details>
<summary>✅ 精确指令</summary>

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

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

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

</details>

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

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

知道了四件套，怎么让每件都变具体？三个杠杆：

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

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

判断标准：动词要能**验证**——做完了能不能客观判断完没完？模糊动词做不完，具体动词做完了能跑测试。

### 杠杆 2 · 给显式范围（路径 / 表 / 时间 / 数量）

| 含糊 | 显式 |
|------|------|
| 看一下 webhook | 看 `controllers/webhook.ts` 的 `handleStripeEvent` 函数 |
| 改一改测试 | 改 `tests/auth/login.test.ts` 中标 `@flaky` 的 3 条 case |
| 加点日志 | 在 `services/payment.ts` 的 retry 分支加 `logger.warn`，含 `transactionId` 和 `attempt` 数字段 |
| 优化最近的代码 | 优化最近 7 天 git diff 里的 hot path（用 `git log --since="7 days ago"` 找）|

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

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

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

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

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

## 5. 何时用结构化提示

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

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

```text
<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 件套**——目标、上下文、边界、验收。

**为什么 Claude 系列对 XML 标签特别敏感**：Anthropic 在训练 Claude 时大量用了 XML 结构化的 prompt 数据，官方的 prompt engineering 文档也把 XML 标签作为推荐写法。这意味着模型在解析 `<task>` `<context>` `<constraints>` `<acceptance>` 时会把它们当作**强语义边界**——比纯散文段落更容易识别"这一段是目标，那一段是约束"。换成 Markdown 标题（`## 目标`）也能用，但 Claude 对 XML 的训练信号更强。**这是模型偏好，不是协议要求**——其它模型（GPT / Gemini）用 Markdown 反而更好。

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

## 6. 跟人说话 vs 跟 Claude 说话

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

<details>
<summary>🧑 跟人说话</summary>

**人会主动追问**：

- 你说**修一下**，他问哪里？
- 你说**优化**，他问怎么算优化好？
- 你说**不对**，他问具体哪里不对？

**人有沉默成本**：

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

**人有项目记忆**：

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

</details>

<details>
<summary>🤖 跟 Claude 说话</summary>

**Claude 不主动追问**：

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

**Claude 没有沉默成本**：

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

**Claude 没有项目记忆（除非）**：

- 上下文 ≠ 长期记忆（[02 篇](/docs/claude-code/understanding/02-context-window)）
- 只有写进 CLAUDE.md 或 Auto Memory（[03 篇](/docs/claude-code/understanding/03-memory)）的它才记得
- 团队不成文规矩 → **必须显式写出来**

</details>

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

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

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

```mermaid
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。
2. 4 件套里**最容易被忽略**的是哪一件？为什么忽略它最容易翻车？举一个例子。对应 §3。
3. **动手题** ⭐：拿出你昨天给 Claude Code 发过的最模糊的一条指令（比如"优化这段代码"、"改改这个函数"）。按 4 件套（目标 / 上下文 / 边界 / 验收）改写一遍，每一件至少补一句具体的。改写完对比原版，估算新版会减少多少轮"它没听懂我再解释" 的来回——这就是 4 件套省下的真实成本。 对应 §3 + §4。

> [!TIP]
> **过关标准**：能用一句话说清——**模型不读心，输出 = 输入信息密度的函数；4 件套（目标 / 上下文 / 边界 / 验收）是这个函数的可调字段。**

<details id="glossary">
<summary><b>本篇术语速查表</b></summary>

- **prompt**：提示词，你给 AI 的输入指令。
- **prompt engineering**：提示词工程，系统化设计输入信息以稳定输出。
- **context**：上下文，模型决策时能看到的所有信息，[02 篇](/docs/claude-code/understanding/02-context-window) 详拆。
- **信息四件套**：目标 + 上下文 + 边界 + 验收，本篇核心。
- **XML 标签**：`<task>` `<context>` `<constraints>` `<acceptance>` 结构化提示标记，Claude 系列训练熟。
- **CLAUDE.md**：项目记忆文件，长期指令，跨会话保留，[03 篇](/docs/claude-code/understanding/03-memory) 详拆。

</details>

## 官方资料

- [Best practices](https://code.claude.com/docs/en/best-practices)
- [Common workflows](https://code.claude.com/docs/en/common-workflows)
- [Quickstart](https://code.claude.com/docs/en/quickstart)

## 接下来去哪

<Cards>
  <Card title="05 · AI 怎么决定想多深" href="/docs/claude-code/understanding/05-thinking-depth">
    四件套搞定输入信息。下一篇拆模型怎么处理这些信息——快思考 vs 慢思考、effort 思考深度参数。
  </Card>
  <Card title="03 · 怎么记住你的习惯（上一篇）" href="/docs/claude-code/understanding/03-memory">
    复习一下：4 件套里的公共上下文该写进 CLAUDE.md，本次任务特有每次显式给。
  </Card>
  <Card title="06 · 把重复的话写成文件（可跳读）" href="/docs/claude-code/understanding/06-command-files">
    如果你发现某种 4 件套组合反复使用——这就是 Skills 的雏形。把它沉淀成可复用文件。
  </Card>
</Cards>

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