平时一直在用各种大模型和 Coding Agent,很早就知道大模型有幻觉,但是从来没有深入探究过,我对大模型的幻觉一直停留在“脑子里只有大模型有幻觉”这几个字。我今天就想问个为什么,深入了解一下大模型幻觉相关知识。
这篇文章的核心就一条主线:是什么 → 为什么 → 怎么应对。
太长不看:一张全局地图
先给你一张”思维导图式”的全局图,后面每一节都是它的展开:
大模型幻觉├── 是什么?── 幻觉分四类:编 / 偏 / 矛 / 旧├── 为什么?── 一个根因 + 三条加剧线 + 两个帮凶│ ├── 根因:训练目标是"接话",不是"求事实"│ ├── 加剧线:有损压缩 / 暴露偏差 / 注意力失焦│ └── 帮凶:没有元认知刹车 / 对齐过度应答├── 怎么治?── 战术四招 + 工程四法 ├── 战术:允许说不知道 / RAG / 给依据 / 自查 └── 工程:Prompt / RAG / 采样参数 / 评测审核一、是什么:幻觉分四种类型
大模型幻觉,就是模型编出”看起来很流畅、但不符合事实或与你的输入不一致”的内容。分四类,用四个字记:编、偏、矛、旧。
- 编(事实性幻觉):虚构不存在的事实、数据、来源。比如虚构一篇论文、报错一个数字。
- 偏(忠实性幻觉):不看你给的上下文,答非所问、脱离输入自由发挥。
- 矛(逻辑矛盾):前后推理不自洽,自己打自己脸。
- 旧(过时幻觉):知识截止之后的信息,它不知道却硬答,把旧的当新的。
二、为什么:从根因到帮凶的因果链
如果原本让我回答”为什么会有幻觉”,我可能会列出一堆并列的理由:训练数据质量有局限、语料不干净、模型追求流畅、知识有截止线、长上下文会丢……这些都对,但都只是表象。真正有深度的理解,是一条层层递进的因果链。
根因(第 1 层):训练目标是”接话”,不是”求事实”
大模型的损失函数只认识一件事:给定前文,下一个 token 应该是什么?它从没见过”这句话符合事实”或”这句话是编的”这样的监督标签。一句天衣无缝的谎话,只要在训练语料里反复出现,对它而言就是正确答案。
模型从诞生起,就没被赋予过”诚实”这个优化维度。
这一层是总根因,前面那些”表层理由”其实是它的下游:
- “生成机制使然” = 根因本身:追求”分布内最流畅的延续”,而不是”最经得起事实验证的表述”。
- “概率偏好” = 根因的下游:当”说得通”和”说得对”冲突,它无痛地倒向前者。
- “训练数据有错” = 根因的输入:语料里的错信息,被当作正确答案学了进去。
加剧线一(第 2 层):有损压缩——参数是世界的缩略图
一个 70B 参数的模型,参数约占 140GB 存储,要吸收的训练数据却是几十 TB 级别。这是极度有损的压缩——模型只记住了高频模式和统计轮廓,刻录不了每条冷僻的实验数据。追问低频事实时,它不是”回忆”,而是”补全”:按学到的模式,猜一个统计上最说得通的数值或人名填进去。
这就解释了”知识有截止线”:不是它不想告诉你,是它压根没存下真相。
加剧线二(第 3 层):暴露偏差——训练和推理之间的裂缝
训练时用 teacher forcing,每一步喂的是标准答案里的真实 token;推理时模型看到的是自己刚生成的 token。只要某一步产出一个稍有偏差的词,这个偏差就被当作正确上下文进入下一轮计算,误差逐 token 积分。
就像没有卫星修正的惯性导航:起始只偏 0.1 度,走远了就把你带到完全陌生的地方。
所以幻觉总爱出现在长回答的中后段——偏差在逐 token 累积,越往后偏离真实越远,而文本却依然通顺无比。
加剧线三(第 4 层):注意力检索失焦——记得,但取不出来
不少知识其实已经存进参数,只是推理时没被正确取出来。注意力本质上是一种软性检索,靠 Q 和 K 的相似度定位相关信息;当问题表述偏离训练句式、或上下文堆积到数千 token 时,注意力就会偏焦、指向错误的知识碎片。模型明明”记得”正确答案,却读错了”内存地址”。
这种失败容易被误判为”知识缺失”,其实病灶在注意力、不在记忆。
帮凶 A:没有元认知刹车
解码是永不停歇的补全引擎,内部不存在一个评估模块来喊停”这个我没把握,别往下编了”。无论你问什么,它都会用最自信的语气填满答案——从不留白,也就从不暴露自己的知识边界。这让幻觉格外有迷惑性。
帮凶 B:对齐训练的好心办坏事
经过 RLHF/DPO,模型学会了”乐于助人”,同时也学会了一套隐性社交规范:拒绝用户是不好的、“说我不知道”显得无能。于是它在不确定时,宁可输出一个像模像样的回答讨好你——“服务型人格”无意中关小了诚实度。
三、怎么治:从战术到工程落地
应对幻觉,分为两个层次:日常使用的战术四招,和生产级的工程四法。
战术层:日常四招
- 允许说”不知道”:明确告诉模型不会就说不会,不要猜。
- 给模型”根据地”:用检索增强(RAG),绑定可信资料再作答。
- 强制给依据:要求引用来源、标注置信度,方便核对。
- 让它自查:分步推理 + 输出前自己检查一遍。
工程层(一):Prompt 工程——用指令约束幻觉
模型推下一个 Token 时,上下文里每一个 Token 都在影响概率分布。System Prompt 注入的约束词,就是在上下文里放入”高质量的前文”——让”我不确定”这个序列概率上升、编造序列概率下降。本质:用精心设计的前文,定向干预后文的概率分布。
示例 · 智能客服 System Prompt:
你是 [公司名] 的智能客服助手。
## 核心约束- 只回答知识库中有明确记录的问题- 涉及价格、政策、库存等数字,必须从知识库获取,禁止自行推断- 不确定时,统一回复:「这个问题我需要帮您查询一下,请稍等」- 严禁编造不存在的优惠活动、退款规则、产品参数
## 兜底话术当无法确认时:「感谢您的耐心等待,这个问题我帮您转接专属客服确认,预计 [X] 分钟内回复,是否方便留下联系方式?」
## 拒绝回答的场景- 竞争对手产品比较- 超出本公司产品范围的法律/医疗建议- 用户情绪激动时,不做解释,直接转人工局限:约束指令只在模型有一定不确定感时有效;当模型对错误答案高度自信(训练数据的系统性错误、过时知识被当事实)时,第一候选词就是错的,约束词干预不了。所以对”高度自信但可能出错”的领域,必须配 RAG 或人工审核兜底。
工程层(二):RAG 检索增强——让模型”开卷答题”
模型是 Token 推 Token,推出什么取决于前文。RAG 用”检索到的真实文档”作为高质量前文注入上下文——模型没有变聪明,只是有了一个更好的起点。
局限在于它不是银弹:检索本身可能出错,错误文档会被当权威依据;上下文窗口有限,窗口外的内容模型仍会用记忆补全,RAG+幻觉混合输出比纯幻觉更难识别。
成本优化上,核心是”什么情况下不用 RAG”——约 70% 的对话其实不需要检索,先做意图识别能省一大笔。四种优化策略:
| 策略 | 收益 | 要点 |
|---|---|---|
| 关键词触发(过滤) | 跳过 30–70% 查询 | ”今天几号?“直接答,“退款政策”才触发检索 |
| 模型路由(分级) | LLM 费用降 60–80% | 简单问题用小模型,复杂问题才上旗舰 |
| 语义缓存 | 延迟费用降 50% | 向量相似度 ≥ 0.95 直接返回缓存 |
| 精准切块 | 准确率提 20–40% | 约 512–800 Token/块,以标题/段落为边界 |
记住:知识库质量 → 检索质量 → 回答质量,三层缺一不可。
工程层(三):Temperature & Top-P——调节采样随机性
每步推 Token 时,模型对候选词算 logits,经 softmax 得到概率分布。Temperature 在 softmax 前对 logits 做等比缩放:T 越小分布越尖锐,T 越大分布越平坦。这是最直接干预每步采样随机性的手段。
原则:事实问答全程低温,创意场景才放开。但要警惕——低温锁定的是”最可能”,不是”最正确”。如果训练数据里那个问题本身就是错的,低温只会让模型错得更稳定;它也不影响知识边界,模型不知道的事低温下照样编。
工程层(四):评测 + 人工审核——在输出端架一道纠错层
三个环节闭环:
- 上线前 · 评测基线:建立幻觉测试集(已知正确答案的问题),量化幻觉率,设定准入门槛。
- 上线后 · 分级审核:按风险等级自动路由——低风险直接发出,高风险先人工审核再发送。
- 持续优化 · 错误反馈闭环:把审核发现的幻觉案例收集为 Bad Case,反哺模型优化和 Prompt 调整。
为什么有效?模型没有自我检查机制——推出一个错误 Token 后,会以这个错误为基础继续往下推,误差累积。评测+审核是在输出端架一个外部纠错层,弥补”Token 推 Token 单向不回头”的根本缺陷。
一句话定位:前三个手段改变概率,这一手段拦截结果。
结语
幻觉从来不是”模型变坏了”。它是大模型作为一种统计世界模拟器,在压缩、检索、生成这一整套流水线上层层累积的必然投影。理解幻觉,就是在理解这条流水线上,连接主义与符号真理之间那道尚难弥合的缝。
而应对之道,也藏在这条流水线上:给它更好的前文(Prompt / RAG),管住它的采样(Temperature),再在输出端加一道人工的闸(评测 + 审核)。它不是一场可以根治的病,而是一门需要持续管理的工程。