在实际评测大模型的前沿科学推理能力时,一个越来越常见的现象是:模型给出了正确答案,但推理过程完全不是逻辑推理。研究者把这类现象称为 shortcut hacking,也就是“捷径攻击”或“快捷路径取巧”。它描述的是模型利用评测基准中的结构性弱点,而不是真正解决科学问题,却照样拿到正确分数。这个问题正在动摇“分数越高、推理越强”这个基本假设。

如果只看最终答案,一个通过捷径拿高分的模型,与一个真正掌握科学推理的模型,在评测报告里的数字完全相同。但对于科研辅助、教育答疑、专业问答以及任何依赖模型解释能力的生产系统,这两者有天壤之别。本文从推理评测的失真机制出发,拆解 shortcut hacking 的常见形态,说明为什么正确答案不能证明推理能力,并给出可操作的检测方法、评测流程和排查清单,帮助研究者和工程师更严谨地判断“模型到底会不会推理”。

1. 从“答对”到“真的会推理”:评测失真的核心矛盾

1.1 快捷路径攻击是什么

快捷路径攻击不是一个模型主动“作弊”的概念,而是评测设计与模型学习行为共同作用的结果。通俗地说,模型在训练阶段见过或接触到大量题目、答案、解题步骤,当评测题目与训练数据分布高度重合时,模型并不需要推导,只需要“回忆”或“模式匹配”就能填出正确答案。

技术定义上,shortcut hacking 指模型通过利用评测任务中与真实推理目标无关的特征,在评测指标上取得高性能的现象。这些特征包括题干措辞、选项位置、标点结构、常见题库编号、知识库原文片段,以及训练数据中已经存在的完整标准答案。换句话说,模型找到了一条不需要真正执行推理也能答对的道路。

把这个问题放到前沿科学基准场景里更清楚。前沿科学基准通常包含研究生级别的问题,覆盖物理、化学、生物、数学等学科。题目难度高,学科知识专业,普通评测人员很难凭直觉判断模型是否在“真推理”。正因为题目难、答案唯一、自动评分简单,基准才容易被人为构建出大量捷径。

这里容易误解的一点是:捷径攻击不意味着模型“有恶意”。绝大多数情况下,模型只是暴露了评测数据与训练数据之间不可避免的重叠,以及评测指标本身的脆弱性。真正需要承担责任的,是评测流程没有区分“记住了答案”和“学会了推理”。

1.2 前沿科学基准为什么更容易被误导

前沿科学基准与传统自然语言理解任务不同,它有三个结构性特点,让 shortcut hacking 更容易发生。

第一,题目难度高,导致人工复核困难。物理、化学、生物领域的研究生级别问题,本身需要专业知识才能判断推理过程是否正确。评测团队往往只能依赖自动化的答案匹配,无法逐题检查推理链路是否真实可信。

第二,答案相对封闭。科学问题通常有唯一正确选项,格式高度统一。这种封闭性是自动评测的便利条件,同时也是捷径的最佳温床。模型只要学会识别题目中的关键词组合,就能命中正确选项,而不需要真正理解背后的公式或机制。

第三,训练语料覆盖广。前沿科学基准的很多题目来自期刊论文、教科书、竞赛题库和公开研究材料。这些材料很可能已经存在于模型的预训练语料中。基准发布得越早、传播得越广,被纳入后续训练数据的概率就越大。

这三个特点组合起来,使前沿科学基准容易出现“评测分数虚高、推理能力失真”的落差。下面用一张表说明评测目标和实际测得内容之间的距离。

评测设计假设 捷径攻击下的实际情况
模型通过科学推理得到答案 模型通过记忆或模式匹配得到答案
高正确率代表强推理能力 高正确率只代表能命中训练分布中的答案线索
推理过程可以作为解释依据 思维链可能只是后验编造的解释
模型在新问题上有迁移能力 模型仅在相似题型上有表面泛化
分数可用来横向比较模型 分数受数据污染和题目格式影响,比较失真

1.3 评测的核心矛盾:分数增长不等于能力增长

参与大模型评测的人都会遇到一个尴尬场景:同一个模型在某科学基准上得分很高,但换一种问法、改一个数字、换一个选项顺序,分数就明显下降。这说明模型掌握的并不是学科规律,而是题干与答案之间的相关性。

这个现象背后是评测逻辑的根本矛盾。评测希望测量的是“生成能力”,也就是模型在没有标准答案参考的情况下,通过已知科学知识推导出新结论。但评测系统能采集到的只是“判别结果”,也就是模型输出与标准答案之间是否一致。这两者之间隔着一层无法直接观测的推理过程。只要评测过程允许模型利用表面特征来提升一致率,分数和能力就会脱节。

对研究者而言,这意味着不能在看到分数后就直接得出结论“模型已经具备前沿科学推理能力”。必须先确认评测数据是否被污染、题目是否容易被表面线索命中、思维链是否忠实于最终答案、以及模型在扰动后的表现是否稳定。这四个检查点,是区分“分数增长”和“能力增长”的基础。

2. 大模型在科学基准上“走捷径”的常见形态

2.1 数据污染:训练集直接包含评测题目

数据污染是最直观、也最难彻底消除的捷径来源。模型公司通常不公开全部训练数据,外部评测团队无法逐条确认基准题目是否出现在预训练语料中。当题目原文或近似变体出现在训练语料中时,模型只需要记忆,不需要推理。

检查数据污染有一个常见方法:输入不完整的题干,观察模型是否能够“续写”出完整题目和标准答案。例如:

用户:请继续完成下面这道题的题干部分:“在标准状态下,1 mol 理想气体所占体积约为……”
模型:……22.4 L。如果气体分子间作用力不能忽略,实际体积会偏大还是偏小?

如果模型能准确补全后续内容,说明这道题可能已经存在于训练语料中。这是污染检测的初步信号,但不能作为直接证据,只能提示评测人员需要对这道题做进一步扰动测试。

2.2 表面统计线索:选项位置、长度和措辞模式

即使没有完整的数据污染,模型也能利用选项本身的统计规律。许多自动生成的基准题目,正确答案的选项位置并不均匀。如果正确答案长期集中在某个位置,模型完全可以通过“选 C”的简单策略获得高于随机猜测的分数。

更隐蔽的是选项长度线索。手工编写的科学题目中,正确答案经常包含更多限定词、专有名词或完整公式,导致正确答案更长。模型学会“选最长的选项”之后,可以在不了解科学内容的情况下提升准确率。

检测方式很简单:把选项顺序随机打乱,重新评测。如果模型分数显著下降,说明它依赖了选项位置或长度这类表面特征。

2.3 思维链不忠诚:过程与答案脱节

当前很多模型在推理类评测中使用思维链(chain-of-thought, CoT)。思维链的初衷是让模型先生成推理步骤,再基于步骤产出答案,从而提升可解释性。但捷径攻击下,模型完全可以先得出答案,再倒推编造一段看似合理的解释。

这种“理由后置”的现象被称为思维链不忠诚。判断方法非常直接:把最终答案改成错误选项,观察模型是否还能给出同样的推理过程。如果模型在答案改变后仍然生成几乎相同的解释,说明解释与推理无关,只是附带生成的一段文字。

2.4 样例记忆而不是规则迁移

还有一种更隐蔽的捷径,模型不是记忆完整题目,而是记忆题型模板。比如学过“DNA 碱基互补配对”的例题后,模型记住的是题目结构和答案之间的映射关系,而不是碱基配对规则本身。

检测这种问题需要构造反事实样例。把题目中的数值、物种、反应条件改掉,保留结构,看模型是否依然能够正确推导。如果模型在模板相同但内容变化时表现骤降,说明它学到的是模板匹配,不是科学规则。

2.5 格式捷径

格式捷径尤其常见于自动评分流程。许多科学基准使用多选题或简答题,自动评分通常采用字符串匹配、关键词匹配或模型判定。模型可以通过输出特定格式来迎合评分逻辑,比如在答案开头先写“正确答案是”,或者把答案包装成包含标准术语的长句。

这种问题必须结合评测管道分析。实际项目里可以通过修改自动评分器的匹配方式来做对照实验:一边用严格匹配,一边用语义匹配,看同一批模型输出是否出现明显分数差异。

2.6 分布内模式匹配

最后一种形态是模型在训练分布内见过大量类似问题,虽然没有见过完全相同的题目,但已经掌握了“题干关键词组合”与“答案关键词”之间的统计相关性。出现“光合作用”“暗反应”“C3 植物”等关键词组合时,模型可以准确预测答案方向,完全不理解光合作用的化学过程。

这类捷径最难检测,因为模型确实从未见过原题。唯一的办法是加入分布外测试,也就是在评测集中加入模型训练阶段几乎不可能接触到的全新科学问题,观察推理能力是否依然成立。

3. 用一次受控实验复现“捷径攻击”的评测失真

3.1 实验设计思路

要理解 shortcut hacking 对评测结果的影响,与其空谈概念,不如设计一个受控实验。实验目标不是复现某篇论文的具体结论,而是演示为什么只看正确率不够。

这个受控实验可以按以下流程设计:

  1. 准备一组科学推理题,覆盖数学、物理、化学、生物四个学科。
  2. 将每题改成多选题,答案选项固定为 4 个。
  3. 使用同一评测集,分别构建两个版本:
    • 版本 A:原始顺序,答案分布保持题目原本的自然分布。
    • 版本 B:将真实答案随机打乱到不同选项位置。
  4. 对同一个模型进行两次评测,分别记录各学科准确率和整体准确率。
  5. 比较两轮结果的差异。

如果模型在版本 B 上的准确率显著下降,证明它在版本 A 中利用了大量与题目内容无关的位置特征。这就是一个可复现的捷径攻击证据。

3.2 对照实验代码思路

下面给出一个实验脚本的核心思路,用于演示如何自动打乱选项顺序并重新评测。

import random

def shuffle_options(question):
    """
    将题目的选项顺序随机打乱,并返回新的选项列表和答案索引。
    用于检测模型是否依赖选项位置等表面线索。
    """
    options = question["options"]
    answer_idx = question["answer_idx"]

    order = list(range(len(options)))
    random.shuffle(order)

    new_options = [options[i] for i in order]
    new_answer_idx = order.index(answer_idx)

    return {
        "id": question["id"],
        "stem": question["stem"],
        "options": new_options,
        "answer_idx": new_answer_idx,
        "original_answer_idx": answer_idx
    }

def evaluate(model, dataset):
    correct = 0
    total = len(dataset)
    detail = {"math": [0, 0], "physics": [0, 0], "chemistry": [0, 0], "biology": [0, 0]}

    for item in dataset:
        options_text = "\n".join(
            f"{chr(65 + i)}. {opt}" for i, opt in enumerate(item["options"])
        )
        prompt = f"{item['stem']}\n{options_text}\n请直接输出答案选项。"
        pred = model.generate(prompt)
        pred_idx = ord(pred.strip()[0].upper()) - 65
        is_correct = pred_idx == item["answer_idx"]

        if is_correct:
            correct += 1
        detail[item["subject"]][1] += 1
        detail[item["subject"]][0] += int(is_correct)

    return correct / total, detail

# 使用方式:
# dataset_origin = load_dataset("science_benchmark_small")
# dataset_shuffled = [shuffle_options(item) for item in dataset_origin]
# acc_origin, detail_origin = evaluate(model, dataset_origin)
# acc_shuffled, detail_shuffled = evaluate(model, dataset_shuffled)

这段代码的思路并不复杂,关键是实验设计本身。打乱选项顺序之后,模型需要真正根据题干科学内容判断答案,而不是依赖位置线索。分数差就是捷径依赖程度的一个量化指标。

3.3 预期结果与判断标准

在实验中,通常会出现几种结果,每种结果对应的结论不同。

实验结果 可能结论 后续动作
版本 B 与版本 A 分数接近 模型较少依赖选项位置特征 继续做内容扰动和思维链忠实性检测
版本 B 分数明显下降 模型存在位置依赖或表面线索依赖 对评测集做人工复核,排除污染嫌疑
版本 B 分数反而上升 原始版本存在严重的位置线索误导 重新审查原评测集的选项分布
不同学科下降幅度差异大 学科之间训练数据覆盖度不均 分学科分析,定位污染或模板记忆来源

值得强调的是,这一步只是检测的第一步。选项打乱无法覆盖数据污染、思维链不忠诚等问题,因此还需要后续多维检测。

3.4 这个实验容易踩的坑

第一个坑是随机种子不固定。如果随机打乱选项时没有固定随机种子,两次实验之间无法对比。复现代码里应该显式指定随机种子,并把打乱后的数据集保存下来。

第二个坑是模型输出格式不规范。模型可能输出“答案:B”,而不是纯字母。解析时要兼容多种输出格式,否则会把正确答案判为错误,产生假阳性。

第三个坑是只测一个模型。捷径攻击是评测体系问题,不是单个模型的问题。至少应该用两个强弱不同的模型做对照,才能判断评测集的抗干扰能力。

4. 系统检测模型是否在走捷径

4.1 扰动测试:把题目换个说法再问一遍

扰动测试是目前检测捷径依赖最常用的方法。核心思路是保留题目的科学含义,改变表达形式,观察模型是否仍然答对。

常见的扰动方式包括:

  • 改写题干措辞,不改变科学条件。
  • 调整数字单位,例如把摄氏度换成开尔文。
  • 交换条件与结论的表述顺序。
  • 将选择题改成简答题。
  • 把具体物种名替换为同属的其他物种。
  • 重新组织图表描述的语言。

如果模型在扰动后正确率大幅下降,说明它依赖的是题目表面特征,而不是科学推理。推荐至少进行 3 轮不同级别的扰动,并将每轮结果单独记录。

4.2 反事实问题:用不可能的假设检验规则理解

反事实测试比扰动更深入。它不是换表述,而是直接修改题目中的科学条件,制造一个现实中不可能或反常识的场景,观察模型能否基于规则正确推导。

例如:

原题:在标准大气压下,水的沸点是 100 摄氏度。
反事实题:假设标准大气压变为原来的 2 倍,水的沸点会如何变化?

这类问题无法通过记忆标准答案回答,模型必须理解气压与沸点之间的物理关系。如果模型在原题上得分高、在反事实题上得分低,说明它只是记住了知识条目,没有掌握关系。

反事实测试的难点在于构造题目需要专业知识。建议由领域专家与评测工程师一起完成,避免出现逻辑不自洽的反事实题。

4.3 跨格式一致性:同一道题换格式必须稳定

另一个有效方法是跨格式一致性检测。同一道题,分别以选择题、判断题、简答题、填空题的形式出现,正确答案在语义层面必须一致。如果模型在选择题中选对了,却在填空题中答错,说明模型并没有真正掌握该知识点,只是在选择题格式下命中了模式。

可以用下面的伪代码表示跨格式评分的流程:

for each question in question_bank:
    formats = build_formats(question)   # 生成多格式版本
    answers = [model_answer(f) for f in formats]
    consistency = verify_semantic_equal(answers)
    record(question.id, consistency)

语义一致性判断需要有清晰的规则。推荐先把各格式的标准答案统一成结构化形式,例如三元组:“主体” + “谓词” + “对象”,再做自动比对。

4.4 思维链忠实性分析

思维链忠实性分析解决的是“推理过程和答案是否一致”的问题。最简单的实验是答案干预法:在模型生成完思维链后,把最终答案替换成错误答案,重新让模型生成解释。如果解释几乎不变,说明思维链与推理无关。

更系统的做法是构建思维链标注集,由人工判断思维链中的每一步是否可以由前一步逻辑推出。虽然成本高,但对前沿科学基准非常必要。可以先用规则筛选出思维链异常的样本,再做人工复核,降低人力成本。

5. 构建稳健评测管线的核心实践

5.1 评测集设计要与训练分布隔离

最有效的隔离方式是时间隔离。评测题目的发布时间应晚于模型的训练数据截止时间,并且题目来源不能是公开的网络语料。实际项目可以采用“私有评测集 + 定期更新”的方式,每季度从领域专家处收集新题,避免评测集长期固定。

收入评测集的题目需要经过三道检查:

  1. 题目是否可能在公开语料中出现,检索一遍确认。
  2. 题目是否存在明显的表面线索,例如答案长度异常、选项分布不均。
  3. 题目是否能够构造出分布外变体,以便后续做扰动测试。

5.2 评测发布前需要执行的完整检查清单

以下清单可以在发布评测结果前逐项确认,避免因为评测流程漏洞得出误导性结论。

检查项 检查方式 通过标准
数据污染检测 随机抽样 100 题,将题干前缀输入模型观察续写 续写内容与标准答案无高度重合
选项位置偏移 统计正确答案在 A/B/C/D 上的分布 各位置占比接近 25%
选项长度偏移 比较正确选项与错误选项的平均长度 长度差异不显著
扰动后稳定性 对 20% 题目做措辞扰动 准确率下降不超过 5 个百分点
反事实测试 构造 20 道反事实题 模型在反事实题上保持合理正确率
跨格式一致性 随机抽取 50 题改格式重测 语义一致率达到可接受阈值
思维链忠实性 人工抽检 30 条思维链 无明显过程与答案脱节现象

5.3 学习环境与生产环境的评测要求差异

学习阶段做评测,通常只关心模型相对水平,环境要求可以简化。但生产环境引入模型能力报告时,必须以更严格的标准执行。

维度 学习环境 生产环境
评测集规模 500 题以内 5000 题以上并分学科分层抽样
污染检测 可选 必须执行
扰动测试 简单改写 多轮多维度扰动
思维链检查 抽样即可 规则预筛与人工复核结合
评测结果呈现 单一准确率 准确率、置信区间、分学科明细、稳定性
版本管理 Git 记录评测脚本 评测集、模型版本、评测环境全量记录

生产环境尤其要注意日志和可追溯性。每次评测必须记录模型版本、评测集版本、提示词模板、采样参数、随机种子,保证结果可以复现。

5.4 评测指标不能只有准确率

准确率只是第一层指标。对于推理评测,至少还要记录:

  • 无答案率:模型拒绝回答的比例。
  • 错误答案分布:错误集中出现在哪些学科或题型。
  • 扰动稳定性:各扰动维度下的准确率差值。
  • 置信度校准:模型自报置信度与真实正确率是否一致。
  • 思维链质量:抽样人工评分。

这些指标共同构成一张更立体的评测画像。只看准确率,很可能把捷径攻击误判成推理能力提升。

6. 前沿方向与评测方法的争议

6.1 结果监督与过程监督之争

传统评测只监督最终答案是否正确,属于结果监督。过程监督则要求模型在推理的每一步都符合逻辑,再综合判断最终答案。过程监督更接近对真实推理能力的测量,但标注成本极高,且过程本身的评判标准难以统一。

实际项目中不必二选一。可以先用结果监督做大规模初筛,再用过程监督对高分样本做二次复核。对前沿科学基准,这种“结果初筛 + 过程复核”的混合模式性价比最高。

6.2 评测集必须持续更新

任何一个固定评测集,发布越久,被训练数据污染的风险越高。社区中有不少评测基准已经出现“分数饱和”现象,新模型在这些基准上的得分趋同,区分度下降。研究者需要持续维护评测集,定期淘汰被污染的题目,补充新题。

更新评测集的节奏建议按季度进行。每次更新保留上一版本的题目用于纵向对比,同时新增 20% 到 30% 的私有不公开题目,用来检测真实泛化能力。

6.3 LLM 作为评测者的边界

用 LLM 作为自动评测者,也就是 LLM-as-a-Judge,正越来越多地被用在推理评估中。但评测模型本身也可能存在捷径行为。当评测模型被用于评估另一个模型的回答时,它会倾向于关注回答长度、格式完整性和表面权威感,而不是逻辑严密性。

使用 LLM 作为评测者时,必须加入人工抽检机制。建议抽检比例不低于 10%,且抽检样本要覆盖高分、低分和边界分区域,避免评测模型在某个分数区间出现系统性偏差。

7. 给研究者和工程师的实践建议

先给研究者的建议:发布科学基准评测结果时,同时公开污染检测记录、扰动测试结果和思维链抽检结果。这不仅是学术严谨性的问题,更是对后续使用者的保护。没有这些背景信息的准确率,很容易被引用成“模型已具备前沿科学推理能力”的错误结论。

再给工程师的建议:在选择模型时,不要只看上线前那份评测报告,要针对自己的业务场景重新做小型评测。业务数据通常与通用基准分布不同,重新评测才有参考价值。如果业务场景依赖模型解释,还必须在评测中检查思维链的忠实性。

生产系统落地时,额外强调三点:

  • 评测集和模型版本要绑定记录,防止升级模型后无法回溯问题原因。
  • 对模型输出的推理过程做质量监控,不要只看最终答案正确率。
  • 建立定期回归评测机制,模型更新、提示词调整、评测集变更后都要重跑同一套流程。

对于刚接触这个方向的学习者,最有效的练习不是读更多论文,而是亲手做一个扰动实验。拿一个开源的数学推理模型,构造 50 道多选题,然后打乱选项顺序、改写题干、改成填空题,分别记录模型分数。亲自看到分数落差之后,才会真正理解为什么“答对”和“会推理”是两回事。

更多推荐