跳到主要内容

组装提示词 — 山谷、文档类型与背包式取舍

这一章讲三件事: 一份提示词的「户型图」长什么样(开头、中段、结尾各有什么讲究); 三种现成的文档原型,分别什么时候用;以及料太多装不下时, 怎么挑、怎么排——这是个有名字的数学问题。 读到这里,第 05 章的「去程」就走完了全程。

1. 这一章讲什么

第 06 章备料,这一章组装。原书第 6 章是全书的工艺核心: 同样的料,摆法不同,答案不同。

主走查是给 Fiona 挑书的那份 ChatML 提示词—— 它把「三明治」「重新聚焦」「硬转折」三个手法串在一份文档里。 辅走查是两组四个字母:be+amcat+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:

  1. 极简组装器:不评分,把料排好序,从末尾往前装到预算满—— 利用的是「模型天然擅长处理文档后缀」(3.1 的上下文学习); 适合验证想法的第一版;
  2. 加法贪心:从空开始,每步加入「依赖已满足、与已选不冲突、 还剩预算」里分最高的。依赖少、互斥少时最划算; 先把片段按依赖排个序,能省掉反复检查;
  3. 减法贪心:全装进,再逐步删「分最低、或依赖已落空」的。 弹性片段在减法里更好处理(先装最长版,塞不下就降档)。

作者的一手经验: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…?」重新聚焦 → 模型开答—— 三明治两片面包,夹住的是整个山谷。

  1. 户型四段:引言、上下文、重新聚焦、硬转折;引言让模型一开始就想对方向;
  2. 平庸之谷:开头末尾记得牢,前中段是低洼地——关键料放谷外,谷内少放料;
  3. 长提示词用三明治,结尾那次叫重新聚焦;
  4. 补全模型的硬转折:替它写答案的开头(留个开引号都算);
  5. inception:替助手写台词——它会把既成事实当自己的;
  6. 三种原型:对话灵活、报告划界稳、结构化好解析;报告统一 Markdown,目录可兼做草稿区与停止信号;
  7. token 数不可加——片段以空格开头、不以空格结尾,换行要统一;
  8. 弹性片段:备好几档长度,问「放得下的最大版本」;
  9. 位置≠重要性;依赖分需求与互斥;
  10. 组装是背包问题:先极简(从末尾装),再加法/减法贪心,领域规则长进组装器。

7. 原文地图

主题原书章原文位置
户型图、引言Chapter 6text/09-ch06-chapter-6-assembling-the-prompt.txt:28(搜「Anatomy of a well-constructed prompt」) · :39(搜「thought budget」)
两个效应与山谷Chapter 6text/09-ch06-chapter-6-assembling-the-prompt.txt:48(搜「In-context learning」) · :54(搜「Valley of Meh」)
三明治、主走查Chapter 6text/09-ch06-chapter-6-assembling-the-prompt.txt:66(搜「sandwich technique」) · :75(搜「Fiona」)
硬转折三种写法Chapter 6text/09-ch06-chapter-6-assembling-the-prompt.txt:122(搜「three variations of transition」)
inceptionChapter 6text/09-ch06-chapter-6-assembling-the-prompt.txt:164(搜「inception」)
报告与目录两用法Chapter 6text/09-ch06-chapter-6-assembling-the-prompt.txt:281(搜「table of contents」) · :299(搜「Jerry's in Accounting」)
Artifacts 与格式选择Chapter 6text/09-ch06-chapter-6-assembling-the-prompt.txt:314(搜「elder_plinius」) · :418(搜「
token 不可加Chapter 6text/09-ch06-chapter-6-assembling-the-prompt.txt:504(搜「cattail」)
弹性片段Chapter 6text/09-ch06-chapter-6-assembling-the-prompt.txt:560(搜「elastic prompt elements」)
三关系Chapter 6text/09-ch06-chapter-6-assembling-the-prompt.txt:625(搜「Richard is the protagonist」)
背包与贪心Chapter 6text/09-ch06-chapter-6-assembling-the-prompt.txt:656(搜「knapsack」) · :667(搜「minimal prompt crafter」)

Footnotes

  1. 出处:「Chapter 6. Assembling the Prompt」第 16-44 段(text/09-ch06-chapter-6-assembling-the-prompt.txt:28,搜「Anatomy of a well-constructed prompt」)。「three lengthy elements to hundreds of one-line elements」。

  2. 出处:「Chapter 6. Assembling the Prompt」第 45-53 段(text/09-ch06-chapter-6-assembling-the-prompt.txt:48,搜「In-context learning」)与(:51,搜「lost middle」)。

  3. 出处:「Chapter 6. Assembling the Prompt」第 54-62 段(text/09-ch06-chapter-6-assembling-the-prompt.txt:54,搜「Valley of Meh」)。原文:「How deep the Valley of Meh is and its exact location depends on the model, but all models have it—as do humans!」 2

  4. 出处:「Chapter 6. Assembling the Prompt」第 63-68 段(text/09-ch06-chapter-6-assembling-the-prompt.txt:66,搜「sandwich technique」)。

  5. 出处:「Chapter 6. Assembling the Prompt」表 6-1(text/09-ch06-chapter-6-assembling-the-prompt.txt:70,搜「Sandwiching the context」)。

  6. 出处:「Chapter 6. Assembling the Prompt」第 101-105 段(text/09-ch06-chapter-6-assembling-the-prompt.txt:101,搜「as short as half a line」)。

  7. 出处:「Chapter 6. Assembling the Prompt」第 106-128 段(text/09-ch06-chapter-6-assembling-the-prompt.txt:122,搜「three variations of transition」)。三种对照由 text-davinci-002 生成;「the opening quotation mark ending the transition in column three is still part of the prompt」。 2

  8. 出处:「Chapter 6. Assembling the Prompt」第 163-169 段(text/09-ch06-chapter-6-assembling-the-prompt.txt:164,搜「inception」)。原文:「start the answer for the model and the model will think that it's the one that came up with it」。

  9. 出处:「Chapter 6. Assembling the Prompt」第 130-136 段(text/09-ch06-chapter-6-assembling-the-prompt.txt:130,搜「What Kind of Document?」)。

  10. 出处:「Chapter 6. Assembling the Prompt」表 6-2 与第 175 段(text/09-ch06-chapter-6-assembling-the-prompt.txt:175,搜「Asking an LLM for ideas」)。

  11. 出处:「Chapter 6. Assembling the Prompt」第 235-301 段(text/09-ch06-chapter-6-assembling-the-prompt.txt:250,搜「Scope section」)与(:281,搜「table of contents」)。「LLMs aren't oracles…no reason its opinion should count for more than Jerry's in Accounting」。

  12. 出处:「Chapter 6. Assembling the Prompt」第 302-399 段(text/09-ch06-chapter-6-assembling-the-prompt.txt:307,搜「Artifacts」)与(:314,搜「elder_plinius」)。「antThinking is parsed out and hidden from the user, and antArtifact is extracted and placed into the Artifact pane」。 2

  13. 出处:「Chapter 6. Assembling the Prompt」第 400-432 段(text/09-ch06-chapter-6-assembling-the-prompt.txt:411,搜「five in XML」)与(:429,搜「escape heavy」)。

  14. 出处:「Chapter 6. Assembling the Prompt」第 433-491 段(text/09-ch06-chapter-6-assembling-the-prompt.txt:464,搜「consider this snippet from」)。Copilot 用代码注释引入外文件片段:「// <consider this snippet from ../skill.go>」。

  15. 出处:「Chapter 6. Assembling the Prompt」表 6-4(text/09-ch06-chapter-6-assembling-the-prompt.txt:502,搜「Token count」)。token id:be=1395,am=309,beam=54971;cat=4719,tail=14928,c/att/ail=66/1617/607。 2

  16. 出处:「Chapter 6. Assembling the Prompt」第 509-516 段(text/09-ch06-chapter-6-assembling-the-prompt.txt:512,搜「start with a space」)。

  17. 出处:「Chapter 6. Assembling the Prompt」第 530-568 段(text/09-ch06-chapter-6-assembling-the-prompt.txt:560,搜「elastic prompt elements」)。原文:「What's the biggest version of this snippet we have space for?」

  18. 出处:「Chapter 6. Assembling the Prompt」第 575-639 段(text/09-ch06-chapter-6-assembling-the-prompt.txt:581,搜「Position」)与(:625,搜「Richard is the protagonist」)。

  19. 出处:「Chapter 6. Assembling the Prompt」第 641-660 段(text/09-ch06-chapter-6-assembling-the-prompt.txt:656,搜「knapsack」)。

  20. 出处:「Chapter 6. Assembling the Prompt」第 661-704 段(text/09-ch06-chapter-6-assembling-the-prompt.txt:666,搜「minimal prompt crafter」)与(:680,搜「additive greedy」)、(:694,搜「subtractive greedy」)。

  21. 出处:「Chapter 6. Assembling the Prompt」第 663-665 段与第 706-710 段(text/09-ch06-chapter-6-assembling-the-prompt.txt:663,搜「specific postfix」)。 2

  22. 出处:「Chapter 8. Conversational Agency」第 852-854 段(text/11-ch08-chapter-8-conversational-agency.txt:854,搜「test this for yourself」)。