跳到主要内容

提示词里放什么 — 静态澄清与动态上下文

这一章讲三件事: 提示词的内容怎么分成「澄清任务」和「提供情境」两类; 放例子(few-shot)这件利器为什么会反噬;以及动态上下文该按什么规矩收集。 原书第 5 章很长,我们把它拆成两章——本章管「从哪来、怎么选」, 第 07 章专管「检索与摘要」这条最大的来料渠道。

1. 这一章讲什么

第 05 章立了四准则,这一章开始填第一准则和第二准则的料: 提示词里到底该放什么、从哪来。

主走查围绕同一个应用——图书推荐——分两段: 先看同一句「下一本读什么」怎么被拆成静态、动态两块; 再看一个「猜书评评分」的提示词,例子的三种摆法怎样引出三种不同的模型行为。

2. 顶层全景:模型最擅长处理的,恰恰是你没给它的

先看书的引子。做一个图书推荐应用,传统做法(协同过滤那类)只看 「谁读过什么」。拿 LLM 做,你可以喂给它乱糟糟的文字: 人口统计、书之外的爱好、最近的经历—— 它能像一个「读遍了全网书评的人」那样,用常识做推荐1

只给「最近读过《白鲸》和《哈克贝利·费恩》」,它推荐《杀死一只知更鸟》,合理。 加上「中年、爱旅行、刚发帖吐槽过背包客」之类的杂料, 推荐立刻变得贴身。模型的长处是消化乱七八糟的文字信息—— 但把信息找来给它,是你的工作2

这些料分两类,这是全章的总纲3:

静态内容 = 写死在代码里的文字
作用:定义任务、澄清问题、给精确指令
动态内容 = 请求到来时才取来的文字
作用:提供「这一个用户、这一次请求」的具体情境

图说:分在哪一类,不看文字本身,看它从哪来——
写死的就是静态,从可变来源取的就是动态。

3. 核心原理

3.1 一条会移动的分界

主走查第一段。 同一句问话,三个版本4:

版本文字第二句是什么
A「下一本读什么?我是说消遣读物,不是教科书。静态:澄清「书」在这任务里指什么
B「下一本读什么?我上一本读的是《白鲸》。动态:这一次的具体情境
C「下一本读什么?我要正经书,不要自助书。不一定

C 分在哪边,取决于你怎么实现: 如果「不要自助书」是你写死的应用规则——它是静态澄清; 如果是你从这位用户的聊天记录里发现的偏好——它是动态上下文。 同一句话,出身决定类别5

这个分界不是学究:静态料要在上线前打磨到完美, 动态料要解决「从哪来、多快能取来」的工程问题——两拨不同的工作。

3.2 澄清任务:显式指令的三条写法规矩

为什么「澄清」值得专门一节?因为程序化的调用里, 一次误解就是一次彻底的失败——没有人替你追问「你刚才是不是这个意思?」。 而且澄清带来一致性:每次都以同样方式理解任务,才谈得上优化和信任6

显式指令就是直说:用 Markdown(一种拿 #* 做排版标记的轻量写法, 网上文档里遍地都是)、别带链接、别提某日期之后的事。 业界真实应用的系统消息里,这种「该做/不该做」能列一长串—— 书里引了一张从 Bing Chat 套出来的指令表(代号 Sydney), 并特别注明:是否真是 Bing 生产用的提示词,未获证实7

写指令的三条经验法则,书是用「十诫」句式对比给的8:

  1. 说正,不说反。 「Thou shalt not kill」→「Thou shalt preserve life」;
  2. 给命令配个理由。 「…since the act of killing disrespects the other person's right to life」;
  3. 忌绝对化。 「…kill only rarely…and make sure it's really appropriate!」

对聊天模型,显式指令放系统消息——它被训练成最服从那里; 但没有任何模型百分百听话,指令只是强倾向,不是保险锁9

3.3 主走查第二段:例子教会的,比你说出来的多

另一种澄清是给例子——第 01 章说的少样本(few-shot)。 主走查开始: 造一个「读一句书评,猜打几分」的提示词, 里面放几个例子(书评 + 评分),最后留一句新书评等它打分10

模型从这几个例子里学到的东西,数一数:

评分是数字 ← 你说过吗?没有
格式是「评语:分数」换行分隔 ← 你说过吗?没有
分数是 1–5 的整数,越高越好 ← 你说过吗?没有
分布上 4 分 5 分居多,低分稀少 ← 你说过吗?你根本没想到这条

图说:一条隐式规则都没写,它全学走了。
写成显式规则试试:又长、又怕漏、有的你说不清(「我知道什么样是好,但说不出来」)。

这就是「隐式常常胜过显式」:模型有延续模式的强迫症, 模式里带的规矩,它执行起来比你明文规定的还稳。 例子还顺带定人设——例子里的评语刻薄,它就一路刻薄下去,而且每次都同样刻薄, 一致性白捡11

3.4 坑一:例子随上下文膨胀

例子的类型得跟主问题一致。可如果主问题本身拖着一大坨上下文呢?

书里的反例:推荐系统给每个用户都采集了冗长资料(人口统计、历史书评……), 你照着造了四个假用户当例子(For ${PersonA.name}, we know the following: ${JSON.stringify(PersonA)}…),再跟上真用户。 四段又长又相似的 JSON,加上一段更长的——窗口先爆,模型后晕12

为什么会晕?回到第 03 章的注意力游戏: 负责写答案的小脑们回头喊「谁有相关经验?」, 四段结构雷同的段落同时举手,答案看起来全都像—— 它分不清哪段是例子、哪段是正题13

把例子缩短?短例子会把它往「浅薄的匹配」上引,而且信息量比主问题少太多, 学不到东西。例外:只澄清「输出长什么样」时,小例子就够使—— 这是少样本最划算的用法14

3.5 坑二:锚定——例子会替你预设立场

锚定——先看到的信息会不成比例地影响后续判断,人如此,模型也如此。

书里两组对照实验(都是 text-davinci-003 的真实输出)15:

  • 问「某个名字听起来像哪个年代的人?」—— 例子里全是二十世纪初的名字,它答二十世纪初; 例子全换成二十一世纪初的,同一个名字,它改答二十一世纪初;
  • 「猜评分」的例子改成 1、2、3、4、5 分各来一个——看起来很公平, 但真实分布里 5 分占绝对多数。没有线索时,它按「均匀」猜 3, 而无所知的正确猜法是 5。

要点:例子不只教格式,还偷偷运输了一个「什么算正常」的概率分布。 对策有三:例子尽量贴近真实分布(有真实样本就抽样,别手编); 主要类别都要覆盖;边界案例一定要给——不给,它遇到边界时只能乱猜16

3.6 坑三:它会从例子里学出你没想教的东西

三个数字按升序出现的概率是多少?17%(降序也是 17%)。 十个数字纯靠运气排成完美有序,概率比被雷劈死还低—— 所以例子很少时「碰巧有序」是常态,而模型会把「序」当成要学的东西17

更常见的是你亲手造的序:「顺利的例子在前,出错的在后」—— 你按这个顺序收集例子,天经地义;它学到的是「主问题八成也会出错」, 于是对新问题莫名悲观。书里的演示:同一道逻辑题, 例子按「先顺后错」排,它答「无解」;打乱顺序,它就答出(一个错的)解了18

对策:例子的顺序有意识地打乱;更系统的做法是拿评估来选例子、排顺序—— 书里点了 DSPy 这类自动优化框架的名(第 12 章会再遇到)19

什么时候干脆别用例子? 书里给了明确的回答: 任务对模型来说本来就清楚,就别放—— 例子拉长提示词,还把上面三个坑全引进来20

3.7 动态上下文的三把尺子

动态料是请求来了才取的,多了三条静态料没有的约束21:

尺子一:延迟预算。 触发方式决定你能花多少时间取料:

触发方式例子紧迫度能用的取料策略
用户不在场/一次性批处理邮件摘要助手慢慢取,没人催
用户点一下、等一下图书推荐几秒为限,多轮调用基本出局
用户正在操作、自动响应打字时的代码补全每浪费一毫秒,用户可能已经敲下一个字

尺子二:可预备性。 变得慢的料(用户画像)可以提前备好; 极度赶时间的应用,值得投机预取——猜你等下要用,现在就先取着。

尺子三:可比较性。 收料的原则是「先头脑风暴地全收,再筛」—— 第 08 章组装时要砍,砍的前提是料与料能比: 这条比那条更有用吗?这条依赖那条吗?这条作废那条吗? 给每条料打个分,是最省事的比法; 静态料也要打(通常打最高分——上下文再重要,也没有「让模型听懂题」重要)22

3.8 去哪找上下文:一张脑图,两把梳子

办法一:画脑图。 把问题写在中间(「下一本读什么?」), 逐个词往外变:「我」是谁(画像、历史)?「读」过又怎样(喜欢吗)? 「下一本」换成「别人都在读什么」?——能长出一树的候选上下文, 再按可行性划掉够不着的23

办法二(作者说他们自己常用):不问「想要什么」,先问「能拿到什么」。 两把梳子,把能拿到的料各梳一遍24:

  • 按距离梳:① 应用指尖上的(屏幕内容、当前时间)② 已存下的(用户资料) ③ 能自己记录的(历史行为)④ 公开 API(天气)⑤ 要用户授权的(购买记录、邮件)。 越远越难拿,要越值钱才值得拿;
  • 按稳定性梳:① 恒定(画像)② 慢变(购买历史)③ 瞬态(当前会话——这一轮谈话的活状态)。 越不稳越难预取,延迟问题越难解。

两把梳子梳完,先实现最显然的源, exotic 的留给成熟期。

4. 作者的判断与证据

有硬证据的:

  • 锚定、假模式两组对照,都是 text-davinci-003 的真实补全,书里带截图1518;
  • 「4 字符一标记」式的工程口径之外,作者明确说「按能拿到什么来梳」 是他们自己项目里实测有用的方法24

作者明确标注存疑的:

  • Bing/Sydney 指令表:书里原话「是否与 Bing 实际使用的提示词一致,未获证实」7;
  • 「隐式胜过显式」是经验法则,作者自己马上用三个坑来平衡它—— 这一节的完整结论其实是「威力大,但要评估着用」20

判断(我们的,不是书里的): 「静态/动态」这条分界,表面是内容分类, 实质是部署节奏分类:静态料跟着代码走(改一次发一版), 动态料跟着数据走(取了就用)。把它当部署节奏看,很多纠结自动解开—— 「这句话该写死还是该取?」变成「它变了我要不要发版?」 如果错,会错在: 如果应用把「动态取来的规则」再缓存成准静态, 分界又会模糊——但那时决定因素仍然是「变更走哪条管道」,判断方法不变。

5. 边界与局限

  • 「说正不说反」等三条是经验法则,不是定律—— 书里给的形态是「rules of thumb」,不同模型的服从度差异很大,要拿自己的评估验;
  • 锚定的对策只能减轻、不能根除——作者明说「不锚定是不可能的」, 例子天然携带分布;
  • 动态料的「打分」本章只立了规矩,打分的细化(优先级层、token 长度折算) 在第 08 章;
  • RAG(检索增强:先查资料再塞给它,见第 07 章)与摘要是动态料最大的两个源,本章只点到。

6. 可带走的

主走查一行回顾:「下一本读什么?」→ 澄清句是静态、《白鲸》是动态、 「不要自助书」看出身 → 评分例子里,模型白学走格式+分布+人设 → 同一任务,例子摆法三种,模型行为三种——例子不是装饰,是程序。

  1. 静态管「什么任务」,动态管「这一次」;分边看文字出身,不看文字本身;
  2. 程序化调用里,一次误解 = 一次失败——澄清就是一致性,一致性就是信任;
  3. 显式指令:说正、给理由、忌绝对;放系统消息,但别指望百分百服从;
  4. 例子教隐式规则:格式、分布、人设,一样不少——写不出来的规矩,让例子说;
  5. 三个坑:膨胀、锚定、假模式;主问题上下文多时,例子只澄清输出格式;
  6. 例子运输分布:贴近真实分布抽样,边界案例必须给;
  7. 例子顺序要刻意打乱——「先顺后错」会教它对新问题悲观;
  8. 任务本来就清楚,就别放例子——它不是必修课;
  9. 动态料三把尺:延迟、可预备、可比较;每条料都打分,静态料也打;
  10. 找料先画脑图,再按距离和稳定性各梳一遍

7. 原文地图

主题原书章原文位置
推荐引子、静态/动态分界Chapter 5text/08-ch05-chapter-5-prompt-content.txt:14(搜「Moby Dick」) · :60(搜「not always cleanly separated」)
澄清与一致性Chapter 5text/08-ch05-chapter-5-prompt-content.txt:90(搜「Clarification creates consistency」)
Sydney 指令表、三条法则Chapter 5text/08-ch05-chapter-5-prompt-content.txt:102(搜「Marvin von Hagen」) · :136(搜「Thou shalt not kill」)
少样本与隐式规则Chapter 5text/08-ch05-chapter-5-prompt-content.txt:154(搜「few-shot prompting」) · :204(搜「I know it when I see it」)
坑一:膨胀Chapter 5text/08-ch05-chapter-5-prompt-content.txt:219(搜「JSON.stringify(PersonA)」)
坑二:锚定Chapter 5text/08-ch05-chapter-5-prompt-content.txt:266(搜「anchoring」) · :289(搜「most common number of stars」)
坑三:假模式Chapter 5text/08-ch05-chapter-5-prompt-content.txt:330(搜「17%」) · :342(搜「happy path first」)
三把尺子Chapter 5text/08-ch05-chapter-5-prompt-content.txt:393(搜「every millisecond matters」) · :434(搜「give every item a score」)
脑图、距离、稳定性Chapter 5text/08-ch05-chapter-5-prompt-content.txt:455(搜「mind map」) · :483(搜「proximity」) · :503(搜「stability」)

Footnotes

  1. 出处:「Chapter 5. Prompt Content」第 3-11 段(text/08-ch05-chapter-5-prompt-content.txt:5,搜「collaborative filtering」)。

  2. 出处:「Chapter 5. Prompt Content」第 12-29 段(text/08-ch05-chapter-5-prompt-content.txt:14,搜「Moby Dick」)与(:27,搜「messy textual information」)。

  3. 出处:「Chapter 5. Prompt Content」第 46-48 段(text/08-ch05-chapter-5-prompt-content.txt:46,搜「static content」)。

  4. 出处:「Chapter 5. Prompt Content」第 48-59 段(text/08-ch05-chapter-5-prompt-content.txt:51,搜「not what kind of textbook」)。

  5. 出处:「Chapter 5. Prompt Content」第 60-74 段(text/08-ch05-chapter-5-prompt-content.txt:60,搜「not always cleanly separated」)。原文:「The answer depends on the exact way you build your application.」

  6. 出处:「Chapter 5. Prompt Content」第 81-94 段(text/08-ch05-chapter-5-prompt-content.txt:90,搜「Clarification creates consistency」)。原文:「misunderstandings often lead to complete failure」。

  7. 出处:「Chapter 5. Prompt Content」表 5-1 及引言(text/08-ch05-chapter-5-prompt-content.txt:100,搜「has not been confirmed」)。提取者是 Marvin von Hagen。 2

  8. 出处:「Chapter 5. Prompt Content」第 133-143 段(text/08-ch05-chapter-5-prompt-content.txt:137,搜「Thou shalt not kill」)。

  9. 出处:「Chapter 5. Prompt Content」第 145-149 段(text/08-ch05-chapter-5-prompt-content.txt:149,搜「perfectly compliant」)。

  10. 出处:「Chapter 5. Prompt Content」第 185-200 段(text/08-ch05-chapter-5-prompt-content.txt:190,搜「the likely rating」)。书评来自 Kaggle 的亚马逊书评数据集。

  11. 出处:「Chapter 5. Prompt Content」第 177-184 段(text/08-ch05-chapter-5-prompt-content.txt:177,搜「compulsion to continue patterns」)与(:181,搜「grumpy reviewer」)。

  12. 出处:「Chapter 5. Prompt Content」第 210-235 段(text/08-ch05-chapter-5-prompt-content.txt:219,搜「JSON.stringify(PersonA)」)。

  13. 出处:「Chapter 5. Prompt Content」第 241-250 段(text/08-ch05-chapter-5-prompt-content.txt:241,搜「attention game」)。原文:「very similar sections are shouting very similarly formed possible answers—and they all seem like they might fit」。

  14. 出处:「Chapter 5. Prompt Content」第 251-263 段(text/08-ch05-chapter-5-prompt-content.txt:258,搜「output format」)。

  15. 出处:「Chapter 5. Prompt Content」第 265-297 段(text/08-ch05-chapter-5-prompt-content.txt:266,搜「anchoring」)与(:275,搜「early 20th century」)、(:289,搜「most common number of stars」)。 2

  16. 出处:「Chapter 5. Prompt Content」第 309-319 段(text/08-ch05-chapter-5-prompt-content.txt:312,搜「edge case」)。

  17. 出处:「Chapter 5. Prompt Content」第 321-335 段(text/08-ch05-chapter-5-prompt-content.txt:330,搜「17%」)与(:332,搜「struck by lightning」)。脚注 2:美国居民被雷劈死概率约 1/100,000,而十个数完美有序是 1/1,800,000。

  18. 出处:「Chapter 5. Prompt Content」第 336-354 段(text/08-ch05-chapter-5-prompt-content.txt:342,搜「happy path first」)。作者注明:这类谜题本来就不该裸问,得用第 8 章的思维链。 2

  19. 出处:「Chapter 5. Prompt Content」第 356-361 段(text/08-ch05-chapter-5-prompt-content.txt:359,搜「DSPy」)。

  20. 出处:「Chapter 5. Prompt Content」第 362-373 段(text/08-ch05-chapter-5-prompt-content.txt:371,搜「feel that you have to use」)。 2

  21. 出处:「Chapter 5. Prompt Content」第 388-420 段(text/08-ch05-chapter-5-prompt-content.txt:393,搜「every millisecond matters」)与表 5-2(:399,搜「effects of different triggers」)。

  22. 出处:「Chapter 5. Prompt Content」第 421-449 段(text/08-ch05-chapter-5-prompt-content.txt:434,搜「give every item a score」)。原文:「All context is optional, and you need to quantify how optional each bit is.」

  23. 出处:「Chapter 5. Prompt Content」第 455-470 段(text/08-ch05-chapter-5-prompt-content.txt:455,搜「mind map」)。

  24. 出处:「Chapter 5. Prompt Content」第 471-514 段(text/08-ch05-chapter-5-prompt-content.txt:471,搜「found useful ourselves」)与(:483,搜「proximity」)、(:503,搜「stability」)。 2