大模型为什么会有“幻觉”——从训练方式到推理局限
前言
如果你用过ChatGPT或任何大模型,你一定遇到过这种情况:
你问:“深度求索公司是哪一年成立的?”
大模型答:“深度求索公司成立于2019年,总部位于深圳……”(一本正经、语气肯定、完全是编的)
这就是大模型幻觉。它不是偶然的bug,而是大模型工作原理的必然产物。理解幻觉的成因,是做好RAG和Prompt Engineering的前提。面试中,面试官也喜欢问:“你说说幻觉的原理,以及你是怎么解决的?”
本文核心问题:
- 什么是大模型幻觉?有哪些类型?
- 幻觉是模型“故意骗人”吗?从工作机制看根本原因是什么?
- 大模型的训练方式如何决定了它“编造事实”的倾向?
- 为什么大模型不知道自己不知道?
- 温度参数和幻觉有什么关系?
- 为什么RAG能减少幻觉?从概率角度看底层逻辑是什么?
- Prompt Engineering中防幻觉的策略有哪些?
- 幻觉能被彻底消除吗?如果不能,我们应该怎么看待它?
读完本文,你将能从“解码机制”“训练数据”“概率生成”三个维度说清楚幻觉的根源,并对接你项目中用RAG和Prompt约束防幻觉的技术决策。
一、幻觉是什么?——不是偶然的bug
疑问:什么是“大模型幻觉”?它和普通程序出bug有什么不同?
回答:大模型幻觉指的是模型生成了看起来通顺但不符合事实的内容,而且语气极为自信。
1.1 幻觉的几种类型
| 类型 | 表现 | 举例 |
|---|---|---|
| 事实性幻觉 | 编造不存在的事实 | “深度求索公司成立于2019年” |
| 忠实性幻觉 | 偏离用户指令 | 让写诗,却输出了一大段散文 |
| 逻辑性幻觉 | 推理过程出现矛盾 | 数学题中间推导正确,最后结论错误 |
1.2 幻觉不是“故意骗人”
大模型没有主观意图。它不是在“决定要不要骗你”,而是在完成一个数学任务——生成概率最高的下一个token。只不过这个任务的输出恰好看起来像在编造事实。
关键认知:幻觉是大模型训练目标(预测下一个token)的副产品,而不是独立的设计缺陷。
二、根因一:训练方式——它学的是“说话像人”,不是“说真话”
疑问:大模型到底是怎么训练的?为什么训练方式决定了它可能编造事实?
回答:大模型训练的核心任务是“预测下一个token”,不是“判断事实真假”。
2.1 训练目标决定了它的能力边界
训练语料中的一句话: “法国的首都是巴黎。” 模型的训练任务: 给定“法国的首都是”,预测下一个词。 模型学到了什么: “当见到‘法国首都’这个模式,后面接‘巴黎’的概率非常高。” 这不一定是因为它“知道巴黎是法国首都”—— 它只是学到了这个统计规律。2.2 训练数据中的“矛盾”与“偏见”
互联网上的训练数据包含:
- 过时的信息
- 小说中的虚构情节
- 论坛上的错误回答
- 不同时期的矛盾说法
模型在学习时,这些都被平等对待。它无法区分“事实”和“虚构”,只能学到统计上的高频模式。如果训练数据中某件事被说了很多次,模型就会倾向相信——即使这件事是假的。
2.3 举一个直观例子
训练数据中可能出现: “量子力学很难”(来自科普文章) “量子力学很简单”(来自忽悠广告) “量子力学是由薛定谔的猫发现的”(错误信息) 模型不会说“简单”或“难”哪个是事实, 它只会看到哪些说法更频繁出现, 然后按照概率生成一个回答。核心结论:大模型学的是“人们怎么说话”,而不是“事实是什么”。
三、根因二:解码机制——它是“猜”,不是“检索”
疑问:大模型在生成回答时,是一次性输出全部吗?如果不是,这和幻觉有什么关系?
回答:大模型是逐token生成的,每生成一个token都是一次“猜下一个字”的赌博。
3.1 自回归解码
输入:“今天天气” 生成过程: 1. 预测第一个token → “真”(概率30%) 2. 拿到“今天天气真”,预测下一个token → “好”(概率40%) 3. 拿到“今天天气真好”,预测下一个token → “!”(概率50%)每一步都在“猜”,而且下一步的猜测建立在之前所有猜测的基础上。一旦某一步猜错了方向,后面就会越猜越偏。这就是误差累积效应。
3.2 温度(Temperature)的作用
// 温度影响概率分布低温度(T=0.1):模型更保守,倾向选概率最高的词 → 回答稳定但缺乏变化 高温度(T=1.0):模型更冒险,低概率词也有机会被选中 → 回答富有创意但容易乱说你项目中调用大模型API,如果不设置Temperature,默认值通常是1.0——这给了幻觉“可乘之机”。在课程问答项目中,我把Temperature设为0.3,让模型尽量输出确定的内容,减少自由发挥导致的编造。
四、根因三:知识边界——它不知道自己不知道
疑问:为什么大模型遇到不懂的问题时,不能像人一样说“我不知道”?
回答:因为训练数据中几乎没有“我不知道”这个模式的范例。
4.1 训练数据的模式偏差
互联网上极少有这样的对话: Q: 深度求索公司是哪一年成立的? A: 我不知道。 但充斥着这样的模式: Q: 某某公司是哪一年成立的? A: 某某公司成立于XXXX年。模型学到了一个模式:当有人问关于某个实体的事实性问题时,答案应该是“某某成立于某年”这个结构。遇到没见过的公司,它仍然会“填空”——找个听起来合理的年份填进去。
4.2 概率视角的解释
当模型不知道答案时:
它面临两个选择: 选择A —— 说“我不知道”: 在训练数据中,这个回答的概率极低(几乎没见过)。 选择B —— 编一个看起来合理的答案: 在训练数据中,这种形式的回答到处都是。 模型自然地选择了B。它不是在“编造”—— 它只是在给最高概率的结构填空。五、为什么RAG能减少幻觉?
疑问:你项目中用了RAG,它是怎么缓解幻觉的?原理是什么?
回答:RAG改变了模型作答的“概率基础”——不再是检索记忆,而是参照输入。
5.1 从“闭卷考试”到“开卷考试”
不用RAG(原始大模型): → 问:“本课程Java线程池有哪些参数?” → 大模型:搜自己的参数化记忆 → 可能参数记忆模糊或训练数据中存在矛盾说法 → 编造一个“听起来对”的答案 用RAG: → 问:“本课程Java线程池有哪些参数?” → 检索:在课程文档中找相关段落 → Prompt拼接:“请根据以下课程内容回答:{检索到的文档}。问题:Java线程池有哪些参数?” → 大模型:不需要回忆,只需要阅读并总结 → 幻觉大幅减少5.2 为什么RAG能起作用?
因为RAG绕过了模型的“记忆”路径,走的是“阅读”路径。阅读比回忆可靠得多,这和人一样——给你一本教材让你对着回答,比你凭记忆作答准确得多。
5.3 RAG仍然可能产生的幻觉
即使有了RAG,幻觉仍可能出现:
检索到的文档不包含答案 → 模型仍可能填空
检索到的文档和问题不匹配 → 模型可能受无关信息误导
所以你在课程问答项目中设计了“如果文档不包含就直说不知道”的Prompt约束,并且增加了检索相关性阈值过滤——本质上是在给模型划定知识边界。
六、Prompt Engineering中的防幻觉策略
疑问:除了RAG,还有哪些Prompt技巧能减少幻觉?
回答:你在课程问答项目中已经用到了核心策略,这里系统梳理一下。
| 策略 | Prompt示例 | 原理 |
|---|---|---|
| 明确知识边界 | “如果课程内容中没有相关信息,请直接说‘未提及’” | 给模型一条“安全出路” |
| 要求引用原文 | “回答时请引用课程原文” | 强迫它基于材料而非记忆 |
| 限定输出格式 | “回答格式:{原文出处}→{你的总结}” | 结构约束减少自由发挥 |
| Few-shot示例 | 在Prompt中给出2-3个正确回答的示例 | 示范正确的行为模式 |
| 链式追问 | 先问“课程有没有提到X”,再问“X是什么” | 分步走减少跳跃式猜测 |
| 降低温度 | 设置Temperature=0.2~0.3 | 减少随机性,更倾向确定性输出 |
七、幻觉能被彻底消除吗?
疑问:所以有没有办法让大模型完全不产生幻觉?
回答:从当前大模型的原理上看,完全消除幻觉是不可能的。
7.1 根本原因
幻觉是大模型“统计预测”本质的必然副产物。只要模型是逐token预测概率,它就永远有可能在某一步猜错方向,然后越猜越远。
7.2 我们能做什么?
不是消除幻觉,而是把它控制在可接受的范围内:
| 方法 | 作用 |
|---|---|
| RAG | 把“闭卷”变“开卷”,从根源减少编造 |
| Prompt约束 | 划定知识边界,给模型“不知道”的出口 |
| 检索过滤 | 相关性不够就不回答,避免误导 |
| 人类审核 | 关键场景保留人工把关 |
| 降低温度 | 减少随机性,输出更确定性 |
7.3 正确的心态
把大模型当成一个表达能力很强但记忆力不准的实习生:
- 如果给了它参考资料(RAG),它能把资料总结得很好
- 如果不给它参考资料,它凭记忆干活,可能会出错
- 最好的用法是让它基于你给的资料工作,而不是依赖它的记忆
总结
- 幻觉不是bug,是训练目标的副产物——大模型学的是“说话像人”,不是“说真话”
- 逐token生成机制导致误差累积,一步猜错可能步步猜错
- 模型不知道自己的知识边界——训练数据中缺乏“我不知道”的模式,导致它天然倾向给出确定性答案
- RAG减少幻觉的本质是把模型从“靠记忆”变成“靠阅读”,绕过了记忆模糊和知识陈旧的问题
- Prompt防幻觉策略的核心是给模型划定边界、提供出路、减少自由发挥空间
- 幻觉无法根除但可以控制——方法论是用工程手段约束它,而非期待模型本身的完美
下一篇预告:AI理论学习(四)——Prompt Engineering:从随意提问到工程化调用。拆解角色设定、Few-shot、Chain of Thought等核心Prompt技巧的底层逻辑,以及本人在课程问答项目中Prompt模板的设计心法。
