提示工程 — 不动参数,把能力「问」出来
这一章讲三件事: 一个好提示的内部结构(四要素、四原则——一份能带走的 实战清单); 上下文学习(ICL):示例怎么选、怎么排,以及它为什么不动参数也能「学会」; 思维链(CoT):基本形、增强招、树与图的扩展,和一场还没打完的机制之争。 主走查: 拿原书的网球算术题,看同一道题在三种问法下被怎么解开。
1. 一个提示的四个零件,和一道题的三种问法
微调一次要花掉几台服务器(第 06、07 章的账),而提示—— 就是你发给模型的那段话——改起来不要钱。提示工程就是把这段话当工程对象来设计。 原书把一个提示拆成四个要素1:
| 要素 | 干什么 | 书里的例子 |
|---|---|---|
| 任务描述 | 说清要干什么、输出什么格式 | 「你是程序员,补全这段代码」;找不到答案就答「无法找到」 |
| 输入数据 | 题目本身;结构化数据要转成文本(表格线性化、图转代码) | 学生成绩表转成「学号 姓名 分数」的文本行 |
| 上下文信息 | 外挂的参考资料、示例 | 检索来的文档;几个「问题+答案」示例 |
| 提示策略 | 怎么问的技巧 | 「Let's think step by step」;「你是这个领域的专家」;拆成多轮 |
主走查:一道题的三种问法
拿原书反复使用的算术题(例 10.3/10.5,数字都是书里的),看四个零件怎么组装出三种完全不同的问法2:
题目:「Roger 有 5 个网球,又买了 2 罐,每罐 3 个。现在有几个?」(答案 11)
问法 ① 裸问:直接把题目丢过去。模型直接给答案。
—— 简单题行;题一难,它「脱口而出」就容易错。
问法 ② 给示例(ICL):先给一道带答案的样例题,再给真题——
「Question: Roger has 5 tennis balls... Answer: 11.
Question: 袋子里有 16 个球,一半是高尔夫球,其中一半是蓝色。
蓝色高尔夫球有几个?」
模型照示例的格式回答。示例教的不是答案,是「这任务长什么样」。
问法 ③ 给思维链示例(CoT):示例的答案里带中间过程——
「Answer: Let's think step by step. 先有 5 个,2 罐 × 3 = 6 个,
5 + 6 = 11,所以答案是 11。」
模型学着把中间步骤也写出来:16 的一半是 8,8 的一半是 4,答案是 4。
图说:同一道题,①靠直觉,②靠模仿格式,③把推理过程显式摊开。
③就是第 02 章「逐步推理」那种涌现能力的调用方式。
2. 四条设计原则(实战清单)
原书从各家实践里汇总了四条原则,每条配了一串操作建议,我们挑出最顶用的3:
- 任务目标说清说细:多说「该做什么」,少说「别做什么」; 限制输出长度用「Question: Short Answer:」这类格式后缀; 选择题就约束输出空间;排序任务别让它重写全文,给选项编上 ABCD 让它只输出排好的编号;
- 拆成子任务:复杂任务写明中间步骤编号;有个「单提示版树思考」咒语值得一记—— 「想象三位专家各自写一步,互相传看,谁发现自己错了就退出」; 让它下结论前先自查(「检查一下上面的解法对不对」);
- 给示例:少样本——只给几个例子,与「一个例子都不给」的零样本相对; 示例的顺序影响很大,问题放开头还是结尾也有影响; 实在没有示例,让模型自己生成一批再用;
- 用模型喜欢的格式:###、三引号、XML 标签划重点; 英文指令普遍更好,非英语任务可以先翻译再问; 数学题用 python 代码风格的提示更有效。
3. 自动优化:把「写提示」也变成任务
手写提示费经验,而模型对措辞又敏感,所以「自动找好提示」本身也成了一个研究方向。 离散提示(自然语言写的)有四条优化路线4: 梯度法(AutoPrompt:把提示位填上 [MASK],按梯度逐位替换成最好的词—— 要跑大量前向反向,慢);强化学习法(把「生成提示」当成 RL 任务,按任务成绩给奖励); 编辑法(预定义一批编辑操作——改任务描述、增删示例、换标签说法—— 迭代修改并小规模评测;只有 API、拿不到内部状态时,这是唯一可行的路); LLM 法(让一个模型当「提示工程师」:生成一批候选提示,目标模型挨个打分, 高分的留下再繁衍——要带历史记录防局部最优)。 连续提示(直接优化一串向量)就是第 07 章的前缀微调、提示微调那条线, 还有迁移学习(迁移学习:把在 A 任务上学到的东西搬到 B 任务)的玩法——在多个源任务上学好提示, 再按相关性加权组合给新任务用5。
4. ICL:示例的三套讲究与两种机制解释
上下文学习(ICL,第 01 章介绍的涌现能力)是提示工程的核心武器: 给几个示例,不动参数就会做新任务。它的效果由示例的三个属性决定6:
- 怎么选:按语义相似度选(用嵌入模型把候选示例和考题都变成向量, 挑最像的 k 个邻居)通常胜过随机选;但只挑「最像的」会让示例集趋同, 所以要掺多样性——用 MMR/DPP 这类「既要相关又要互不相同」的算法; 还可以让大模型给候选示例打分,甚至训一个分类器专挑好示例;
- 怎么排版:模板从简到繁有三档——只有输入输出、加任务描述、加思维链(§1 的三种问法); 模板也能让模型自动生成:手工写一小批种子模板,让模型给新任务仿写;
- 怎么排序:模型对示例顺序敏感(位置偏差),常偏好靠后的内容; 把与考题最像的示例放在最后。没有测试集时,可以用模型预测分布的熵 (第 11 章讲过:分布越集中熵越低)来评估哪个顺序好——熵低者胜7。
它为什么有用? 两种机制解释,原书并列给出8。表里两个词先说掉:梯度下降(训练时「顺着让损失变小的方向挪参数」的标准做法,这里只是类比)。
另一个是决策树(一种老派的规则分类器)。
| 解释 | 主张 | 证据 |
|---|---|---|
| 任务识别 | 示例只是帮模型「认出」这是预训练里学过的任务,然后调用旧知识 | 小模型(350M)只有这个水平 |
| 任务学习 | 模型能从示例里学到预训练没见过的新映射——前向计算里隐式地做了一次「模拟的梯度下降(训练时「顺着让损失变小的方向挪参数」的标准做法,这里只是类比)」,甚至能模拟决策树(一种老派的规则分类器) | foo/bar 实验 |
foo/bar 实验是这场争论的关键证据:把示例里的真实标签换成无关符号 (情感分析——判断一段文本是好评还是差评——的「正面/负面」换成「foo/bar」),模型没法再靠「认出任务」, 只能从示例里学全新的「什么样的文本叫 foo」。结果:大模型成绩掉得很少—— 它真能从示例里学新映射;小模型掉得多,它只会识别9。 训练侧也有结论:专门用「按示例预测」的元任务(MetaICL)训过的模型 ICL 更强; 预训练数据里多域混合、长程依赖丰富的,ICL 也更强10。
5. CoT:把中间步骤写出来,再谈树与图
思维链(CoT)把提示从「输入→输出」改成「输入→中间步骤→输出」。 零示例时一句咒语就能触发:「Let's think step by step」 (或「Take a deep breath and work on this problem step by step」)11。 三条增强路线12:
-
示例更复杂、更多样:挑步骤多、题干长的题做示例;或用 k-means (一种聚类(把样本按相似度自动分成 k 堆)算法)从每堆里挑一道代表题。 反直觉的一点:模型生成的示例思维链里有错也没关系,多样性本身就能摊薄错误的影响;
-
生成更稳:自洽性(第 09 章幻觉检测里的老熟人——同题采多条推理路径, 答案投票,多数胜出);或训练验证器:DIVERSE 练了两个裁判, 全路径裁判看「整条链 + 最终答案」打分,逐步裁判看每一步是否与正确路径重合;
-
结构更宽:链不够用就扩成树和图。思维树(ToT)允许每一步分多个叉, 给每个节点打「通向答案的置信分」,低分早剪枝——原书用 24 点游戏演示: 普通 CoT 走错了只能从头再来,树可以回溯换枝;思维图(GoT)更进一步, 任意节点可以互连——长数组排序演示里,它把数组分四组各自排、再归并, 子节点之间能交换中间结果13。
6. 机制之争:CoT 真正起作用的,可能不是「推理」
CoT 为什么有效,原书摆了三组研究,结论一个比一个反直觉14:
- 起源:训练数据里埋着「重叠的变量簇」——两个从不共现的概念, 也能通过一串中间变量关联起来;贝叶斯(以「按证据更新信念」著称的概率学派)网络 (一种表示变量依赖关系的概率模型)实验里, 不给中间变量时模型的条件概率预测偏差很大,给了就大幅下降—— 思维链有效,可能因为数据本身就是「链式关联」的;
- 扰动实验(最狠):把 CoT 示例拆成「符号」(题目里的数与实体)与「模式」 (公式与句式),分别做手脚。结果:公式写错几乎不影响成绩; 真正影响成绩的是「与问题相关、逻辑上连贯」。研究者的解读是—— CoT 里的符号与模式主要用来传达任务意图,而不是提供正确推理; CoT 是一种「把任务意图表达得更清楚」的增强版 ICL;
- 旁证:根本不给 CoT 提示,只在生成时保留那些「自己写出推理过程」的候选, 正确率也更高——中间步骤本身确实在帮忙,不只是格式安慰剂。
原书的态度是摆证据不下定论:CoT 的机制解释仍是开放问题。 这个「不确定」本身就是第 16 章(开放问题)的素材。
判断(我们的,不是书里的): 「公式写错不影响成绩」是全书提示部分最值得记住的实验。 它和第 02 章「涌现可能是尺子画出来的」是同一类警告: 我们以为机制是 A(模型在推理),实验说效果可能来自 B(任务意图被说清了)。 用 CoT 的正确姿势因此是:别迷信「步骤正确性」, 而要保证示例「与问题相关、前后连贯」——这是实验真正支持的东西。 如果错,会错在: 如果后续研究证明在数学等强逻辑任务上, 步骤正确性确实显著影响成绩(而不只是相关性),那「任务意图说」就高估了自己—— 目前(本书成书时)扰动实验的 证据站在「相关性」一边。
7. 作者的判断与证据
- 实验证据: foo/bar 实验9、MetaICL10、扰动实验14、24 点与长数组排序演示13, 均有原论文;
- 作者汇总的实践清单: 四原则与操作建议是原书从 OpenAI 文档与各论文里汇编的, 属于经验集而非实验结论3;
- 明确标为开放问题: CoT 的机制解释,原书只摆三组研究,没有下结论14。
8. 边界与局限
- 提示工程的全部技巧都假设「能力已在模型里」——它只是唤醒,不能注入 (与第 07 章指令微调同一条边界);
- 示例选择/顺序的收益因任务与模型而异,原书的方法多为启发式,没有通用最优解;
- 扰动实验主要在数学与常识任务上做,代码、多模态任务上「公式对错无关」是否成立未知;
- ToT/GoT 的多分支搜索成本数倍于普通 CoT,原书未给「何时值得上树」的量化判据;
- 本章(及原书对应章节)写于长 CoT 模型(o1/R1)爆发前夜—— 「让模型自己想久一点」内化为模型能力后,手工提示工程的一部分技巧会被吸进训练里(第 14 章)。
9. 可带走的
- 提示四要素:任务描述、输入数据、上下文信息、提示策略——写好提示是四件事不是一件事;
- 原则:说清目标(多说该做什么)、拆子任务、给示例、用模型喜欢的格式(###、英文、代码风);
- 只有 API 时用编辑法自动优化;「让 LLM 当提示工程师」已是成熟路线;
- ICL 三讲究:选(相似+多样)、排(最像的放最后)、评(没测试集就看熵);
- 两种机制:小模型只会「识别旧任务」,大模型真能「学新映射」(foo/bar 实验);
- CoT 咒语:「Let's think step by step」;示例要复杂多样,有错也不怕;
- 自洽性:多条路径投票;验证器:全路径与逐步两种裁判;
- ToT 可回溯剪枝(24 点),GoT 任意互连(分组排序归并);
- 公式写错几乎不影响成绩——CoT 主要在传达任务意图;用 CoT 求「相关且连贯」,别迷信步骤正确;
- 提示工程的边界:它唤醒能力,不注入能力。
10. 原文地图
| 主题 | 原书章 | 原文位置 |
|---|---|---|
| 提示四要素 | 10.1.1 | text/55-ch10-01-10-1-basic-prompt.txt:11(搜「four key elements」) |
| 任务描述与输入数据例子 | 10.1.1 | text/55-ch10-01-10-1-basic-prompt.txt:17(搜「Unable to find the answer」) · text/55-ch10-01-10-1-basic-prompt.txt:29(搜「Zhang San」) |
| 上下文与策略 | 10.1.1 | text/55-ch10-01-10-1-basic-prompt.txt:41(搜「task demonstrations」) · text/55-ch10-01-10-1-basic-prompt.txt:55(搜「think step by step」) |
| 四条设计原则与建议 | 10.1.1 | text/55-ch10-01-10-1-basic-prompt.txt:75(搜「Clearly express the task goal」) · text/55-ch10-01-10-1-basic-prompt.txt:109(搜「three different experts」) · text/55-ch10-01-10-1-basic-prompt.txt:99(搜「indicators」) |
| 模型友好格式 | 10.1.1 | text/55-ch10-01-10-1-basic-prompt.txt:137(搜「XML tags」) · text/55-ch10-01-10-1-basic-prompt.txt:151(搜「python」) |
| 离散优化四法 | 10.1.2 | text/55-ch10-01-10-1-basic-prompt.txt:161(搜「AutoPrompt」) · text/55-ch10-01-10-1-basic-prompt.txt:165(搜「API-only」) · text/55-ch10-01-10-1-basic-prompt.txt:167(搜「Monte Carlo」) |
| 连续优化与 迁移 | 10.1.2 | text/55-ch10-01-10-1-basic-prompt.txt:173(搜「Prefix-tuning」) · text/55-ch10-01-10-1-basic-prompt.txt:175(搜「transfer learning」) |
| ICL 定义与公式 | 10.2.1 | text/56-ch10-02-10-2-in-context-learning.txt:11(搜「formatting function」) |
| 示例选择三法 | 10.2.2 | text/56-ch10-02-10-2-in-context-learning.txt:25(搜「k-nearest neighbors」) · text/56-ch10-02-10-2-in-context-learning.txt:27(搜「determinantal point process」) |
| 示例格式三档与自动生成 | 10.2.2 | text/56-ch10-02-10-2-in-context-learning.txt:47(搜「Answer: 11」) · text/56-ch10-02-10-2-in-context-learning.txt:103(搜「seed set」) |
| 顺序与熵评估 | 10.2.2 | text/56-ch10-02-10-2-in-context-learning.txt:109(搜「semantic similarity」) · text/56-ch10-02-10-2-in-context-learning.txt:111(搜「entropy」) |
| 训练侧影响(MetaICL/数据) | 10.2.3 | text/56-ch10-02-10-2-in-context-learning.txt:121(搜「MetaICL」) · text/56-ch10-02-10-2-in-context-learning.txt:123(搜「long-tail words」) |
| 识别 vs 学习与 foo/bar | 10.2.3 | text/56-ch10-02-10-2-in-context-learning.txt:127(搜「task recognition and task learning」) · text/56-ch10-02-10-2-in-context-learning.txt:133(搜「foo/bar」) |
| CoT 基本形与咒语 | 10.3.1 | text/57-ch10-03-10-3-chain-of-thought-prompting.txt:7(搜「Take a deep breath」) |
| 复杂化/多样化示例 | 10.3.2 | text/57-ch10-03-10-3-chain-of-thought-prompting.txt:19(搜「Complicated CoT」) · text/57-ch10-03-10-3-chain-of-thought-prompting.txt:21(搜「k-means」) |
| 自洽性与 DIVERSE | 10.3.2 | text/57-ch10-03-10-3-chain-of-thought-prompting.txt:27(搜「self-consistency」) · text/57-ch10-03-10-3-chain-of-thought-prompting.txt:29(搜「DIVERSE」) |
| ToT 与 GoT | 10.3.2 | text/57-ch10-03-10-3-chain-of-thought-prompting.txt:35(搜「24-point game」) · text/57-ch10-03-10-3-chain-of-thought-prompting.txt:39(搜「four groups」) |
| CoT 机制三研究 | 10.3.3 | text/57-ch10-03-10-3-chain-of-thought-prompting.txt:49(搜「overlapping」) · text/57-ch10-03-10-3-chain-of-thought-prompting.txt:51(搜「symbols and patterns」) |