跳到主要内容

中级:结构与思考(第 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.pyexercise_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.ipynbPROMPT。 另一个例子让 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.pyexercise_7_1_solution)。

4.3 把四件套连起来看

XML 隔离prefill出声思考few-shot
立「边界」卡「起点 / 格式」提「准确率」定「格式 / 语气」
<data>…</data>assistant: "{"<brainstorm>…<example>…</example>

这四件武器在第 9 章会被一起塞进同一个复杂提示模板——见 03-reliability-and-complex.md

代码地图

主题文件符号
模板替换 + 边界 bugAnthropic 1P/04_Separating_Data_and_Instructions.ipynbPROMPT, ANIMAL, EMAIL
XML 修复 / 故意留的连字符Anthropic 1P/04_Separating_Data_and_Instructions.ipynbPROMPT, grade_exercise
prefill 参数Anthropic 1P/05_Formatting_Output_and_Speaking_for_Claude.ipynbget_completion(prefill 形参)
Curry prefill 练习Anthropic 1P/hints.pyexercise_5_1_hint
双论点 / brainstorm CoTAnthropic 1P/06_Precognition_Thinking_Step_by_Step.ipynbPROMPT, SYSTEM_PROMPT
few-shot 家长 bot / 抽取Anthropic 1P/07_Using_Examples_Few-Shot_Prompting.ipynbPROMPT
few-shot 分类范例解Anthropic 1P/hints.pyexercise_7_1_solution