Lecture 7 · 自我反思、自我纠错与元认知:模型能检查自己吗? · Self-Reflection, Self-Correction, and Metacognition

Advanced Large Language Models Research Seminar · Lecture 07。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

个人整理的学习笔记,非官方讲义;课程来源与整理说明见课程介绍。配套示例未逐一运行验证。

本篇目录

对应 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

学完这一讲,你应该能够:

  1. 把一次”自我纠错”拆成三件事:察觉(这个答案可能错了)、定位(错在哪里)、修复(换一个不同的、更好的做法),并说出每件事失败时会发生什么。
  2. 用一个四个参数的模型(检查的真 / 假阳性率、修复率、改坏率)判断纠错什么时候有用;解释为什么反复纠错会收敛到一个和初始准确率无关的不动点,为什么强模型对检查的假阳性率要求极高。
  3. 识别自我纠错评测里最常见的漏洞:用真实答案决定”何时停止修改”(Huang et al. 2024)。
  4. 区分内在反馈(模型自己)、外部反馈(工具、验证器、执行结果)和神谕反馈;区分二值反馈和定位反馈;知道哪一种在什么条件下有用。
  5. 评估一个置信度信号:区分度(AUC)、在控制表面特征(例如长度)之后的区分度、校准(ECE)、选择性回答;理解”察觉不对劲”和”能说出来”之间的差距。
  6. 说清为什么提示出来的自我纠错常常无效,而训练出来的纠错(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 一轮纠错

设当前准确率为 aa,一轮”检查 → 修改”由四个概率描述:

  • TPR\text{TPR}:答案错了时,检查发现它错了的概率;
  • FPR\text{FPR}:答案对了时,检查却说它错了的概率;
  • pfixp_{\text{fix}}:被标为错的错误答案,修改后变对的概率;
  • pbreakp_{\text{break}}:被标为错的正确答案,修改后变错的概率。

一轮之后的准确率:

a′=a (1−FPR⋅pbreak)+(1−a) TPR⋅pfix,Δ=(1−a) TPR pfix⏟救回来的−a FPR pbreak⏟改坏的.a' = a\,(1 - \text{FPR}\cdot p_{\text{break}}) + (1 - a)\,\text{TPR}\cdot p_{\text{fix}}, \qquad \Delta = \underbrace{(1-a)\,\text{TPR}\,p_{\text{fix}}}_{\text{救回来的}} - \underbrace{a\,\text{FPR}\,p_{\text{break}}}_{\text{改坏的}}.

在 pfix=pbreak=0.5p_{\text{fix}} = p_{\text{break}} = 0.5 时(“修改”约等于重新猜一次),三种质量的检查器在不同初始准确率下的收益(演示 1):

检查器初始 30%50%70%90%盈亏平衡点
弱(TPR 0.5,FPR 0.3)+13.0 点+5.0−3.0−11.062.5%
中(TPR 0.8,FPR 0.1)+26.5+17.5+8.5−0.588.9%
强(TPR 0.95,FPR 0.02)+32.9+23.2+13.5+3.897.9%

模型越强,可救的越少、可坏的越多。 同一个检查器,在弱模型上”有用”,在强模型上有害。这解释了文献里看似矛盾的结果:在模型本来就做得不好的任务上,自我纠错常常有提高;在模型已经很强的任务上(GSM8K 上的 GPT-4),它往往让结果变差。

2.2 反复纠错:不动点

每一轮都用同样的公式,准确率是一个线性递推,它的不动点

a∗=TPR⋅pfixTPR⋅pfix+FPR⋅pbreaka^* = \frac{\text{TPR}\cdot p_{\text{fix}}}{\text{TPR}\cdot p_{\text{fix}} + \text{FPR}\cdot p_{\text{break}}}

和初始准确率无关——它恰好就是上表的盈亏平衡点。蒙特卡洛(演示 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 强模型需要多好的检查?

要让一轮纠错不亏,需要 FPR≤(1−a) TPR pfixa pbreak\text{FPR} \le \frac{(1-a)\,\text{TPR}\,p_{\text{fix}}}{a\,p_{\text{break}}}(演示 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)
二值·ORM30.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-full40.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 瓶颈在哪里:第一轮的四个参数

方法TPRFPR修复率改坏率
二值·自己0.950.240.010.07
二值·ORM0.960.220.010.08
二值·神谕1.000.000.010.00
定位·自己0.080.000.000.00
定位·PRM-full0.930.150.241.00
定位·神谕1.000.000.290.00

(对一轮来说,§2 的公式是一个精确的分解:把实测的四个参数代回去,必然等于实际准确率。它的用处是看出瓶颈在哪个因子。)

三个结论:

  1. 二值反馈 + 重新采样无效,连神谕也不行。瓶颈不在察觉——模型自己的对数概率就有 TPR 0.95——而在修复:被标出的错误回答,重新采样后只有 1% 变对。cot_L2 在这些题上的错误是系统性的,重新采样还是同一个错(第 4 讲的 pass@k 几乎是平的,原因相同)。知道”错了”而不知道”错在哪、该怎么改”,再试一次没有用。
  2. 定位反馈有效,但取决于定位得准不准。神谕定位 6 轮后 74.0%,而且从不把对的改错;PRM-full 定位 55.0%,但它误标了 15% 的正确回答,这些回答全部被改坏(改坏率 1.00)——在一条正确的推理链上”换一个候选”,必然换错。改坏率高时,检查的 FPR 决定成败(§2.4)。这和 Tyen et al. 的发现一致。
  3. 模型能察觉,却不能定位。整条回答的对数概率作为二值检查 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.9070.702
平均每 token 对数概率0.8940.702
最小 token 概率0.8870.697
答案字母的概率0.8760.553
回答越短(对照,和模型无关)0.8950.500
ORM(第 4 讲)0.9290.897
PRM-full(第 4 讲)0.9840.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%
ORM92.7%73.3%55.1%41.3%

“知道什么时候不回答”是有用的,但在这里它和”挑短的回答”几乎一样好——这样的弃答规则在长度分布变化时会失效。(共形预测等方法可以给弃答规则加上统计保证,但前提是置信度信号本身有意义。)

5.5 察觉”无解”

第 6 讲 §6.3 看到,模型在无解的题上不会说”无解”,而是编造一步。它的概率里有没有”不对劲”的信号?用第 6 讲的 distract 模型在 400 道 n = 16、k = 6 的扫描题上(191 道无解)测试(演示 4):

信号可解的题(平均)无解的题(平均)AUC
最小 token 概率0.9990.8150.977
整条回答的对数概率−0.004−0.2550.980
答案字母的概率1.0001.0000.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 有两个问题:

  1. 分布偏移:训练数据里的”第一次尝试”来自别的模型(或者模型早先的版本),和模型测试时自己犯的错不一样(第 4、5 讲反复看到的离策略问题);
  2. 行为坍缩(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)。

研究问题:

  1. 怎样测量长思维链里的一次”检查”是否改变了结果(结合第 6 讲的干预)?
  2. 能否训练一个模型,使它的置信度在分布外仍然校准,至少在”远离训练分布”时知道降低把握?
  3. 定位反馈有效、二值反馈无效——能否训练模型自己产生定位信号(而不只是”对 / 错”)?
  4. 什么时候自我纠错的收益超过它的成本(多几轮生成)?和”同样的计算用来多采样投票”(第 4 讲)相比呢?

9. 小结 · Summary

  1. 一次纠错要做对三件事:察觉、定位、修复;任何一件做不好,纠错就可能无效甚至有害。
  2. 一轮纠错的收益 = 救回来的 − 改坏的;模型越强,可救的越少、可坏的越多。反复纠错收敛到一个和初始准确率无关的不动点:弱检查器会把强模型拉低。
  3. 用真实答案决定”何时停止”是一个评测漏洞,会把有害的纠错报告成大有帮助。
  4. 在实验台上,二值反馈 + 重新采样完全无效,连神谕也不行——系统性错误重新采样还是同一个错;定位反馈有效(神谕定位 29.5% → 74.0%),但验证器的误报会把对的改错。
  5. 模型能察觉、不能定位;它的”察觉”大部分来自回答长度。
  6. 分布内校准很好,分布外严重过度自信(置信度 0.998、准确率 8.2%)。
  7. 模型说不出”无解”,但它的概率里有信号;要用这个信号,先在开发集上校准阈值。
  8. 测试时纠错不如结构知识和训练;SCoRe 等工作用 RL 训练纠错,避免 SFT 的分布偏移和行为坍缩。
  9. 生成–验证的不对称来自为检查而训练的验证器或外部工具,同一个模型”检查自己”不会自动获得它。

10. 常见误区 · Common pitfalls

  1. “让模型再检查一遍总没坏处。” 检查有误报,修改会改坏;对强模型,自我检查常常有害。
  2. “自我纠错把准确率从 X 提到了 Y。” 先看何时停止是谁决定的;用真实答案决定,结果被高估。
  3. “模型知道自己错了,就能改对。” 察觉、定位、修复是三件事;知道错了而不知道错在哪,重来一次还是同样的错。
  4. “模型的置信度 AUC 很高,说明它有元认知。” 先和简单的表面特征(长度)比较,再在控制这些特征后看。
  5. “校准得好的模型在新题上也校准。” 分布外的系统性错误常常伴随极高的把握。
  6. “Reflexion / CRITIC 证明了自我纠错有效。” 它们的反馈来自环境或工具(外部反馈),不是内在的自我检查。
  7. “在 (错误, 正确) 的修改例子上做 SFT,模型就学会纠错了。” 可能学到的是离策略的错误类型,或者干脆不改(行为坍缩)。

11. 练习 · Exercises

练习 1(不动点)。一个模型的初始准确率是 85%。它的自我检查 TPR = 0.6、FPR = 0.15,修复率 0.4、改坏率 0.6。(a) 一轮纠错后准确率是多少?(b) 反复纠错的极限是多少?(c) 要让反复纠错的极限达到 90%,在其他参数不变时 FPR 要降到多少?

参考答案:(a) 0.85(1−0.15×0.6)+0.15×0.6×0.4=0.85×0.91+0.036=0.7735+0.036=0.80950.85(1 - 0.15 \times 0.6) + 0.15 \times 0.6 \times 0.4 = 0.85 \times 0.91 + 0.036 = 0.7735 + 0.036 = 0.8095,下降约 4 个点。(b) a∗=0.6×0.40.6×0.4+0.15×0.6=0.240.24+0.09=0.727a^* = \frac{0.6 \times 0.4}{0.6 \times 0.4 + 0.15 \times 0.6} = \frac{0.24}{0.24 + 0.09} = 0.727。(c) 要 0.240.24+0.6 FPR=0.9\frac{0.24}{0.24 + 0.6\,\text{FPR}} = 0.9,即 0.6 FPR=0.24/0.9−0.24=0.02670.6\,\text{FPR} = 0.24/0.9 - 0.24 = 0.0267,FPR≈0.044\text{FPR} \approx 0.044。

练习 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 提议 + 验证器批评”的循环,并用本讲的四参数模型分析它为什么有效。

← 返回课程目录