让 AI 自查三遍,它只会把错的说得更像对的——检查的人和被检查的,是同一个

先说结论,三条:

  1. 让模型"再检查一遍",多数情况下不会把错的挑出来,只会把错的换个说法,说得更像对的。
  2. 原因不是模型笨,是检查的人和被检查的是同一个。它的盲区,跟着它一起进了检查环节。
  3. 能稳定生效的替代方案只有一个方向:把"检查"这件事挪到模型外面去------外部证据、可执行验证、独立校验器。三个都能今天落地。

下面给三个今晚就能自己跑完的验证,和一版线上真在用的替代方案。

一、先看一个现场

老陈让模型帮他查一件旧事:1987 年,他们县里那场下了三天三夜的雨,到底是几号停的。

第一轮,答得很快。有日期,有风向,还顺手补了一句"那几年这一带普遍偏涝"。

他追问了一句:你确定?

第二轮:抱歉,是我记错了,应该是十四号。

他愣了:那到底是十三还是十四?

第三轮:您说得对,这两种说法都有记载,具体要看您指的是哪个观测站。

第四轮,模型开始讲"历史气象记录的局限性",讲得又稳又客气。

四轮下来,没有一句是硬顶的,每一轮都在让步,都在"修正"。但那个数字一次也没落地。

这不是它在撒谎。这是它在自己的圈里绕:每被推一下,往里缩一格;缩到最后一格,它开始说一些听起来永远正确、其实什么都没说的话。

做 RAG、做 Agent、做代码补全的人,对这个体感应该都不陌生------它不跟你吵,它顺着你滑。

二、验法一:四层追问,看它从第几层开始变虚

同一个问题,往下问四层。一个字别改,原样记。

  • 第一层,问事实:这件事具体是哪天、哪个版本、哪个数?
  • 第二层,问确定性:你确定吗?
  • 第三层,问动机:你刚才为什么改口?
  • 第四层,问自检:你现在这句话,你自己判断得了真假吗?

四个回答原样存下来,然后数三样东西:

  1. 含糊词密度:从第几层开始出现"一般来说""在某种意义上""这取决于""建议以官方渠道为准"。
  2. 复读率:它是不是开始重复你问题里的词,用你的措辞回答你的问题。
  3. 落地率:还有多少回答里带着可核对的具体值------日期、数字、版本号、函数签名、字段名。

我这边跑下来的规律是:前两层通常还硬;第三层开始出现过程性描述("我当时考虑的是......");第四层基本全是空话。

第四层之所以空,不是因为它谦虚。是因为在这个位置上,它手里只有一套东西可用:它自己知道的那点东西。拿自己知道的去检自己知道的,检到最后的结论永远是"我说得通",不是"这是真的"。

想把这条做得更硬,就把每次回答里的数字抽出来,跟参考答案比对,算一个编造率。四层就是四个点,一条曲线就出来了。曲线往上翘的那一层,就是它够不着的地方。

三、验法二:让它自查,看它到底改了什么

就问一句:再检查一遍,有没有错。

然后把修改前后的两版 diff 出来,逐条分类:

  • A 类,真纠错:改掉了一个可核实的错。
  • B 类,换说法:同一个错,换个更确定的措辞。
  • C 类,加免责:内容没动,补一句"建议核实"。
  • D 类,删掉:把可能错的部分整段抹掉,不留痕迹。

多数情况下,A 类少得可怜,B 和 C 占大头。有些任务上 D 类会突然变多------那不是它发现了错,是它发现了"这段有风险",然后把风险删掉,把问题留给你。

原因很直接:检查的人要判断"这句对不对",得先知道"对的应该是什么"。而这个"对的应该是什么",和被检查的内容,来自同一份参数、同一段上下文、同一个训练分布。它没有多出任何一点信息。

这不是我一个人的观察。2023 年有一篇论文专门验过(Huang 等,Large Language Models Cannot Self-Correct Reasoning Yet),结论是:在没有任何外部反馈的情况下让模型自我纠正推理,准确率不但没升,有些任务上还降了。它会把对的改成错的------因为"改"这个动作本身,被当成了"进步"。

要补一句边界:这篇论文说的是内在自纠。给它外部信号------跑测试、查文档、拿到报错------它能改,而且改得不错。这也是下面那条方案的全部前提。

四、验法三:换一个外来的检查者

不是让它自查,是让另一个东西来看它写的东西,加两条硬约束:

  1. 只许挑错,不许重写。
  2. 检查者看不到"作者"的推理过程,只给结果 + 原始材料。

然后对比:外来检查者挑出的问题里,有多少是自查没挑出来的。

你会看到一批很具体的毛病------引用了文档里根本不存在的段落、函数少一个必填参数、版本号对不上、把两个相似概念的边界搞混、示例代码里的变量名早就改过。这些不是"它不肯挑",是这些毛病就长在它的盲区里,它站不进去。

最要紧的一句:如果验法三挑不出自查挑不出的错,那这套说法就不成立,你尽管把它划掉。

五、工程上怎么用(这部分才是能拿走的)

三个位置,从弱到强。

1. 证据锚定:不给证据,不许下结论

  • 检索到的原文段落,要求逐字引用,并回填位置。
  • 引用对不上原文的,直接判失败,不进下一步。
  • 没有检索到证据时,允许它说"没找到",但要有独立的标志位,不能混在正常答案里。

关键点是让它引用,而不是让它复述。复述会被润色,引用不会。这一条能干掉大部分"看起来很合理"的编造。

2. 可执行验证:能跑的,就别问

  • 生成代码 → 跑测试、跑类型检查、跑 lint。
  • 抽取结构化数据 → JSON Schema + 业务规则校验(金额加起来对不对、时间顺序合不合理、外键在不在)。
  • 数值和统计 → 把算式抽出来,用代码复算,别信它口算。
  • SQL → 先在只读副本上 EXPLAIN,再小样本执行。

这一层的价值在于:它的判定不依赖任何模型的意见。测试过了就是过了。

3. 独立校验器:换个模型,或者换个身份

  • 换模型最省事:A 生成,B 挑错。B 的上下文里只有结果和证据,没有 A 的推理链。
  • 不换模型也行,但要换身份和上下文:新开会话,system prompt 只写"你是审查者,只输出问题清单,不许给修改建议",输入只有结果 + 原始材料。
  • 别在同一段对话里说"你再想想"。那不叫验证,那叫让它自我确认------上下文里全是它自己刚说过的话,它只会往回找补。

一个反直觉的点:校验器不需要比生成器强。它只需要站在外面。同一个量级的模型,只要不带生成时的那段上下文,挑错能力就明显不一样。

六、边界,说清楚,不然就是吆喝

  1. 有外部可验证信号的场景,自查 + 工具反馈是有效的。 别把"自查没用"推广成"反馈没用"------差的是信号从哪来,不是要不要反馈。
  2. 多次采样投票(self-consistency)确实能提升准确率。 但它提升的是稳定性,不是真实性。一百次采样里错得一致,投出来的还是一个一致的错。
  3. 上面三个验法都是小样本、单场景。 换任务、换模型、换语言,结论可能变形。真要认真,自己跑够样本量再下判断。

一支不敢让人来划的笔,本来也写不出什么。

七、一句话版本

发布前问自己一句:这次的"检查",是在模型外面发生的,还是在模型里面发生的?

在外面------测试、检索、Schema、另一个模型------留着。 在里面------"你再仔细看看"------删掉,换成外面那一步。

省下来的不是 token,是你上线之后半夜被叫起来查的那个幻觉。


把"自指""盲区""外部参照"这些平时说不清的东西讲清楚,是结构认知 一直在做的事。上面这条"自查为什么改不掉错"的推导,出自《实验协议:AI 幻觉的结构根因验证(对撞机协议)》,第一发现者:林小黑。完整推导见 gitee.com/samforce/st...。

相关推荐
木子n11 小时前
软件架构设计实战-架构21.调度架构的抖动账单:抢占、协作与事件循环各自收多少延迟税
架构·autosar·性能工程·架构决策
禅与计算机程序设计艺术2 小时前
面向大语言模型智能体的 Harness 工程:工具编排、记忆与自修复闭环设计
架构
众链网络2 小时前
从一次近 5 小时的大模型中断,讲清 AI 应用的降级设计
人工智能·架构
Thneonl2 小时前
一次 rebalance,全组停摆:Kafka lag 从 0 到百万的事故复盘
后端·架构
总裁余(余登武)3 小时前
K-means算法改进(Python版)
python·算法·kmeans
灯澜忆梦3 小时前
【面向对象编程c++】| 指针与自定义数据类型
开发语言·c++·算法
anew___3 小时前
《从零手写操作系统 (48):网络协议栈基础——Socket API与TCP/IP分层架构》
网络协议·tcp/ip·架构
xxwl5853 小时前
区域赛算法模版第八章---贪心(Greedy)
c++·笔记·学习·算法
weixin_382395233 小时前
0-500 人工厂的生产 PMC 系统怎么做?基于 Tauri + SQLite 的性能架构实践与 5000 物料压测实录
数据库·架构·sqlite