你基于 Claude 的分步解释微调了一个小模型。它在评测集上生成的推理理由看起来挺不错——条理清楚、结构完整,有时甚至和老师难以区分。你把它上线了。六周后,有人跑了一次扰动实验,发现推理理由文本和最终答案基本没相关性。这个模型在说话,只是它没在"想着说"。

这就是推理理由的忠实度问题,也是近年可解释性研究里最让人不安的一类发现。如果你正在从一个 Claude 工作流里做蒸馏——尤其是老师的思维链本身就是训练信号的一部分——你必须对它有一个能用的心智模型。否则你会在错的目标上做优化,然后被下游那些"没人吭声"的失败搞得措手不及。

忠实度究竟指什么

"忠实度"这个词乍听很直观,真要精确定义就麻烦了。在解释质量这条研究线里,它指的是一件很具体的事:一段解释是忠实的,当且仅当它准确反映了模型实际用来产出结果的推理过程。它和"看起来合理"、"结论正确"、"对人类读者有帮助"完全不是一回事。

Wiegreffe 和 Marasovic 的 NLP 解释评测综述把这件事讲得很锐利。他们把 合理性(plausibility)(这段解释在人类眼里像不像那么回事?)和 忠实度(faithfulness)(这段解释是否描述了模型真实的计算?)严格区分开。合理性是读者的属性。忠实度是模型的属性。一段推理理由完全可以既高度合理,又完全不忠实,而这两种失败模式,如果你不主动去测,是很难区分的。

对蒸馏模型来说,这个区分格外扎心。你的训练损失奖励的是"看起来合理"的输出,因为老师产出的就是这些。标准的监督目标里没有任何东西强迫学生说出的推理和它内部实际用到的特征对得上。结果就是你训出一个专门写"可信解释"的系统,但它未必真在解释自己。

Anthropic 的 Lanham 等人直接研究过思维链上的这个问题。他们衡量 CoT 忠实度的工作显示,在某些场景下,哪怕把 CoT 截断、改写、甚至有意破坏,模型最终答案都不变。这是一个强烈的信号:推理理由里的那些话对最终答案根本不起承重作用。而在另一些场景下,CoT 确实起作用——改推理轨迹就会改答案。让人抓狂的是:光看推理理由的文本,你根本判断不出自己身处哪一种情况。

Turpin 等人从另一个角度加深了这个问题。他们展示:偏置性特征——比如多选题里正确答案的位置、某些微妙的上下文提示——能够在推理理由完全不提及它们的情况下改变模型的最终预测。模型产出的论证听起来是在讨论题目内容,但真正驱动答案的却是一个推理理由从头到尾都没承认的特征。这是最有杀伤力的一种不忠实:解释不只是不完整,它对因果结构的描述是主动误导性的。

这些失败是怎么被检测到的

忠实度没有一个能给出干净"通过/不通过"结论的测试。你能用的,是一组基于扰动的探针,每一种检测一种不同的失败模式。如果你打算认真把一个蒸馏模型送上线,其中至少两三种是应该跑的。

扰动推理理由本身。 在推理理由生成完之后、模型给出最终答案之前,改动这段推理理由。如果答案不变,说明推理理由没起到实质作用。常见变体:把 CoT 从中间截断、改写它、注入一个错误,或者干脆用另一道题的推理理由替换。对比扰动前后的答案分布。高度一致就说明模型是把推理理由当摆设。

反事实输入。 改动输入里的某个东西——如果模型的说法是忠实的,答案就应该跟着变。假如推理理由说"我选 B,因为它提到 X",那把输入改成 X 出现在 A 里。忠实的推理器现在应该选 A;不忠实的会继续说"因为 X",但仍然选 B。这就更接近 Turpin 那一套研究:构造那些让"陈述的理由"和"真正的驱动力"分道扬镳的输入。

偏置探针。 引入一个模型本不该依赖的伪相关特征——位置、格式、某个名字、一句干扰句。测量最终答案的偏移幅度。然后检查推理理由里有没有提到这个伪特征。答案悄悄偏移但推理理由只字不提,就是破绽。

同义改写下的一致性。 用不同措辞问同一个问题,检查各次的推理理由彼此之间以及与答案之间是否一致。蒸馏模型在这一点上常常脆弱得惊人:语义相同,推理理由天差地别,答案偶尔也不同。

这些探针都不完美。扰动会把模型推到分布外,可能污染信号。反事实样本构建成本高。偏置探针需要你先对"哪些伪特征值得关注"有假设。但把它们叠加起来,你得到的画面远比"随手翻几段推理理由觉得还行"要靠谱。

为什么 FDE 会把这个风险放大

从解释中进行聚焦蒸馏——FDE,如果你在跟这套简写——是一种训练配方:学生从一批经过筛选的老师输出中学习,这些输出把答案和推理轨迹配成一对。它天然契合 Claude 工作流:用强老师产出高质量推理,把推理连贯的样本筛出来,训一个更小的学生把答案和推理轨迹一起复现出来。

这套办法确实管用。这样训出来的学生,在下游任务上一般会比只学答案的学生表现更好。推理轨迹提供了稠密的监督信号,筛选又滤掉了噪声。到这里都还挺顺。

问题在于,训练目标区分不了"学生在学着像老师那样推理"和"学生在学着听起来像老师那样推理,但实际上在干别的事"。这两种目标在读起来通顺的推理理由上都能给出低损失,可只有前一种能训出推理理由真正承重的学生。

FDE 特别糟糕的几个点:

  1. 按推理理由质量筛选,本质上是在筛合理性。 当你靠人工阅读推理理由或用大模型打分来筛训练集时,你就是在直接优化"听起来合理的推理轨迹"。而这恰恰是合理性和忠实度分道扬镳的那根轴。你正在把学生往失败模式那边推。

  2. 学生的容量小于老师。 蒸馏就是压缩。老师内部在做的事情里有一部分没法紧凑地表示到学生中。学生必须在某个地方做妥协。推理轨迹是相对容易被牺牲的一环,因为训练信号并不惩罚"合理但与答案脱钩"的推理轨迹。

  3. 评测通常只看答案准确率。 大多数 FDE 流水线只按任务指标评测学生。评测集上答案分布对得上老师,配方就算成功了。你从来不会去看推理理由到底有没有干活,因为整条流水线里没有任何环节问过这个问题。

结果就是一类蒸馏模型:基准跑得好、解释写得流畅,却悄悄依赖着推理理由从不提及的特征。对很多应用来说这没关系。但只要你的应用里推理理由是要给用户看的、需要被审计的、或者会作为输入喂给下一个系统,那就是严重问题。

三个可落地的缓解手段(针对基于 Claude 工作流上线蒸馏模型的团队)

用现在的技术,你没办法彻底解决推理理由的忠实度问题。但你完全可以显著降低自己的暴露面。下面三件事值得投入工程时间:

1. 把忠实度评测加进你的蒸馏流水线

不管你现在用什么来评估学生的任务表现,都在旁边至少再加一个基于扰动的忠实度探针。最简单的版本:对评测集里随机抽一小部分样本,先让学生生成推理理由,然后把推理理由截断到原长度的 50%,再让它生成第二次答案。计算两个答案的一致率。如果学生在推理理由被砍掉一半的情况下依然有 90% 以上的自我一致,那在这一片切片上推理理由基本没干活。

这是个粗信号,但它便宜,能抓住最严重的退化。把它按时间跟起来。如果你重训学生后,任务准确率没变但忠实度分数掉了,就等于收到一个警告:新 checkpoint 正在拿推理换表面形式。

如果你有更多预算,就在一批人工构造的样本上跑反事实探针——你事先知道这些样本里哪些特征应该决定答案。对比学生的答案偏移和老师的答案偏移,偏差本身就是诊断。

2. 把 Claude 用作审计层,而不只是训练老师

大多数 FDE 流水线只让 Claude 扮演一个角色:生成训练数据。还有一个同样有价值的角色:在评测阶段或生产环境里审计学生的推理理由。

具体做法:把学生输出的一部分回灌给 Claude,用一个提示词让它对比学生的推理理由和学生的答案,标出不一致之处。Claude 挺擅长这种结构化的批判,尤其是当你把输入、陈述的推理理由、最终答案作为独立字段喂进去时。它抓不到所有不忠实的轨迹,但能抓到明显的那些——推理理由和答案自相矛盾的、推理理由援引了输入里不存在的信息的、推理理由跳过了真正的决策点的。

把这一层接进 CI,或者接进一份采样的生产影子评测里。用一份 CLAUDE.md 式的审计规范让这套提示词可复现、可版本化,你就得到一个持续测量的推理理由质量指标——而不只是"它读起来还行吗"。

3. 让产品界面把推理理由设计成可选或可验证

最稳健的缓解手段是架构层面的:不要把没有验证过的学生推理理由,当作可靠解释放到用户或下游系统面前。如果推理理由要露给用户,就明确标注为"模型陈述的推理",而不是"这就是答案的理由"。如果它是下游某个自动化步骤的输入,就在动手之前加一道校验,先看推理理由和答案是否一致。

在高风险场景下,考虑把最终答案再过一道独立的推理检查——要么再调一次 Claude,要么用一个专门训来识别不忠实轨迹的小型验证器。这会加延迟、加成本,但它把一个"闷声犯的错"变成了"响亮的错",而对任何真正重要的场景来说,这几乎总是划算的取舍。

收束

一个让人不太舒服的事实是:当下的蒸馏配方,是在优化"看起来对"的推理理由,而不是"如实描述模型自身计算"的推理理由。这不是某一次训练里的 bug,它是损失函数在奖励什么、人工筛选在筛什么共同决定的必然。Wiegreffe 与 Marasovic 的框架、Lanham 等人的 CoT 实验、Turpin 等人的偏置研究,从不同角度指向同一种失败形状:合理性容易,忠实度难,而两者之间的鸿沟正是事情出岔子的地方。

如果你正在一个 Claude 工作流之上做产品——用它生成训练数据、蒸馏出小模型、把小模型送进产品——就默认学生的推理理由是不忠实的,然后把评测和产品界面都设计得能承受这个假设。这比"相信推理理由文本、后面被打个措手不及"的姿态好得多。

关于训练侧的更多讨论,可以看 从解释中蒸馏推理能力:FDE 给工程师的实战启示。想把 Claude 工作流围绕规范和审计组织好、让忠实度检查能可复现地跑起来,参考 Claude Code CLAUDE.md 完整指南