Hallucination (in LLMs)
LLM 幻觉是指流畅且语气肯定,但实际错误或缺乏来源依据的输出。内容涵盖模型为何会产生幻觉,以及检索和拒答如何提供帮助。
大型语言模型 (LLM)中的幻觉,是指读起来流畅且自信、但内容错误、缺乏模型来源支持,或与模型自身输入不一致的生成内容。幻觉的表现范围很广,从捏造引用或日期错误,到在摘要中添加源文档从未提及的主张都有;由于错误答案与正确答案的语气相同,因此很难察觉。2023 年,在 Mata 诉 Avianca 案中,美国联邦法院制裁了两名律师,因为他们提交的法律意见书引用了 ChatGPT 捏造的六项法院判决。有些研究人员更倾向于使用“虚构”一词,因为模型会用看似合理的文本填补知识空白。
幻觉的类型#
- 内在幻觉:输出与所提供的来源相矛盾,例如摘要给出的批准年份与其所总结的文档不同。Ji 等人的综述使用这个术语和下一个术语,对摘要、对话和翻译中的错误进行分类。
- 外在幻觉:输出添加了来源无法证实的信息,这些信息可能为真,也可能为假。
- 开放式回答中的事实错误:没有任何来源时,模型会陈述错误事实、捏造参考资料,或将多个人物的细节拼凑到同一份传记中。
- 软件包幻觉:代码助手会导入并不存在的库。一项研究分析了 16 个模型生成的576,000 个代码样本,发现商用模型建议的软件包中至少有 5.2%、开源模型建议的软件包中有 21.7% 是幻觉,共涉及 205,474 个独一无二的虚假软件包名称,攻击者可以注册这些名称并植入恶意代码。
- 物体幻觉:视觉语言模型 (VLM)会描述图像中不存在的物体。
LLM 为什么会产生幻觉#
LLM 会根据预训练期间学到的概率预测下一个token来生成文本,没有内置机制将文本与事实数据库进行核对。OpenAI 的 Kalai 等人 (2025)将幻觉归因于两种统计压力。预训练时,只出现过一次的事实(例如某个冷门人物的生日)无法被可靠学会:如果训练数据中有 20% 的生日事实恰好只出现一次,那么就应该预期基础模型至少会在 20% 的生日问题上产生幻觉。训练之后,大多数基准测试只给答案判定对错,并对“我不知道”给零分,因此猜答案的模型得分会高于选择弃答的模型;后训练则会把模型调教成自信的猜答者。
其他因素也会加剧这一问题。使用较高温度或较宽的核采样会选中概率较低的续写;随着相关事实埋藏在更长的输入中,准确度会下降(上下文退化);而基于人类偏好训练的模型往往会接受问题中的错误前提,这是一种AI 谄媚现象。
检测和减少幻觉#
- 检索增强生成 (RAG):系统从可信集合中检索段落,并指示模型根据这些段落作答。重排序器可以改善进入提示词的段落,但模型仍可能误读或忽略这些段落。
- 带引用的接地:每项主张都必须引用检索到的段落,并由检查器(通常是第二个模型)确认该段落是否能支持这项主张。
- 语义熵:让模型多次回答同一个问题,再按含义对答案聚类;如果不同类别之间的熵很高,就说明很可能出现了虚构。
- 自我验证链 (CoVe):模型先起草答案,再针对自身主张编写验证问题、独立回答这些问题,最后修订草稿。
- 奖励弃答:使用 RLHF 或其他反馈进行训练,对自信的错误比“我不知道”惩罚更多,并采用相同方式评估模型,这样就消除了猜答案的动机。
一个接地式问答系统会在循环中组合其中多种检查方式:
幻觉与相关概念的比较#
- AI 偏见:输出中存在系统性倾向,例如偏袒某个群体。回答可以没有偏见却仍包含幻觉,也可以事实正确却仍有偏见。
- 过拟合:以牺牲泛化能力为代价记住训练样本。幻觉往往恰恰源于相反的情况:模型试图补全一个它见得太少、无法记住的事实。
- 模型崩溃:模型使用生成数据训练时丢失罕见知识,这会导致后续模型在长尾事实上的幻觉更多。
视觉语言模型中的物体幻觉#
VLM 会依赖语言先验,因此图像描述模型可能会说餐桌上有一把叉子,即使图像中并没有,因为训练描述里叉子常常出现在盘子旁边。图像描述中的物体幻觉使用 CHAIR 指标衡量,即描述中提到但不在图像真实标注中的物体所占比例。一种缓解方法是将检测器实际检测到的物体列表传给语言模型。下面的代码片段会在图像上运行 YOLO26,并将检测结果转化为提示词约束:
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
results = model("https://ultralytics.com/images/bus.jpg")
result = results[0]
# Per-class detection counts as text, used as facts the language model must stay within
detections = result.verbose()
prompt = f"Describe this image. Mention only these detected objects: {detections}"
print(prompt)result.verbose()会针对每个检测到的类别返回一个计数,因此提示词中提到的每个物体都有对应的边界框作为依据;任何提到其他物体的回答都可以在显示给用户之前被标记出来。










