你问一个大模型“麻雀会飞吗”,它几乎秒答“会”。但如果追问一句“假如在这个世界里,所有鸟都不会飞,那麻雀还会飞吗”,不少模型会愣住,甚至开始给你科普生物学常识。这就是大规模语言模型在反常识推理上的典型翻车现场。我近几年一直在做推理能力评测相关的工作,最直观的感受是:模型在“符合常识”的题上刷分很快,但一旦遇到需要主动推翻常识设定的题目,能力曲线会断崖式下跌。很多人把这个问题归因于“模型笨”,其实不是,背后是数据分布、对齐方式和评测口径三股力量在共同作用。
这篇文章不是纯理论科普,而是把“反常识推理能力培养”这件事拆成可落地的评测方案、数据构造方法和训练策略。我会用一个贯穿全文的“猫会汪汪叫”式逻辑题来解释原理,再结合一个内部模拟项目X的完整实操记录,讲清楚从数据清洗、微调超参到评测指标设计的每一个环节。适合正在做模型评测、推理能力优化或Prompt工程的算法工程师,也适合想搞明白“为什么模型在这种题上总翻车”的产品和研究人员。先把概念掰开,再看实操。
1. 反常识推理到底是什么:先把它拆明白
1.1 一道题看出模型在“背答案”还是在“真推理”
常规的常识推理题,比如“下雨了,小明出门应该带什么”,模型只需要调用现实世界的先验知识就能答对。反常识推理则完全不同:题目会先给出一个和现实世界相悖的设定,要求模型在这个“虚拟规则”下继续推理。最经典的例子是“已知所有猫都会汪汪叫,那么路边遇到一只猫,它会怎么叫”。现实常识告诉我们是“喵喵”,但题设已经把规则改成了“汪汪”。模型如果直接输出“喵喵”,说明它根本没在按题设推理,只是在背常识统计规律。
这个测试看似无聊,实际上非常锋利。它把“记忆”和“推理”硬生生分开:背答案的模型会在反常识题上暴露原形,而真正理解“推理前提是由题设决定的模型”,即使答错,也会沿着题设给出的方向去思考。我在评测时发现,同一道题只改一个规则,不少模型的得分能从接近满分掉到近乎为零,这个断层本身就是能力短板的最佳证据。
1.2 把反常识推理拆成三个可训练的能力层次
我习惯把反常识推理拆成三个层次,这样无论是做数据还是做训练,都能精准定位模型到底卡在哪一步。
第一层是“假设识别”。模型得先发现题目里的隐藏预设。比如“所有猫都会汪汪叫”这道题,隐藏预设是“猫的真实叫声是喵喵”;如果题目换成“在一个只有水没有火的世界里点燃木柴”,隐藏预设就更复杂:既要识别“燃烧需要火源”,又要识别“这个世界没有火”。很多模型在这一层就挂了,它的语义理解会把题设当成“事实错误”而不是“规则声明”。
第二层是“假设否定”。识别出预设之后,模型要主动把这个预设搁置,不能让现实世界的先验知识继续干扰推理。这一步需要模型具备“暂时接受荒谬前提”的能力。人类很容易做到,比如玩游戏时接受“角色有三条命”,但模型会反复被训练数据里的常识拉回去。
第三层是“逻辑重建”。在接受了新规则之后,模型要基于新规则做一致性的推导,而不是只记住规则本身。比如“猫会汪汪叫”和“狗会喵喵叫”同时成立时,猫狗相遇的场景就要完全按照新设定来脑补,不能再调用现实世界的叫声库。能稳定做到第三层的模型,才算真正具备反常识推理能力。
1.3 为什么要单独培养这项能力:不是炫技,是补短板
我遇到过不少质疑:反常识题那么偏,投入产出比是不是太低了?我的回答是:这项能力不是用来炫技的,它直接暴露的是模型的“先验依赖度”。一个模型如果在反常识题上持续翻车,说明它在面对新领域、新规则、新任务时,会本能地套用训练数据里的旧模式。这恰恰是智能体、游戏NPC、虚拟仿真系统等落地场景最致命的短板——这些场景里,规则就是由产品定义的,模型必须无条件服从新规则,而不是质疑规则本身。
从评测角度看,反常识推理是少数能把“逻辑能力”和“记忆能力”剥离开的测试维度。传统推理评测里,模型完全可以靠见过类似题目拿高分,但反常识题目的规则可以无限组合,背题基本无效。这也是近几年一些推理榜单开始加入反常识项的原因——大家逐渐意识到,模型答对多少常识题不重要,重要的是它在反常识规则下还能不能保持推理一致性。
2. 模型为什么读不懂反常识:能力短板的三层归因
2.1 训练数据里只有“常识惯性”,反常识是长尾里的长尾
先看数据分布。大规模语言模型的训练语料来自网页、书籍、论文,这些内容默认都在描述真实世界或虚构但自洽的世界。符合常识的陈述句在语料里占比极高,而“所有猫都会汪汪叫”这种反常识单句,即便存在,也往往出现在段子里或者否定语境里,比如“这种说法荒谬,猫怎么会汪汪叫”。模型学到的不是“规则可以改写”,而是“猫叫=喵喵”这个统计规律被反复强化。
我做了个粗略统计:在一个模拟项目X的语料抽样里,符合现实世界物理规则和生物常识的描述占到了九成以上,真正可用的反常识推理型语句不到万分之一。这就像一个人从小到大只看一种类型的电影,突然让他看一部设定完全相反的片子,他当然会处处觉得“不对劲”。模型的“常识惯性”本质上是一种统计学上的先验偏好,不是它故意固执,而是训练信号里反例太少。
2.2 对齐过程在悄悄奖励“常识顺从”
训练完预训练模型之后,还要做对齐。对齐的目标是让模型输出对用户“有用且正确”的内容,但这里隐藏着一个矛盾:在人工偏好数据里,符合常识的回答通常被标注为“更好”,不符合常识的回答被标注为“更差”。标注者看到“猫会汪汪叫”这种答案,第一反应就是“胡说八道”,很少会去考虑题目设定是否允许这个答案。于是对齐过程equivalent给模型加了一道锁:越是对齐充分的模型,越倾向于输出“常识上正确”的答案。
这个结论我实测过:同一个基础模型,做完全量微调后的版本在反常识题上的准确率,反而比微调前的原始版本低了十几个百分点。原因就是对齐阶段用的偏好数据里,反常识正确答案被当作错误样本打了低分。模型学到的是“不要输出反常识内容”,而不是“先判断题目设定了什么规则”。所以培养反常识推理能力,不能只在评测阶段想办法,还得考虑对齐阶段怎么把“规则服从”纳入奖励信号。
2.3 评测指标报喜不报忧,掩盖了真实短板
还有一个容易忽略的环节,是评测指标本身有问题。很多评测集用标准准确率来算分,而标准答案往往就是常识答案。模型在反常识题上如果被题设说服了,输出了“汪汪叫”,但标准答案写着“喵喵叫”,它照样被打错。反过来,如果模型根本无视题设,直接背常识,反而能拿分。这种评测口径下,模型的“常识惯性”被误判为“推理能力”,问题完全被掩盖了。
所以要评测反常识推理能力,必须设计对照实验。同一道题做成两个版本:一个版本保持现实规则,一个版本把规则反转,然后看模型在两个版本上的得分差值。如果模型在现实版上拿高分、在反转版上拿低分,说明它只是个“常识背诵器”;只有两个版本都拿高分,才说明它真正理解“推理规则来自题设”。这个差值指标,才是暴露真实短板的关键工具。
3. 反常识推理评测基准:先把尺子做出来
3.1 三类反常识题型怎么造:单规则、多规则、冲突题
评测反常识推理能力,不能靠拍脑袋出题,要系统化地对“规则覆盖”进行设计。我在模拟项目X里把反常识题分成三类,每一类对应一个不同的推理难度。
第一类是“单规则替换”,整个测试里只翻一条常识规则,其他规则全部保留。例如“所有猫都会汪汪叫,狗仍然喵喵叫,那么猫遇到狗时会怎样交流”。这类题考察的是最基本的规则替换能力,模型只需要识别并否定“猫叫喵”这一条预设,操作门槛最低。
第二类是“多规则叠加”,同时推翻两条甚至三条常识规则。例如“所有猫都会汪汪叫,所有鱼都会在陆地上行走,那么猫和鱼在陆地上相遇时,谁会先发出声音”。这类题目要求模型同时维护多个反常识设定,任何一个预设残留都会导致推理链条断掉。
第三类是“冲突题”,题设内部存在明显矛盾,但要求模型在矛盾下仍然保持推理一致性。例如“在一个不允许使用火焰的世界里,所有食物都必须用火烹饪,那么这个世界的人怎么吃饭”。这类题目最考验模型的“规则优先级”处理能力:是要保留“禁止火”还是保留“必须用火”?关键不是选边站,而是给出一个自洽的解释路径。
3.2 标注与清洗:反常识不等于瞎编
出题只是第一步,真正的难点在标注与清洗。反常识题最忌讳的是“开放式脑洞”,即答案完全无法判断对错。我要求模拟项目X里每道题都必须满足两个条件:一是题设规则足够明确,答案可以被唯一推导;二是答案必须能在题设内部找到依据,不能依赖现实世界知识。
实际操作中,我会先把自动生成的候选题交给大模型写参考答案,再由两个标注者背靠背审核。审核重点不是“答得对不对”,而是“答案是否严格遵循题设”。比如“所有猫都会汪汪叫”这道题,如果参考答案是“猫会发出汪汪声”,就算正确;如果参考答案是“猫会先喵后汪”,这就属于从现实世界偷渡了常识,要打回重做。清洗环节还会过滤两类不合格数据:一类是题干里隐藏了过多未说明的规则,导致回答路径分叉;另一类是参考答案与题设逻辑自相矛盾。
标注完成后还需要做一致性抽检。我一般会抽10%的数据让标注二方重新独立标注,用标注一致性来评估数据质量,如果一致率低于一定阈值,就说明题目的理解成本过高,需要简化题干。这一步听起来繁琐,但直接决定了后续训练和评测的可信度。
3.3 评测协议与指标:用差值暴露“常识惯性”
评测协议上,我建议至少测三种设置:零样本直接回答、少样本带上几个示例、思维链提示要求模型先列假设再推理。原因很简单,反常识推理能力可能被Prompt格式激活或抑制,只测一种设置容易误判。比如有些模型在零样本下完全无视题设,但在思维链提示下就能一步步把假设列出来,分数差异很大。
指标层面,除了常规准确率,更推荐引入一个“反常识敏感度”差值指标。具体做法是给每道反常识题配一个“常识对照版”,例如反常识题“所有猫都会汪汪叫,猫遇到狗时怎么叫”搭配常识版“猫遇到狗时怎么叫”。然后分别计算模型在两组上的准确率,用“反常识版准确率减去常识版准确率”得到差值。差值越接近0,说明模型对规则反转越不敏感;如果两个分数都很高,那说明模型真正具备反常识推理能力。我在模拟项目X里发现,基线模型的差值大得惊人:常识版准确率八十多分,反常识版只有二十多分,差值接近五十分,这个差距比任何单项准确率都更能说明问题。
| 指标 | 计算方式 | 解释 |
|---|---|---|
| 反常识版准确率 | 直接评估反常识题 | 反映模型在新规则下的推理能力 |
| 常识版准确率 | 评估配对常识题 | 反映模型在现实规则下的推理能力 |
| 反常识敏感度差值 | 反常识版准确率 - 常识版准确率 | 差值越大,常识惯性越重;理想状态是接近0且两者均高 |
| 思维链增益 | CoT提示准确率 - 零样本准确率 | 反映模型能否被引导进行逐步推理 |
这套评测方案的关键价值在于,它不是只看一个绝对分数,而是通过对照把“推理能力”和“先验依赖”区分开。模型完全可以通过背常识拿到一个不错的反常识版准确率吗?理论上可以,但如果把反常识的规则随机组合、每题都不重复,背题的空间会被压缩到很小。
4. 反常识推理能力的培养路径:数据、训练与推理三层联动
4.1 三条数据构造路线怎么选:变换、模板、对抗生成
数据是培养反常识推理能力的地基。我在实践中总结出三条不同成本的构造路线,按从低到高的顺序排列。
第一条是“句式变换”,把常识题加上否定或替换条件,简单粗暴但覆盖有限。比如“鸟会飞”改成“所有鸟都不会飞,麻雀呢?”这条路线适合快速搭起第一批数据,但很容易出现“加了否定以后题干语法不自然、规则不完整”的问题,需要人工二次润色。
第二条是“模板组装”,把常识关系抽象成槽位,再用程序批量填充。比如设计一个“所有[动物]都会[叫声],那么[动物2]遇到[动物]时会怎样”的模板,然后从词表里随机填充。这条路线的优势是产量高、规则清晰,缺点是模板句式容易雷同,模型训练时可能过拟合到固定句法,导致泛化能力不足。
第三条是“对抗生成+人工审核”,用大模型批量生成反常识题,再由人类筛选合格样本。这条路线质量上限最高,因为生成模型可以构造出远超模板限制的多样化情境,比如跨领域的规则组合、带逻辑陷阱的问题。但人工审核成本也最高,需要标注者把每道题都跑一遍逻辑链,确认题干没有歧义、答案可以被推导。
我的建议是三条路线混合使用:模板组装保证基础覆盖,句式变换补充自然语言变化,对抗生成负责提升题目多样性。模拟项目X最终的数据配比大约是三成模板题、两成句式变换题、五成对抗生成并经过人工审核的题。
4.2 训练阶段三层策略:预训练、微调、偏好优化
数据准备好之后,选择什么样的训练策略直接决定效果天花板。我按干预深度把培养路径分成三层。
第一层是“增量预训练”,把反常识语料混入原有训练数据继续训练。这条路最彻底,能让模型在基础分布层面就减轻常识惯性,但成本也很高。一般来说,只有你有足够的算力预算,才会选择在全量预训练阶段注入数据。
第二层是“监督微调”,这是我在模拟项目X里主要采用的方式。具体做法是构造“反常识题-正确答案-推理过程”的三元组,然后对模型进行指令微调。为了让模型学会“先识别假设再推翻假设”的推理模式,我特意在训练数据里把推理过程展开写,而不仅仅是给一个最终答案。这一步的效果很快能看到,但风险是模型可能过拟合到有限的反常识句式上,遇到新题又变回原样。
第三层是“偏好优化”,把“识别反常识设定并严格按设定推理”作为正样本信号,也就是让模型从偏好层面就知道“服从设定比符合常识更重要”。我在模拟项目X里用了偏好优化方法,把“按题设回答的反常识答案”打高分,把“无视题设、坚持常识答案”打低分。这一步处理的收益是持久的,它修正了模型在人类偏好数据里学到的“常识顺从”倾向。
这三层策略不是互斥的。对于大多数中小团队,我的实际建议是先做监督微调把能力“教”给模型,再用偏好优化把能力“固化”住,最后如果还有预算,再用少量增量预训练数据做一次稳固。顺序反过来效果通常不好,因为如果模型根本没有见过足够多的反常识题,偏好优化阶段就没有正样本可以学。
4.3 推理阶段临门一脚:提示词与解码参数
训练做得再好,推理阶段的Prompt设计和解码参数也会影响最终效果。我在评测中发现,很多模型默认状态下会把题设里反常识描述当成“噪声”忽略掉,但只要我们把提示词里加上一句“请忽略现实世界常识,严格遵循题目设定”,准确率就能提升明显。
这里分享一个我在模拟项目X里验证有效的三步法提示词模板:
请忽略现实世界常识,严格遵循题目中的设定进行推理。 题目:{题目} 请先列出题目中包含的隐藏假设; 然后逐一推翻这些假设,改写为新规则; 最后基于新规则给出你的答案。这套模板的原理其实就是把反常识推理的三层能力显式地写进提示里,让模型按照“假设识别-假设否定-逻辑重建”的路径走一遍,而不是直接跳到最后答案。对于基础能力中等偏弱的模型,这个引导尤其有效:它会为了避免被扣分而把隐藏假设一一列出来,这本身就在强制它执行第一层和第二层能力。
解码参数也需要调整。我常用的反常识推理解码设置是temperature=0.4、top-p=0.9。为什么不是常规的0?因为反常识推理需要一定的多样性,温度太低会让模型固守在概率最高的常识答案上,反常识的正确回答在词汇概率分布上往往不是最高概率的。但温度也不能太高,太高会导致模型在规则推导过程中胡编乱造。0.4到0.6之间是我实验下来比较稳妥的范围。注意,这个建议只针对反常识推理场景,写代码、做计算题这些场景还是要回到低温。
5. 完整实操回顾:一个7B模型的反常识能力改造
5.1 从0到1准备反常识数据集:质检规则与比例划分
在模拟项目X里,我们选用了一个开源的中小规模模型(7B参数级别),目标是把它在内部构建的反常识推理测试集上的得分从不到三成拉到五成以上。整个改造过程耗时三周,第一周几乎全部花在数据准备上。
我们一共收集并清洗了约五千条反常识训练样本,另配了五百条常识对照组样本用于评测差值指标。数据来源按照第十章的路线混合:约三成直接模板生成,两成来自句式变换,五成来自大模型生成并人工审核。清洗规则非常严格:所有包含模糊指代、逻辑链断裂、多重规则未加说明的题目全部打回;参考答案必须是题设内部可推导的唯一结论,不允许出现“都可以”这类开放答案。数据划分上,训练集、验证集、测试集按比例大致是8比1比1,且测试集和训练集在模板和句式上做了去重,确保不会出现“背题过线”的情况。
模型微调方式采用参数高效微调,原因是7B模型全量微调显存压力太大,而且我们的训练数据只有五千条,全量微调很容易把模型做崩。微调目标是让模型学会“先识别假设、再推翻假设、最后基于新规则推导”的回答范式,而不是只记住具体的猫叫或鸟飞答案。
5.2 微调实操:LoRA超参与完整流程
我给出一个实际可参考的配置。基底模型选用某个开源7B参数模型,应用LoRA进行训练,配置如下:秩设为8,缩放系数为16,作用在查询、键、值、输出四个映射上;学习率2e-4;批量大小16;训练轮数3轮;采用余弦退火调度。每轮训练后在验证集上计算反常识版准确率,选验证分数最高的那一轮作为最终模型。
# 模拟项目X的LoRA训练配置示例(伪代码) config = { "base_model": "some-7b-base-model", "lora_rank": 8, "lora_alpha": 16, "target_modules": ["q_proj", "k_proj", "v_proj", "o_proj"], "lr": 2e-4, "batch_size": 16, "epochs": 3, "lr_scheduler": "cosine", "max_seq_len": 1024, }训练数据样本的组织方式很关键。我要求样本以“问题+完整推理过程+最终答案”的格式组织,而不是“问题+答案”的简单结构。比如样本的内容是:“已知所有猫都会汪汪叫,问遇到猫时它会怎么叫?”答案部分写:“第一步,隐藏假设是猫发出喵喵声;第二步,题设已经将‘猫叫’这一属性替换为‘汪汪叫’;第三步,基于新规则,遇到猫时它会汪汪叫。”这样做的好处是,模型在监督微调阶段就模仿了完整的推理路径,而不是只学到一个答案。
训练耗时在单张中高端显卡上大概是四到六小时。训练完成后,我建议不要直接用最终模型做评测,而是做一次轻量级的“通用能力回归”,比如跑一组常规指令测试,确认模型没有在反常识任务上过度偏科,把基础问答能力牺牲掉。
5.3 效果对照与翻车复盘:模型在哪些题上仍然固执
经过三轮微调,模拟项目X的结果如下:零样本直接回答的基线准确率大约在28%左右,加入三步法思维链提示后基线能到34%;微调之后,零样本直接回答准确率提升到了46%,三步法提示下提升到了55%。常识对照版准确率没有明显下降,仍然维持在80%左右,说明模型在反常识能力提升的同时,没有把常识推理给丢掉。差值指标从原先的五十多分缩小到了二十多分,这个趋势证明训练确实让模型对规则反转的敏感度提升了。
但复盘失败案例时还是发现两类典型翻车。第一类是“复合规则”题,比如同时要求“猫会汪汪叫”和“鱼会爬树”两条规则生效时,模型经常只执行其中一条,要么仍然让鱼在水里游,要么让猫正常喵喵叫。这说明模型还没有真正学会“并行维护多条反常识规则”,原因很可能是训练数据里复合规则题占比偏低。我们后续在数据里专门增加了这类样本,情况就好转了一些。
第二类是“规则传递”题,比如“所有猫都会汪汪叫,而猫怕狗,所以狗出现时猫会怎么叫”。模型容易在“猫怕狗”这个常识性关系上做文章,推出“猫吓得不敢叫”,忽视了题设中猫的叫声已经被替换成“汪汪叫”这一关键规则。这说明模型在推理过程中还是会被高先验的情感关系带偏,反常识规则没有在整条推理链上持续生效。解决思路是在Prompt里强制要求每步结论都必须引用题设规则。
6. 常见问题与排查技巧实录
6.1 高频问题速查表:从训练到评测评一体化排障
| 问题现象 | 可能原因 | 排查方向 | 解决建议 |
|---|---|---|---|
| 微调后反常识准确率没有提升 | 训练数据里正例太少或答案格式不规范 | 抽样检查训练样本的推理过程质量 | 重新清洗数据,确保每一条都有完整推理链 |
| 反常识提升了,通用问答明显变差 | 微调时未混入通用指令数据,模型偏科 | 跑通用能力回归测试 | 按比例混合反常识和通用数据,例如7比3 |
| 模型输出仍然符合现实常识 | 提示词没有强调“忽略现实常识” | 对比有无三步法提示的准确率差异 | 改用“先列假设、再否定假设”的提示模板 |
| 训练后测试集分数高,新题泛化差 | 训练数据句式过于单一,模型过拟合模板 | 检查数据里的模板占比 | 增加对抗生成数据,减少模板类数据比例 |
| 评测分数波动剧烈 | 解码温度过高或评测集样本太少 | 固定temperature和top-p,增加测试集规模 | 统一使用temperature=0.4,top-p=0.9,样本量加大到300条以上 |
| 同一道题模型时对时错 | 模型对复合规则维护不稳定 | 分析答错时的推理链在哪里断裂 | 增加复合规则训练样本,并在Prompt中分步骤拆解规则 |
6.2 几条越早知道越好的实战心得
关于反常识推理能力培养,还有几条来自实践的经验,常规文档里往往不会写。
第一,不要只盯着“答对率”这一个指标。模型可能在单规则题上表现得很好,但多规则题全跪。建议单独统计“单规则题”和“多规则题”的准确率,分开看,这样才能知道模型究竟卡在规则替换的哪一段。如果单规则题已经很高而多规则题很低,问题大概率出在“并行维护规则”而不是“识别规则”上。
第二,训练数据里加入推理链的收益,远比加更多题目要大。我在模拟项目X里做过消融对比:用一千条带完整推理链的数据训练,效果优于三千条只有“题目+答案”的数据。原因是反常识推理的核心难点在于“过程”而不是“结果”,模型只有见过完整的过程,才可能学会如何从常识假设过渡到新规则。
第三,反常识推理能力的养成要迭代,不能一次性做到位。模型第一轮训练后可能只会机械地复述提示模板,第二轮训练后才有部分泛化,第三轮训练后才能在一些无模板的新题上表现出推理一致性。如果第一轮效果不明显,先不要怀疑方向错了,先看看是不是数据多样性不足或者学习率设置不合适。
第四也是最实用的一点:一定要做常识对照。我建议在评测套件里给每道反常识题都配一个常识版本,两者共享同一套逻辑结构,只把规则反转。这样无论模型分数怎么变化,只要算一下两个版本的差值,就能很清楚地知道它是因为“变聪明了”才得分,还是因为“瞎蒙”碰对了反常识答案。
写在最后的经验
这几轮反常识推理能力改造项目做下来,我最大的体会是:这项能力不太可能毕其功于一役。模型天然倾向于服从训练数据里的常识分布,反常识推理更像是在和模型的先验做拉锯战,需要数据、训练策略和推理提示三端同时发力,并且每隔一段时间就要回归测试,防止模型在后续通用任务微调中出现“常识惯性回弹”。我自己养成了一个习惯:每次模型版本更新,都会把反常识测试集完整跑一遍,哪怕这个版本和反常识无关。
最后再分享一个低成本的小技巧:如果你暂时没有算力做微调,只靠提示词也想提升反常识表现,可以试试让模型“先把题设规则改写成一段独立的设定说明,再回答本题”。这个简单的改写动作,相当于强制模型在语义上把反常识规则从现实世界里剥离开来。在我测试过的好几个模型上,光靠这一招,反常识准确率就能有十几个百分点的提升。这句话听着简单,但真的能救急。