Chapter 02

为什么有效,为什么脆弱

上一章把 6 类手艺当工具教了——这一章翻到背面,看 few-shot、思维链、自洽性各自为什么有效,以及所有提示为什么会突然失灵。这是把"会用"变成"理解"的一章,也是面试里最能拉开差距的一章。

本章你将建立的 schema

  • 能对同行讲清三个机制的名字与原理:few-shot = induction heads 的复制电路;CoT = 突破单次前向的串行算力;自洽性 = 让正确答案当"众数吸引子"。
  • 提示脆弱性的四个具体来源(格式 token 敏感、示例顺序、lost-in-the-middle、否定),以及各自的缓解和残留代价。
  • 一条会贯穿后面的判断:当前跑得顺 ≠ 真的可靠——哪些"顺滑"是假象。

2.0机制都长在同一个底座上

01 章那句"模型只做一件事——预测下一个 token"不是简化说法,而是本章所有机制的共同底座。三个让提示"显得智能"的现象,都是注意力机制在这个底座上的不同副产物,不是三种独立魔法。先看它们各自挂在哪里:

自回归预测 + 注意力 给定全部上文,对下一个 token 打分 few-shot induction heads 思维链 CoT 串行算力 自洽性 众数吸引子 同一底座的三种副产物
图 2.1三个机制不是三种独立能力,而是同一个"自回归 + 注意力"底座长出的三种副产物。 注意:理解了底座,你就能预测一个新技巧有没有效——它若不是在"改造上文让目标续写概率更高",多半没用。

2.1few-shot 的机制:induction heads

示例之所以"无需训练就生效",是因为模型里有一类注意力头实现了"看到 A…B…又看到 A,就预测 B"的模糊复制。

运行方式:Anthropic 的可解释性研究(Olsson 2022)在 Transformer 里找到了 induction heads(归纳头)——一类注意力头,专门实现 [A][B] … [A] → 预测 [B] 这种模式:它回头找"上一次出现当前 token 的地方",然后复制那时候紧跟其后的东西。few-shot 就是在喂这套复制电路:你给的"输入→输出"示例,被它当成"看到类似的输入结构,就复制类似的输出结构"。

苹果 红 香蕉 黄 苹果 ? ① 回看上一次的"苹果" ② 复制它后面跟的"红"
图 2.2induction head 干的事:回看当前 token 上一次出现的位置,复制那时紧跟其后的内容。 注意:它复制的是模式不是含义——这就是为什么 few-shot 主要传递"格式与任务身份",也是为什么把示例标签写反、输出往往照样可用。

一个会改变你看法的事实:induction heads 在训练早期会经历一次相变(phase change)——loss 曲线上出现一个短暂的小驼峰,而模型大部分的上下文学习能力,恰好在那一刻同时冒出来。这是 ICL ≈ 归纳头复制的强证据:能力不是渐渐学会的,是在某个点"接通"的。对你的实际意义:few-shot 是在调用一个早已成型的电路,不是在"现教"——所以示例的格式和任务信号,比示例的"正确答案"更重要。

表 2.1 · 让模型适配一个新任务的三种方式
方式优势代价 / 何时不选
zero-shot 指令零额外 token,最省;任务常见时够用格式/边界靠描述,模糊任务上不稳
few-shot(ICL)无需训练即可锁定格式与任务身份;改示例即改行为示例占 token、对顺序敏感;推理模型上多余甚至有害
微调(fine-tuning)把行为烧进权重,推理时零示例开销;适合海量稳定样本要数据、要训练、改一次贵;迭代慢
带来的代价

few-shot 的代价不只是占 token。它对示例顺序敏感(Lu 2022:同一组示例换个排列,性能能从接近 SOTA 滑到接近随机),而且这个 permutation variance 不随模型变大或示例变多而消失。所以"多塞几条示例求稳"经常是错觉——你只是增加了组合数。缓解见 §2.4。

2.2思维链的机制:突破单次前向的算力上限

中间推理 token 是把"一次前向放不下的串行计算"摊进输出的手段,不是解释。

运行方式:一次前向传播是固定深度的并行计算——理论上属于一个受限的计算类(TC⁰,固定深度电路)。很多问题(多位数乘法、多步逻辑)本质上需要串行步骤,单次前向算不出来。当模型把中间结果写成 token,下一步就能"读自己刚写的"继续算——于是串行步骤被摊进了一串可见 token,模型的有效算力突破了单次前向的上界(Merrill & Sabharwal 2023 给了这个表达力提升的形式化证明)。

涌现,不是线性提升:Wei 2022 测得在 PaLM-540B 上,GSM8K 小学数学题准确率从 18% 跳到 57%——但这种增益只在足够大的模型上出现。小模型加了 CoT 反而产出"读起来通顺、每一步都错"的推理链。这条解释了 01 章那句"小模型上几乎没用":它们连摊开的中间步骤本身都算不对。

表 2.2 · 让多步推理更准的三种做法
做法优势代价
直接答(greedy)最快最省,一次调用多步任务错误率高,错误直接落到答案
单条 CoT性价比拐点:一次调用换显著准确率提升更长的输出 = 更高延迟和 token 成本
自洽性(多条投票)更稳,见 §2.3N 倍计算成本
带来的代价 · 且会反转

CoT 拿延迟和 token 换准确率。但在推理模型上这笔账反转:它们已经把推理内置了,你再手动叫"一步步想"是重复劳动,反而会干扰它自己的思考路径、拉低结果。这是 2026 年最容易踩反的一条,03 章专门讲怎么判断。

2.3自洽性与分解:让正确答案成为众数

自洽性 = 对同一问题采样多条推理路径,再对最终答案取多数票。

运行方式:贪心解码只走一条路径,一旦这条路某步错了,答案就错。自洽性(Wang 2022)改成:用较高温度采样出多条不同的 CoT 路径,只对它们的最终答案投票。它有效的原因很优雅——正确的推理往往殊途同归到同一个答案,而错误各式各样地发散。所以正确答案是这堆采样结果里的"众数吸引子"。它不需要任何验证器或额外训练,纯靠无监督投票。GSM8K 上相比单条 CoT 再提升约 +17.9 个百分点。

问题 路径 A → 94.5 路径 B → 94.5 路径 C → 85 路径 D → 94.5 多数票 → 94.5 3 / 4 收敛于同一答案
图 2.3自洽性:采样多条路径,对最终答案投票。 注意:路径 C 错得"与众不同",被多数稀释;这套之所以work,靠的是"对的答案趋同、错的答案发散"这一统计事实,而非任何对错判断器。

分解(least-to-most)的机制:Zhou 2022 把难题先拆成由易到难的子问题,再依次解、把前一步答案带进后一步。每个子步都更容易落在模型的能力分布内,于是模型能从"见过的简单情形"泛化到"没见过的复杂情形"——在 SCAN 这类组合泛化任务上,准确率从 CoT 的约 16% 提到 99% 以上。这也解释了 01 章为什么把"拆成链"说成 Agent 的雏形:把控制权阶段性交还给程序,正是 03 章编排的核心。

想一想

自洽性靠"多数票"。如果一道题的错误答案恰好也高度一致(比如大家都掉进同一个陷阱),自洽性还有用吗?

展开答案(先停 10 秒)

没用,甚至有害——它会自信地投出那个一致的错误答案。自洽性的前提是"错误彼此发散"。当存在一个系统性偏差(提示诱导、训练数据偏见、一个所有路径都会踩的陷阱)让错误也收敛时,多数票只会放大它。

这是"当前表现≠真可靠"的一个具体形态:自洽性让你对答案更有信心,但信心和正确率在系统性偏差下会脱钩。要破,得靠独立视角(不同提示、不同模型)而非同质重复。

2.4为什么脆弱:提示是用一门不稳定语言写的程序

同一个意思,换个 token 级的写法,结果会天差地别——因为模型抓的是表层特征,不是你的意图。

前面三节解释了机制为什么有效。这一节是硬币的反面,也是把新手和老手分开的地方:同样这套机制,决定了提示天然脆弱。把提示当成"程序",但它是用一门不稳定的语言写的——同样的语义有无数种 token 写法,而模型对这些写法并非等价对待。四个具体来源:

来源一:token 级格式敏感

Sclar 2023 测得:仅仅把分隔符从 :: 改成 :、或多加一个空格这种语义无关的改动,能让 LLaMA-2-13B 在某些任务上的表现摆动多达 76 个百分点。根因正是机制本身:模型抓的是 token 级的表层统计特征,一个它在训练里见惯的格式触发了某条强通路,换个写法就没触发。

来源二:示例顺序

就是 §2.1 那条——Lu 2022,同一组 few-shot 示例的不同排列,能从接近 SOTA 滑到接近随机。且不随规模消失。

来源三:lost-in-the-middle

Liu 2023:把关键信息放在长上下文的不同位置,模型的检索准确率呈 U 形——开头和结尾的信息检索得好,中间的容易被"丢失"。根因是注意力的位置偏好(开头的 attention sink + 训练带来的近因偏置)。

高 低 检索准确率 开头 中间 关键信息的位置 中间被"丢失"
图 2.4关键信息放在长上下文的不同位置,检索准确率呈 U 形——两端好、中间塌。 注意:截至 2026,这个 U 形在部分前沿模型(如 Gemini 2.5)上已显著变平——它是旧长上下文训练的产物,不是物理定律。设计时仍按"重要信息放两端"更安全,但别当成永恒铁律。

来源四:否定与系统性偏差

就是 01 章那条——模型对"不要做 X"不敏感,且越大的模型在否定指令上反而越差(KAIST 的结果)。配合 §2.3 的系统性偏差,构成一类"你越自信、它越错"的陷阱。

表 2.3 · 脆弱性来源 → 缓解 → 残留代价
脆弱来源表现缓解残留代价
格式 token 敏感改个空格/分隔符,结果剧变固定模板;用评测集而非手感判好坏模板锁死后灵活性下降
示例顺序换排列性能大幅波动多种排列各跑几次取均值;平衡标签分布评测成本上升
lost-in-the-middle长上下文里中段信息被忽略重要信息放两端;检索更少、重排序需要额外的检索/重排逻辑
否定 / 系统性偏差"不要 X"无效;自信地集体犯错改正向描述;用独立视角而非同质重复提示更长;多模型成本
最危险的一条:temp=0 也不是确定的

很多人以为"设 temperature=0 就能拿到可复现的输出,用来写回归测试"。这是错的。Thinking Machines 2025 的研究显示,由于服务端批处理的非确定性(batch-invariance 缺失),同一个 temp=0 请求跑 1000 次,能得到约 80 种不同输出。结论:不要用 temp=0 当确定性来源;要稳,得在评测层面跑多次取统计,而不是假设单次可复现。

洞察 · 这一节真正想给你的

提示"在 playground 里跑顺了"几乎不能说明它在生产里稳。手感顺滑恰恰是脆弱性最爱藏身的地方——你试的那几个输入碰巧落在强通路上,换一批就塌。这条认知是 03 章 prompt ops 存在的理由:把"我觉得这提示挺好"换成"它在 200 条评测集上的通过率是 87%±3%"。能不能做出这个转变,是中级和高级工程师的分水岭。

2.5跨概念综合:给一个数学辅导 bot 选方案

把这一章和上一章的概念放到一个具体场景里掂量。场景:你在做一个面向中学生的数学解题辅导 bot,要求"答案要准、解释要清楚、调用成本要可控"。下面每个决策都牵涉多个机制:

  • 要不要 CoT?要。多步数学正是 §2.2 串行算力发挥作用的地方,而且"解释清楚"本身就需要把推理摊开——这里 CoT 同时服务了准确率和产品需求。
  • 要不要上自洽性?看预算。它能再提准确率(§2.3),但 N 倍成本。折中:只对模型"自己标记为不确定"或学生追问的难题开自洽性,普通题走单条 CoT。
  • few-shot 怎么配合?用 1–2 条示例示范解题格式(先列已知、再分步、最后框出答案),让 induction heads(§2.1)锁定输出结构——而不是用它去"教数学"。注意示例顺序敏感(§2.4),别堆太多。
  • 如果换成推理模型呢?上面三条要大改:CoT 触发语撤掉(内置了)、few-shot 解题示范反而拖低表现、自洽性的位置让给模型自带的思考预算。这正是 03 章要展开的"换底座就要换打法"。

§本章 self-check

先合上教程作答,写完再展开对照。

  1. 用 induction heads 解释:为什么 few-shot 里示例的"格式"比"标签对错"更重要?
  2. 从计算复杂度的角度,一句话说清思维链到底买到了什么。
  3. 自洽性在什么情况下会失效,甚至放大错误?
  4. (跨机制综合)有人说"我把提示在 playground 调到 temp=0、跑了 5 次都对,所以它可靠"。指出这句话里的两个错误,各对应本章哪个结论。
答案(先做完再展开)
  1. induction heads 做的是"回看上一次出现的模式并复制其后续",复制的是结构不是含义。所以示例传递的主要是"任务身份 + 输出格式",格式信号强、标签内容弱——标签写反往往不影响输出。
  2. 突破了单次前向(约 TC⁰,固定深度)的算力上限:中间 token 让模型把串行计算摊进输出,能算出单次前向算不出的多步结果。
  3. 当错误答案也系统性地收敛(共同陷阱、训练偏见、提示诱导)时失效——多数票会自信地投出一致的错误。它的前提是"错误彼此发散"。
  4. 错误一:temp=0 不保证确定性(服务端 batch-invariance,1000 次能有 ~80 种输出,§2.4)。错误二:playground 上 5 次都对说明不了可靠——脆弱性最爱藏在手感顺滑里,那几个输入可能碰巧落在强通路上(§2.4 洞察)。可靠性要在评测集上用统计说话。
进阶挑战 · 刚好够不着

给"格式敏感 76 分摆动"设计一个不被它坑的工作流

已知同一语义的提示换个 token 写法,性能会摆动几十分。请设计一个让你不会被这种摆动悄悄坑到的最小工作流——它至少要回答:你怎么知道一次"无害的措辞微调"没有让线上质量掉了 20 分?这个工作流和 §2.4 洞察里那句"87%±3%"是什么关系?

提示(卡住再展开)

核心是:任何提示改动(哪怕只是改个标点)都必须过同一个固定评测集,比较改动前后的通过率和置信区间,而不是靠"读着顺"。这就把"提示"纳入了和代码一样的回归测试。这套东西有个名字叫 prompt ops,是 03 章 §3.7 的主题——你刚刚自己推导出了它存在的理由。