模型幻觉:为什么 AI 会一本正经地胡说八道

深入分析大模型幻觉的成因、类型分类、检测手段和缓解方案(RAG、自检机制、人工审核),帮你正确使用 AI 而不被它忽悠。

目录

  1. 一个让人哭笑不得的故事
  2. 什么是模型幻觉
  3. 幻觉的分类
    1. 事实性幻觉
    2. 虚构性幻觉
    3. 逻辑性幻觉
    4. 指代性幻觉
  4. 幻觉是怎么产生的
    1. 训练目标的天生缺陷
    2. 知识的压缩存储
    3. 过于自信的输出机制
    4. 训练数据的噪声
  5. 如何检测幻觉
    1. 自洽性检查
    2. 置信度评估
    3. 基于检索的验证
  6. 如何缓解幻觉
    1. RAG(检索增强生成)
    2. 自检机制(Self-Verification)
    3. 结构化输出
    4. 温度调节
    5. 人工审核
  7. 不同场景的幻觉风险评估
  8. 模型幻觉会被解决吗
  9. 正确的心态

一个让人哭笑不得的故事

2023 年,美国一位律师在法庭上引用了 ChatGPT 提供的六个判例来支持他的论点。听起来没什么问题,直到对方律师和法官发现——这六个判例全是编造的。案件名称、法院、判决日期、判决内容,全是 AI 现编的。

这位律师被法官严厉批评,差点丢掉执照。

这不是个别现象。你用 AI 写过东西的话,大概率遇到过类似的情况:AI 引用了一篇不存在的论文、给出了错误的统计数据、或者编造了一个看起来合理但完全虚假的事实。而且它说这些话的时候,语气非常自信,完全没有「我在编」的痕迹。

这种现象有个正式的名字:模型幻觉(Hallucination)

什么是模型幻觉

模型幻觉,就是大语言模型生成了看起来合理、读起来流畅、但实际上不正确或者根本不存在的内容。

注意几个关键词:

  • 看起来合理:不是明显的胡话,格式正确、逻辑通顺
  • 读起来流畅:语言质量没问题,不会因为表达问题让你起疑
  • 实际不正确:核心信息是错的或者是编造的

这就是幻觉最危险的地方——它穿了一件「正确」的外衣,不仔细验证根本发现不了。

幻觉的分类

模型幻觉不是铁板一块,可以分为几种不同的类型:

事实性幻觉

模型给出了错误的事实信息。

比如你问它「量子力学是谁创立的」,它可能会回答一个看似合理但并不准确的说法——把多个物理学家的贡献张冠李戴,或者给出一个错误的年份。

这类幻觉最常见,也最容易被忽略,因为回答的结构和语气都像是正确的。

虚构性幻觉

模型编造了根本不存在的东西。

比如让它推荐几篇关于某个话题的论文,它可能会生成标题、作者、期刊、年份都齐全的论文引用——但这些论文压根不存在。它编造了一个完整的、看起来非常真实的信息实体。

逻辑性幻觉

模型的推理过程看似严密,但中间有一步或者几步是跳跃的或者错误的。

最终结论可能是错的,但你很难发现,因为推理链条看起来环环相扣。这在数学题和编程题中尤其常见——步骤看起来都对,结果就是不对。

指代性幻觉

在长文本生成中,模型可能会搞混之前提到的实体。

比如你让它写一篇关于 A 和 B 两家公司的对比分析,写着写着它可能会把 A 的特征说成 B 的,或者凭空引入一个之前没有提到的 C 公司。

幻觉是怎么产生的

理解幻觉的成因,有助于你在实际使用中更好地规避风险。

训练目标的天生缺陷

大模型的基础训练任务是预测下一个 token。给定前面的文字,模型要猜下一个最可能出现的字词。

注意:它优化的是「下一个字词看起来合理」,而不是「下一个字词在事实上正确」。

这两者的区别非常大。在模型看来,「水在零度时结冰」和「水在二十度时结冰」在语言流畅度上差别不大。模型选择哪个,取决于训练数据中的统计分布,而不是物理规律。

知识的压缩存储

一个 7B 参数的模型(大约 14GB 文件大小)里「存储」了从数万亿 token 训练数据中学到的知识。

这种存储是高度压缩的——模型不是把训练数据原封不动地记下来,而是把信息压缩成了参数权重中的统计模式。这种压缩过程中必然会丢失精确信息。

就像你读了一百本书然后凭记忆复述内容——大致的概念和逻辑你记得,但具体的数字、日期、引用来源很容易记混。

过于自信的输出机制

大模型的生成机制是从概率分布中采样。即使模型对某个事实「不确定」,输出的文本也不会表现出不确定——因为生成机制不区分「我确定是 A」和「A 的概率比 B 稍微高一点」。

这就是为什么 AI 胡说八道的时候语气这么自信。它没有「我不知道」的内在状态表示,只能在概率分布中选择一个最可能的选项,然后用同样自信的语气说出来。

训练数据的噪声

互联网上的数据并非全部正确。新闻报道有错误、论坛帖子有谣言、维基百科有未被纠正的错误。模型从这些数据中学习,自然也学到了错误的知识。

更麻烦的是,同一个事实可能在训练数据中有多个版本。某个历史事件的年份,可能在不同来源中有不同的说法。模型没有可靠的机制来判断哪个版本是正确的。

如何检测幻觉

既然幻觉不可避免,那就需要有检测手段。

自洽性检查

让模型对同一个问题生成多个回答,然后比较这些回答是否一致。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def consistency_check(model, question, n_samples=5):
"""通过多次采样检查回答一致性"""
answers = []
for _ in range(n_samples):
response = model.generate(
question, temperature=0.8
)
answers.append(response)

# 让模型自己判断这些回答是否一致
check_prompt = f"""以下是对同一个问题的 {n_samples} 个回答:

问题:{question}

{''.join(f"回答{i+1}{a}" for i, a in enumerate(answers))}

这些回答之间是否存在矛盾或不一致?
如果有,指出具体的不一致之处。
如果回答都一致,说明核心信息是什么。"""

return model.generate(check_prompt, temperature=0.1)

如果模型对同一个问题给出了不同甚至矛盾的回答,说明它对这个知识点「没有把握」,幻觉的风险很高。

置信度评估

让模型自我评估回答的可信度:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def confidence_assessment(model, question, answer):
prompt = f"""请评估以下回答的可信度。

问题:{question}
回答:{answer}

评估维度:
1. 这个回答中包含的事实性声明有几条?
2. 每条声明你有多大把握是正确的?
(高把握/中等把握/低把握/纯猜测)
3. 哪些信息需要用户自行核实?

注意:如果有任何不确定的内容,一定要标出来。
宁可说不确定,也不要错误地表示确定。"""

return model.generate(prompt, temperature=0.1)

虽然模型的自我评估不完全可靠,但配合低温度采样,准确率还是不错的。

基于检索的验证

用搜索引擎或知识库来验证模型输出的事实。这是目前最可靠的检测方式。

如何缓解幻觉

完全消除幻觉在目前的技术框架下是做不到的,但可以大幅降低其发生率。

RAG(检索增强生成)

RAG 是目前缓解幻觉最有效的方案。

原理很简单:不让模型凭记忆回答,而是先从可信的知识库中检索相关信息,再让模型基于检索到的内容来生成回答。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class FactGroundedGenerator:
def __init__(self, knowledge_base, model):
self.kb = knowledge_base
self.model = model

def generate(self, question):
# 从知识库检索相关内容
sources = self.kb.search(question, top_k=5)
context = "\n---\n".join(
[s["content"] for s in sources]
)

prompt = f"""基于以下参考资料回答用户的问题。

重要规则:
- 只能基于参考资料中的信息回答
- 如果参考资料中没有相关内容,直接说"我没有找到相关信息"
- 不要添加参考资料中没有的额外信息
- 引用具体内容时标注来源

参考资料:
{context}

用户问题:{question}"""

return self.model.generate(prompt)

RAG 的关键在于那条规则:「只能基于参考资料中的信息回答」。这把模型从「凭记忆回答」变成了「看资料回答」,大幅减少了编造的空间。

如果你想用 Hermes 搭建一个带 RAG 的系统,可以参考 用 Hermes 打造私人 AI 学习助手 里的详细教程。

自检机制(Self-Verification)

让模型在输出之后做一轮自我检查:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def self_verify(model, question, initial_answer):
verify_prompt = f"""请仔细检查以下回答中是否存在
事实性错误或不确定的信息。

问题:{question}
回答:{initial_answer}

检查步骤:
1. 逐一列出回答中的事实性声明
2. 对每条声明判断:确定正确 / 可能正确 / 不确定 / 可能错误
3. 对于不确定或可能错误的内容,给出修改建议
4. 生成修正后的回答

如果回答整体是正确的,输出 VERIFIED。
如果有需要修正的地方,输出修正后的完整回答。"""

return model.generate(verify_prompt, temperature=0.1)

一次生成加一次自检,虽然多用了一倍的推理成本,但能过滤掉相当一部分明显的幻觉。

结构化输出

要求模型以结构化的格式输出,并明确标注信息来源和置信度:

1
2
3
4
5
要求回答格式:
- 主要观点:[观点内容]
- 依据:[具体依据]
- 置信度:[高/中/低]
- 来源:[参考资料编号] 或 [模型自身知识]

这种格式逼着模型去思考每个论点的支撑证据,减少了凭空编造的可能。

温度调节

在需要事实准确性的场景,把采样温度降低:

  • 温度 0.1-0.3:最大概率采样,输出更确定但可能缺乏多样性
  • 温度 0.5-0.7:平衡模式
  • 温度 0.8-1.0:高随机性,创意性强但幻觉风险也高

事实性问答用低温度,创意写作用高温度——这是最基本的但很多人忽略的调节手段。

人工审核

说到底,最后一道防线还是人。

对于重要的、会被公开发布的、或者影响决策的内容,AI 生成之后必须经过人工审核。核实关键数据、验证引用来源、检查逻辑链条。

这不是说 AI 没用,而是说 AI 在当前阶段的定位应该是「辅助」而不是「替代」。它帮你快速出初稿、整理思路、提供方向,但最终的准确性由人来把关。

不同场景的幻觉风险评估

不是所有场景的幻觉风险都一样高。根据场景选择合适的防范策略:

场景 幻觉风险 建议策略
创意写作 低(甚至欢迎) 高温度,无需特别防范
代码生成 可以直接运行验证
知识问答 RAG + 自检 + 人工核实
学术引用 极高 必须人工验证每条引用
医疗/法律建议 极高 不建议直接使用 AI 输出
数据分析 中高 要求结构化输出 + 验证

模型幻觉会被解决吗

短期内不太可能完全解决。

原因在于幻觉是当前大模型架构的一个内在特性,而不是一个可以通过打补丁修复的 bug。只要模型的基础机制是「基于统计概率预测下一个 token」,它就没有真正的「事实核查」能力。

但长期来看,有几个方向在努力:

更好的训练数据:用更干净、更准确的数据训练,从源头减少错误知识。

检索增强的深度集成:让模型在生成过程中实时检索事实,而不是先生成再检索。

多模态验证:结合图片、表格、数据库等多种信息源来交叉验证。

过程监督:对模型的推理过程(而不只是最终结果)做监督和约束。这跟 RLHF 中的过程奖励 是相关的技术方向。

正确的心态

跟 AI 打交道,心态很重要:

把 AI 当实习生,不当专家。实习生可能很聪明、干活很快,但你不会不检查就直接把他的输出提交给客户。

越重要的内容,越需要人工核实。AI 写的微博发出去错了没什么大事,AI 写的法律文书发出去错了可能要坐牢。

学会提问。好的提问能减少幻觉。给明确的约束条件、提供参考资料、要求标注信息来源——这些技巧能显著降低幻觉率。

不要因为幻觉就否定 AI 的价值。90% 准确 + 10% 需要人工修正,跟 100% 人工从零开始相比,前者仍然是巨大的效率提升。关键是你要知道那 10% 可能出现在哪里,然后有针对性地核查。

有更多关于 AI 使用经验的话题,欢迎来 cocoloop 社区 一起讨论。

参与讨论

对这篇文章有疑问或想法?cocoloop 社区有不少开发者在讨论 Hermes 相关话题,欢迎加入交流。

前往 cocoloop 社区 →