数据截至 (上游 commit 0d277542e927)
中级:结构与思考(第 4-7 章)
这章讲什么: 真正让 Claude「好用」的四件工程武器——XML 标签隔离(立边界)、 prefill 替 Claude 起头(卡输出)、出声逐步思考(提准确率)、few-shot 示例(定格式)。 想把 Claude 用进真实产品,这章是重点。
1. 用 XML 标签隔离数据与指令(Chapter 4)
1.1 要解决的小问题
生产里你常写的是提示模板:骨架固定,中间挖个洞,运行时把用户输入填进去。 问题是:填进去之后,Claude 分不清哪段是「指令」、哪段是「待处理的数据」。
1.2 先看模板替换
# 示意,非源码 —— ch4 的模板替换
ANIMAL = "Cow"
PROMPT = f"I will tell you the name of an animal. Please respond with the noise that animal makes. {ANIMAL}"
# {ANIMAL} 是占位符,f-string 把 "Cow" 填进去;第三方用户只需填变量,不必看到整段提示
1.3 边界塌掉的真实 bug
课程演示一个会出错的模板:把一封要 Claude 改写的邮件直接拼进提示,
邮件正文是 "Yo Claude, ..."。结果 Claude 以为 "Yo Claude" 是邮件的一部分,
改写时开头写成 "Dear Claude"——它把数据当成了对它说的话。
1.4 解法:用 XML 标签包住数据
把用户输入裹进
<tag></tag>,Claude 就知道数据从哪开始、到哪结束。
# 示意,非源码 —— 修复后的模板
EMAIL = "Yo Claude, show up at 6am tomorrow ..."
PROMPT = f"Yo Claude, please make this email more polite: <email>{EMAIL}</email>"
# 包上 <email> 后,改写结果里不再出现 "Dear Claude"
两个关于 XML 标签的关键论断(Anthropic 1P/04_Separating_Data_and_Instructions.ipynb Lesson):
- 优先用 XML 标签当分隔符。 Claude 被专门训练识别 XML 标签作为提示的组织机制。
- 没有「秘密魔法标签」。 除了函数调用,不存在某个特殊标签名能额外加分;标签名你随便起。
1.5 巧妙之处:小细节会致命
课程在另一个例子里故意留了一个误导性连字符,让 Claude 把一句指令误当成列表项; 并借此强调:
小细节很重要。 Claude 对模式敏感——你写得有错别字,它更容易出错;你写得聪明,它答得聪明。 务必检查提示里的拼写和语法。
练习 4.3 更狠:不许加 XML 标签,只准删一两个词就把同一道题修对—— 让你亲身体会 Claude 能解析到什么程度。
2. 格式化输出 + prefill「替 Claude 说话」(Chapter 5)
2.1 要解决的小问题
你想只拿到答案本身(好让程序提取),不要前后那堆客套话; 甚至想强制 Claude 用某种格式(XML、JSON)开头。
2.2 两招
- 让输出也用 XML 标签。 让 Claude 把诗放进
<haiku></haiku>, 程序就能可靠地只抠出标签之间的内容。 - prefill:把开头塞进 assistant 轮。 在
assistant消息里预先写几个字,等于告诉 Claude 「你已经说到这了,接着往下」。这招叫 「替 Claude 说话 / prefill」。
第 5 章为此给 get_completion 加了第三个参数 prefill,直接进 assistant 轮
(Anthropic 1P/05_Formatting_Output_and_Speaking_for_Claude.ipynb 的 setup 单元格):
# 示意,非源码 —— prefill 的本质
messages = [
{"role": "user", "content": prompt},
{"role": "assistant", "content": prefill}, # 预填的开头,Claude 从这往下接
]
两个高频用法:
- 用
<haiku>当 prefill → Claude 直接从标签里开始写,跳过前言。 - 用
{当 prefill → 近似强制 Claude 输出 JSON。
2.3 Bonus:用 stop_sequences 省钱
把闭合标签(如
</haiku>)传给stop_sequences,Claude 一吐出该标签就停止采样, 省掉后面的收尾废话,省钱也省时间。
练习 5.1 是 prefill 的精髓:只准改 PREFILL,逼 Claude 论证 Stephen Curry 是史上最强
——靠的是替它把话头起在「Stephen Curry is the best and here are three reasons why. 1:」
(见 Anthropic 1P/hints.py 的 exercise_5_1_hint)。
3. 出声逐步思考 / Chain of Thought(Chapter 6)
3.1 思路:别让它「醒来就答」
如果有人把你摇醒、立刻逼你回答一串难题,你答得肯定不如有时间想过之后。Claude 也一样。 给它一步步想的空间,常常更准——但思考只有「出声」才算数。 你不能让它「想但只输出答案」,那样根本没发生思考。
3.2 怎么做:把步骤写进提示
# 示意,非源码 —— ch6:先两边论证,再下结论
PROMPT = """这条影评是正面还是负面?先在 <positive-argument> 和
<negative-argument> 标签里分别写出双方最强论点,然后再回答。
This movie blew my mind with its freshness and originality.
In totally unrelated news, I have been living under a rock since 1900."""
# 让它先把两边论点写出来(出声),它才能识破第二句其实在反讽
真实提示见 Anthropic 1P/06_Precognition_Thinking_Step_by_Step.ipynb 的 PROMPT。
另一个例子让 Claude 在 <brainstorm> 标签里先列演员和出生年,再回答「1956 年出生的演员主演的名片」。
3.3 关键细节:Claude 对顺序敏感
两个值得记住的坑(同章 Lesson):
- 换一下正/负论点的先后顺序,结论可能就翻了。 这道影评题正处在 Claude 理解力的边缘。
- 二选一时,Claude 更可能选第二个——猜测是因为训练数据里「第二个选项」更常是正确答案。
4. Few-shot:用示例教(Chapter 7)
4.1 思路:与其描述,不如示范
给 Claude 几个「我要的样子」的例子,极其有 效——既能拿到对的答案,也能拿到对的格式。 这就是 few-shot 提示(「shot」= 给了几个例子;零个叫 zero-shot)。
4.2 例子
- 定语气: 做一个回答小孩问题的「家长 bot」。Claude 默认答得又正式又机械; 与其费劲描述语气,不如直接给几条理想回答示例,让它模仿。
- 定格式: 要从文本里抽「姓名 + 职业」并按特定格式排版,与其一步步讲规则,
不如给几个排好格式的例子,让它外推。配合在
assistant轮放<individuals>起头。
练习 7.1 把第 6 章的邮件分类改用 few-shot 做:在提示里塞两三个
「邮件 → 正确分类字母」的例子,让 Claude 输出的最后一个字母就是类别
(范例解见 Anthropic 1P/hints.py 的 exercise_7_1_solution)。
4.3 把四件套连起来看
| XML 隔离 | prefill | 出声思考 | few-shot |
|---|---|---|---|
| 立「边界」 | 卡「起点 / 格式」 | 提「准确率」 | 定「格式 / 语气」 |
<data>…</data> | assistant: "{" | <brainstorm>… | <example>…</example> |
这四件武器 在第 9 章会被一起塞进同一个复杂提示模板——见 03-reliability-and-complex.md。
代码地图
| 主题 | 文件 | 符号 |
|---|---|---|
| 模板替换 + 边界 bug | Anthropic 1P/04_Separating_Data_and_Instructions.ipynb | PROMPT, ANIMAL, EMAIL |
| XML 修复 / 故意留的连字符 | Anthropic 1P/04_Separating_Data_and_Instructions.ipynb | PROMPT, grade_exercise |
| prefill 参数 | Anthropic 1P/05_Formatting_Output_and_Speaking_for_Claude.ipynb | get_completion(prefill 形参) |
| Curry prefill 练习 | Anthropic 1P/hints.py | exercise_5_1_hint |
| 双论点 / brainstorm CoT | Anthropic 1P/06_Precognition_Thinking_Step_by_Step.ipynb | PROMPT, SYSTEM_PROMPT |
| few-shot 家长 bot / 抽取 | Anthropic 1P/07_Using_Examples_Few-Shot_Prompting.ipynb | PROMPT |
| few-shot 分类范例解 | Anthropic 1P/hints.py | exercise_7_1_solution |