你有没有遇到过这种情况:问ChatGPT一个问题,它回答得头头是道,语气笃定,结果你一查证,发现里面掺了假。
不是那种明显的胡说,是那种夹在一堆正确信息里,你如果不较真根本发现不了的错误。这就是大语言模型的"幻觉"问题,学术圈这么叫它是因为它太像人类偶尔的错觉,明明没看见却信誓旦旦说看见了。
这件事在医疗咨询、法律分析、金融建议这些场景里特别致命。因为AI从来不会脸红,它撒谎时的语气和说真话时一模一样。
麻烦的是,现有的检测方法有一个共同的死穴,而且几乎没人真正意识到这个死穴有多深。这篇来自独立研究者Igor Itkin的论文,就是从这个死穴切入的。
检测幻觉这件事,为什么一直做不好
先说说现在的检测方法都是怎么干的。
大体分成四路人马。第一路是"内部探针",直接扒开模型的隐藏层,看它内部的神经元活动有没有什么异常信号能对应上撒谎行为。第二路是"不确定性估计",让模型对同一个问题回答很多遍,看它答案之间的分歧有多大,分歧大就说明它自己也没底。第三路是自然语言推理判断,拿生成的内容去和原始资料做逻辑比对,看看是不是自相矛盾。第四路是直接训练一个分类器去标注每个词是不是有问题。
> 自然语言推理(NLI):判断两句话之间是蕴含、矛盾还是无关的技术,常用来检查AI生成的内容有没有和原文对上。
这四路人马各有各的死穴。
Simhi等人2025年的研究发现,用不确定性来判断的方法,恰恰在模型"胡说得特别自信"的时候彻底失效,而这正是最需要抓的场景。Cheang等人2025年发现,当模型对某个话题只有一知半解的时候,内部探针根本分不清它是在编还是在讲真的。Dubanowska等人2025年则指出,这些检测器换个数据集就集体翻车。
这几个失效模式看起来毫不相关,但这篇论文的作者发现它们共享一个隐藏的病根:所有这些方法都是逐词打分的。
也就是说,无论用哪种信号,模型看到第37个词的时候,完全不管第36个词发生了什么。每个词都是孤立的判决,谁跟谁都没关系。
这个假设听起来好像没什么问题,但论文作者认为这恰恰扔掉了一个最基本的规律:幻觉不是一个点状事件,它是一整段一整段发生的。
想象你在写一篇报告,某一句你编了一个假数据。接下来会发生什么?你大概率会顺着这个假数据继续往下编,因为你的大脑已经把这个假信息当成了"既定事实",后面的句子会自然而然地建立在它之上。AI也是这样,自回归生成的模型会把前面刚生成的词当成上下文,如果前面已经开始瞎编了,后面的词会更倾向于继续瞎编。
论文在RAGTruth数据集上验证了这个直觉。数据显示,如果上一个词是幻觉,那下一个词也是幻觉的概率高达90.2%,但如果上一个词是正常的,下一个词突然开始幻觉的概率只有0.6%,两者相差了150倍。信息论分析进一步证明,光靠"上一个词是不是幻觉"这一个信息,就能解释76%的不确定性。
这就是整篇论文的立足点:既然幻觉是成串出现的,那检测它就不该是逐词独立判断,而应该是一个序列标注问题,就像给一段话里连续的词打上"这段可能有问题"的标签。
这有点像医生看X光片。一个刚入行的医生可能盯着每一个像素点单独判断"这里有没有阴影",但经验丰富的医生看的是整个区域的连贯性,一小片阴影如果周围也有类似的纹理延伸,说明这是一整片病变,而不是噪点。如果医生非要一个像素一个像素孤立判断,他会漏掉那些边缘模糊但确实连成一片的病灶,这就是逐点判断的代价,它丢掉了"连续性"这个诊断线索里最值钱的部分。
三十三个数字拼出的证据链
那具体怎么把"连续性"用起来?
论文的做法是给每个词构造一个33维的特征向量,融合三类完全不同来源的信号。
第一类是文本统计特征,一共20维,包括这个词有多长、是不是数字、是不是大写、它在原文里有没有出现过(逐字、两字、三字连续匹配)、还有一系列滚动统计量比如累计重叠率、新词出现的速度、连续多少个词都是"新词"(也就是原文里没有的),以及这些指标随时间的一阶和二阶变化率。
第二类是NLI蕴含特征,7维,用DeBERTa模型算出每句话相对原文是蕴含、矛盾还是中立,并且同样加上时间维度的衍生指标,比如矛盾分数的滚动均值、相邻句子间矛盾分数的变化、10个词窗口内的最大矛盾值。
第三类是语言模型困惑度特征,6维,用一个叫TinyLlama的小模型作为旁观者,去看当前生成的这个词,从这个小模型的视角看有多"意外",包括对数概率、下一词的熵、子词排名等等。
> 困惑度(perplexity):衡量一个语言模型对某段文本感到"意外"程度的指标,越意外说明这段文本越不像该模型会自然生成的内容。
把这33个数字拼成一个特征矩阵后,交给一个叫BiGRU的双向循环神经网络去学习。
> BiGRU(双向门控循环单元):一种能同时向前和向后读取序列信息的神经网络结构,读一句话的时候既能看之前的词,也能看之后的词。
这里有个关键设计需要说清楚,为什么要用"双向"而不是只往前读。
单纯往前读的模型,就像你一边看电影一边猜剧情,只能根据已经看过的部分做判断。但双向模型相当于你看完整部电影后再回头分析某一幕,你知道后面发生了什么,这个信息其实对判断当下这一幕的性质也很有用。论文的实验证实了这一点:只往前读的模型AUC是0.802,只往后读的模型AUC是0.817,两者结合的双向模型达到0.840,明显比任何单向模型都强。
> AUC(ROC曲线下面积):一个衡量分类器排序能力的指标,取值0到1,越接近1说明模型越能把真正的幻觉词排在前面、正常词排在后面,0.5相当于瞎猜。
值得一提的是,反过来往后读的模型居然比往前读的模型还要强1.5个百分点。论文给出的解释是,特征本身已经包含了"滚动均值""一阶差分"这些前瞻性的统计量,相当于往前看的功课已经被预先做完了,往后读的方向反而提供了新信息,因为它能看到幻觉片段结束之后上下文的样子。
这整套设计最后达到了0.840的AUC(10次随机种子实验的平均值),比一个逻辑回归基线模型高出整整11个百分点,而且这个差距在统计检验下是显著的(p=0.002)。
这11个百分点到底是从哪来的
这是整篇论文我觉得最有意思的地方。作者没有满足于"用了序列模型效果更好"这个表面结论,而是较真地拆解了这11个百分点具体是怎么来的。
他们设计了一个层层递进的对照实验。
第一步,用一个参数量和BiGRU差不多(11万多参数)的多层感知机(MLP)替代BiGRU,这个MLP依然是逐词独立判断,唯一区别是它比逻辑回归更"聪明",有非线性拟合能力。结果MLP的AUC是0.765,比逻辑回归高了3.5个百分点。这部分提升来自"模型更聪明",跟顺序完全没关系。
第二步,把BiGRU用在被随机打乱顺序的词序列上,特征和标签一起打乱,保持对应关系但破坏时间顺序。这样BiGRU还是能做"集合层面的聚合",比如统计这段话整体有多少矛盾信号,但完全丢失了"谁在谁前面"的信息。这个打乱版本的AUC是0.791,比MLP又高了2.6个百分点,这部分提升来自"把一堆特征揉在一起考虑",不是顺序。
第三步,才是真正保留时间顺序的BiGRU,达到0.840,比打乱版本又高了4.9个百分点。
这4.9个百分点,才是真正意义上"时间顺序"本身带来的贡献,占整个11点提升的44%,是三个成分里最大的一块。
这个拆解让我想起一个特别朴素的场景。假设你在破一个案子,有三种侦探。第一种侦探能力普通但很努力,第二种侦探很聪明能看出蛛丝马迹(对应更强的非线性模型),第三种侦探不仅聪明,还会把散落的线索凑在一起综合判断(对应把特征揉在一起看),第四种侦探不仅会综合判断,还知道案发的时间线和先后顺序(对应真正的时序建模)。
如果案子的关键就在于"谁先做了什么导致了后面发生了什么",那前三种侦探哪怕再努力再聪明,也破不了案,因为他们从根上就没有使用"顺序"这个信息。这不是能力问题,是信息来源被砍掉了一整类。
论文的信息论分析进一步验证了这个逻辑。他们把幻觉标签序列建模成一个马尔可夫链,算出如果你知道上一个词的标签,能消除76%关于当前词的不确定性;如果你同时知道前一个词和后一个词的标签,能消除91%的不确定性。而互信息随着距离衰减的速度显示,这种"记忆"大概能持续10个词左右,之后信息基本耗尽。
这个"10个词"的发现顺带解释了另一件事:为什么一个卷积核只有7的简单一维CNN,也能捕捉到大部分的时序信号,恢复了BiGRU相对逻辑回归优势的75%。因为局部窗口已经足够覆盖大部分有效的时间关联距离了,不需要处理特别长程的依赖。
单独一种信号都不够格,融合了才行
刚才说的33个特征分成三类,那如果只用其中一类信号,效果会是怎样?
论文专门做了单信号测试。结果很扎心:表现最好的单一特征是NLI里的"蕴含骤降分数",AUC只有0.641,比融合了所有信号的BiGRU低了整整20个百分点。语言模型的困惑度特征更惨,AUC只有0.551,几乎是瞎猜的水平(0.5是随机水平),原因是这里用的TinyLlama只是个1.1B参数的小模型,它自己都不是生成幻觉内容的那个模型,它看不出"这个词对原始生成模型来说是不是意外",只能看出"这个词对TinyLlama自己来说是不是意外",两者未必一致。
这就好比你请了一个外行朋友帮你审查一份专业报告里有没有造假的数据。这个朋友能感觉到"这句话读起来有点怪",但他判断不了这句话在专业领域里到底对不对。真正管用的是让懂行的人(NLI模型,专门训练来判断逻辑蕴含关系)去比对原文和生成内容,同时让另一个人去看文本本身的统计特征(有没有引用原文里不存在的内容),最后把这些不同视角的判断汇总起来,才能拼出一个靠谱的结论。如果只依赖其中一个视角,你要么漏掉逻辑层面的破绽,要么漏掉表面统计层面的破绽。
融合之后(仍然是逐词独立判断,不加时序)的逻辑回归模型能到0.730的AUC,相比单一特征提升了8.9个百分点。再加上BiGRU的时序建模,总共提升到0.840。
这两部分加起来正好印证了论文标题里"多信号"和"时间融合"两个词都不是摆设,融合信号解决的是"从哪里获取证据"的问题,时序建模解决的是"证据之间怎么互相支撑"的问题,两者缺一不可。
换个模型架构会怎样,答案有点意外
既然BiGRU效果这么好,是不是应该继续加大加深这个模型?
论文做了一个很扎实的架构对比实验,测试了包括BiGRU、BiLSTM、Transformer、一维CNN、Mamba状态空间模型、双向xLSTM在内的一堆架构。
结果发现,只要给足够公平的训练设置(用ReduceLROnPlateau动态调整学习率加上早停机制,而不是固定轮数的训练),这些架构最后都收敛到了0.843到0.845之间的AUC,几乎分不出高下。
> Mamba:一种近年提出的状态空间模型架构,被视为Transformer的有力竞争者,擅长处理长序列。
> Transformer:目前最主流的深度学习架构,核心是自注意力机制,广泛用于大语言模型本身。
这个发现的意义很大:性能的天花板不是模型架构决定的,而是那33个特征本身能提供多少信息决定的。不管你用多先进的模型去"消化"这些特征,消化到极限也就是0.845附近,再往上就是巧妙无米之炊了。
作者最后选择BiGRU作为推荐方案,不是因为它最强,是因为它在这堆打平的架构里收敛最快(只需要8轮训练),参数量也最省。这是一个很务实的工程决策:既然大家都到天花板了,那就选最省资源的那个。
这里其实藏着一个更深的道理。论文特意用了一个和BiGRU参数量相当的MLP做对照,结果MLP只弥合了逻辑回归到BiGRU差距的32%。这说明单纯堆参数是没用的,真正有用的是"参数用在了对的结构上",也就是能利用时序关系的结构。这和很多深度学习的直觉不太一样,我们总下意识觉得"模型更大就更强",但这个实验清楚地展示了,当瓶颈在于输入信息本身而不是模型容量时,加参数是白费力气。
CRF被冤枉了,问题出在打分方式上
论文里还有一个挺有意思的小插曲,关于条件随机场(CRF)模型的。
> 条件随机场(CRF):一种专门用于序列标注任务的模型,能显式建模相邻标签之间的转移关系,比如"如果上一个词是幻觉,下一个词更可能也是"。
理论上CRF应该特别适合这个任务,因为它天生就会建模"相邻标签之间的依赖关系",这不正是论文一直强调的核心逻辑吗?但实验一开始却显示CRF版本的模型效果反而变差了,BiGRU-CRF的AUC只有0.630到0.666。
后来作者发现问题不出在模型本身,而是出在评分的方式上。CRF模型输出的是一种叫"势能"的东西,不是真正校准过的概率,如果直接用softmax去打分排序,会导致分数在不同训练轮次之间浮动高达正负0.05,非常不稳定。
正确的做法是用前向后向算法计算边际概率,重新给CRF打分。用这个方法后,BiGRU-CRF的AUC立刻从0.666跳到了0.845,和普通的BiGRU几乎打平,最大恢复了17.9个百分点。
这个小插曲提醒我们一件事,有时候一个模型看起来效果差,未必是模型本身的问题,可能只是你用错了尺子去量它。这就像你拿体重秤去测量一个人的身高,得出"这个人特别矮"的结论,问题不在这个人身上,在你选错了测量工具。
换个模型生成的文本,检测器还灵不灵
一个检测器如果只能用在它训练时见过的那几个模型生成的文本上,实用价值就要打折扣了。毕竟真实场景里,你不可能提前知道用户会拿哪个大模型来生成内容。
论文做了留一法的跨模型测试,一共涉及六个生成模型:GPT-4、GPT-3.5、三个不同规模的LLaMA-2、还有Mistral-7B。每次拿掉一个模型的数据不参与训练,只用来测试。
结果平均AUC是0.808,相比不做跨模型测试时的0.840,只下降了3.8%。最容易迁移的是LLaMA-2-70B(0.829),最难的是GPT-4(0.781),作者推测是因为GPT-4本身幻觉率更低,出错的模式也和其他模型不太一样。
这个"低于4%的性能损失"其实相当能打。因为很多依赖模型内部结构的检测方法(比如探针类方法)一旦换了生成模型,内部表示空间完全不同,性能会断崖式下跌。而这套黑盒方法因为压根不碰模型内部,换谁生成都一视同仁地用外部信号去审视,自然更稳。
这就好比一个海关安检员,他检查的是行李箱里有没有违禁品,而不是要求每个航空公司的行李箱都长一个样子。不管乘客坐的是哪家航空公司的飞机,安检的逻辑始终一致:X光扫描、气味检测、称重比对。这就是黑盒方法的优势所在,它审视的是"生成的内容本身呈现出来的痕迹",而不是"生成这段内容的机器内部长什么样"。如果检测逻辑绑死在某个特定模型的内部结构上,换一个模型就得从头再来。
跨数据集迁移,量少但质精更重要
论文还测试了跨数据集的迁移能力,用了另一个叫PsiloQA的多语言幻灯数据集(这里只用了英文QA子集)。
有意思的是,PsiloQA的幻觉比例高达53%,而RAGTruth只有5.6%,两者相差近10倍,这本身就是一次不小的分布偏移考验。
结果显示迁移是不对称的:用PsiloQA训练、拿去测RAGTruth,AUC能到0.744;反过来用RAGTruth训练测PsiloQA,AUC只有0.634。而PsiloQA的训练样本数量(4250条)其实只有RAGTruth(12826条)的三分之一左右。
作者给出的解释是"标注密度"比"数据集规模"更重要。PsiloQA虽然样本少,但每条样本里含有幻觉的词更多(53%对5.6%),换算下来PsiloQA里实际的正样本(幻觉词)总数反而更多。
这个发现对实际做检测器的人来说是个挺实用的提醒:与其费劲收集一个巨大但幻觉稀疏的数据集,不如花心思整理一个小而精、幻觉标注密度高的数据集。
这就像学开车,与其在空旷的高速上开一千公里(大部分时间都是匀速直行,没啥可学的),不如在一个复杂的老城区窄巷里练一百公里(每几十米就要处理一次会车、转弯、避让行人)。练习的总里程不是关键,关键是这段里程里到底遇到了多少次真正需要做出判断的场景。
和已有方法比,站在什么位置
论文也没有回避和其他现有方法的直接对比。
在只能拿到生成文本、无法接触模型内部的黑盒场景下,这套方法达到了0.840的AUC,明显超过了LettuceDetect(基于395M参数的ModernBERT编码器微调,span F1为58.9%)和HaluGate等黑盒方法在各自指标上的表现。
而当把这套黑盒特征和需要接触模型内部注意力权重的Lookback Lens方法结合起来时(也就是允许一定程度的白盒访问),AUC能进一步提升到0.866,比单独的Lookback Lens高2.8个百分点。这说明两类信号是互补的,不是互相替代的关系。
论文也很坦诚地指出了这套方法的短板:在span级别的F1指标上(也就是判断一整段连续幻觉边界划得准不准)只有0.394,明显低于LettuceDetect的0.589。作者解释这是因为LettuceDetect用了一个395M参数的编码器专门去学习上下文表示,从而画出更精准的边界,而这套方法只用了12万参数在预先提取好的特征上做优化,目标是排序质量(AUC)而不是边界精度。想要弥合这个差距,大概率得换成一个可学习的编码器,但那样就丧失了黑盒的优势,参数量也要暴涨三千倍。
这种"有得必有失"的坦诚,我觉得挺值得肯定的。没有一种方法是万能的,重要的是知道自己适合什么场景。
探针方法真的看穿模型内心了吗
论文里有一段我觉得特别值得单独拎出来说,是关于"直接看模型内部在想什么"这条路到底靠不靠谱的验证。
作者专门跑了一次实验,把Mistral-7B和LLaMA-2-7B的隐藏层状态提取出来,用同样的思路(线性探针或者BiGRU)去预测幻觉标签,结果这种"读心术"式的方法表现出奇地差:线性探针的AUC只有0.543到0.574,加上BiGRU也只提升到0.631到0.637,远远低于这套黑盒方法的0.770到0.833。
更让人意外的是,把黑盒特征和模型隐藏状态拼在一起用,效果反而比单用黑盒特征更差。作者的解释是隐藏状态里的噪声拖了后腿。
这个结果其实颠覆了一个直觉:很多人会下意识觉得"既然幻觉是模型自己生成的,那模型内部一定'知道'自己在瞎编",只要找对探测的方法就能读出来。但这个实验说明,至少在token这个细粒度层面上,模型的内部表示并不可靠地编码"我现在是不是在瞎编"这件事,模型很可能压根不知道自己正在犯错,这恰恰是它会犯错的原因。
作者甚至进一步测试了"是不是选错了层"这个可能性,把32层全部拆开单独测试,还试了用可学习的权重去融合所有层,结果最好的单层也只有0.590的AUC,全层融合的权重分布几乎是均匀的(每层权重接近1/32),说明根本不存在一个"藏着秘密"的特殊层。
这提醒我们,很多时候技术直觉上"应该有效"的方法,实际测下来未必真的有效,说到底还是得靠数据说话。
写在后面
读完这篇论文,最让我意外的其实是那个探针对比实验。
我一直以为,既然幻觉是模型自己生成出来的,那模型内部理应留下某种痕迹,就像人撒谎时会有细微的生理反应一样。但数据明明白白地告诉我们,在词一级的粒度上,模型的隐藏状态几乎不携带这个信息,读心术式的方法反而干不过纯粹从外部观察文本表现的黑盒方法。
这让我想到一个更大的问题:我们总假设"越接近本质的信息越有用",但这篇论文说明,有时候表面痕迹(文本本身呈现出的统计特征、和原文的逻辑关系)比深层信号(模型内部的神经元激活)更能反映真相。
论文里还有一个细节我觉得值得单独回味:CRF模型明明设计理念和这篇论文的核心思路完全一致,都是要建模标签之间的依赖,但因为打分方式用错了,差点被误判为"效果不好的架构"。这提醒我,评估一个方法是否有效,光看最后那个数字是不够的,得先搞清楚这个数字是怎么算出来的。
如果幻觉真的像论文说的那样,是一整段一整段地传染开来,那有没有可能在生成过程中,一旦检测器发现苗头不对,就立刻打断生成,而不是等一整段话说完了再事后纠错?论文最后提到这是未来值得探索的方向,我倒是很好奇这在实际产品里能不能真的做出来。
Q&A
Q1:什么是token级别的幻觉检测?
A:就是不给整段回答打一个总分,而是给回答里每一个词都单独判断它是不是幻觉内容,这样能精确定位到底哪句话、哪个词开始编造,而不只是笼统地说"这段话可能有问题"。
Q2:BiGRU相比逻辑回归为什么能提升11个百分点的AUC?
A:论文拆解发现这11个百分点里,44%来自"时间顺序建模"本身,24%来自把多个特征综合考虑,32%来自模型的非线性能力。核心原因是幻觉词往往连续成串出现,逐词独立判断的方法会丢掉这种连续性带来的强关联信息。
Q3:这种检测方法能不能用在GPT-4这种闭源模型上?
A:可以。因为这套方法完全不需要访问模型内部结构,只依赖生成出来的文本本身以及外部的NLI模型、小型语言模型作为辅助工具,属于黑盒方案,天然适用于无法拿到内部权重的闭源API场景。