对应 Maps to:CS486 课程描述的 “enhance LLM reasoning”——推理部分(第 3–7 讲)的最后一讲:模型能不能发现并改正自己的错误?它知道自己什么时候可能错吗? 依据说明:CS486 没有公开的日程或讲义。本讲依据自我纠错的主要文献来写:Self-Refine(Madaan et al. 2023)、Reflexion(Shinn et al. 2023)、CRITIC(Gou et al. 2024)、“LLM 还不能自我纠正推理”(Huang et al. 2024)、Tyen et al.(2024)、Stechly et al.(2024)、Kamoi et al.(2024)的综述、SCoRe(Kumar et al. 2024);元认知部分依据 Kadavath et al.(2022)、Xiong et al.(2024)等。§2–§5 的实验是本讲义自己设计的,数字全部来自配套代码的实际输出。 配套代码 Code:
code/lecture07/(PyTorch;3 个脚本 + 1 个模块;不需要训练新模型——复用第 1、4、5、6 讲的缓存;每个脚本 10 秒以内) 预计阅读时间:3 小时(含运行代码)
0. 本讲导航 · How to read this lecture
0.1 学习目标 Learning goals
学完这一讲,你应该能够:
- 把一次”自我纠错”拆成三件事:察觉(这个答案可能错了)、定位(错在哪里)、修复(换一个不同的、更好的做法),并说出每件事失败时会发生什么。
- 用一个四个参数的模型(检查的真 / 假阳性率、修复率、改坏率)判断纠错什么时候有用;解释为什么反复纠错会收敛到一个和初始准确率无关的不动点,为什么强模型对检查的假阳性率要求极高。
- 识别自我纠错评测里最常见的漏洞:用真实答案决定”何时停止修改”(Huang et al. 2024)。
- 区分内在反馈(模型自己)、外部反馈(工具、验证器、执行结果)和神谕反馈;区分二值反馈和定位反馈;知道哪一种在什么条件下有用。
- 评估一个置信度信号:区分度(AUC)、在控制表面特征(例如长度)之后的区分度、校准(ECE)、选择性回答;理解”察觉不对劲”和”能说出来”之间的差距。
- 说清为什么提示出来的自我纠错常常无效,而训练出来的纠错(SCoRe、推理模型的 RL)可以有效,以及训练时会遇到什么问题(分布偏移、行为坍缩)。
0.2 先修与本讲范围 Prerequisites & scope
| 默认你已经会 Assumed | 本讲不展开 Not covered |
|---|---|
| 第 4 讲:ORM / PRM-full 验证器;生成–验证的不对称;“走过头”是系统性错误 | 不确定性量化的统计理论(共形预测等,只提一句) |
| 第 5 讲:GRPO;RL 能修好”何时停下” | 智能体在环境里的反思与记忆(第 11 讲) |
| 第 6 讲:忠实性;监控器只看得见自己检查的那部分;无解的题 | 多智能体互相批评(第 13 讲的辩论) |
0.3 本讲地图 Map
§1 自我纠错为什么诱人、为什么难:察觉、定位、修复;反馈从哪里来
§2 一个四个参数的模型:什么时候有用;不动点;"对了就停"的评测漏洞 ← 代码 01
§3 文献:Self-Refine、Reflexion、CRITIC;批评与澄清(Huang、Stechly、Tyen)
§4 实验:二值反馈 vs 定位反馈;自己 vs 验证器 vs 神谕;瓶颈在哪里 ← 代码 02
§5 元认知:区分度、长度混淆、校准、选择性回答、察觉"无解" ← 代码 03
§6 训练出来的纠错:SCoRe;推理模型里的"等一下"
§7 再看生成–验证的不对称
§8 现状与开放问题
§9–13 小结、常见误区、练习、延伸阅读、下一讲预告
1. 自我纠错为什么诱人、为什么难 · Why self-correction is tempting, and hard
1.1 一个诱人的想法
人类做题时会回头检查:算完一遍,再验算一遍;写完一段代码,读一遍找 bug。如果模型也能这样,就不需要外部的验证器(第 4 讲)、不需要重新训练(第 5 讲),只要多给它几轮”再想想”的机会。2023 年的一系列工作似乎证实了这一点:Self-Refine 让模型生成 → 自我批评 → 修改,在七种任务上都报告了提高;Reflexion 让智能体在失败后写下”反思”并在下一次尝试中利用它,在 HumanEval 上报告了 91% 的 pass@1。
1.2 三件事都要做对
一次纠错要依次做对三件事:
| 环节 | 问题 | 失败时 |
|---|---|---|
| 察觉 detect | 这个答案可能错了吗? | 错的答案被放过(漏报),或者对的答案被怀疑(误报) |
| 定位 locate | 错在哪一步? | 不知道该改哪里,只能整个重来 |
| 修复 fix | 那一步该怎么改? | 改了还是错(重复原来的错误),或者把对的改成错的 |
任何一环做不好,纠错就可能无效甚至有害。第 6 讲已经看到了这三件事的一个影子:监控器能”察觉”思维链里的问题,但每种监控器只看得见一部分。
1.3 反馈从哪里来
Kamoi et al.(2024)的综述把自我纠错按反馈的来源分成三类,这个区分是理解整个领域的钥匙:
| 反馈来源 | 例子 | 可靠性 |
|---|---|---|
| 内在(intrinsic) | 同一个模型读自己的答案、给出批评 | 和生成共享盲点 |
| 外部(external) | 代码的执行结果、单元测试、搜索引擎、计算器、证明检查器、训练过的验证器 | 取决于外部工具,常常比模型可靠得多 |
| 神谕(oracle) | 用真实答案判断对错 | 评测时可用,真实使用时不存在 |
很多”自我纠错有效”的结论,其实来自外部反馈或神谕反馈。
2. 一个四个参数的模型 · When does correction help?
代码:01_when_correction_helps.py(只用标准库,不到 1 秒)。
2.1 一轮纠错
设当前准确率为 ,一轮”检查 → 修改”由四个概率描述:
- :答案错了时,检查发现它错了的概率;
- :答案对了时,检查却说它错了的概率;
- :被标为错的错误答案,修改后变对的概率;
- :被标为错的正确答案,修改后变错的概率。
一轮之后的准确率:
在 时(“修改”约等于重新猜一次),三种质量的检查器在不同初始准确率下的收益(演示 1):
| 检查器 | 初始 30% | 50% | 70% | 90% | 盈亏平衡点 |
|---|---|---|---|---|---|
| 弱(TPR 0.5,FPR 0.3) | +13.0 点 | +5.0 | −3.0 | −11.0 | 62.5% |
| 中(TPR 0.8,FPR 0.1) | +26.5 | +17.5 | +8.5 | −0.5 | 88.9% |
| 强(TPR 0.95,FPR 0.02) | +32.9 | +23.2 | +13.5 | +3.8 | 97.9% |
模型越强,可救的越少、可坏的越多。 同一个检查器,在弱模型上”有用”,在强模型上有害。这解释了文献里看似矛盾的结果:在模型本来就做得不好的任务上,自我纠错常常有提高;在模型已经很强的任务上(GSM8K 上的 GPT-4),它往往让结果变差。
2.2 反复纠错:不动点
每一轮都用同样的公式,准确率是一个线性递推,它的不动点
和初始准确率无关——它恰好就是上表的盈亏平衡点。蒙特卡洛(演示 2,20000 道题):弱检查器下,从 30% 和从 90% 出发,30 轮后都在 62.6–62.8% 附近(解析解 62.5%)。一个 90% 的模型被一个弱的自我检查”纠正”成了 62.5% 的模型。
2.3 “对了就停”:一个评测漏洞
如果纠错循环用真实答案决定何时停止——一道题一旦变对就不再修改——那么正确的答案永远不会被改坏,准确率只会单调上升。演示 3,同一个弱检查器:
| 初始 | 何时停止 | 1 轮 | 3 轮 | 10 轮 |
|---|---|---|---|---|
| 90% | 检查器决定(真实使用) | 79.1% | 68.4% | 63.0% |
| 90% | 真实答案决定(评测漏洞) | 92.6% | 95.9% | 99.4% |
同一个检查器,结论从”有害”变成了”大有帮助”。Huang et al.(2024,Large Language Models Cannot Self-Correct Reasoning Yet)指出,一些早期的自我纠错结果正是这样得到的:它们用正确答案判断”是否需要继续修改”。去掉神谕之后,内在的自我纠错在推理任务上常常让结果变差:在他们的表格里,GPT-4 在 GSM8K 上从 95.5% 降到 89.0%(第 2 轮),而用神谕决定何时停止时是 97.5%。
2.4 强模型需要多好的检查?
要让一轮纠错不亏,需要 (演示 4)。初始 90% 时,即使 TPR = 0.95,FPR 也必须低于 0.106;初始 99% 时要低于 0.010。对一个已经很强的模型,自我检查几乎不能对正确的答案起疑——而模型检查自己的答案时,误报和漏报恰恰难以控制。
这个模型假设检查和修复是独立的随机事件。真实系统里它们是相关的:同一个模型检查自己时,盲点和生成时的盲点重合;修复常常重复原来的错误。§4 在实验台上测量这四个量的真实值。
3. 文献:方法与批评 · Methods and critiques
3.1 三种代表性的方法
- Self-Refine(Madaan et al. 2023):同一个模型轮流扮演三个角色——生成初稿、对初稿写批评意见(feedback)、根据意见修改(refine)——重复若干轮。在写作、代码优化、对话等任务上提高明显(这些任务的”好坏”本来就有改进空间,而且批评不需要找出确切的错误)。
- Reflexion(Shinn et al. 2023):智能体在环境里尝试,失败后(失败信号来自环境,例如测试没通过)用语言写一段”反思”,存进记忆,下一次尝试时读它。关键在于失败信号是外部的。
- CRITIC(Gou et al. 2024):让模型调用工具(搜索引擎、代码解释器、计算器)来验证自己的输出,再根据工具的结果修改。工具提供了可靠的外部反馈。
3.2 批评
- Huang et al.(2024):在推理任务上,没有神谕时,内在自我纠错不能稳定地提高、反而常常降低准确率;模型更倾向于把对的改成错的。他们还指出,一些多智能体辩论的收益和”同样调用次数的自洽性投票”相当(第 12、13 讲继续)。
- Stechly, Valmeekam & Kambhampati(2024):在图着色、规划(积木世界)等可以精确验证的任务上,让 LLM 批评自己的解答会让表现下降;换成一个可靠的外部验证器(哪怕只告诉它”错了”),表现明显提高。这正是第 8 讲 LLM-Modulo 框架的出发点。
- Tyen et al.(2024,LLMs cannot find reasoning errors, but can correct them given the error location):他们构造了 BIG-Bench Mistake 数据集(LLM 生成的推理链,标注第一个逻辑错误的位置),发现模型找不到自己推理里的错误;但如果告诉它错误的位置,让它从那里重新开始(回溯),它往往能改对。瓶颈在察觉和定位,不在修复。
这三条批评都可以用 §2 的模型读出来:内在检查的 FPR 高(Huang)、内在检查的 TPR 低而外部检查高(Stechly)、定位决定了修复率(Tyen)。
4. 实验:反馈从哪里来、说了什么 · Feedback on the testbed
代码:02_feedback_sources.py(约 6 秒)。cot_L2 在 n = 12 的长题面上贪心只有 29.5%,主要错在”走过头”。给它 6 轮纠错的机会,比较两类反馈、三种来源:
- 二值反馈:只说”这个答案可以 / 不可以接受”;不可以就重新采样一次(温度 1.0)。来源:自己(整条回答的对数概率,阈值在开发集上按 Youden 指数选)、ORM、神谕。
- 定位反馈:说”第 j 步错了”;在那一步换成策略的下一个候选 token(
|也是候选),再贪心地接着写。来源:自己(某个 token 的概率 < 0.5)、PRM-full(某一步的分数 < 0.5)、神谕(第一个错步)。
4.1 结果
| 反馈 | 1 轮 | 2 轮 | 4 轮 | 6 轮 |
|---|---|---|---|---|
| 二值·自己 | 30.0%(+2 / −1) | 29.5% | 29.5% | 28.5%(+1 / −3) |
| 二值·ORM | 30.0%(+2 / −1) | 29.0% | 28.5% | 29.5%(+2 / −2) |
| 二值·神谕 | 30.0%(+1 / −0) | 30.5% | 31.0% | 31.0%(+3 / −0) |
| 定位·自己 | 29.5%(+0 / −0) | 29.5% | 29.5% | 29.5%(+0 / −0) |
| 定位·PRM-full | 40.5%(+31 / −9) | 43.0% | 49.5% | 55.0%(+60 / −9) |
| 定位·神谕 | 50.0%(+41 / −0) | 55.0% | 65.5% | 74.0%(+89 / −0) |
(括号:错→对 / 对→错 的题数,相对于纠错之前的贪心回答。)
4.2 瓶颈在哪里:第一轮的四个参数
| 方法 | TPR | FPR | 修复率 | 改坏率 |
|---|---|---|---|---|
| 二值·自己 | 0.95 | 0.24 | 0.01 | 0.07 |
| 二值·ORM | 0.96 | 0.22 | 0.01 | 0.08 |
| 二值·神谕 | 1.00 | 0.00 | 0.01 | 0.00 |
| 定位·自己 | 0.08 | 0.00 | 0.00 | 0.00 |
| 定位·PRM-full | 0.93 | 0.15 | 0.24 | 1.00 |
| 定位·神谕 | 1.00 | 0.00 | 0.29 | 0.00 |
(对一轮来说,§2 的公式是一个精确的分解:把实测的四个参数代回去,必然等于实际准确率。它的用处是看出瓶颈在哪个因子。)
三个结论:
- 二值反馈 + 重新采样无效,连神谕也不行。瓶颈不在察觉——模型自己的对数概率就有 TPR 0.95——而在修复:被标出的错误回答,重新采样后只有 1% 变对。
cot_L2在这些题上的错误是系统性的,重新采样还是同一个错(第 4 讲的 pass@k 几乎是平的,原因相同)。知道”错了”而不知道”错在哪、该怎么改”,再试一次没有用。 - 定位反馈有效,但取决于定位得准不准。神谕定位 6 轮后 74.0%,而且从不把对的改错;PRM-full 定位 55.0%,但它误标了 15% 的正确回答,这些回答全部被改坏(改坏率 1.00)——在一条正确的推理链上”换一个候选”,必然换错。改坏率高时,检查的 FPR 决定成败(§2.4)。这和 Tyen et al. 的发现一致。
- 模型能察觉,却不能定位。整条回答的对数概率作为二值检查 TPR 0.95,可逐个 token 看,只有 8% 的错误回答里有一个概率低于 0.5 的 token:模型在每一步都很”自信”,包括走过头的那一步。§5 会看到,整条回答的概率之所以能区分对错,主要是因为错的回答更长。
4.3 对照:不在测试时纠错
| 做法 | 准确率 |
|---|---|
| 贪心(不纠错) | 29.5% |
| 最好的测试时纠错(神谕定位,6 轮) | 74.0% |
| 强制在第 k 步停下(第 4 讲:结构知识) | 84.5% |
| 第 5 讲 GRPO 训练后的模型(种子 0),贪心 | 100.0% |
即使有神谕告诉它错在哪,6 轮纠错也不如一条结构知识,更不如训练。这是 §6 的出发点:与其指望模型在测试时纠正自己,不如训练它一开始就做对,或者训练它学会纠错。
5. 元认知:模型知道自己不知道吗? · Metacognition
代码:03_know_what_you_know.py(约 5 秒)。
5.1 背景
Kadavath et al.(2022,Language Models (Mostly) Know What They Know)发现:大模型在多选题上给各选项的概率校准得不错(说 80% 有把握的题,大约 80% 是对的);让模型先回答、再判断”我的答案对吗”(P(True)),或者在回答之前预测”我能答对这道题吗”(P(IK)),都有相当的区分度。但后来的工作也发现:让模型用文字说出自己的把握(“我有 90% 的把握”),往往严重过度自信(Xiong et al. 2024);经过 RLHF 的模型,概率的校准常常变差。
元认知要分开检验三件事:区分度(有把握的比没把握的更常对吗?)、校准(说 80% 的时候真的是 80% 吗?)、可用性(能不能用它来决定”不回答”)。
5.2 区分度,以及一个长度混淆
在 n = 10、12、14 的 600 道题上(贪心准确率 41.3%),各种信号区分”对 / 错”的 AUC(演示 1):
| 信号 | AUC | 同长度内的 AUC |
|---|---|---|
| 整条回答的对数概率 | 0.907 | 0.702 |
| 平均每 token 对数概率 | 0.894 | 0.702 |
| 最小 token 概率 | 0.887 | 0.697 |
| 答案字母的概率 | 0.876 | 0.553 |
| 回答越短(对照,和模型无关) | 0.895 | 0.500 |
| ORM(第 4 讲) | 0.929 | 0.897 |
| PRM-full(第 4 讲) | 0.984 | 0.906 |
模型自己的置信度看上去很有区分度——可是一个和模型无关的规则”回答越短越可能对”就有 0.895。只在回答长度相同的题之间比较时,整条回答的对数概率降到 0.702,答案字母的概率降到 0.553(接近随机);第 4 讲的验证器仍有约 0.90。模型的”自知”大部分来自长度:走过头的回答更长,长回答的总概率自然更低。(同长度内的比较只用了 8.0% 的”对–错”配对,因为大多数对的和错的回答长度不同。)
方法上的教训:评估一个置信度信号,要和简单的表面特征比较,并在控制这些特征之后再看。真实 LLM 的置信度同样可能和长度、措辞、题目的表面难度相关。
5.3 校准:分布外的过度自信
答案字母的概率作为置信度(演示 2):n = 8(训练分布内)平均置信度 1.000、准确率 100.0%、ECE 0.000;n = 16 时,200 道题里只有 49 道给出了置信度 ≥ 0.9 的答案(其余大多一直没停下、没给答案),这 49 个答案的平均置信度 0.998,准确率只有 8.2%。系统性的错误伴随着极高的把握——第 4 讲的投票、本讲的二值纠错对它无效,原因相同。
5.4 选择性回答
如果允许模型”不回答”,只回答自己最有把握的一部分题(演示 3,600 道题):
| 按什么排序 | 回答 25% | 50% | 75% | 100% |
|---|---|---|---|---|
| 整条回答的对数概率 | 89.3% | 74.0% | 53.6% | 41.3% |
| 回答越短(对照) | 87.3% | 70.7% | 55.1% | 41.3% |
| ORM | 92.7% | 73.3% | 55.1% | 41.3% |
“知道什么时候不回答”是有用的,但在这里它和”挑短的回答”几乎一样好——这样的弃答规则在长度分布变化时会失效。(共形预测等方法可以给弃答规则加上统计保证,但前提是置信度信号本身有意义。)
5.5 察觉”无解”
第 6 讲 §6.3 看到,模型在无解的题上不会说”无解”,而是编造一步。它的概率里有没有”不对劲”的信号?用第 6 讲的 distract 模型在 400 道 n = 16、k = 6 的扫描题上(191 道无解)测试(演示 4):
| 信号 | 可解的题(平均) | 无解的题(平均) | AUC |
|---|---|---|---|
| 最小 token 概率 | 0.999 | 0.815 | 0.977 |
| 整条回答的对数概率 | −0.004 | −0.255 | 0.980 |
| 答案字母的概率 | 1.000 | 1.000 | 0.481 |
信号是存在的:编造的回答里有不那么有把握的 token。但”最小 token 概率 < 0.5 就说无解”这条直觉规则只能标出 8.9% 的无解题;在开发集(另一个种子生成的扫描题)上选阈值(0.998),能标出 87.4% 的无解题、误标 3.8% 的可解题。模型”察觉到不对劲”的信号存在,但落在一个没有校准过的尺度上——要用它,先在开发集上校准。注意答案字母的概率完全没有区分度(0.481):不对劲发生在编造的那一步,到写答案时模型已经”说服了自己”。
5.6 三个层次
| 层次 | 这个小模型 | 用什么检验 |
|---|---|---|
| 察觉(我可能错了) | 有一些真实的信号(同长度内约 0.70 的 AUC、无解题上的概率下降) | 控制表面特征后的 AUC |
| 定位(错在哪一步) | 几乎没有(§4:只有 8% 的错误回答里有低概率 token) | 定位反馈的修复率 |
| 校准(有多大把握) | 分布内完美,分布外完全失效 | ECE、可靠性表,分别在分布内外 |
6. 训练出来的纠错 · Learning to self-correct
6.1 为什么提示不够
§2–§5 的分析指向同一个结论:如果模型的检查和生成共享盲点,那么在测试时提示它去检查自己,很难有效。一个自然的想法是训练它学会纠错:给它看”错误的第一次尝试 → 正确的第二次尝试”的例子。
SCoRe(Kumar et al. 2024,Google DeepMind,Training Language Models to Self-Correct via Reinforcement Learning)发现,直接在这样的数据上做 SFT 有两个问题:
- 分布偏移:训练数据里的”第一次尝试”来自别的模型(或者模型早先的版本),和模型测试时自己犯的错不一样(第 4、5 讲反复看到的离策略问题);
- 行为坍缩(behavior collapse):模型学会了一个偷懒的策略——第一次尽量答好,第二次几乎原样照抄,“纠错”形同虚设。
SCoRe 用多轮在线 RL、完全基于模型自己生成的数据:第一阶段训练出一个不容易坍缩的初始策略;第二阶段在奖励里加一项奖励”第二次比第一次好”的奖励,放大真正的纠错行为。在 Gemini 1.0 Pro 和 1.5 Flash 上,它把自我纠错的提高幅度在 MATH 上提高了 15.6%、在 HumanEval 上提高了 9.1%(相对于基座模型的自我纠错表现)。
6.2 推理模型里的”等一下”
第 5 讲的 DeepSeek-R1-Zero 在 RL 中”学会”了反思:“Wait, wait. Wait. That’s an aha moment I can flag here.” 推理模型的长思维链里充满了”等一下,让我检查一下”。这算自我纠错吗?
- 它是训练出来的(结果奖励的 RL),不是提示出来的;奖励只看最终答案,所以只有”能提高最终准确率”的检查行为会被强化——这正是 SCoRe 想要的性质。
- 但第 5、6 讲提醒我们:这些行为有一部分是基座里就有、被挑出来的;思维链里写的”检查”未必忠实地反映了实际的计算(第 6 讲);一些分析发现长思维链里的很多”反思”只是重复,和答对没有明显关系。区分”真正改变了答案的检查”和”装饰性的检查”,需要第 6 讲的干预方法。
7. 再看生成–验证的不对称 · The generation–verification gap revisited
第 4 讲说,检查一个答案往往比生成它容易——一个同样大小的验证器能认出策略模型写不对的推理链。本讲的结果补充了这个说法的条件:
- 不对称来自为检查而训练:第 4 讲的验证器是专门在”标注了对错的推理链”上训练的;策略模型自己的概率(为生成而训练)几乎不能定位错误(§4.2),区分度大多来自长度(§5.2)。同一个模型、不经训练,“检查自己”不会自动获得不对称的好处。
- 自我改进需要验证跟得上生成:Song et al.(2024,Mind the Gap)把”生成–验证差距”作为自我改进(模型用自己的验证来改进自己)能否成功的关键量。第 5 讲的奖励黑客实验从另一面说明了这一点:验证器一旦跟不上被优化的策略,就会被钻穿。
- 外部反馈往往是最便宜的不对称:代码可以运行、证明可以检查、规划可以模拟(第 8 讲)。在这些领域,自我纠错之所以有效,是因为”自我”之外有一个可靠的检查者。
8. 现状与开放问题 · State of the field
- 提示出来的内在自我纠错在推理任务上基本被证明不可靠;在开放式生成(写作、风格)上仍常被使用,那里”改进”不需要找出确切的错误。
- 外部反馈驱动的修改(执行代码、跑测试、调用工具、规划验证器)是实际系统里最有效的形式,是智能体(第 11 讲)的基本组件。
- 训练出来的纠错:推理模型的 RL 让模型在思维链里自发地检查和回溯;它在多大程度上是真正的纠错、多大程度是装饰,仍在研究中。
- 元认知与弃答:让模型说”我不知道”或”这道题无解”,对可靠性至关重要;目前模型更倾向于给出自信的答案(第 6 讲、本讲 §5.5)。
研究问题:
- 怎样测量长思维链里的一次”检查”是否改变了结果(结合第 6 讲的干预)?
- 能否训练一个模型,使它的置信度在分布外仍然校准,至少在”远离训练分布”时知道降低把握?
- 定位反馈有效、二值反馈无效——能否训练模型自己产生定位信号(而不只是”对 / 错”)?
- 什么时候自我纠错的收益超过它的成本(多几轮生成)?和”同样的计算用来多采样投票”(第 4 讲)相比呢?
9. 小结 · Summary
- 一次纠错要做对三件事:察觉、定位、修复;任何一件做不好,纠错就可能无效甚至有害。
- 一轮纠错的收益 = 救回来的 − 改坏的;模型越强,可救的越少、可坏的越多。反复纠错收敛到一个和初始准确率无关的不动点:弱检查器会把强模型拉低。
- 用真实答案决定”何时停止”是一个评测漏洞,会把有害的纠错报告成大有帮助。
- 在实验台上,二值反馈 + 重新采样完全无效,连神谕也不行——系统性错误重新采样还是同一个错;定位反馈有效(神谕定位 29.5% → 74.0%),但验证器的误报会把对的改错。
- 模型能察觉、不能定位;它的”察觉”大部分来自回答长度。
- 分布内校准很好,分布外严重过度自信(置信度 0.998、准确率 8.2%)。
- 模型说不出”无解”,但它的概率里有信号;要用这个信号,先在开发集上校准阈值。
- 测试时纠错不如结构知识和训练;SCoRe 等工作用 RL 训练纠错,避免 SFT 的分布偏移和行为坍缩。
- 生成–验证的不对称来自为检查而训练的验证器或外部工具,同一个模型”检查自己”不会自动获得它。
10. 常见误区 · Common pitfalls
- “让模型再检查一遍总没坏处。” 检查有误报,修改会改坏;对强模型,自我检查常常有害。
- “自我纠错把准确率从 X 提到了 Y。” 先看何时停止是谁决定的;用真实答案决定,结果被高估。
- “模型知道自己错了,就能改对。” 察觉、定位、修复是三件事;知道错了而不知道错在哪,重来一次还是同样的错。
- “模型的置信度 AUC 很高,说明它有元认知。” 先和简单的表面特征(长度)比较,再在控制这些特征后看。
- “校准得好的模型在新题上也校准。” 分布外的系统性错误常常伴随极高的把握。
- “Reflexion / CRITIC 证明了自我纠错有效。” 它们的反馈来自环境或工具(外部反馈),不是内在的自我检查。
- “在 (错误, 正确) 的修改例子上做 SFT,模型就学会纠错了。” 可能学到的是离策略的错误类型,或者干脆不改(行为坍缩)。
11. 练习 · Exercises
练习 1(不动点)。一个模型的初始准确率是 85%。它的自我检查 TPR = 0.6、FPR = 0.15,修复率 0.4、改坏率 0.6。(a) 一轮纠错后准确率是多少?(b) 反复纠错的极限是多少?(c) 要让反复纠错的极限达到 90%,在其他参数不变时 FPR 要降到多少?
参考答案:(a) ,下降约 4 个点。(b) 。(c) 要 ,即 ,。
练习 2(阈值与误报)。§4.2 里 PRM-full 定位的改坏率是 1.00,所以它的 FPR 决定了有多少对的被改坏。把判定”这一步错了”的阈值从 0.5 改成 0.2、0.05,重新跑 6 轮定位纠错。先预测趋势。这个实验有什么方法上的问题?
参考答案(编写时在草稿目录里的实际运行):阈值 0.5 / 0.2 / 0.05 时,6 轮后准确率 55.0% / 61.0% / 66.5%,对→错 9 / 5 / 3 道,错→对 60 / 68 / 77 道。更严的阈值减少了误报,修复反而也变多了:被误标的位置少了,真正出错的那一步更常成为”第一个被标出的位置”,换掉的才是该换的 token。方法上的问题:阈值是在测试集上扫出来的,挑最好的那个就是在测试集上调参(第 2 讲的赢家的诅咒);正确的做法是在开发集上选阈值,再在测试集上报告一次。
练习 3(二值把关 + 定位)。只在 ORM 判为”错”(< 0.5)的回答上使用 PRM-full 定位。这样能减少对的被改坏吗?代价是什么?
参考答案(草稿目录里的实际运行):6 轮后 51.0%,对→错 4 道(单用 PRM-full 是 9 道),错→对 47 道(单用 PRM-full 是 60 道)。把关减少了误报,但 ORM 也放过了一些错误的回答(漏报),这些回答再也没有机会被定位和修改——净效果反而比单用 PRM-full(55.0%)差。两个检查器串联时,FPR 相乘地降低,TPR 也相乘地降低。
练习 4(常数参数模型 vs 实际曲线)。用 §4.2 里 PRM-full 定位的第一轮参数(TPR 0.93、FPR 0.15、修复率 0.24、改坏率 1.00)和 §2 的递推,预测 6 轮的准确率曲线和不动点,与实际曲线比较。为什么会不同?
参考答案:常数参数的预测是 40.8%、47.9%、52.3%、55.1%、56.9%、58.0%(不动点 59.8%);实际是 40.5%、43.0%、46.5%、49.5%、50.5%、55.0%。第一轮几乎一致(第一轮的公式是精确分解),之后预测涨得更快。原因是参数不是常数:容易改的题在前几轮已经改好了,剩下的错误回答更难修(修复率下降);而被误标的正确回答在第一轮就全部改坏了,之后的轮次里几乎没有新的误报(实际的对→错一直是 9 道)。独立同分布的假设在反复纠错里不成立——同一道题会被反复检查,错误是相关的。
练习 5(长度混淆的推广)。§5.2 发现置信度的区分度大多来自长度。在真实的数学推理模型里,你会怀疑哪些表面特征同样会混淆置信度和正确性?设计一个检验。
参考答案要点:候选:回答长度(错误的推理常常更长、更绕);是否出现”wait""let me re-check”这类词;题目长度或题目里的数字位数(难题更长);答案是否是整数。检验:在这些特征的分层内计算 AUC(像演示 1 那样);或者把置信度和这些特征一起放进逻辑回归,看置信度的系数在控制特征后是否仍然显著;最好构造”表面特征相同、难度不同”的题目对。
练习 6(论文卡片)。用第 1 讲 §8.4 的论文卡片读 Huang et al.(2024)。他们的”内在自我纠错”具体是怎样提示的?如果你认为他们的提示不够好,怎样设计一个实验,公平地检验”更好的提示能不能让内在自我纠错有效”?
参考答案要点:他们用三步提示:回答 → “回顾你之前的答案,找出问题” → “根据发现的问题改进答案”,在 GSM8K、CommonSenseQA、HotpotQA 上评测。公平检验:(1) 不用真实答案决定何时停止;(2) 在开发集上选提示,在测试集上只评测一次;(3) 和同样调用次数的基线比较(例如自洽性投票,第 4 讲);(4) 报告对→错和错→对两个方向,而不只是净变化;(5) 多个模型、多个任务,因为 §2 说明收益依赖初始准确率。
12. 延伸阅读 · Further reading
方法
- A. Madaan et al. Self-Refine: Iterative Refinement with Self-Feedback. NeurIPS 2023.
- N. Shinn et al. Reflexion: Language Agents with Verbal Reinforcement Learning. NeurIPS 2023.
- Z. Gou et al. CRITIC: Large Language Models Can Self-Correct with Tool-Interactive Critiquing. ICLR 2024.
批评与综述
- J. Huang et al. Large Language Models Cannot Self-Correct Reasoning Yet. ICLR 2024.
- K. Stechly, K. Valmeekam, S. Kambhampati. On the Self-Verification Limitations of Large Language Models on Reasoning and Planning Tasks. 2024.
- G. Tyen et al. LLMs cannot find reasoning errors, but can correct them given the error location. Findings of ACL 2024.
- R. Kamoi et al. When Can LLMs Actually Correct Their Own Mistakes? A Critical Survey of Self-Correction of LLMs. TACL 2024.
训练纠错
- A. Kumar et al. Training Language Models to Self-Correct via Reinforcement Learning(SCoRe). ICLR 2025.
元认知与校准
- S. Kadavath et al. Language Models (Mostly) Know What They Know. 2022.
- M. Xiong et al. Can LLMs Express Their Uncertainty? An Empirical Evaluation of Confidence Elicitation in LLMs. ICLR 2024.
- Y. Song et al. Mind the Gap: Examining the Self-Improvement Capabilities of Large Language Models. 2024.
13. 下一讲预告 · Next lecture
第 8 讲:LLM 能规划吗?经典规划、PlanBench 与 LLM-Modulo。 推理部分到此结束。本讲的结论——内在的自我检查靠不住,可靠的外部验证器才是纠错有效的关键——正是 Kambhampati 等人提出 LLM-Modulo 框架的出发点:让 LLM 提出计划,让可靠的验证器把关,循环往复。下一讲进入”规划”部分:先认识经典规划(STRIPS、状态空间搜索),看 LLM 和推理模型在积木世界(以及把物体名字全部换掉的”神秘积木世界”)上的成绩,然后亲手实现一个计划验证器和一个”LLM 提议 + 验证器批评”的循环,并用本讲的四参数模型分析它为什么有效。