引言
我们都有过这样的经历。你向大型语言模型 (LLM) 提出了一个复杂的问题——也许是一道棘手的数学应用题,或者是一个冷门的冷知识查询——它自信地给出了答案。看起来合情合理,推理似乎也站得住脚。但当你仔细检查时,却发现答案完全是错的。
这种现象通常被称为“幻觉”或推理失败,是部署 AI 智能体处理高风险任务时的最大障碍之一。自然的解决方案似乎是: “我们要不直接让模型再次检查一下它的工作?”
很长一段时间以来,研究界的共识是悲观的。先前的研究表明,LLM 在内在自我修正 (intrinsic self-correction) 方面表现挣扎。当你只是简单地问模型“你确定吗?检查一下有没有错误”时,它往往要么盲目地坚持错误,要么更糟糕——因为它缺乏外部真理来源,反而把对的答案“修正”成了错的。
但是,如果问题不在于模型的推理能力,而在于我们要求它验证的方式呢?
一篇引人入胜的新论文 “Large Language Models Can Self-Correct with Key Condition Verification” (大型语言模型可以通过关键条件验证进行自我修正) 彻底改变了自我修正的思路。研究人员引入了一个名为 PROCO (Progressive Correction,渐进式修正) 的框架。PROCO 不再模糊地要求模型“找出错误”,而是强制模型执行特定的验证测试: 识别问题中的关键条件,将其掩蔽 (mask) ,并尝试利用其自身的答案来反推该条件。
在这篇深度文章中,我们将探讨 PROCO 的工作原理、其验证过程背后的数学逻辑,以及为什么它可能是让 LLM 成为更可靠的自主推理者的关键一环。
背景: 为什么自我修正很难
要理解 PROCO 的重要性,我们首先需要了解 LLM 推理的现状。
思维链及其脆弱性
从 LLM 获得优质答案的标准方法是思维链 (Chain-of-Thought, CoT) 提示。这鼓励模型在得出最终答案之前生成中间推理步骤。虽然 CoT 很强大,但它也很脆弱。推理链中的一个错误就可能像滚雪球一样导致最终答案错误。
验证中的“盲从”
之前尝试的自我修正 (比如一种名副其实叫 Self-Correct 的方法) 通常按以下循环运行:
- 生成一个答案。
- 问模型: “回顾你之前的答案并找出错误。”
- 优化答案。
问题出在哪里?LLM 通常具有盲从性 (sycophantic) 或过度自信。在没有外部反馈 (如计算器、搜索引擎或人类) 的情况下,模型无法客观地判断自己的输出。它经常无法发现推理漏洞,因为它在验证时使用的是与生成时相同的有缺陷逻辑。
PROCO 假设
PROCO 背后的研究人员提出了一种基于代入验证 (Substitute Verification) 的不同方法。直觉很简单: 从头解决一个问题很难,但验证一个解通常很容易。
想象一道数学题: \(x + 5 = 12\)。解这道题需要代数运算。验证它只需要将答案代入: “如果答案是 7,那么 \(7 + 5 = 12\) 吗?”
PROCO 为 LLM 自动化了这个“代入”过程,不仅将其应用于数学,还应用于开放域问答和常识推理。
核心方法: PROCO 如何运作
PROCO 代表 Progressive Correction (渐进式修正) 。 它是一个迭代框架,帮助 LLM 在没有任何外部工具的情况下识别和修正错误的回答。
该过程遵循“先验证,后修正”的循环。让我们一步步拆解其架构。
步骤 1: 初始化与关键条件
首先,模型使用标准的思维链提示生成一个初始答案。一旦有了答案,PROCO 流程就开始分析原始问题,以寻找关键条件 (Key Condition) 。
关键条件是问题中对解决问题至关重要的特定约束或信息。如下图所示,这些条件因任务而异。

- 算术: 关键条件是一个数字 (例如,“Keith has 20 books”) 。
- 开放域问答: 关键条件是一个实体 (例如,“Minnesota Vikings”) 。
- 常识: 关键条件是一个概念。
识别关键条件
对于算术任务,系统需要找出文本中哪个数字与查询最相关。研究人员使用相似度度量来寻找上下文中与查询句子 \(q\) 语义最相似的句子 \(s_j\)。
他们使用余弦相似度 (Cosine Similarity) 来计算:

一旦确定了句子,就使用正则表达式提取数值。对于非数学任务 (如文学或冷知识) ,模型只是被简单地提示“识别一组实体……并选择与解决问题最相关的一个”。
步骤 2: 代入验证的技巧
这是论文中最具创新性的部分。一旦系统有了一个初始答案 (\(a_{t-1}\)) 和一个关键条件 (\(c_k\)),它就会创建一个验证问题 。
它通过以下方式做到这一点:
- 掩蔽 (Masking) 原始文本中的关键条件 (将其替换为 “X”) 。
- 追加 (Appending) 初始答案作为一个已知事实。
- 要求 (Asking) 模型求解 X。
在数学上,如果我们把掩蔽过程表示为替换句子 \(s_{J(k)}\) 中的关键条件,那么掩蔽后的问题如下所示:

然后,系统通过将此掩蔽问题与模型之前的答案 (\(a_{t-1}\)) 和一个验证查询 (\(q^{(v)}\)) 相结合,构建完整的验证提示 (\(Q_t^{(v)}\)):

一个具体例子
让我们看看这在实践中是如何工作的。
- 原始问题: “Who plays Skylar on Lab Rats: Elite Force?” (谁在《超能高校生: 精英部队》中扮演 Skylar?)
- LLM 初始答案: “Paris Berelc.”
- 识别出的关键条件: “Skylar.”
系统现在基本上是在说: “好吧,让我们假装不知道角色的名字是 Skylar。让我们假装演员是 Paris Berelc。我们能推导出角色的名字吗?”
- 验证问题: “Who plays X on Lab Rats: Elite Force? Suppose the answer is Paris Berelc. What is the value of unknown variable X?” (谁在《超能高校生: 精英部队》中扮演 X?假设答案是 Paris Berelc。未知变量 X 的值是多少?)
LLM 解答这个问题。如果它回答 “Skylar Storm”,系统就会将这个验证后的答案与原始的关键条件 (“Skylar”) 进行比较。
步骤 3: 验证逻辑
系统如何决定验证是否通过?
对于数学: 它使用直接匹配。如果计算出的 X 等于原始数字,则答案通过验证。
对于文本: 精确匹配是危险的,因为 “Skylar” 和 “Skylar Storm” 是不同的字符串,但指的是同一个实体。为了解决这个问题,PROCO 使用基于命题的验证 (Proposition-based Verification) 。 它向 LLM 询问一个新的提示:
“Determine the correctness of the proposition: If the answer to question [Verification Q] is [Key Condition], then X could also be [Verified Answer].” (判断命题的正确性: 如果问题 [验证问题] 的答案是 [关键条件],那么 X 也可以是 [验证后的答案] 吗。)
这使得 LLM 能够利用其语义理解来判断等价性。
步骤 4: 迭代修正
如果验证通过,答案就被接受。但如果验证失败——即把答案代回导致矛盾——该答案就会被标记为错误。
错误的答案会被添加到一个“潜在错误答案”集合 (\(\mathcal{P}_t\)) 中。然后,模型被提示再次回答原始问题,但带有一个特定的提示:
“The answer is likely not in {\(\mathcal{P}_t\)}.” (答案很可能不在 {\(\mathcal{P}_t\)} 中。)
这可以防止模型陷入循环并重复相同的错误。该过程会迭代进行 (通常最多 3 次) ,直到找到一致的答案。
实验与结果
研究人员在三个不同的推理领域测试了 PROCO:
- 算术推理: GSM8K, AQuA, MATH。
- 开放域问答: Natural Questions (NQ), TriviaQA, WebQ, HotpotQA。
- 常识推理: CSQA。
他们将 PROCO 与标准 CoT、“Self-Correct”基线 (Kim et al., 2023) 以及基于 RAG 的方法进行了比较。
通用推理的表现
所有领域的结果都令人信服。下表显示了使用 GPT-3.5-Turbo 和开源 Mixtral-8x7B 在问答和常识任务上的表现。

注意底部的 “PROCO” 行。在 Natural Questions (NQ) 数据集上,PROCO 实现了 48.0 的完全匹配 (EM) 分数,显著高于标准 CoT (40.3) 和传统的 Self-Correct 方法 (40.1)。这表明验证步骤确实捕捉到了标准提示所遗漏的错误。
数学表现
数学通常是 LLM 自我修正最困难的领域,因为计算错误可能非常微妙。PROCO 在这里表现出色,因为数学问题本质上是可验证的 (逻辑必须平衡) 。

在 GSM8K 数据集 (小学数学) 上,PROCO 将 GPT-3.5-Turbo 的准确率从 78.6% (CoT) 提高到了 87.1% 。 对于纯提示技术来说,这是一个巨大的飞跃,缩小了较小模型与最先进的大型模型之间的差距。
它在 GPT-4 上有效吗?
对提示工程论文的一个常见批评是,它们只能帮助较弱的模型。研究人员在强大的 GPT-4-Preview 上测试了 PROCO。

即使使用 GPT-4,PROCO 也进一步推高了性能,在 GSM8K 上取得了近乎完美的分数 (97.6%) ,并显著提升了 HotpotQA (从 49.0 提升到 61.0) 。
为什么 PROCO 能成功而其他方法失败
自我修正方法的真正考验不仅仅在于它是否得到了更多正确的答案,还在于它是否能准确地识别出错误的答案,且不破坏正确的答案。
“不造成伤害”原则
先前“Self-Correct”方法的一个主要缺陷是模型经常不必要地怀疑自己。如果你问 LLM “你确定吗?”,它可能会因为焦虑或对提示的敏感性而将正确的答案改为错误的。
下面的图表分析了答案状态变化的频率 (正确 \(\to\) 错误 vs. 错误 \(\to\) 正确) 。

看左边的“正确 \(\to\) 错误”组。标准的 Self-Correct 方法 (蓝色条) 破坏了近 10% 的正确 GSM8K 答案。 PROCO (红色条) 只破坏了约 2.5%。相反,在“错误 \(\to\) 正确”组中,PROCO 修正了更多的错误。
这证明了验证是一种比批评更安全的机制。通过要求答案在数学或逻辑上符合掩蔽问题,PROCO 充当了一个严格的看门人,只允许在出现可证明的矛盾时进行更改。
效率与迭代
这个过程会花费很长时间吗?令人惊讶的是,并不会。研究人员发现大多数问题在很少的迭代次数内就能解决。

平均迭代次数很低 (通常在 1.5 到 2 次迭代左右) 。这意味着模型通常第一次就答对了,或者在第一次验证检查后立即修正了错误。
案例研究: “Patience is a Virtue”
为了定性地说明差异,研究人员提供了一个关于短语 “Patience is a virtue” (耐心是一种美德) 起源的案例研究。

在这个例子 (表 6) 中,标准 CoT 产生了幻觉,称起源未知。“Self-Correct” 方法自信地 (但错误地) 将其归因于 Piers Plowman。只有 PROCO,特别是在结合了 RAG (检索增强生成) 时,正确地将起源识别为 5 世纪的诗歌 Psychomachia。
上图中包含的图 5 图表也突出了效率的提升。虽然自洽性 (Self-Consistency) (问模型 5 次并投票) 是提高准确率的流行方法,但它在 Token 消耗方面非常昂贵。PROCO 在使用更少 Token 的同时实现了比自洽性更高的准确率。
结论与启示
PROCO 框架代表了大型语言模型自主性向前迈出的重要一步。通过将范式从“批评”转变为“验证”,作者解锁了一种让模型检查自己工作的方法,这种方法模仿了人类解决问题的过程。当我们不确定计算结果时,我们会反推看看是否吻合。PROCO 教会了 LLM 做同样的事情。
这项研究的主要收获是:
- 内在自我修正是有可能的: 我们不一定需要外部计算器或搜索引擎来修正推理错误;我们需要的是构建提示,以强制执行“逆向工程”检查。
- 验证 > 批评: 问“这也就是对的吗?”是很弱的。问“如果这是答案,它能推导出前提吗?”是很强的。
- 适用性: 这种方法适用于数学、冷知识和常识推理,并且无论是小型开源模型还是大型专有模型都能从中受益。
随着我们迈向模型需要长时间独立运行的智能体 AI 工作流,像 PROCO 这样的框架将变得至关重要。它们提供了“健全性检查”层,防止幻觉级联成故障。
](https://deep-paper.org/en/paper/2405.14092/images/cover.png)