第31章:幻觉——LLM 的阿喀琉斯之踵
GPT-4 可以写出完美的 Python 代码,可以解释量子力学,可以翻译 20 种语言。但它也可能煞有介事地引用一篇根本不存在的论文,或者把一位健在的人说成已经去世。这种现象有一个名字:幻觉(Hallucination)。
幻觉是 LLM 最危险的特征之一,因为它具有欺骗性——错误的答案被包裹在流畅、自信的语言中,普通用户很难察觉。理解幻觉的本质,是负责任地使用 LLM 的第一步。
31.1 幻觉的定义与分类
什么是幻觉?
幻觉指的是:模型生成了看似合理、语言流畅,但实际上与事实不符或与给定信息相矛盾的内容。
注意这里有两个关键词:"看似合理"和"实际错误"。幻觉不是胡言乱语,恰恰相反,它往往读起来非常像真的——这才是真正的危险所在。
幻觉的两大类型
1. 事实性幻觉(Factual Hallucination)
模型凭空捏造了现实世界中不存在的事物:
- 引用一篇从未发表过的学术论文(作者名、期刊名、年份、DOI 都编造得头头是道)
- 描述一个从未发生过的历史事件
- 给出一个不存在的 API 函数签名
- 声称某位名人说过某句话,但该引言子虚乌有
这类幻觉的典型例子是"幻觉引用"问题。有研究发现,让 GPT 类模型列举参考文献时,相当比例的引用是虚构的。
2. 忠实性幻觉(Faithfulness Hallucination)
模型拿到了真实文档,但在处理(总结、翻译、问答)时曲解了原文含义:
- 总结合同时遗漏了关键限制条款
- 将原文中的"可能"(may)翻译为"将会"(will)
- 从文章中"推断"出原文并未声明的结论
忠实性幻觉更隐蔽,因为用户往往相信:给了模型原始文档,它就不会出错。
严重性分级
:::warning 高风险场景 幻觉在不同场景下的危害程度差异巨大:
| 场景 | 幻觉类型 | 潜在危害 |
|---|---|---|
| 闲聊、创意写作 | 低风险 | 几乎无害 |
| 代码生成 | 中等风险 | 程序崩溃、安全漏洞 |
| 法律咨询 | 高风险 | 误导当事人,造成法律损失 |
| 医疗建议 | 极高风险 | 可能危及生命 |
| 学术引用 | 高风险 | 学术诚信危机 |
| ::: |
31.2 幻觉的成因分析
为了消除幻觉,我们需要先理解它从哪里来。幻觉并非偶然 bug,而是当前 LLM 架构的系统性局限。
原因一:自回归的本质——"预测"而非"查询"
这是最根本的原因。LLM 的工作原理是:
模型在每一步生成的,是在当前上下文下概率最高的下一个 token,而不是在执行"查询事实数据库"操作。
打个比方:模型更像一个博学的人在凭记忆侃侃而谈,而不是一个正在查阅百科全书的学生。当他确实知道某个事实时,输出很准确;当他不确定时,他不会停下来说"我不知道",而是凭直觉"脑补"一个听起来合理的答案。
这是架构层面的特性,而不是可以简单修复的 bug。
原因二:训练数据中的噪声与偏差
互联网上的文本包含大量错误信息、过时信息和互相矛盾的说法。LLM 在这些数据上训练,不可避免地会学到一些错误的"事实"。
更糟糕的是,模型可能会把高频出现的错误信息当作"事实"记住。如果网上有 1000 篇文章错误地声称某个历史年份,模型的权重就会被这 1000 篇文章"投票"影响。
原因三:校准失败(Miscalibration)
**校准(Calibration)**指的是模型的置信度与其准确率的匹配程度。一个完美校准的模型,当它说"我有 80% 把握"时,它应该有 80% 的时候是对的。
现实中,LLM 普遍存在过度自信问题:即使在不确定的内容上,模型也倾向于使用肯定语气输出答案,而不是表达不确定性。
从对数似然的角度看,训练目标是:
这个目标只要求模型给正确 token 分配高概率,没有任何机制要求模型在不确定时表达不确定。
原因四:知识截止日期(Knowledge Cutoff)
LLM 的知识被冻结在训练数据的截止时间点。2024 年发生的新闻、刚发表的论文、最新的政策变化——这些信息模型一无所知。
问题在于,模型并不知道自己不知道。当被问及截止日期之后的事件时,它可能会用训练数据中的旧知识"推断"出一个听起来合理但已经过时的答案。
原因五:长尾知识稀疏
训练数据遵循幂律分布:关于主流话题的文本铺天盖地,关于小众话题的文本寥寥无几。
:::info 直觉 想象一个学生,教科书中关于牛顿力学的习题有 10000 道,关于某个冷僻定理的例题只有 3 道。他对前者掌握扎实,对后者可能会"背错"——但他不知道自己背错了,照样自信地作答。
LLM 对长尾知识(罕见人名、小众事件、冷门机构)的记忆就是这种状态。 :::
31.3 缓解方法
既然幻觉源于 LLM 的多层次局限,缓解方法也必须从多个层次入手——没有一颗银弹。
方法一:RAG(检索增强生成)
核心思路:与其让模型从权重中"记忆"事实,不如让它实时从可信的外部数据库中检索事实,然后基于检索结果生成答案。
用户提问
↓
[检索器] → 从知识库中找到相关文档
↓
[LLM] 基于检索文档回答(而非凭记忆)
↓
输出答案(附原文引用)
RAG 的效果:
- 事实性幻觉大幅减少(因为模型有据可查)
- 知识截止日期问题得到缓解(知识库可实时更新)
- 忠实性幻觉仍可能发生(模型仍可能曲解检索结果)
RAG 的详细原理我们已在第 22 章讨论,这里不再展开。
方法二:工具调用(Tool Use)
比 RAG 更进一步:让模型调用可信工具来获取信息,而不是依赖内部记忆。
# 模型决定调用搜索工具
tools = [
{"name": "web_search", "description": "搜索实时网络信息"},
{"name": "calculator", "description": "执行精确数学计算"},
{"name": "database_query", "description": "查询企业内部数据库"},
]
# 模型生成工具调用
response = {
"tool": "web_search",
"query": "2025年诺贝尔物理学奖得主"
}
# 系统执行工具,将结果返回模型
result = execute_tool(response)
# 模型基于真实结果生成答案
final_answer = model.generate(
question + "\n工具返回结果:" + result
)
工具调用对计算类幻觉尤其有效(LLM 的数学推理本质上也是"预测",并非精确计算)。
方法三:自我校验(Self-Consistency / Self-Check)
直觉:如果模型幻觉了一个答案,让它用不同方式问自己同一个问题,幻觉结果往往不一致;真实答案则多次出现。
Self-Consistency(自洽性) 方法:
- 对同一问题采样 个独立回答
- 统计最高频的答案
- 如果答案高度发散,则触发"不确定"提示
Self-Check 方法:
生成答案后,再让模型扮演"批评者"角色:
第一轮:请问X的出生年份?
模型答:1856年。
第二轮(自检):
"以下陈述是否有误?'X出生于1856年。'"
模型答:是的,X实际出生于1847年。
:::tip 局限性 自我校验的效果依赖模型本身的可靠性。如果模型对某个知识点系统性地错误,它也会系统性地通过自我校验——所以这个方法对"模型确实不知道"的内容效果有限。 :::
方法四:训练层面的干预
RLHF 中惩罚幻觉:在人类反馈强化学习阶段,让标注者专门识别并惩罚幻觉输出,使模型学会在不确定时主动说"我不确定"而非编造答案。
Honesty 对齐:Anthropic、OpenAI 等机构的对齐研究中,"诚实性(Honesty)"是明确的训练目标之一,包括:
- Truthful:只声明自己认为真实的事情
- Calibrated:对不确定的内容表达不确定
- Non-deceptive:不主动误导用户
这些目标通过构造专门的训练数据(如 TruthfulQA 基准)和偏好标注来实现。
自我知识训练:训练模型区分"我知道的"和"我不知道的",对后者直接拒绝回答或标注置信区间。
方法五:用户侧的使用策略
无论模型如何改进,用户侧的良好习惯始终不可或缺:
| 策略 | 操作方式 | 效果 |
|---|---|---|
| 要求引用来源 | "请引用具体来源支撑你的每个论点" | 迫使模型不能凭空声明 |
| 怀疑具体细节 | 对人名、日期、数字等进行独立核实 | 避免在高风险信息上犯错 |
| 提供上下文 | 将相关文档粘贴进 prompt | 减少模型依赖记忆的场景 |
| 分解任务 | 将复杂问题拆成小步骤 | 每步可验证,错误更易发现 |
| 提示不确定性 | "如果你不确定,请直说" | 降低过度自信的概率 |
小结
| 维度 | 要点 |
|---|---|
| 定义 | 生成看似合理但实际错误的内容 |
| 主要类型 | 事实性幻觉(捏造)vs 忠实性幻觉(曲解) |
| 根本原因 | 自回归预测的本质:猜而非查 |
| 加重因素 | 数据噪声、校准失败、知识截止、长尾稀疏 |
| 技术缓解 | RAG、工具调用、自我校验、Honesty 对齐 |
| 用户策略 | 要求来源、独立核实、提供上下文 |
幻觉不是 LLM 的"偶发故障",而是其工作方式的内在产物。完全消除幻觉可能需要根本性的架构创新;在此之前,理解幻觉、设计对抗幻觉的系统,是每一位 LLM 从业者的必修课。
下一章我们将聚焦另一个前沿挑战:长上下文推理——当输入文本从数千 token 延伸到数百万 token 时,模型的注意力机制面临哪些新的困境,工程上又有哪些突破?