Detecting hallucinations in large language models using semantic entropy

📅 2026/6/25 18:26:55
Detecting hallucinations in large language models using semantic entropy
标题Detecting hallucinations in large language models using semantic entropy (使用语义熵检测大语言模型中的幻觉)作者Sebastian Farquhar, Jannik Kossen, Lorenz Kuhn, Yarin Gal发表年份2024发表刊物Nature引言领域基础知识大语言模型 (Large Language Model, LLM)简单理解大语言模型llm它阅读了互联网上几乎所有的文本学习了词语与词语、句子与句子之间的统计学规律。工作原理当你给它一个“提示”Prompt比如一个问题它不是真正“理解”并“思考”答案而是基于概率一个词一个词地我们称之为Token预测最有可能的下一个词是什么最终连成一句话。比如你问“法国的首都是”它在内部计算出“巴黎”这个Token出现的概率极高于是就生成了“巴黎”。幻觉 (Hallucination)定义在LLM的语境下幻觉并非指人类的精神状态而是一个比喻指模型生成的内容听起来连贯、流畅、看似合理但实际上是无意义或不忠实于事实的。就像一个人信誓旦旦、滔滔不绝地说着毫无根据的事情。为什么重要这是一个根本性的信任问题。如果一个医疗问答AI有时会“幻觉”出错误的药品剂量或者一个法律AI会“幻觉”出根本不存在的法条那么我们就无法在关键领域信赖和使用它。概率与熵 (Probability Entropy)概率 (Probability)在LLM中每个生成的词都有一个概率。模型对其输出越“确定”它给所选词的概率就越高。熵 (Entropy)熵是“不确定性”的数学度量。一个系统越混乱、越不确定它的熵就越高。直观类比想象两个口袋。口袋A里只有红球你伸手进去摸100%确定会摸到红球这就是低熵不确定性低。口袋B里有红、蓝、绿、黄各25%的球你完全不确定会摸到什么颜色这就是高熵不确定性高。在本文中的应用如果我们能测量LLM回答一个问题时的不确定性熵那么熵高的时候可能就意味着模型在“瞎编”即产生幻觉因为模型自己都“拿不准”该说什么。研究的主要背景在本文出现之前学界和工业界已经为检测和缓解幻觉问题付出了巨大努力但效果仍有局限。当时的背景可以概括为以下几点问题严峻但定义模糊“幻觉”这个术语变成了一个“大筐”什么都往里装。模型由于训练数据有误而导致的“系统性错误”和因为模型“不知道”而随机瞎编的“随意性错误”被混为一谈。这就像把“计算错误”和“故意撒谎”都叫“失误”不利于我们精准地解决问题。已有方法的局限基于监督学习的方法需要大量人工标注的“幻觉”样本去训练一个检测器。这就像教一个人识别谎言需要先给他看一千个谎言和真相的例子。问题是新场景下的新谎言可能和旧谎言的模式完全不同导致检测器在新任务上失灵泛化能力差。基于简单词法Naive熵的方法直接计算模型输出词语序列的熵。这里有一个巨大的陷阱同一种意思在语言中可以有无数种表达方式。比如“巴黎是法国首都”和“法国的首都乃巴黎是也”意思完全一样但词语序列完全不同。如果只看词语模型会因为能变换多种说法而表现出“高熵高不确定性”但这其实是语言表达的灵活性而非意义上的不确定。因此这种方法会错误地将许多正确的回答也标记为幻觉。模型自我评估的局限直接去问一个可能产生幻觉的模型“你刚刚说的是真的吗”这种方法如P(True)就像让一个潜在的骗子自己判断自己是否诚实其可靠性值得商榷尤其是在模型自身能力不足的领域。作者的问题意识问题的重定义——从“幻觉”到“虚构” (Confabulation)作者首先对“幻觉”这个宽泛的概念进行精准切割。他们引入并聚焦于一个更精确的子集——虚构 (Confabulation)。什么是虚构它特指那种**“任意且不正确的”生成。关键特征是“任意性”即对于同一个问题在相同的提示下仅仅因为模型内部采样的随机种子Random Seed不同它就会给出不同的错误答案。这暴露了模型在此问题上缺乏扎实的根据而是在随机猜测**。区分这与模型因训练了错误数据而顽固地、一致性地犯错例如始终错误地认为太阳绕着地球转是不同的机制。作者认为将不同机制下产生的“症状”分开处理是取得进展的关键。这种方法论的“切割”体现了研究者精准界定问题的功力。核心洞察——“知道”与“不确定”的信号作者的核心洞见是**当LLM要开始“虚构”时它自己内部对于“该说什么”是高度不确定的。**这种不确定性正是我们可以用来检测虚构行为的“指纹”。提出核心难题——如何测量“意义”的不确定性既然不确定性是关键那么如何测量它旧方法的缺陷前述的基于词法Naive熵的方法测量的是“词语选择”的不确定性而非“意义”的不确定性。新方法的精髓作者提出我们应该测量语义层面的不确定性。我们要问的不再是“模型不确定下一个词是‘首都’还是‘首府’”而是“模型不确定答案的意义是‘巴黎’还是‘柏林’”。这是一个从形式到本质的飞跃。研究意义方法论从形式到意义的跃迁。它没有停留在词语表面的概率统计而是深入到人类语言的核心——语义。通过创造性地聚类同义表达它首次让基于熵的不确定性度量真正反映了模型在“意思”层面的把握程度。实用价值让LLM真正“可用”无需“备课”的通用检测器该方法完全无监督不需要任何标注好的幻觉样本。这意味着它可以开箱即用直接部署到任意新领域、新问题上这对于日新月异的LLM应用场景至关重要。高风险的“安全阀”在高风险领域如医学、法律、金融该方法可以作为一个智能的“安全阀”。当系统检测到对某个问题的回答具有高语义熵时可以选择“拒绝回答”并建议用户寻求人工专家而不是强行输出一个看似流畅但可能致命的“虚构”答案。提升整体准确率实验证明通过简单地“拒绝”回答那些被判定为高不确定性的问题剩下的问题的回答准确率得到了显著提升。这为用户提供了实打实的好处。正文背景大模型的不可靠的输出想象一下你问一个医疗LLM“Sotorasib的药理靶点是什么”有时它正确回答“KRAS G12C”有时却错误回答“KRAS G12D”。你给的指令完全一样仅仅是模型内部一个微小的随机波动就导致了截然不同、且可能危及生命的答案。这种任意性就是“虚构”的典型特征。它表明模型在这个问题上没有稳固的知识根基而是在“蒙”一个听起来专业的术语。挑战为何传统的方法会失灵要阻止模型“虚构”自然地我们会想有没有一个方法能在模型准备开口“胡说”前就发出警报过去的尝试主要面临两大挑战“语法多样性”不等于“语义不确定性”朴素熵的陷阱最直接的想法是利用“熵”这个数学工具。但过去的“朴素熵”只看词语序列的概率变化它犯了一个致命的错误它将语言表达的多样性误判为意义的不确定性。“监督学习”在新任务前的无力嵌入回归的缺陷另一类方法是“监督学习”即用过去标注好的“谎言”样本训练一个分类器。分布外泛化失败当一个全新的、与训练数据完全不同的任务out-of-distribution, OOD出现时就会失灵。而模型最不可靠的地方恰恰是在这些我们人类自己都难以判断的新领域。该方法依赖的“数据分布保持不变”的假设在现实世界的复杂场景下往往过于脆弱。方法——语义熵始于一个根本性的问题转换我们能不能不测量“措辞”的不确定性而是直接测量“意义”的不确定性步骤一生成——让模型“多答几次”给定一个问题 x我们不只看模型的一次回答而是让它用不同的随机种子独立地生成M个回答例如M10。这就像对一个不确定的问题我们让同一个人在不同的情境下回答多次看看他是否会“前后不一”。关键点我们使用一个比较高的“温度”如1.0进行采样这样模型更有可能输出各种不同的回答特别是当它不确定的时候。步骤二聚类——寻找“同义表达”的家园这是整个方法最核心。面对M个形形色色的回答我们如何判断哪些是“意思一样说法不同” 作者引入了语言学中的一个概念双向蕴含 (Bidirectional Entailment)。什么是双向蕴含简单来说如果句子A能推出句子B成立并且句子B也能推出句子A成立那么我们就可以认为A和B在意义上是一致的。例子句子A“埃菲尔铁塔位于巴黎。”句子B“巴黎是埃菲尔铁塔的所在地。”我们可以说A蕴含BB也蕴含A它们是语义等价的。重要性这是判断语义等价的黄金标准比简单计算两个句子的词语相似度要深刻得多。如何实现自动判断作者利用另一个现成的LLM如GPT-3.5或DeBERTa来判断两句话之间是否存在“蕴含”关系。这被称为自然语言推理 (Natural Language Inference, NLI)。聚类算法如同扩展数据图1所示它遍历所有生成的回答。对于当前这个回答s它会检查它是否与任意一个已有的语义簇Cluster中的第一条回答构成双向蕴含关系。如果构成s就被放入那个簇如果不构成则检查下一个簇直到检查完所有已有簇。如果s和所有已有簇都不等价就为它新建一个簇。为什么只需检查每个簇的第一条因为语义等价是且必须是可传递的。如果ABBC那么AC。这是一个非常重要的性质它大大减少了我们需要进行的NLI判断次数。关键步骤将图1(a)具象化。模型生成了“巴黎”、“It’s Paris”、“France’s capital Paris”、“罗马”、“It’s Rome”、“柏林”。聚类过程会把前三个归入“簇1”代表“巴黎”的语义后两个归入“簇2”代表“罗马”的语义“柏林”单独归入“簇3”。这样我们就把语言的“外壳”剥离直指其意义的“内核”。步骤三估算——计算“意义分布”的熵预测熵——思想的起点x输入的问题。比如“法国的首都是什么”Y模型可能输出的所有答案的集合。这是一个随机变量意味着在模型还没开口之前一切皆有可能。y一个具体的可能答案。比如“巴黎”、“伦敦”等。P(y|x)给定问题x模型认为答案应该是y的概率。ln自然对数。计算机里用ln而不是log₂不影响定性理解。H(Y|x)条件熵即“在已知x的条件下Y还剩多少不确定性”。现在我们不再计算词语的概率而是计算这些语义簇的概率。计算语义簇的概率一个语义簇c的概率P(c|x)等于落入该簇的所有生成回答的概率之和。公式1虽然优雅但有一个致命缺陷它看的是具体词语序列s的概率而不是意思c的概率。公式2正是为了解决这个问题而生。c一个语义簇semantic cluster即一群意思相同的句子。s一个具体的句子一个具体的词语序列。注意s ∈ c意味着句子s属于语义簇c。P(s|x)这正是公式1里计算的东西——模型生成这个具体句子s的概率。P(c|x)模型生成“意思是c”的任何句子的总概率。- 这就像把支持“答案意思为巴黎”的所有不同说法的票数概率加在一起。计算语义熵基于这些语义簇的概率我们计算它们的熵。- 如果概率都集中在“簇1巴黎”上熵值就低如果概率分散在“簇1巴黎”、“簇2罗马”甚至“簇3柏林”上熵值就高。离散语义熵 (Discrete Semantic Entropy)这是一个极具实用价值的变体。当研究者无法获取模型的内部输出概率时比如早期的GPT-4我们可以简化地认为每个生成回答都是等值的。此时一个簇的概率直接近似为该簇包含的回答数占总回答数M的比例。实验表明这种近似的方法效果出奇地好证明了“意义聚类”这一步骤是成功的压倒性因素。从“标准语义熵”到“离散语义熵”模型对一个问题生成了10个回答经过双向蕴含聚类后我们得到了3个语义簇簇A代表“巴黎”包含4个回答簇B代表“罗马”包含5个回答簇C代表“柏林”包含1个回答标准语义熵要计算的是语义簇的概率分布而不是简单看每个簇有多少个回答。这个概率是怎么算的呢公式回顾P(c|x) ∑_{s∈c} P(s|x)这意味着对于簇A我们不能简单地说它的概率是 4/10 0.4而是要找出落入簇A的这4个回答各自被模型生成出来的原始概率然后把它们加在一起。比如回答1“巴黎”模型认为它的生成概率是 0.35回答2“It’s Paris”模型认为它的生成概率是 0.08回答3“法国首都巴黎”模型认为它的生成概率是 0.02回答4“Paris”模型认为它的生成概率是 0.10那么P(簇A) 0.35 0.08 0.02 0.10 0.55簇B和簇C也依此计算最后用这些簇概率去算熵。关键问题要完成这个计算我们必须能够获取模型对每个生成回答赋予的原始概率。这意味着我们需要访问模型的内部输出概率分布。在撰写这篇论文时GPT-4的API是个“黑盒”——你给它问题它只给你回答文本但不告诉你它是用多大的概率生成这些话的。这就如同你要计算一个班级学生的考试成绩总分但学校只告诉你每个学生“及格/不及格”而不给你具体的分数。标准语义熵的计算公式在这种情况下就失灵了。面对这个限制离散语义熵做出了一个看似粗糙、实则深刻的简化假设“所有被实际生成的回答在被生成的那一刻都被认为是等概率的。”用数学语言表达就是P(C_i|x) ≈ (簇C_i中包含的回答数量) / M其中M是生成回答的总数。在我们之前的例子中簇A有4个回答所以 P(簇A) 4/10 0.4簇B有5个回答所以 P(簇B) 5/10 0.5簇C有1个回答所以 P(簇C) 1/10 0.1然后直接用这三个概率去计算熵SE_discrete -(0.4×log(0.4) 0.5×log(0.5) 0.1×log(0.1))结果作者设计了两套严格的测试来检验语义熵方法的真本事。一短文本问答与数学 (Sentence-Level QA Math)实验设置与数据集 (这是一个突出的重点)作者在五个广泛使用的基准数据集上进行了测试覆盖了常识、通用知识、生物医学、开放域问答和数学推理等多个领域。TriviaQA冷知识问答。例如“Fado’是哪个欧洲国家的民族音乐”。SQuAD 1.1基于维基百科的阅读理解问答。BioASQ生物医学领域的问答。NQ-Open来自谷歌搜索的真实用户查询。SVAMP小学数学应用题。被测试的模型涵盖了多个主流且不同规模的LLM家族如LLaMA 2 (7B/13B/70B)、Falcon (7B/40B) 和 Mistral (7B)证明了方法的普适性。对照的“竞争者”朴素熵 (Naive Entropy)只看词语不看意思。P(True) 方法用少量例子提示模型让它自我判断回答是“真”还是“假”。这是一种“上下文内”的监督学习方法。嵌入回归 (Embedding Regression)一种经典的监督学习方法在训练数据上学习模型的嵌入表示和回答正确性之间的关系。评判标准 (Metrics)AUROC衡量区分正确答案与错误答案的能力。1.0是完美0.5是等于瞎猜。AURAC一个更贴近用户的指标。它衡量的是当我们根据不确定性分数逐步拒绝掉最可能“虚构”的问题后剩下问题的回答准确率有多高。这直接反映了采用本法后用户体验到的性能提升。核心发现 (Results)性能全面碾压如图2所示在所有模型、所有数据集上语义熵和它的离散变体几乎都显著优于所有基线方法。它平均AUC达到了0.790远超朴素熵0.691、P(True)0.698和嵌入回归0.687。这证明了从“意义”层面衡量不确定性的巨大优势。语义熵给出的不是一个非黑即白的“是/否幻觉”判断而是一个连续的不确定性分数。这个分数能非常好地反映模型出错的概率为后续的决策如拒绝回答提供了灵活的操作空间。无监督的鲁棒泛化语义熵无需任何训练数据。而作为对比的嵌入回归方法一旦脱离其训练数据分布在图中以浅黄色柱子代表其OOD表现性能会大幅下降。这恰恰证明对于安全至关重要的、充满未知的新场景无监督的语义熵是更值得信赖的选择。案例分析表1第一行对于工业建筑类别的问题模型给出了几种说法不同但意思完全一样的答案。朴素熵因此错误地判断为“虚构”而语义熵正确地判断为“非虚构”。表1第二行对于一个蛋白质功能问题模型每次回答都指向完全不同的生物过程。语义熵正确地检测到了这种意义上的混乱判断为“虚构”。表1第四行一个关于日期的微妙案例。模型生成的答案都是同一个日期但有的是“1998年”有的是“1998年10月1日”。语义熵的聚类算法将这两者分开了从而错误地判断为“虚构”。这既展示了方法的严格性也揭示了上下文语境在语义聚类中的重要性。在某些情况下“1998年”可能就是足够正确的答案。二长篇传记生成 (Paragraph-Length Biographies)如果说短文本是“问答题”那么长篇生成就是“写小作文”挑战完全不同。一句话的真实性可能取决于它在整个段落中的位置。数据集FactualBio (关键)这是作者为此次研究专门构建并贡献给社区的数据集。它包含GPT-4为21位名人撰写的人物传记作者从中提取了150个事实性陈述并由人工逐一标注其真伪。这是一个来之不易、高质量的评测基准。方法论的巧妙适应——一个优雅的“分治”策略 直接对整个段落重新采样并计算熵是行不通的因为模型的不确定性可能在于“先写家庭还是先写事业”而非事实本身。为此作者设计了一套精妙的流程事实分解 (Factoid Decomposition)用LLM从长篇传记中将段落拆解成一个一个独立的、原子化的事实陈述Factoid。问题生成 (Question Generation)针对每一个事实陈述让LLM反向生成“如果不看原文回答什么问题会得出这个陈述”。答案再生成 (Answer Regeneration)用原始LLM对这些由“分解事实”生成的问题进行多次再回答。语义熵聚合 (Semantic Entropy Aggregation)在这些针对具体问题的“再回答”上应用语义熵计算然后将与同一个事实陈述相关的所有问题的语义熵取平均值作为该事实陈述的“虚构”风险评分。核心发现再次胜出如图3所示这一连串复杂操作的“组合拳”其最终的检测性能AUROC和AURAC再次超越了包括一个专门为此场景适配的P(True)变体在内的基线方法。应用场景的极大拓展这证明了语义熵的核心思想——在意义层面测量不确定性——不仅适用于简短的答案同样也能被成功地推广到更长、更复杂的自由格式文本生成中为文章级的事实性校验开辟了新道路。结论“虚构”是可被有效检测的本文最核心的结论是LLM的一种典型失败模式——“虚构”即由于缺乏知识而产生的任意性错误回答——可以通过量化模型在语义层面的不确定性来被系统性地、有效地检测出来。语义熵是优越的检测指标通过创造性地引入“双向蕴含聚类”以剥离语义外壳语义熵方法在检测“虚构”方面显著优于过去仅关注词法形式的朴素熵也优于需要标注数据的监督学习方法在跨域场景下。并且其简易的“离散变体”同样有效这极大地方便了其在商业API等受限环境下的应用。LLM“知道自己不知道”的潜力被重新发现本文有力地回应了此前关于“LLM是否知道自己的盲区”的争论。结果表明LLM不仅“知道它自己不知道什么”而且这种“知道”的信号就埋藏在其回答的语义多样性之中。关键在于我们是否拥有正确的工具如语义熵去挖掘这个信号。它们并非完全混沌无知其混乱的“语言表象”背后是对自身知识边界的“意义困惑”。该方法是推动LLM安全应用的关键技术通过提供一种无监督、可跨域泛化的不确定性度量该方法可以被构建成一个可靠的“安全开关”在模型进入“高不确定性区”时自动拒绝回答或提请人类注意。这对于将LLM从有趣的研究模型转变为值得信赖的生产力工具具有里程碑式的实践意义。