第 11 章 测试时计算:思维链与推理扩展¶
开场问题:同一个模型、同一道题,让它先写三千 token 再回答,准确率能高一大截。这些 token 到底提供了什么?模型真的在"思考"吗?
11.1 为什么多生成 token 就能算对更难的题¶
一次前向里,模型对每个 token 做的计算量是固定的:L 层,每层宽度固定。这是一个常数深度的电路。如果一个问题本身需要的串行步骤超过 L,单次前向连放中间结果的地方都没有。
生成中间 token 改变了这件事。每写出一个 token,它就进入下一步的输入,成为下一次前向可以读取的状态。于是 token 序列变成了模型的外部工作内存,生成长度变成了可变的计算深度:一次前向是固定深度,n 个 token 的思维链约等于把 n 次固定深度的计算串起来。
这个视角一旦建立,很多现象就不需要死记:
- CoT 买的是串行计算步数,不是知识。 知识缺失的问题想一万个 token 也变不出事实,这正是 RAG 不能被 CoT 替代的原因。
- 收益集中在"多步、可分解、有中间状态"的任务:多位数运算、多跳推理、模拟执行、约束求解。
- 一步就能查到答案的题,长 CoT 只增加成本和出错机会。
理论侧有相应结果(常数深度 Transformer 的表达能力有明确上界,允许足够长的中间步骤后能力类显著变大),不必记定理,记住"深度换长度"这个交换即可。
11.2 三种 CoT,别混成一个词¶
提示出来的 CoT:few-shot 给几个带推理过程的例子,或 zero-shot 加一句"一步步想"。它不改变权重,只是把概率质量引向带中间步骤的输出分布。对没做过推理训练的基座模型效果显著;对现代推理模型,这句话作用很小,甚至会干扰它自己的思考格式。
训练进去的 CoT:用带推理轨迹的数据做 SFT,模型学会该展开时展开。形态取决于示范数据,通常比较像人写的解题过程。
RL 长出来的 CoT:第 10 章那条线。奖励只看最终结果,模型自己发现"多试几种、中途自检、错了回头"能提高正确率,轨迹于是自然变长,并涌现出验证、换方法、承认错误这些行为。它不是在模仿人怎么写解题步骤,而是在优化"怎样更可能答对"——所以读起来常常不像教科书解答,会有大量自言自语和反复。
三者的产物都是"一段思考文字",但可控性、长度分布和失败方式完全不同。讨论"CoT 有没有用"之前,先说清是哪一种。
11.3 测试时扩展的两个方向¶
串行:让单条轨迹更长。收益来自更多中间状态和自我修正,代价是延迟线性增长,且超过某个长度后边际收益递减甚至转负(想太久把对的改错)。
并行:采样 N 条独立轨迹再聚合。
- 多数投票(self-consistency):答案可归一化时最简单有效,不需要额外模型。
- Best-of-N + 验证器:有可靠 verifier(测试、检查器)时远好于投票;换成奖励模型打分则受 reward hacking 影响。
- 两者的天花板都是 pass@N:正确答案至少要被采到一次。
两个方向可以组合,但预算是相乘的。这里要建立一个硬习惯:报告准确率必须带 token 预算。"多想一倍换两个点"和"多花十倍算力换两个点"是完全不同的结论。真正有意义的产物是一条 accuracy-vs-token 曲线,单点准确率在测试时扩展的语境下几乎没有信息量。
11.4 谁来决定想多久¶
- 固定预算:简单,但简单题浪费、难题不够。
- 可控档位:把 reasoning effort 暴露成 low/medium/high,由调用方按场景选,是目前主流产品做法。
- 自适应:模型自己判断该不该展开。训练上通常要在 reward 里加长度惩罚,或用难度条件化,否则 RL 会单调地把轨迹推长。
- 预算强制:到上限就注入"因此,答案是"逼它收尾;反过来在它想停时注入"等一下"逼它继续。粗暴但有效,属于推理时旋钮,不是训练方法。
工程上必须有硬上限。没有上限的思考在生产里会变成不可控的成本和延迟长尾——一个请求烧掉三万 token 的事故,几乎都是这么来的。
11.5 思考区与回答区必须分开¶
现代推理模型把输出分成 thinking 段和 answer 段,用特殊 token 界定。这不是显示层的美化,涉及三件实打实的事:
- loss 和 reward 的作用范围:thinking 段通常不要求格式、不给用户看;answer 段要严格遵守 schema。训练时两段的监督方式不同。
- 多轮上下文怎么带:上一轮的 thinking 通常不放回下一轮。否则上下文迅速爆炸,而且模型会被自己上一轮的草稿带偏。这条直接影响第二册的前缀缓存——丢掉 thinking 意味着历史前缀被改写,命中率和缓存键都要重新设计。
- 给不给用户看:展示思考有透明度价值,但会暴露中间错误、也更容易被人蒸馏走,很多产品折中成只给摘要。
训练数据里如果 thinking 和 answer 混在一起不加标记,模型会在最终答案里继续碎碎念。这是长 CoT 微调最常见的翻车方式。
11.6 CoT 不等于模型真实的计算过程¶
写出来的推理是一段被采样的文本,它和模型内部真正决定答案的计算不是一回事。有个已被反复观察到的现象:在提示里埋一个无关线索(比如暗示某个选项是对的),模型的答案会被它带走,但推理文字里会另外编出一套看起来合理的理由,完全不提那个线索。
两个直接后果:
- 不能把 CoT 当作可靠解释交给用户或监管。它是模型的一种行为,不是它决策过程的证明。
- 过程监督要非常小心。奖励"看起来合理的推理",训出来的是更会写理由的模型,不是更会算的模型。这正是 10.6 节说 PRM 有风险的根源。
可信度排序始终是:可执行的中间状态(代码跑通、检查器接受、工具返回)> 结构化可验证步骤 > 自然语言推理文本。
11.7 失败形态与监控¶
- 过度思考:简单题写几千 token 反复确认,甚至把对的答案改错。
- 思考不足:难题上过早收敛到第一个想法。
- 反复横跳:在两个候选之间来回摇摆,不收敛。
- 假验证:写"让我验算一下",然后编一个通过的验算。
- 语言漂移与退化重复:长思考中混入其他语言或陷入循环,RL 训练里常见,通常要专门加惩罚。
该监控的不只是平均思考长度,还包括:长度的整条分布(尾部才是成本来源)、答案在思考中被改变的次数、每个正确答案的 token 成本,以及按难度分层的"长度—正确率"关系。只看均值会完全错过过度思考。
11.8 把长 CoT 蒸馏进小模型¶
这是目前小推理模型最主流的来源:用强推理模型在一批可验证的题目上生成长轨迹 → 只保留最终答案正确的 → 拿这些轨迹做 SFT。
四个决定成败的细节:
- 必须按结果过滤。答案对但过程胡来的轨迹会教出"看起来在推理"的模型;条件允许时再叠加过程检查。
- 要保留失败恢复。如果只留一次做对的干净轨迹,学生遇到自己的错误状态时不知道怎么回头——它从没见过"错了再纠正"长什么样。
- 长度要匹配学生容量。小模型学不动几万 token 的轨迹,通常要按难度分档或做压缩。
- tokenizer 不同就只能做文本蒸馏,做不了下一章要讲的分布蒸馏。
必须说清的局限:蒸馏出来的小模型在目标分布上接近教师,但在分布外和真正需要探索的新问题上明显更弱。它复制的是已经找到的解题模式,不是找到解法的能力。 常见配方因此是两段——先蒸馏拿到推理格式和习惯,再用少量 RLVR 在目标领域继续拉。
11.9 它如何改变另外两册的账¶
- 第一册:CoT 把每个请求的 decode token 数放大一到两个数量级。KV 显存、长上下文、投机解码、MTP 的价值全部随之上升——第 13、14 章那些架构选择的性价比是被这条线重新定价的。
- 第二册:线上推理和 RL rollout 的 decode 长度暴涨,调度、KV 管理、PD 分离的账要重算;训练侧生成耗时进一步压过反向传播。
- 第三册:它是被 SFT 和 RLVR 训出来的行为,也是需要被评测、被预算约束的对象。
核心问答¶
Q:CoT 为什么能提高准确率? 它把固定深度的一次前向,变成可变长度的多次串行计算,中间 token 充当外部工作内存。它增加的是计算步数,不是知识。
Q:对现代推理模型还需要写"一步步思考"吗? 通常不需要,甚至有害。这类模型已经把思考训进了默认行为,额外指令可能干扰它自己的格式。
Q:串行想更久和并行采样多条,哪个更划算? 取决于有没有可靠验证器。有 verifier 时 Best-of-N 很强;没有时只能投票,且受 pass@N 上限约束。两者预算相乘,必须画 accuracy-vs-token 曲线来比。
Q:能把模型写出来的推理当作解释吗? 不能。已有明确证据表明推理文字可以与真实决定答案的因素脱节。它是行为,不是证明。
Q:蒸馏出来的推理小模型和 RL 训出来的差在哪? 差在分布外和探索能力。蒸馏复制已知解题模式,RL 才是在学怎么找解法。