开车去洗车店,还是走路去洗车店?如果在路上随机拦下一个大语言模型,问它“我准备走路去洗车店,你觉得我需要准备什么”,它的回答很大概率会从“穿舒服的鞋”“涂防晒”“带瓶水”里选。这些信息当然不算错,但你会隐约觉得不对劲——洗车店需要你自己走路去吗?你难道不是开着车去洗车店,然后走路离开,再走回停车场取车吗?更离谱的是,模型很容易忽略一个事实:如果你真的把车留在洗车店,那才叫“走路去洗车店”,而这时候更应该想的是“车洗好了谁开走”“有没有备用钥匙”“等的这段时间干什么”。这种只在表面信息上打转、被一个显著词带偏的现象,正是大模型在常识推理里经常暴露的短板:显著性偏差(Salience Bias)。
这些年大模型进化得很快,代码、数学、知识问答都能打得有来有回,但常识推理仍然是“一眼看上去很强,细问下去漏风”的重灾区。而且漏风的方式往往高度一致:模型不是不懂常识,而是被输入里那些最显眼、最容易触发高频联想的词带着走,忽略了场景里真正起决定作用的低显著性约束。这个问题的可怕之处在于,它不像知识幻觉那样能被“补充更准的文档”解决,也不像上下文长度那样靠堆窗口就行。它更像一种思维偏好,如果不刻意对抗,模型会一直沿着最容易出词的路径滑下去。
1. 先搞清楚“显著性偏差”在常识推理里到底长什么样
1.1 一个典型场景:模型看到了“走路”,没看到“洗车店的流程”
我们日常感知世界时,注意力和记忆力通常会被那些“突出”的信息吸引。比如一个穿红色衣服的人站在人群里,你第一眼看到他;一条消息标题里有“免费”,你更容易点进去。大模型处理文本时也有类似的倾向,只不过它更依赖训练语料中哪些词和哪些词总是高频共现。
回到“走路去洗车店”这个例子。输入里有几个实体:“走路”“洗车店”“我”。论视觉显著度,“走路”是一个动作,且直接和“去”绑定在一起,模型很容易把它当作任务的最核心约束。于是后续推理会沿着“走路需要什么”展开:鞋、防晒、时间。但实际上,这个场景最关键的约束不是“走路”,而是“洗车店”。洗车店服务的对象不是人,是车。人走路去洗车店,意味着车在洗车店,人不在车旁边,这才需要安排后续的取车、等待、支付等问题。如果模型被“走路”带偏,就会把场景理解成一次普通外出,而不是一次“车辆服务过程中的人车分离”。
这种错误不是简单的知识缺失,而是对场景要素重要度排序出了问题。在常识推理里,模型需要依据真实世界的因果链条、物理约束、社会规则来对信息重新加权,但显著性偏差会让它天然给高频显眼的词加权重,给那些隐式、低频、需要默会理解的约束低权重。
1.2 和幻觉、知识截止不同,这是推理偏好问题
很多人把这类问题统一叫作“AI 犯错了”,但如果拆开看,常识推理中的显著性偏差和幻觉、知识截止完全不是一回事。
幻觉是模型编造了不存在的事实,比如问“XX公司创始人是谁”,它答了一个查无此人的人。知识截止是模型不知道最近发生的事,比如去年发布的某个新政策,它没有训练数据。这两类问题本质上和信息存储、检索有关,可以通过更新数据、增加外部检索来缓解。但显著性偏差不是“不知道正确常识”,而是“明明知道,却在关键推理时选错了依据”。
你可以让模型写一段关于“去洗车店”的常识列表,它能写出“带车、带钥匙、付钱、等待”,这些都背得出。可一旦把它放在一个具有诱导性的快速问答里,只要句子开头的“走路”足够显眼,它就把刚背过的常识丢到一边,顺着“走路”展开联想。这就是为什么单纯给模型更多数据、更大参数量,未必能彻底解决这个问题。它的数据里已经有常识,缺的是在推理时如何对抗表面线索的干扰。
1.3 一句话定义:决策时被“高显著性”信息压倒了“高相关性”信息
用一句话总结:显著性偏差是模型在推理时对“显著但未必关键”的信息给予过高的权重,而低估了那些“关键但不够显眼”的信息。注意,这里的显著性不一定是视觉上的,而是语言层面容易触发高频联想、频繁出现在训练语料里的搭配。比如“走路”和“鞋”,“下雨”和“伞”,“飞机”和“登机牌”,这些都是强共现,模型在生成时很容易顺着这些关联滑过去。
关键问题是:真实世界里的决策,往往不需要你盯着最明显的东西,而是需要你找到最关键的变量。洗车店场景里,最关键的变量是“车”,不是“走”。医生诊断场景里,最关键的变量是症状的细节和既往病史,不是“挂号”这个动作。这种重新排序能力,正是常识推理的核心,也是目前大模型最不稳定的部分。
2. 为什么模型会偏向显著的线索,而不是完整的常识
2.1 训练目标天然奖励“更常见”的关联
大语言模型的训练目标通常是最小化下一个 token 的预测误差。这意味着,一个词后面跟着哪个词在语料里出现得越频繁,模型就会给这条路径越高概率。这种目标和人类学习常识的方式有个根本差异:人类常识的形成不仅来自语言统计,还来自物理世界的因果体验。你摔过跤才知道路滑,你等过洗车才明白车是主角;但模型从来没有开过车,也没有走过路,它对世界的理解全部来自文本中的共现关系。
于是,“走路”后接“鞋”的共现概率,在语料里极高;“洗车店”后接“等待时间安排”的共现概率,就低得多。模型在快速生成时,会天然选择概率更高的路径,即使这条路径不符合完整场景推理。这不是它故意偷懒,而是训练目标造成的统计偏好。当你问一个常识推理问题时,如果问题本身包含高显著词,模型会把文本延续的重心放在那个高显著词引发的联想链上,而不是去做一次全局的因果模拟。
2.2 注意力机制让高显著 token 主导了上下文压缩
除了训练目标,Transformer 的注意力机制也在某种程度上放大了这个问题。模型在生成每个 token 时,会通过注意力机制去计算当前应该关注输入序列中的哪些部分。理论上,它应该学会把注意力分配给“关键约束”,比如洗车店、车、人。但实际训练出来的注意力分布,往往更倾向于那些在语义上“信息量大”或“和当前生成位置关系紧密”的词。
在“走路去洗车店”中,“走路”是一个动词,和后面的“去”形成动作结构,注意力自然把它当作高优先级的线索。而“洗车店”虽然也是名词,但它在句子里的地位更像一个地点状语,模型的注意力会分配给动词更多。这种结构性的注意力倾斜,不是某一次推理的问题,而是模型在预训练阶段通过海量语料形成的一种默认模式。即使后面接了指令微调,如果微调数据里没有大量针对反常识、反直觉场景的训练,模型依然会回到默认模式下工作。
2.3 常识不等于高频语料,数据分布与物理世界的缺口
更本质的原因在于,语料库里的文本分布和物理世界的真实分布并不一致。物理世界里有无数条常识是不被书写的,因为它们太显然,没人会写进文章里。比如“人走路去洗车店,通常不是因为想走路,而是因为车在洗车店”。这种常识在文本里出现的次数极少,因为正常人不会专门写一条帖子解释这件事。反而是“走路穿什么鞋”“走路要注意安全”这类健身、户外文章特别多。于是模型学到的所谓“常识”,是经过文本过滤的、带偏斜的常识。
这个现象在认知科学里叫“可得性偏差”的文本版:越容易被写进语料里的信息,越容易被模型当作世界运行的主要规律。当你用常识推理问题做测试时,你以为是在测物理世界理解,其实测的是文本高频关联。模型答得好,往往是因为问题里涉及的关联在文本里高频出现;模型答得差,往往是因为那个场景在真实世界里很常见,但在文本里很少被直接描述。这提醒我们,在评估大模型常识推理能力时,不能只选网络上聊得多的例子,还要刻意构造一些“文本很少见但物理世界很常见”的场景。
3. 在业务里降低显著性偏差的三步法
3.1 第一步:把高显著特征显式地拆解成低显著约束
我们控制不了模型在预训练阶段形成的联想偏好,但可以控制输入给它的内容格式。既然模型容易盯着最显眼的词,我们就不要让它有机会只盯一个词,而是把问题里的场景要素拆开,先用显式列表把所有约束列出来,再让它做推理。
比如业务场景里有一个问答机器人,用户问:“走路去洗车店需要带什么?”我们可以先在系统层做一步“意图拆解”,把问题转成中间结构:
场景:用户前往洗车店 交通方式:步行 核心对象:车辆 关键隐式约束:车辆将留在洗车店;用户离开洗车店;后续需要取车 待推理问题:需要准备什么?然后让模型基于这个结构进行推理。这里的关键动作是:把“洗车店”背后的“车辆服务流程”这个低显著约束,变成显式列表里的一项。这样模型就不容易忽视它。这个思路并不仅限于洗车店场景,凡是涉及实体角色、动作语义和环境背景的常识问题,都可以先拆解成“主体、动作、对象、地点、隐式约束”五个维度。
这一步是最容易执行的,但很多人不做。原因是觉得让模型直接回答更快,而且有时候模型也答得不错。但真实业务里,十个问题里能答好九个,第十个出问题时引发的用户信任成本很高。提前显式拆解,虽然增加了一步中间过程,但能让输出稳定性大幅提升。
3.2 第二步:用反事实问题逼迫模型走完整推理链
另一个有效策略是设计反事实问题。显著性偏差通常发生在“正常提问”下,而反事实问题会强制模型考虑“如果不是这样,会怎样”,从而触发对低显著约束的检查。
还是在洗车店场景,模型回答“需要穿舒适的鞋”之后,你可以追加追问:“如果车已经提前洗好了,而且有朋友帮你开回家,你还需要准备什么?”或者更直接一点:“如果洗车店提供接送服务,你还需要带什么?”这些追问会把模型从“步行准备”的联想链中拉出来,让它重新评估场景。模型在回答反事实问题时,通常会更完整地思考“哪些条件被改变了”“哪些条件仍然成立”。
实际落地时,可以把反事实问题做成一个“验证步骤”,而不是直接让用户追问。在系统内部,当模型给出一个高显著但可能不完整的回答后,自动生成两组反事实条件,让模型分别推理,再比较结果。如果两个结果没有适当变化,说明模型可能只抓住了表面的显著要素,而没有真正理解场景。
注意,反事实问题要控制数量。一两个就够了,太多会让用户觉得系统在抠字眼。而且反事实设计要基于场景的真实变量,不要为了变而变,比如把“走路”改成“开车”,如果这个变量不影响答案就没有测试价值。
3.3 第三步:建立一批“陷阱样本”做回归测试
前两步属于运行时干预,第三步属于评估体系。如果要长期改善模型在常识推理上的表现,你需要建立一批包含显著性干扰项的测试集,把这些样本作为模型迭代的回归门槛。
陷阱样本的设计方法是:找一批包含高显著特征、但正确答案需要依赖低显著约束的常识推理问题。格式可以是选择题,也可以是开放问答。每个样本至少要标注三部分:
- 显著干扰项:问题里最容易引发联想但并非关键的信息。
- 正确约束:真实世界里的关键约束或因果规则。
- 错误答案示例:模型如果被干扰项带偏,会产生什么类型的输出。
以“走路去洗车店”为例,显著干扰项是“步行”,正确约束是“车辆服务流程”,错误答案是“准备防晒霜和运动鞋”。这批样本不需要很多,五十到一百条足够形成一个有效的最小回归集。关键是覆盖多种场景:物理常识、社会规则、时间顺序、空间关系、角色意图等。
每次迭代模型、调整提示词或修改系统流程后,都跑一遍回归测试,记录答对率。如果新版本在常规知识任务上得分上升,但陷阱样本答对率下降,就说明模型可能变得更会“迎合表面词”,这是一个需要警惕的信号。
4. 别把希望全押在模型上,流程设计才是常识鲁棒性的底座
4.1 人机分工:让模型做检索和枚举,让人做最终判断
在很多真实业务里,我们其实不需要模型独立完成所有常识推理。更好的做法是把任务拆成人机协作:模型负责快速枚举可能性、检索相关背景知识、生成候选选项,而人负责在候选里做最终判断,或者用另一个规则引擎来做交叉验证。
这种方式不是倒退,而是承认大模型在常识推理上存在系统性偏差。与其追求一个“永远不被骗”的模型,不如设计一个“即使被带偏,也能被流程兜住”的系统。比如客服场景里,如果模型被“投诉”“退款”等显著词带动,生成了一堆固定话术,我们可以在流程里加一层“问题类型识别”规则:先判断用户真实诉求是服务问题还是产品质量问题,不让模型在上下文里自由发挥。这种规则并不复杂,但能有效防止显著性偏差在业务链路里传播。
更进一步,可以把模型输出的结果分成“可信区间”和“待验证区间”。对于那些依赖低显著约束的推理结果,系统自动标记为需要人工复核;对于高中心答案,比如一个工具使用说明,可以选择直接输出。
4.2 提示词模板和系统约束:让模型先列约束,再给结论
如果你只能在工程上改一个地方,优先改提示词。不是让你背一堆花哨的模板,而是养成一个固定行为:在给出结论前,先让模型把问题涉及的所有关键约束列出来。
通用提示词模板可以是这样:
请按照以下步骤处理这个常识问题: 1. 提取问题中的实体、动作和地点。 2. 列出这个场景中所有可能影响答案的事实,包括那些没有被明确写出的常识。 3. 评估每个事实的重要性,并说明为什么。 4. 最后给出结论,结论必须引用第2步中的至少一个非显著事实。这个步骤不是万能的,但它能有效抑制模型直接跳到“最显著词”的联想链上。原因很简单:模型在生成时,每一步的输出都会变成后续生成的上下文。当它被迫先写“场景中可能影响答案的事实”时,它会把注意力分散到更多实体和关系上,从而降低某个显著性词的话语权。
在实际使用中,你会发现模型列出的约束可能有错,但没关系。重点是让它的注意力分布发生变化。只要模型在中间步骤里提到了“车辆会留在洗车店”“开车的人需要返回取车”之类的点,最后结论被拉回来的概率就高很多。
4.3 接入外部常识知识库或工具检索,弥补参数化常识的不足
参数化常识的弱点在于它是从文本统计里学来的,而文本统计天然偏向高频、显著、可书写的知识。要弥补这个缺口,最稳妥的办法是引入外部结构化常识,比如一个简单的流程知识库。
不需要做多复杂的知识图谱,一个小型 JSON 文件就够了。针对高频业务场景,手工录入场景中的核心约束关系。例如:
{ "场景": "洗车店", "实体": ["车辆", "车主", "洗车店员"], "默认约束": [ "车辆会留在洗车店一段时间", "车主可能离开,也可能等待", "如果车主离开,需要安排取车方式" ] }模型在回答之前,先从知识库里检索相关场景,把检索到的约束拼接到提示词里。这种做法是把“低显著知识”从模型的隐性记忆里搬到显式输入里,相当于给模型递了一张场景题目的“题干补充”。你不需要让模型记住所有常识,只需要让它学会调用外部信息来补齐那些它容易忽略的隐蔽约束。
这种架构在业务里落地并不复杂,关键是知识库的维护。建议按场景逐步录入,先从用户问题最高频的二十个业务场景开始,不要贪多。每个场景只需要五六条核心约束,就能显著改善模型在常识推理上的表现。
5. 适用边界:哪些场景容易踩中显著性偏差,哪些其实还好
5.1 高风险场景:自动化决策、智能客服、内容生成
最需要警惕显著性偏差的是那些“输出直接进入业务链路”的场景。比如智能客服,用户看似问一个简单问题,但问题里包含强烈的情绪词。常见模式下,模型会被“投诉”“生气”“退款”这些显著情绪词带着走,生成一大段道歉话术,却忽略了用户真正试图解决的问题是“电脑无法开机”“账单金额不对”这类具体故障。道歉本身不解决问题,用户只会更恼火。这时候偏差不是答不上来,而是答非所问。
另一个高发场景是医疗、法律、金融等专业领域的初步咨询。这类场景里,用户问题往往包含显眼的症状词或产品名称,比如“胸口疼”“基金亏损”。模型会顺着这些显眼词输出一堆“建议去医院”“风险提示”,但忽略了用户描述中关于“持续时间和诱因”的细节。这些细节虽然不显眼,却可能是判断问题的关键变量。
5.2 低风险场景:开放写作、灵感生成、代码草稿
并不是所有任务都需要对抗显著性偏差。如果你用模型做头脑风暴、写故事大纲、生成代码草稿,那么被显著词带偏有时反而是一种优势。它会让输出更贴近直觉,更能顺着人类常说的关联展开。比如写一篇以“走路去洗车店”为起点的随笔,模型因为“走路”联想到沿途风景,这其实是好事。
低风险场景的共同点是:不追求唯一正确性,错误成本低,且用户可以轻松修正。在这些场景里,刻意引入反事实追问和外部知识库,反而会让回答变得拖沓、不自然。判断一个场景是否需要做常规推理鲁棒性优化,可以看三个问题:
- 答案错误是否会造成用户信任损失?
- 是否存在唯一的、可验证的正确结果?
- 结果是否会被自动执行,而不是由人阅读后决定?
如果三个问题里有两个是“是”,那就值得投入流程建设。否则,保持简单对话即可。
5.3 建立一套持续评估机制,而不是一次调完就结束
写到这里,我想强调最后一点:显著性偏差的应对不是一劳永逸的功能,而是一个持续评估的过程。
模型会升级,你的提示词可能在下个版本里失效;业务场景会变化,今天不算显著的特征,明天可能因为产品改版变成了高权重信息。所以,最好每两到三周跑一次回归测试,不只看准确率,更要看失败样本里是否出现了新的显著误导模式。每次发现新问题,就把它加入陷阱样本集,更新外部知识库,调整拆分流程。这样做不是追求模型完美,而是让系统对已知的偏差类型保持敏感。
从工程角度出发,这很像给系统做“常态化的免疫监测”:不能因为打了疫苗就以为自己永不得病,而是需要持续跟踪病毒变异。安全边界、常识边界和模型能力边界都在移动,我们能做的不是假设模型永远稳定,而是设计一套能够及时暴露问题的流程。
6. 回到那个“走路去洗车店”的问题
现在再看“走路去洗车店”这个例子,它已经不只是一个有趣的脑筋急转弯,而是理解大模型推理偏好的一个窗口。它提醒我们:模型没有脚,不理解走路为什么会累;模型没有车,不理解洗车店为什么要等两小时。它拥有的只是语言构成的模拟世界,这个世界里,“走路”和“鞋”的关联太醒目,而“车”和“洗车店”的因果链在文本里又太隐蔽。
如果你正在开发一个依赖常识推理的 AI 产品,我的建议非常具体:先不要急着换更大的模型,也不要急着加更复杂的提示词。先把自己业务里最容易出错的二十个问题列出来,找出那些“看起来很简单、模型却总在关键步骤上跑偏”的样本,做一个最小规模的陷阱测试集。然后,尝试在输入里显式添加低显著约束,用反事实问题做验证,再看效果。这个过程可能只需要一个下午,但它带给你的认知增量,比盲目调参要大得多。
毕竟,真正可靠的大模型系统,从来不是找到一个完美的模型,而是设计一套能让模型的不完美不造成严重伤害的流程。理解显著性偏差,是走向这套流程的第一步。