组装提示词 — 山谷、文档类型与背包式取舍
这一章讲三件事: 一份提示词的「户型图」长什么样(开头、中段、结尾各有什么讲究); 三种现成的文档原型,分别什么时候用;以及料太多装不下时, 怎么挑、怎么排——这是个有名字的数学问题。 读到这里,第 05 章的「去程」就走完了全程。
1. 这一章讲什么
第 06 章备料,这一章组装。原书第 6 章是全书的工艺核心: 同样的料,摆法不同,答案不同。
主走查是给 Fiona 挑书的那份 ChatML 提示词——
它把「三明治」「重新聚焦」「硬转折」三个手法串在一份文档里。
辅走查是两 组四个字母:be+am 和 cat+tail——
它们会证明一件反直觉的事:token 数不可加。
2. 顶层全景:一份提示词的户型图
书作者团队做过的项目里,提示词从「3 个长段落」到「几百个一行小段」都有。 但无论大小,户型基本是这个1:
┌ 引言(introduction) 这是什么文档、要干什么——定全场基调
│ 上下文队伍 各种片段,鱼贯而入
│ ……(中段有个山谷,见 3.1)……
│ 重新聚焦(refocus) 把模型的注意力拉回正题
└ 硬转折(transition) 从「说题」切到「答题」——最后一个字符都算数
图说:本章主走查的骨架。引言让模型「一开始就想对方向」——
它每个 token 的思考预算固定,不能回头补课(第 03 章)。
3. 核心原理
3.1 平庸之谷:提示词中段是块低洼地
把所有上下文塞进中段之前,先认识两个效应2:
- 上下文学习(in-context learning)——越靠近提示词末尾的信息, 对模型的影响越大;
- 中间迷失(lost middle)——开头和末尾的内容都记得牢, 塞在中段的容易被略过。
两个效应叠加,在提示词的前中段形成一块低洼地, 作者给它起了个名字:Valley of Meh(平庸之谷)—— 落在谷里的料,利用率明显低于开头和后段。 所有模型都有这个谷,只是深浅位置不同;人也一样有3。
没有完美解,两条对策:关键的好料放谷外(开头引言、结尾重新聚焦); 谷里少放料(第 06、07 章的筛选与摘要,最终都服务于让提示词更短)。
3.2 主走查:三明治、重新聚焦与硬转折
长提示词的标准打法是三明治:开头说一遍要什么,结尾再说一遍—— 结尾那次叫重新聚焦(refocus):铺垫了半天的上下文之后, 把模型的注意力拉回问题上4。
主走查开始,给 Fiona 挑书(ChatML 格式,原书 Table 6-1)5:
system: You are a helpful AI.
user: I want to suggest to Fiona an idea for her next book to read.
Please ask any questions you need to arrive at an informed
suggestion. ← 三明治上半片:开头说清要什么
assistant: Of course! The following information might be useful:
What books did she read last? ← 这句助手台词是你写的!
user: Harry Potter, Lioness Rampant, Mr Lemoncello's Library
assistant: What did she post on social media recently?
user: [……社交媒体内容……] ← 上下文队伍(山谷区)
assistant: I believe this is all the information I need to select
a single best candidate book suggestion.
user: Excellent! So based on this, which book should I
suggest to her? ← 三明治下半片:重新聚焦
这份提示词里有三个手法,逐个看:
手法一,重新聚焦可以很短。 半行就够(「So…which book should I suggest?」), 也可以带上关键澄清(「focusing on narrative prose currently available?」)。 引言管「定调」,聚焦管「收口」6。
手法二,硬转折:从「说题」切到「答题」。 提示词的末尾必须完成这个切换,
否则模型会接着编更多上下文,而不是作答。
聊天模型好办:RLHF 把它调教成「见到问号就答题」。
补全模型要你自己动手——最常见的打法是替它把答案写个开头,
它别无选择,只能顺着给出解答。书里三种写法的对照(图 6-2)很说明问题:
不写转折,它继续编题;写得生硬,它答得敷衍;
末尾留一个开引号(and he suggested, "),它自然衔接到「说出建议」的轨道上7。
手法三,你可以替助手写台词。 主走查里那两句 assistant 提问, 是提示词工程师写的——模型读到「自己问过、用户答过」, 就会顺着这个既成事实往下走。这个手法有个名字,inception(借那部电影): 你替它开个头,它会把这当成自己的想法继续下去。 它能提高服从度,还能保证补全以「答案」而不是「又一轮寒暄」开头8。
3.3 三种文档原型:对话、报告、结构化文档
提示词加补全合起来是一份文档。选哪种文档,就是选它最 擅长续写的赛道。 三种原型9:
原型一:建议对话。 一问一答,多轮自然,还能挂工具(第 10 章)。 聊天模型自带 RLHF 的服从加成;补全模型则没有「过度礼貌」的负担。 对话的写法本身有四种(自由叙述/剧本式/无标记/结构化标签), 书里的对照表显示都有效——按「好不好拼、含不含缩进、 要不要明确谁在说」来选10。
原型二:分析报告。 每年几百万学生被训练写报告,
所以训练集里报告堆积如山——这是小红帽原则的富矿。
报告的好处:划界特别稳——开头一段「Scope:本报告只论小说,不论自助书」,
比在对话里反复叮咛管用;而且客观分析的文体,
省去了模型模拟社交的负担。坏处:分析可以永远写下去——
所以必须在「分析」转「结论」处给硬转折。
报告统一用 Markdown 写:模型熟、标题分层好搬好删、代码块有围栏、
还能直接渲染给用户;开头放个目录还能一鱼两吃:
# Ideas / # Analysis 当草稿区(写完答案再扔),
# Further Reading 当停止信号11。
原型三:结构化文档。 要程序解析输出时,让它按预定格式产——
结构化输出——模型按 XML/JSON 这类预定格式产出内容,
好让程序逐字段提取。
最出名的实例是 Anthropic 的 Artifacts:提示词(被人提取公开)用 XML 组织,
示范例子里助手先写一段 <antThinking>(这段被解析出来、不给用户看),
再写 <antArtifact …>(被提取到右侧栏,带标题和语言属性)——
同一段输出里,「想」和「货」分装两个标签,各走各的通道12。
格式怎么选:元素短选 XML(当心五个转义符);
内容带缩进(代码)选 YAML(fieldname: |2 块免转义);
JSON 转义最重,但 OpenAI 为工具调用专门调教过 JSON 生成,也能用13。
3.4 片段四性,与「token 数不可加」
料要切成片段往里装。好片段有四性:模块化(能插能拔)、 自然(像文档的有机部分——代码文档里,自然语言信息要写成注释)、 简短、惰性14。
惰性值得专门一节,辅走查开始。惰性的意思是: 每个片段的 token 数只算一次、拼接后不互相影响。但它并不天然成立15:
「be」+「am」 → 「beam」: [be] + [am] → [beam] 1 + 1 = 1
「cat」+「tail」→「cattail」:[cat] + [tail] → [c][att][ail] 1 + 1 = 3
图说:辅走查,两组真实切分(token id 见原书 Table 6-4)。
拼接两个片段,token 数可能缩水也可能暴涨——
你的预算表,按片段加总,可能整页都错。
两条对策:片段之间用空白隔开;让片段以空格开头、不要以空格结尾 (GPT 系切词器有「空格开头」的整块,没有「空格结尾」的); 换行符会被合并,片段要么都不以换行开头、要么都不以换行结尾16。
3.5 弹性片段与三关系
同一坨料,可以切成不同大小 的版本——书里的例子: 分析《The Beach》某场景,全文最好,塞不下就逐段省略成「…」, 最短版本只留两段关键引文。弹性片段:一份料备好几个长度档, 组装时不问「放不放得下」,改问「放得下的最大版本是哪档」17。
片段之间有三种关系,组装器都要管18:
- 位置:引用文献要按原序,聊天要按时间序;
- 重要性:和位置不是一回事——引言比中段细节重要得多,尽管它在最前; 打分用「优先级层」(整数,指令永远最高层、解释次之、上下文再次) 或分数(浮点,层内细分);短而信息足的片段,该比长而平的分高;
- 依赖:「Richard 是《The Beach》的主角」必须先于「他在英国长大」(需求); 同一份料的「摘要版」和「详细版」只能二选一(互斥——弹性片段就靠这个实现)。
3.6 组装:一个背包问题,两种贪心解
最后一步:在「不超预算」和「不违反依赖」的约束下,选一组片段,让总价值最大。 这是 0-1 背包问题的近亲,没有现成求解器,得自己写19。
三个档位,按复杂度递进20:
- 极简组装器:不评分,把料排好序,从末尾往前装到预算满—— 利用的是「模型天然擅长处理文档后缀」(3.1 的上下文学习); 适合验证想法的第一版;
- 加法贪心:从空开始,每步加入「依赖已满足、与已选不冲突、 还剩预算」里分最高的。依赖少、互斥少时最划算; 先把片段按依赖排个序,能省掉反复检查;
- 减法贪心:全装进,再逐步删「分最低、或依赖已落空」的。 弹性片段在减法里更好处理(先装最长版,塞不下就降档)。
作者的一手经验:Copilot 的代码片段要带特定「后缀」才算完整, 所以他们用自定义函数管代码行之间的依赖—— 这些路数都是原型,你的领域细节迟早要长进组装器里21。
4. 作者的判断与证据
有硬证据的:
- token 不可加的两组切分是真实切词器的输出,token id 在书里 Table 6-415;
- Artifacts 提示词结构(antThinking/antArtifact)有公开提取文 本可查, 书里标注了提取者12;
- 三明治、硬转折、inception 都配了 text-davinci-002/003 的真实补全对照7。
作者标明是经验之谈的:
- 「所有模型都有平庸之谷」是断言+文献背书(中间迷失有公开研究), 但谷的深浅位置「因模型而异」,他们给不了测量表3;
- 「片段格式(JSON/纯文本/XML)貌似影响不大」——原文自己写着 「Anecdotally…test this for yourself」22。
判断(我们的,不是书里的): 「平庸之谷」和第 03 章的结构定律是同一件事的 两种表述:山谷是「只向左看、只向上传」在长文档上的宏观表现—— 末尾的信息离「要写答案的那些小脑」最近,中间的笔记要在 96 层里接力最久。 所以山谷不会消失,只会随架构改进变浅。 如果错,会错在: 如果有架构让全文的每个位置到输出都「等距」 (比如架构上让全文每一处都能直接看到每一处),山谷会被填平——但 2024 年的所有主流模型都有它, 而「关键料放谷外」在任何模型上都不吃亏。
5. 边界与局限
- 「开头结尾记得牢」不等于「中段随便放」——谷是概率性的变浅,不是黑洞;
- inception 在聊天 API 上受格式限制——有的 API 不允许你以 assistant 身份收尾, 此时硬转折要靠用户消息的最后一句;
- 贪心是近似——依赖复杂(循环依赖、高值依赖低值)时两种贪心都会给出次优解, 书里明说这些只是原型21;
- 「几百个一行片段」的组装器是真实项目形态——别以为提示词就该是三段式, 那只是提示词的童年。
6. 可带走的
主走查一行回顾:引言定调 → 助手「问过」、用户「答过」(你写的剧本)→ 上下文进山谷 → 「So, which book…?」重新聚焦 → 模型开答—— 三明治两片面包,夹住的是整个山谷。
- 户型四段:引言、上下文、重新聚焦、硬转折;引言让模型一开始就想对方向;
- 平庸之谷:开头末尾记得牢,前中段是低洼地——关键料放谷外,谷内少放料;
- 长提示词用三明治,结尾那次叫重新聚焦;
- 补全模型的硬转折:替它写答案的开头(留个开引号都算);
- inception:替助手写台词——它会把既成事实当自己的;
- 三种原型:对话灵活、报告划界稳、结构化好解析;报告统一 Markdown,目录可兼做草稿区与停止信号;
- token 数不可加——片段以空格开头、不以空格结尾,换行要统一;
- 弹性片段:备好几档长度,问「放得下的最大版本」;
- 位置≠重要性;依赖分需求与互斥;
- 组装是背包问题:先极简(从末尾装),再加法/减法贪心,领域规则长进组装器。
7. 原文地图
| 主题 | 原书章 | 原文位置 |
|---|---|---|
| 户型图、引言 | Chapter 6 | text/09-ch06-chapter-6-assembling-the-prompt.txt:28(搜「Anatomy of a well-constructed prompt」) · :39(搜「thought budget」) |
| 两个效应与山谷 | Chapter 6 | text/09-ch06-chapter-6-assembling-the-prompt.txt:48(搜「In-context learning」) · :54(搜「Valley of Meh」) |
| 三明治、主走查 | Chapter 6 | text/09-ch06-chapter-6-assembling-the-prompt.txt:66(搜「sandwich technique」) · :75(搜「Fiona」) |
| 硬转折三种写法 | Chapter 6 | text/09-ch06-chapter-6-assembling-the-prompt.txt:122(搜「three variations of transition」) |
| inception | Chapter 6 | text/09-ch06-chapter-6-assembling-the-prompt.txt:164(搜「inception」) |
| 报告与目录两用法 | Chapter 6 | text/09-ch06-chapter-6-assembling-the-prompt.txt:281(搜「table of contents」) · :299(搜「Jerry's in Accounting」) |
| Artifacts 与格式选择 | Chapter 6 | text/09-ch06-chapter-6-assembling-the-prompt.txt:314(搜「elder_plinius」) · :418(搜「 |
| token 不可加 | Chapter 6 | text/09-ch06-chapter-6-assembling-the-prompt.txt:504(搜「cattail」) |
| 弹性片段 | Chapter 6 | text/09-ch06-chapter-6-assembling-the-prompt.txt:560(搜「elastic prompt elements」) |
| 三关系 | Chapter 6 | text/09-ch06-chapter-6-assembling-the-prompt.txt:625(搜「Richard is the protagonist」) |
| 背包与贪心 | Chapter 6 | text/09-ch06-chapter-6-assembling-the-prompt.txt:656(搜「knapsack」) · :667(搜「minimal prompt crafter」) |