No.307
大模型为什么会产生幻觉?怎么缓解?
一句话回答
幻觉是指模型生成了看起来合理、但与事实或给定资料不符的内容。根本原因是模型按概率生成"最可能出现的下一个 token",学到的是语言模式而不是可查证的事实;训练数据缺失或过时、训练和评测中"给出答案"比"承认不知道"更受奖励、解码的随机性,都会加重幻觉。缓解要组合使用多种手段:用 RAG 或工具提供依据并要求引用、允许回答不知道、降低随机性、对输出做校验。幻觉无法完全消除,关键场景必须有人工复核。
详细解析
两类幻觉
| 类型 | 表现 | 例子 |
|---|---|---|
| 事实性幻觉 | 和真实世界不符 | 编造不存在的论文、API 参数、npm 包、人物经历 |
| 忠实性幻觉 | 和给定的资料或指令不符 | 总结里出现原文没有的内容;RAG 场景中不按检索到的资料回答 |
开发者最常遇到的是编造 API 和依赖包。有研究发现,模型会反复编造同样的、并不存在的包名,攻击者可以抢先注册同名的恶意包,所以 AI 建议安装的依赖要先核实。
为什么会产生
- 生成机制:模型每一步只是在预测最可能的下一个 token。知识以统计关联的形式隐含在参数里,少见的事实记得很模糊,但它仍然能生成通顺的句子
- 数据问题:训练数据里没有(私有知识、长尾知识)、已经过时(训练截止之后发生的事),或者本身就有错误
- 训练激励:如果训练和评测中"猜一个答案"比"说不知道"得分更高,模型就会倾向于自信地给出答案
- 解码随机性:采样可能选中概率较低的错误 token,之后的生成会顺着这个错误继续展开,越写越偏
- 上下文问题:资料不全或互相矛盾;问题带有错误前提(如"为什么 X 比 Y 快",而 X 其实并不比 Y 快);关键信息埋在长上下文的中间
缓解手段
| 手段 | 作用 | 局限 |
|---|---|---|
| RAG、把资料放进上下文 | 让模型基于给定资料回答,而不是凭记忆 | 检索不到正确资料时,仍可能编造 |
| 要求标注引用 | 便于用户核对,程序也能校验 | 引用本身也可能是编的 |
| 允许回答"不知道" | 减少硬编答案 | 要在 Prompt 中明确,评测时不惩罚合理的拒答 |
| 调用工具查事实 | 计算、日期、实时数据交给工具 | 工具结果也可能出错或被注入恶意内容 |
| 降低 temperature | 减少采到低概率 token 的机会 | 只能减少随机性带来的错误 |
| 生成后校验 | 让模型或另一个模型逐条核对结论是否有依据 | 增加成本和延迟;同一个模型自检容易犯同样的错 |
| 人工复核 | 医疗、法律、金融等高风险场景的最后一道关 | 成本高,只能用在关键环节 |
工程上怎么落地
- Prompt:要求"只根据
<documents>中的资料回答,资料不足时直接说明无法确定,每个结论后标注引用的资料编号" - 校验:检查引用编号是否存在、引用的原句是否真的出现在资料里;用模型打分检查回答是否忠实于资料,见 LLM-as-a-Judge
- 评测:评测集里放一些"资料中没有答案"的问题,看模型会不会编,见 RAG 系统怎么评估
- 产品:展示来源链接,提示内容由 AI 生成,提供纠错反馈的入口
代码示例
要求模型按固定结构输出答案和引用,再用程序校验引用是否真的出自原文:
TypeScript
interface AnswerWithCitations {
answer: string
citations: { docId: string; quote: string }[] // quote 要求是资料中的原句
}
function verifyCitations(output: AnswerWithCitations, docs: Map<string, string>) {
const invalid = output.citations.filter((c) => !docs.get(c.docId)?.includes(c.quote.trim()))
// 有引用对不上原文:可以重新生成、删掉对应的结论,或者标记为"待核实"
return { ok: output.citations.length > 0 && invalid.length === 0, invalid }
}
面试官可能追问
用了 RAG 还会有幻觉吗?
会。检索可能没找到正确的片段,模型也可能忽略资料、混入自己的知识,或者读错资料。要同时评估检索的质量和回答的忠实度,并在 Prompt 中明确"资料里没有就说不知道"。
temperature 设为 0 能消除幻觉吗?
不能。它只减少采样带来的随机错误。如果模型认为概率最高的答案本身就是错的,temperature 为 0 只会让它每次都稳定地输出这个错误答案。
为什么模型会编造看起来很真实的引用和链接?
它学到了引用和链接"长什么样"(作者、年份、期刊名、URL 的格式),生成时按这种格式续写,并不会去核对是否真实存在。所以只允许它引用上下文里给定的资料编号,再用程序校验。
怎么发现线上的回答出现了幻觉?
抽样用模型打分,检查回答是否忠实于检索到的资料;统计引用校验的失败率;关注用户的点踩和纠错反馈。发现的问题持续加入评测集,见 上线后怎么发现模型效果变差。
易错点
- 幻觉不只是"知识不够":资料就在上下文里,模型也可能答错
- 要求"给出引用"不等于有了保障,引用本身也要校验
- 让同一个模型"再检查一遍"效果有限,最好有外部依据(检索结果、工具、规则)
- 不要对用户承诺"已消除幻觉",只能降低它出现的概率和影响
AI 模拟面试官
用自己的话回答,AI 对照参考答案打分、指出遗漏,再追问,最多 3 轮
登录后就可以和 AI 面试官对练,面试记录也会保存下来。登录
这道题你掌握了吗?
选一个最接近的状态,没掌握的题会出现在"我的进度 · 待复习"里。
学习记录暂存在本机浏览器。登录后自动同步到账号,换设备也能看到。