Skip to content

模型幻觉 ​

标签
AI/llm
字数
3777 字
阅读时间
15 分钟

模型幻觉(Hallucination) 指模型生成的内容与客观事实、用户输入或上下文信息相矛盾,或者生成了不存在的事实、实体、事件。

本质是模型在生成过程中过度自信地「编造」,而不是准确地检索或推理。它和「答不出」是两回事——幻觉的特征恰恰是语气笃定、格式合规。

先看规模 ​

场景幻觉率
ChatGPT 传记生成的事实准确率只有 58%
代码 LLM 在低频 API 调用上编出不存在的 API超过 60%

再看一条对照强烈的:03-ReAct 那篇里,纯 CoT 的主导失败模式是幻觉(占 56% 的错误),而把行动接进来之后 ReAct 把幻觉压到 6%——但暴露了新瓶颈:23% 的失败来自外部工具本身的质量(搜索没找到)。

这两组数字给出一条判据:幻觉不是「模型不够好」这一个变量能解释的,它同时取决于任务类型和有没有外部锚点。

幻觉与相邻的两个现象不是一回事,两个维度就能分开。

                内容为真              内容为假
  语气笃定  ┌────────────────────┬──────────────────────┐
  格式合规  │  正常的正确回答      │  幻觉                 │
            │                      │  说得很通,格式合规   │
            ├────────────────────┼──────────────────────┤
  语气含糊  │  「答不出」          │  不连贯                │
  或格式乱  │  承认自己不知道      │  话说不通              │
            └────────────────────┴──────────────────────┘

排查时三条路的入口完全不同
  幻觉     语气笃定 + 格式合规 + 内容假 ──▶ 必须查外部知识源才能发现
  不连贯   话说不通 ──▶ 通常与采样参数有关,与幻觉是两件事
  答不出   模型自己给出了不确定性信号 ──▶ 反而好办

三种类型 ​

类型表现
事实性幻觉(Factual)生成与现实世界事实不符的信息
忠实性幻觉(Faithfulness)在摘要、翻译这类任务中,生成内容未能忠实反映源文本的含义
内在幻觉(Intrinsic)生成内容与输入信息直接矛盾

三类在排查时的入口不同:事实性要查外部知识源,忠实性要拿源文本逐句比对,内在幻觉只要看输入输出是否自相矛盾。

成因 ​

三个因素共同作用,缺一个都不会稳定复现幻觉:

  1. 训练数据里本身有错误或矛盾的信息
  2. 自回归生成机制只预测下一个最可能的词元,没有内置的事实核查模块——它没有「先去查一下」这个动作
  3. 需要复杂推理的任务里,逻辑链条中途出错,模型会顺着错误的中间结论继续「编」下去

三个因素共同作用,缺一个都不会稳定复现幻觉。

训练数据里本身有错误或矛盾的信息
   └─▶ 这些内容和正确内容一起,被当成「预测下一个词」的目标学进去
        │
        ▼
自回归生成只预测下一个最可能的词元
   └─▶ 没有内置的事实核查模块,它没有「先去查一下」这个动作
        │
        ▼
需要复杂推理的任务里,逻辑链条中途出错
   └─▶ 模型顺着错误的中间结论继续往下编
        └─▶ 误差累积:后面的每个条件分布都建立在错误前提上

三条合起来的后果:模型对自己编出来的内容没有「不确定」这个出口 ——
这正是幻觉的特征是语气笃定、而不是犹豫的原因。

还有四条与架构和推理相关的 ​

成因机制
超长序列的注意力分散注意力机制难以处理极长序列,把权重过度分散到输入中,导致模型失去对关键上下文的跟踪
位置编码随长度恶化模型可能在文本中错位或错误关联实体(见 09-位置编码 的长上下文外推)
微调时的能力错位模型被迫遵循它缺乏基础知识的领域的指令时,会「猜」而不是承认无知
推理时的随机采样采样固有的随机性偶尔选到「不太准确但很可能」的 token,引发一连串错误——因为后面的 token 都建立在这个错误上

最后一条与 采样参数 直接相关:温度越高、随机性越强,这条路径越容易出现。但要注意——高温度导致的不连贯与幻觉是两件事,前者是「话说不通」,后者是「说得很通但内容假」。

检测:五类方法 ​

幻觉检测本身是个难题,因为输出通常非常合理。当前研究分成五类范式:

类别原理代表与实测数据
自洽性幻觉内容在多次生成之间会发散,事实内容保持稳定SelfCheckGPT(EMNLP 2023)——零资源黑盒检测,比较 N=20 个采样响应,用 BERTScore / NLI / LLM 提示测一致性。非事实句检测 AUC-PR 93.42%,代价是 10–20× 计算开销
不确定性量化在语义级而非 token 概率上测置信度语义熵(Farquhar et al., Nature 2024)——按双向蕴含聚类采样输出,在含义等价类上算熵。AUROC 0.790 vs 朴素熵 0.691
内部状态探测LLM 的隐状态里编码了幻觉相关信息INSIDE / EigenScore(ICLR 2024)算响应嵌入协方差矩阵的特征值;Inference-Time Intervention(NeurIPS 2023)沿「真实方向」移动激活,把 LLaMA 的 TruthfulQA 准确率从 32.5% 提到 65.1%
检索增强验证用外部知识源对输出做事后核验FActScore(EMNLP 2023)——把长文本分解成原子事实再对照 Wikipedia 验证,相对人类判断的错误率 <2%
解码干预直接改生成过程DoLA(ICLR 2024)——把后层(含事实知识)的 logits 与前层对比,TruthfulQA 绝对提升 12–17%,无需微调或外部检索

五类检测方法可以按「需要手上有什么」分层。

需要模型内部信号(权重 / 隐状态 / logits)
├─ 不确定性量化   语义熵:按双向蕴含聚类采样输出,在含义等价类上算熵
│                 AUROC 0.790(对 token 概率算熵只有 0.691)
└─ 内部状态探测   INSIDE / EigenScore:算响应嵌入协方差矩阵的特征值
                  ITI:沿「真实方向」移动激活
                  TruthfulQA 准确率 32.5% ──▶ 65.1%

需要能改生成过程(白盒解码)
└─ 解码干预       DoLA:把后层(含事实知识)的 logits 与前层对比
                  TruthfulQA 绝对提升 12–17%,无需微调或外部检索

只需要输出文本(黑盒)
├─ 自洽性         SelfCheckGPT:同一问题采样 N = 20 次,比较一致性
│                 非事实句检测 AUC-PR 93.42%;代价 10–20× 计算开销
└─ 检索增强验证   FActScore:把长文本分解成原子事实,逐条对 Wikipedia 查
                  相对人类判断的错误率 < 2%

层的选择取决于手上有什么:拿不到 logprobs 的黑盒场景里,只剩最后两个能用。

语义熵那条为什么重要 ​

「不确定性」有两种测法,效果差得很明显:

测法AUROC
对 token 概率算熵0.691
对含义等价类算熵(语义熵)0.790

对「含义」的不确定性优于对「token」的不确定性。 原因也直观:同一个事实可以有很多种说法,token 级熵会把「换个措辞」误判成「模型不确定」。

这条和 置信度分层 里那两个轴直接接上:语义熵测的是区分度(能不能把会幻觉的和不会的分开),而不是校准。

一个不依赖 logprobs 的检测法 ​

上面几类大多需要模型内部信号。在只能拿到文本的黑盒场景里,自洽性检测是最实用的:

  • SelfCheckGPT 的做法:对同一问题采样 N 次,逐句检查其他采样里有没有支持或矛盾的表述
  • 它的前提假设:一个在编造的模型会产生多个听起来都合理但互不相同的答案;而在回忆事实的模型会稳定重复

这个假设在 Self-Consistency 那里已经用过一次——那里用它提准确率,这里用它做检测,同一个信号两种用法。

缓解:四个层次 ​

层次做法
提示层结构化模板、少样本示例、明确指令「保持事实性」
检索层RAG——生成前先从可信数据库检索相关文档作为上下文。这是最有效的策略之一
推理层CoT——把复杂查询分解成更小、可验证的子任务,减少逻辑跳跃和捏造
模型层训练与对齐手段(RLHF、faithfulness-aware training——把忠实度分类器的分数并进训练目标)

三种工程上最常用的具体手段 ​

一、RAG。 把「回忆」换成「查询」——计算交给计算器,实时信息交给搜索,这两类恰好是模型最容易编的地方。见 11-RAG 检索增强。

二、检索增强验证(事后核验)。 不同于 RAG 的「生成前注入」,这是生成后逐条验证:

输出 → 分解成可验证命题 → 逐条向可信知识库查询
     → 零支持证据的断言标为编造

「分解成原子事实」这一步是关键——长文本整段去验证无法定位到具体哪一句有问题。

三、Chain-of-Verification(CoVe)。 让模型系统性地验证自己的输出:

初版回答 → 规划验证问题 → 独立回答这些验证问题 → 最终输出只整合已验证的事实

「独立回答」是整套机制的核心:验证题的答案要在不参考初版的情况下生成。

否则模型只是在复述自己的错误——这正是 Reflection 那篇说的「用同一把尺子量同一块布」,也是 LLM Evaluation 里「自我偏好」的同一个根源。

实测降幻觉约 30%(见参考)。

缓解手段按介入的时机分成三类,时机决定了它能修什么。

生成前(改输入)
└─ RAG:先从可信数据库检索相关文档,作为上下文注入
        计算交给计算器、实时信息交给搜索 —— 这两类恰好是模型最容易编的地方

生成中(改解码)
└─ DoLA 这类解码干预直接改 logits,不经过提示,也不依赖外部检索

生成后(改输出)
├─ 检索增强验证:输出 → 分解成可验证命题 → 逐条向可信知识库查询
│                → 零支持证据的断言标为编造
│                「分解成原子事实」是关键 —— 整段长文本去验证无法定位到哪一句
└─ Chain-of-Verification(CoVe)四步
        ① 出初版回答
        ② 规划一组验证问题
        ③ 不参考初版,独立回答这些验证问题    ← 整套机制的核心在这一步
        ④ 最终输出只整合已验证的事实
      为什么要「独立回答」:否则模型只是在复述自己的错误,
      和「用同一把尺子量同一块布」是同一个根源。实测降幻觉约 30%。

代码幻觉:一个特殊的子类 ​

代码幻觉与自然语言幻觉有本质不同——它表现为「可执行但错误」的产物,因此可以通过编译和测试对照 ground truth 来验证。

这让代码成为少数能用确定性手段检测幻觉的领域——正好对应 LLM Evaluation 里那条判据「工具调用与代码用精确匹配或执行式评测,不用 judge」。

两套已经成形的分类:

HalluCode 的五类:intent-conflicting(与需求语义不符)/ context-conflicting(内部不一致)/ fact-conflicting(错误事实知识)/ input-conflicting(偏离源)/ knowledge-conflicting(领域违规)。

CodeHaluEval(8k+ 样本)的四类:

类型说明
Mapping 幻觉数据类型或值的处理错
Naming 幻觉变量名、函数名写错
Resource 幻觉引用了无效的 API
Logic 幻觉算法本身有缺陷

「Resource 幻觉」在 Agent 场景下最隐蔽——它属于把「记不清的接口」当成「记得的接口」写了出来,与内容层面的错误是两回事。这类错误在工具调用上会直接表现为调用失败,所以返回结构化错误给模型比抛异常更有效:模型看到错误能自己纠正(见 工具系统与 Function Calling)。

在智能体里的具体形态 ​

幻觉在 Agent 场景下会放大成可观察的失败:

  • 旅游规划 Agent 推荐一个现实中不存在的景点
  • 订到航班号错误的机票
  • 调用工具时参数名或枚举值编错,工具返回错误而不是结果

相关 ​

参考 ​

贡献者 ​

文件历史 ​