模型幻觉
模型幻觉(Hallucination) 指模型生成的内容与客观事实、用户输入或上下文信息相矛盾,或者生成了不存在的事实、实体、事件。
本质是模型在生成过程中过度自信地「编造」,而不是准确地检索或推理。它和「答不出」是两回事——幻觉的特征恰恰是语气笃定、格式合规。
先看规模
| 场景 | 幻觉率 |
|---|---|
| ChatGPT 传记生成的事实准确率 | 只有 58% |
| 代码 LLM 在低频 API 调用上编出不存在的 API | 超过 60% |
再看一条对照强烈的:03-ReAct 那篇里,纯 CoT 的主导失败模式是幻觉(占 56% 的错误),而把行动接进来之后 ReAct 把幻觉压到 6%——但暴露了新瓶颈:23% 的失败来自外部工具本身的质量(搜索没找到)。
这两组数字给出一条判据:幻觉不是「模型不够好」这一个变量能解释的,它同时取决于任务类型和有没有外部锚点。
幻觉与相邻的两个现象不是一回事,两个维度就能分开。
内容为真 内容为假
语气笃定 ┌────────────────────┬──────────────────────┐
格式合规 │ 正常的正确回答 │ 幻觉 │
│ │ 说得很通,格式合规 │
├────────────────────┼──────────────────────┤
语气含糊 │ 「答不出」 │ 不连贯 │
或格式乱 │ 承认自己不知道 │ 话说不通 │
└────────────────────┴──────────────────────┘
排查时三条路的入口完全不同
幻觉 语气笃定 + 格式合规 + 内容假 ──▶ 必须查外部知识源才能发现
不连贯 话说不通 ──▶ 通常与采样参数有关,与幻觉是两件事
答不出 模型自己给出了不确定性信号 ──▶ 反而好办三种类型
| 类型 | 表现 |
|---|---|
| 事实性幻觉(Factual) | 生成与现实世界事实不符的信息 |
| 忠实性幻觉(Faithfulness) | 在摘要、翻译这类任务中,生成内容未能忠实反映源文本的含义 |
| 内在幻觉(Intrinsic) | 生成内容与输入信息直接矛盾 |
三类在排查时的入口不同:事实性要查外部知识源,忠实性要拿源文本逐句比对,内在幻觉只要看输入输出是否自相矛盾。
成因
三个因素共同作用,缺一个都不会稳定复现幻觉:
- 训练数据里本身有错误或矛盾的信息
- 自回归生成机制只预测下一个最可能的词元,没有内置的事实核查模块——它没有「先去查一下」这个动作
- 需要复杂推理的任务里,逻辑链条中途出错,模型会顺着错误的中间结论继续「编」下去
三个因素共同作用,缺一个都不会稳定复现幻觉。
训练数据里本身有错误或矛盾的信息
└─▶ 这些内容和正确内容一起,被当成「预测下一个词」的目标学进去
│
▼
自回归生成只预测下一个最可能的词元
└─▶ 没有内置的事实核查模块,它没有「先去查一下」这个动作
│
▼
需要复杂推理的任务里,逻辑链条中途出错
└─▶ 模型顺着错误的中间结论继续往下编
└─▶ 误差累积:后面的每个条件分布都建立在错误前提上
三条合起来的后果:模型对自己编出来的内容没有「不确定」这个出口 ——
这正是幻觉的特征是语气笃定、而不是犹豫的原因。还有四条与架构和推理相关的
| 成因 | 机制 |
|---|---|
| 超长序列的注意力分散 | 注意力机制难以处理极长序列,把权重过度分散到输入中,导致模型失去对关键上下文的跟踪 |
| 位置编码随长度恶化 | 模型可能在文本中错位或错误关联实体(见 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 推荐一个现实中不存在的景点
- 订到航班号错误的机票
- 调用工具时参数名或枚举值编错,工具返回错误而不是结果
相关
- RAG 检索增强 —— 最有效的缓解手段,以及它自身的两种失效
- LLM Evaluation 与反馈闭环 —— 幻觉的两种来源(检索失败 vs 生成噪声)在此分开
- 置信度分层与 Human-in-the-loop —— 语义熵测的是区分度那一轴
- ReAct —— 把 56% 的幻觉压到 6% 的那组数据
- Reflection —— 「自验证」为什么需要独立上下文
- 04-采样参数 —— 随机采样与幻觉的关系,以及为什么不连贯 ≠ 幻觉
- 09-位置编码 —— 超长上下文下的实体错位
参考
- https://engineering.zooz.com/@asverma314/llm-hallucination-detection-and-mitigation-g-a-survey-f6b3f597455d
- https://www.alphaxiv.org/zh/abs/2510.06265
- https://inferensys.com/glossary/algorithmic-explainability-and-interpretability/automated-rationale-generation/hallucination-detection
- Huang, L., et al. A Survey on Hallucination in Large Language Models. arXiv:2311.05232, 2023.
YJ