跳转至

Reasoning 评测

推理评测关注模型在约束、规划、多步逻辑和不确定条件下得到可靠结论的能力。它不只看最终答案,更看重结论是否稳定地依赖于题目中的真实约束,而非表面模式。

推理评测的直接源头是「思维链」 (chain-of-thought, CoT) 的发现:让模型在给出答案前先写出推理步骤,能显著提升算术与多步逻辑题的准确率,这一做法在 Chain-of-Thought Prompting 中被系统提出。此后评测对象从「答案」扩展到「过程」,出现了 GSM8K、ARC 这类可验证答案的题集,以及 Big-Bench Hard (BBH) 这类刻意提高难度的多步任务;同时,如何判断「写出来的过程」是否等于「真实发生的推理」,成为推理评测独有的难题。

快速开始

同时评测最终答案、过程一致性和对反事实扰动的稳定性;不要把冗长输出当作推理质量。

设计评测时至少从三个维度打分:最终答案是否正确、中间步骤是否与结论一致(过程一致性)、以及当题目的无关细节被扰动时答案是否保持不变(稳定性)。三者分开报告,才能看清模型是「真推理」还是「记住了模式」。

过程一致性可以用规则或模型辅助判断中间步骤之间、以及步骤与结论之间是否存在逻辑矛盾。稳定性则通过对同一题做等价改写或反事实扰动来测:改动叙述顺序、替换无关数字、变更人物名称等不影响答案的部分,观察答案是否随之波动。多次采样下的多数投票 (self-consistency) 也常被用来降低单次采样噪声,其形式为:

\[\hat{a} = \arg\max_{a} \sum_{i=1}^{m} \mathbb{1}[a_i = a]\]

其中 \(m\) 为采样次数,\(a_i\) 为第 \(i\) 次采样给出的答案,\(\hat{a}\) 为出现次数最多的答案。

输出长度不是推理质量的指标。模型可能输出很长但无实质逻辑链条的文本,也可能用极短的推理得到正确结论。因此评分应以可验证的结论和步骤逻辑为准,而不是以 token 数量衡量。

风险

链式文本可能是事后解释,也可能泄漏题库模式。应使用可验证任务、扰动测试和独立样本验证泛化。

模型输出的推理文本 (chain-of-thought) 未必反映其真实计算过程,它可能是在得出答案后补写的一段自圆其说的解释,即事后合理化。此时文本看起来连贯,但无法证明推理是真实发生的。这正是 CoT 研究中反复强调的局限:链式文本是「可观察的产物」,不等于内部推理本身。

另一个风险是题库模式泄漏:模型在训练中见过同类题,于是靠表面特征匹配作答,而不是理解约束关系。这会导致在公开题集上分数虚高,一旦换题或扰动就明显下降。

对策是优先使用可验证的任务(答案有客观判据)、对题目做扰动测试检验稳定性,并用独立于训练数据的样本评估泛化。只有三者都稳定,才能对推理能力下结论。

案例

更换题目中的无关数字与叙述顺序,若答案频繁改变,说明模型依赖表面模式而非约束关系。

取一道多步推理题,例如行程问题或分配问题,构造两个变体:变体一只替换题目中的无关数字(保持答案不变的数字),变体二只调整叙述顺序而不改任何语义。原始题与两个变体的正确答案完全相同。

分别评测三个版本。若模型在原始题上答对,却在变体一或变体二上频繁答错,说明它依赖的是题目中的特定数字或句式等表面模式,而非约束关系本身。波动越大,越能说明推理能力并未真正建立。一段最小扰动逻辑如下:

def variant_reorder(text):
    # 把前两句话交换顺序,语义与答案均不变
    s = text.split("。")
    return "。".join([s[1], s[0], *s[2:]])

def variant_swap_number(text, old, new):
    # 替换一个不影响答案的无关数字
    return text.replace(old, new)

进一步排查可记录模型在每个变体上的中间步骤,观察它是否在无关数字处出现不一致的推导;如果步骤本身自相矛盾但结论碰巧正确,也应计入不稳定样本。

相关主题