【AI基础篇09】大模型幻觉问题:为什么AI会一本正经地胡说八道?
·
【AI基础篇09】大模型幻觉问题:为什么AI会一本正经地胡说八道?
前言:ChatGPT会编造法律案例、医生AI会开出错误处方、代码助手会生成不存在的API——这些都不是Bug,而是大模型的"天性"。为什么一个能通过律师资格考试的AI,会连简单的加减法都算错?为什么它谈起虚构的历史人物时能煞有介事地编出完整生平?本文从根源拆解幻觉的成因,给出从提示词到RAG的完整解决方案栈。
📋 目录
- 一、什么是大模型幻觉?
- 二、幻觉的分类:不是所有胡话都一样
- 三、幻觉的根本原因
- 四、幻觉的检测方法
- 五、缓解幻觉的三层防线
- 六、RAG:缓解幻觉的最主流方案
- 七、提示词层防幻觉
- 八、模型层防幻觉
- 九、评估幻觉的量化指标
- 十、实战:构建一个低幻觉的问答系统
一、什么是大模型幻觉?
1.1 定义
大模型幻觉(Hallucination):
模型生成**看似合理、但实际上错误或无依据**的内容。
它听起来很自信
它看起来很有逻辑
它是错的。
举个例子:
问:鲁迅为什么打周树人?
答:鲁迅和周树人是两人不同的人,鲁迅在《狂人日记》中曾批评过周树人...
实际上:鲁迅 = 周树人(本名)
模型编造了一个完整的"两人关系"
而且编得很像真的!
1.2 几个经典案例
案例1:法律界的惨案(2023)
律师用ChatGPT准备法庭文件
ChatGPT引用了6个案例来支持论点
法官发现:6个案例全部是编造的!
模型编造了案件名称、法官名字、判决书编号
甚至连引用都像模像样
→ 律师因此被罚款
案例2:医疗幻觉
问:布洛芬和泰诺能一起吃吗?
答:通常情况下可以,但建议咨询医生...
实际上:两者的活性成分联用会增加肝毒性风险
→ 看似保守的回答也可能是错的
案例3:代码幻觉
问:Python中segmentation_models库怎么用?
答:from segmentation_models import Unet
model = Unet(backbone_name='resnet34')
看起来完全正确
但实际上这个函数签名已在新版本中废弃
→ 代码能跑但已经过时
案例4:历史幻觉
问:戊戌六君子是谁?
答:谭嗣同、康广仁、林旭、杨深秀、杨锐、刘光第
→ 正确
问:他们是怎么死的?
答:1898年9月28日被斩首于北京菜市口
→ 正确
问:慈禧太后为什么杀他们?
答:因为他们策划刺杀慈禧...
→ 错!他们搞的是维新变法,不是刺杀!
关键点:
模型在前两个问题上都说对了
用户建立了信任
于是对第三个问题也信了
→ 幻觉最危险的地方:真话混着假话,真假难辨
1.3 幻觉 vs 创造性
不是所有"不符合事实"的内容都是幻觉:
幻觉 ❌:
"2026年世界杯在蒙古举行"
→ 模型不知道2026年世界杯在哪里,于是编了一个
→ 这是"无知"在伪装"知道"
创造性 ✅:
"请写一个发生在未来的科幻故事"
"在2150年,人类在火星建立了第一个城市..."
→ 用户明确要求虚构
→ 这是"发挥",不是"犯错"
区别在于:
模型是否在"假装知道"
用户是否期待事实性回答
二、幻觉的分类:不是所有胡话都一样
2.1 按内容来源分类
┌──────────────────────────────────────────────────────┐
│ 类型 │ 表现 │ 示例 │ 严重程度 │
├──────┼───────────────┼──────────────────┼──────────┤
│ │ │ │ │
│ 事实型│ 编造事实 │ "Transformer论文│ 🔴 最高 │
│ │ │ 发表于2018年" │ 有时差 │
│ │ │ (实际是2017年) │ 在关键 │
│ │ │ │ 场景致命│
│ │ │ │ │
│ 逻辑型│ 推理错误 │ "A>B, B>C, │ 🟡 中 │
│ │ │ 所以C>A" │ 影响可信│
│ │ │ │ 度 │
│ │ │ │ │
│ 指令型│ 不遵循指令 │ "用中文回答" │ 🟢 低 │
│ │ │ → 输出英文 │ 但烦人 │
│ │ │ │ │
│ 上下文│ 丢失对话历史 │ 第一轮"我叫张三" │ 🟢 低 │
│ 型 │ │ 第二轮"你叫?" │ 影响体验│
│ │ │ → "我是AI助手" │ │
└──────────────────────────────────────────────────────┘
2.2 按"模型知情"分类
幻觉按"模型到底知不知道真相"来分:
1️⃣ 知识边界幻觉(Knowledge Boundary)
模型不知道,但强行回答
问题:"2026年GDP增长率是多少?"
模型训练截止于2025年,不知道2026年数据
但模型不会说"我不知道",而是会"猜"
原因:模型被训练成"什么都要回答"
解决方案:教模型说"我不知道"
2️⃣ 记忆混淆幻觉(Memory Confusion)
模型知道,但记混了
问题:"注意力机制是谁提出的?"
"Transformer"是Attention(2017)
"Neural Machine Translation"也是Attention(2014)
"Seq2Seq with Attention"是Bahdanau(2014)
模型可能把几个人的名字混在一起
原因:训练数据中包含多个相似概念
解决方案:训练时加入精确对齐
3️⃣ 推理匮乏幻觉(Reasoning Gap)
模型知道所有前提,但推理步骤错了
问题:"张三是李四的哥哥,李四是王五的爸爸,张三和王五的关系是?"
模型可能推断出"张三→李四的哥哥,李四→王五的爸爸"
但结论"所以张三是王五的叔叔"需要多步推理
原因:Transformer在复杂推理上天然弱势
解决方案:思维链(Chain-of-Thought)
2.3 按"可检测性"分类
┌────────────────────────────────────────────────┐
│ 容易检测 ⟷ 不易检测 │
├────────────────────────────────────────────────┤
│ │
│ ✅ 容易检测的幻觉: │
│ - 违反常识("太阳从西边升起") │
│ - 数值错误("中国人口1亿") │
│ - 逻辑矛盾("圆形三角形") │
│ - 语法错误(罕见,大模型语法普遍很好) │
│ │
│ ❌ 难检测的幻觉: │
│ - 看似合理的错误事实("某位200年前的历史人物") │
│ - 专业领域的谬误("特定疾病的治疗方案") │
│ - 混合事实("90%真+10%假") │
│ - 过时但曾经正确的信息("冥王星是行星") │
│ │
│ 最危险的幻觉 = 混合事实 │
│ 真话建立信任 → 假话被接受 │
└────────────────────────────────────────────────┘
三、幻觉的根本原因
3.1 核心矛盾:大模型的"知识"本质
重要认知:大模型没有"知识",只有"统计规律"
人类的知识:
我知道"法国的首都是巴黎"
→ 我可以证明:我看过地图、查过资料、去过法国
→ 我知道"为什么正确"以及"如果不正确会怎样"
模型的知识:
模型知道"法国的首都是巴黎"
→ 训练数据中"法国首都"后面经常跟着"巴黎"
→ 模型学会了:P(巴黎 | 法国首都) ≈ 99.9%
→ 模型不知道"为什么",只知道"概率"
后果:
1️⃣ 模型不知道"自己不知道"
2️⃣ 模型不知道"什么是对错"
3️⃣ 模型只计算"什么最可能"
3.2 八种根本原因
原因1:压缩损失(Compression Loss)
大模型用有限参数存储海量知识
GPT-4有约1.8万亿参数,但训练数据远大于此
必须压缩 → 必须丢失细节 → 细节丢失就是幻觉
类似于:你用1MB存一部10GB的电影
一定会丢失细节,不可能100%还原
原因2:训练目标偏差(Training Objective Mismatch)
模型训练目标:预测下一个token
实际使用目标:回答事实性问题
两者不匹配!
训练时模型学习"什么词最可能跟在这个词后面"
使用时用户问"什么才是正确的"
→ 模型不知道"正确"是什么,只知道"可能"
原因3:数据噪声(Data Noise)
训练数据中本身就有错误信息
互联网中有大量错误、矛盾、虚假的内容
模型把错误的也一起学会了
维基百科上"爱因斯坦"词条 99%正确
但模型也学了1%的错误信息
问同一个问题5次,可能有一次触发那1%
原因4:注意力分散(Attention Diffusion)
长上下文中,相关信息被淹没
用户给了一篇10000字的文档问细节
模型在10000字中"找"答案,但注意力被无关内容分散
这就是为什么RAG要把文档切成小块再检索
而不是直接把整篇文档塞进去
原因5:decoder放大效应
前面的小错误 → 后面被不断放大
错误链:
第1步:稍微算错一点 (偏差0.1)
第2步:基于错误继续 (偏差0.5)
第3步:越来越偏 (偏差2.0)
第n步:完全偏离 (偏差100+)
就像倒多米诺骨牌
第一步推倒 → 后面的全部倒下
原因6:缺乏外部验证
模型没有"查证"的能力
人类可以:写完回答后"再确认一遍"
模型不能:生成完token后无法"自我核实"
写完后它不会想:
"等等,我刚才说的对吗?让我查一下"
→ 它已经在生成第100个token了
→ 第1个token的错误已经没法改了
原因7:覆盖不足
长尾知识在训练数据中出现太少
"爱因斯坦的相对论" → 出现100万次 → 模型学得很好
"2024年某个小镇的本地新闻" → 出现1次 → 模型学不到
这解释了为什么大模型在冷门领域幻觉率特别高
不是模型笨,是训练数据里就没怎么提过
原因8:对齐压力
RLHF让模型变得"更愿意回答"
对齐之前:模型可能说"我不知道"
对齐之后:模型学会了"即使不知道也要给个回答"
因为RLHF的奖励模型倾向于:
给回答了(哪怕不对) → 中高分数
给拒绝回答 → 低分数
模型学会了:宁可编,不可拒
3.3 幻觉发生概率统计
不同场景下幻觉发生率(行业估计):
┌──────────────────────────┬────────────┐
│ 场景 │ 幻觉率 │
├──────────────────────────┼────────────┤
│ 日常闲聊 │ 1-3% │
│ 常见知识问答 │ 3-8% │
│ 代码生成(标准API) │ 5-10% │
│ 数学推理 │ 5-15% │
│ 长文档总结(>10页) │ 10-20% │
│ 冷门专业知识 │ 15-30% │
│ 最新事件(训练截止后) │ 30-60% │
│ 多步推理(>5步) │ 20-40% │
│ 多语言(低资源语言) │ 25-50% │
└──────────────────────────┴────────────┘
关键洞察:
模型自己不会告诉你"回答是否正确"
在冷门领域和最新事件上,要格外警惕
不要因为模型在常见问题上表现好,就信任它在所有问题上
四、幻觉的检测方法
4.1 自动化检测
方法1:SelfCheckGPT(自检)
让模型对同一个问题生成多次回答
如果每次回答一致 → 通常正确
如果每次回答不一致 → 可能幻觉
原理:模型"不知道"时,每次"猜"的结果不同
模型"知道"时,每次输出高度一致
方法2:FactScore(事实粒度评分)
把回答拆解成多个"事实声明"
每条声明单独验证
计算"多少条声明是准确的"
例:"爱因斯坦1879年生于德国,1905年提出相对论"
→ 拆分:
事实1:爱因斯坦1879年出生 → ✅
事实2:爱因斯坦生于德国 → ✅
事实3:1905年提出相对论 → ✅
→ FactScore = 3/3 = 100%
方法3:RAG验证
用搜索引擎或知识库检索回答中的每个声明
看检索结果是否支持模型的说法
如果检索不到支持证据 → 判定为幻觉
方法4:NLI检测(2025-2026新趋势)
用NLI(自然语言推理)模型判断"回答是否被上下文支持"
输入:上下文 + 模型回答
输出:蕴含(支持) / 矛盾 / 中立
如果是"矛盾"或"中立"→ 幻觉
2026年新工具:
LLM-as-judge:让另一个LLM评估回答质量
比传统指标更接近人类判断
G-Eval:自动评分框架
SelfCheckGPT已集成到主流框架
4.2 人工检测流程
四步人工审核流程:
Step 1:事实性检查
✅ 所有事实性声明都有依据吗?
✅ 数字、日期、人名正确吗?
✅ 没有编造来源吗?
Step 2:逻辑一致性
✅ 回答内部的逻辑自洽吗?
✅ 没有前后矛盾吗?
✅ 推理链条完整吗?
Step 3:来源可追溯
✅ 如果是RAG回答,引用了哪些文档?
✅ 文档真的说了这个意思吗?
✅ 引用没有断章取义吗?
Step 4:安全性筛选
✅ 没有有害建议吗?
✅ 没有歧视性内容吗?
✅ 符合产品安全要求吗?
注意:人工检测成本极高
每100条回答需要约2-5分钟审核
10万条/天需要约40人全职
五、缓解幻觉的三层防线
5.1 三层防线总览
┌──────────────────────────────────────────────────────┐
│ 缓解幻觉的三层防线 │
├──────────────────────────────────────────────────────┤
│ │
│ 第三层:输入层(提示工程 + RAG) │
│ ├─ 成本最低,效果立竿见影 │
│ ├─ 推荐系统提示词 + RAG │
│ └─ 能解决80%的幻觉问题 │
│ │
│ 第二层:模型层(训练 + 微调 + 对齐) │
│ ├─ 成本高,但根本性好 │
│ ├─ 包括:SFT反幻觉数据、RLHF偏好训练 │
│ └─ 适合自研模型或开源微调 │
│ │
│ 第一层:架构层(架构创新) │
│ ├─ 成本极高,需要从模型架构入手 │
│ ├─ 包括:工具调用、外部验证模块、可信度评分 │
│ └─ 适合大厂自研 │
│ │
└──────────────────────────────────────────────────────┘
80-20法则:
第三层(输入层)能解决80%的幻觉问题
成本只占全部投入的20%
先用提示工程+RAG,效果不够再往上
5.2 各层成本和效果对比
┌──────────────┬──────────┬──────────┬──────────────┐
│ 方案 │ 人力成本 │ 计算成本 │ 幻觉降低幅度 │
├──────────────┼──────────┼──────────┼──────────────┤
│ 基础提示工程 │ 几乎为零 │ 几乎为零 │ 10-20% │
│ RAG + 检索 │ 中 │ 低 │ 50-70% │
│ 微调反幻觉 │ 高 │ 中 │ 30-50% │
│ RLHF对齐 │ 极高 │ 高 │ 40-60% │
│ 工具调用 │ 中 │ 中 │ 60-80% │
│ 综合方案 │ 高 │ 中 │ 80-90% │
└──────────────┴──────────┴──────────┴──────────────┘
⚠️ 注意:
任何方案都无法100%消除幻觉
"零幻觉"在目前的技术条件下是不可能的
目标应该是"把幻觉降低到业务可接受的水平"
六、RAG:缓解幻觉的最主流方案
6.1 RAG的核心逻辑
RAG(Retrieval-Augmented Generation)=
回答问题前,先查资料
不用RAG:
用户:贵公司退货政策是什么?
模型:我们的退货政策是30天内无理由退货...
→ 模型完全依赖自己的"记忆"
→ 如果训练数据中的政策已更新 → 幻觉
用RAG:
用户:贵公司退货政策是什么?
Step 1:从知识库检索相关文档
检索结果:"退货政策2026年3月更新.pdf"
内容:"用户在收货后7天内可申请退货"
Step 2:把检索结果+问题一起给模型
Prompt:基于以下文档回答问题...
文档:用户在收货后7天内可申请退货
问题:退货政策是什么?
Step 3:模型回答
我们的退货政策是7天内可申请退货...
→ 模型生成了基于实时文档的回答
→ 如果政策更新,只需要更新知识库
6.2 RAG架构
┌──────────────────────────────────────────────────────┐
│ RAG 架构 │
├──────────────────────────────────────────────────────┤
│ │
│ 离线阶段(建索引): │
│ 文档 → 分块(Chunking) → Embedding → 存入向量数据库 │
│ │
│ 在线阶段(检索+生成): │
│ 用户问题 → Embedding → 检索Top-K文档 → 拼接Prompt │
│ → 输入LLM → 生成回答 │
│ │
│ 高级优化(2026年): │
│ ├─ 混合检索:向量搜索 + 关键词搜索(BM25) │
│ ├─ 重排序(Re-ranking):检索后二次排序 │
│ ├─ 多轮检索:一步一步检索,逐步收敛 │
│ └─ 结构化检索:表格+知识图谱+向量 │
│ │
└──────────────────────────────────────────────────────┘
6.3 RAG回退策略(2026年最佳实践)
当检索不到相关内容时怎么办?
❌ 错误的做法:
模型没有检索到相关信息,但还是硬着头皮回答
→ 等于没有RAG
✅ 正确的做法(回退策略):
策略1:明确拒绝
检索结果:空
模型回答:"抱歉,我无法从现有知识库中找到相关信息。"
→ 诚实,不给用户错误信息
策略2:表明不确定性
检索结果:部分相关
模型回答:"根据现有资料显示...但建议您联系客服确认。"
→ 加免责声明
策略3:调用工具
检索结果:空,且问题需要实时数据
→ 调用搜索API或数据库查询
→ 用工具补充知识库
策略4:分层检索
第一层:本地知识库(向量检索)
第二层:搜索引擎(Web搜索)
第三层:数据库查询(结构化数据)
逐层回退,保证始终有信息来源
2026年RAG回退的标准化方案:
if retriever_score > threshold:
answer = generate_with_context(context)
elif web_search_available:
answer = generate_with_web_search(query)
else:
answer = "抱歉,我无法回答这个问题。"
6.4 RAG不是为了"让模型更好",而是让模型"基于事实"
重要认知:RAG不改变模型能力,只改变模型的行为
没有RAG:
模型:"阿波罗11号于1969年登月"
→ 模型凭"记忆"输出
→ 如果训练数据正确→正确
→ 如果训练数据错误→幻觉
有RAG:
模型基于文档:"阿波罗11号于1969年7月20日由尼尔·阿姆斯特朗和巴兹·奥尔德林执行登月任务"
模型输出准确匹配文档
→ 模型不再"回忆",而是"阅读理解"
所以RAG解决的是"知识可靠性"问题
不是"模型能力"问题
RAG的局限:
如果知识库本身有错误 → RAG也会传播错误
如果检索不到正确文档 → RAG无能为力
如果检索到不相关文档 → RAG会被误导
💡 面试加分点:面试中常问"RAG能完全消除幻觉吗?“正确答案是"不能,但可以把幻觉从’凭空编造’降到’对检索文档的理解偏差’。它改变了幻觉的性质,而不是彻底消除了幻觉。”
七、提示词层防幻觉
7.1 通用防幻觉提示词
以下是在提示词层面降低幻觉的有效策略:
策略1:明确要求"不知道就说不知道"
"如果你不确定答案,直接说'我不知道',不要编造。"
策略2:要求引用来源(RAG场景)
"回答时引用对应的文档编号:[doc1]、[doc2]..."
策略3:要求步步推理
"让我们一步步思考。首先分析问题,然后检索相关信息,
最后基于信息得出结论。"
策略4:设置置信度
"在回答后标注你的置信度等级:
✅ 高度确信:有明确文档支持
⚠️ 中等确信:有间接证据支持
❓ 不确定:无法确定准确性"
7.2 完整防幻觉System Prompt
## 角色
你是一个专业的知识问答助手。
## 核心原则
1. 只基于提供的上下文回答问题
2. 如果上下文不包含答案,直接说"我不知道"
3. 绝不编造事实、来源或数据
4. 如果只能部分回答,明确指出哪些部分有依据、哪些部分是推断
## 回答模板
如果上下文有明确答案:
"根据[文档X],答案是...(引用原文)"
如果上下文部分相关:
"根据现有资料,我可以说...
但关于...这一点,资料中没有明确说明。"
如果上下文完全不相关:
"抱歉,提供的资料中不包含这个问题的答案。"
## 置信度标注
在回答末尾标注:{置信度: 高/中/低/无法回答}
## 错误类型
如果用户指出你回答中的错误:
1. 立刻承认错误
2. 重新检查上下文
3. 给出修正后的答案
7.3 温度参数调整
温度(temperature)参数对幻觉的影响:
温度=0(最保守):
每次输出几乎一样
选择概率最高的token
幻觉率最低
但可能过于死板
温度=0.7(均衡):
有一定随机性
适合创意性任务
幻觉率中等
温度=1.5+(高随机):
每次输出差异大
适合写诗/创意写作
幻觉率最高,不适合事实性任务
防幻觉建议:
事实性问答:temperature=0
客服系统:temperature=0.1
代码生成:temperature=0.2
创意写作:temperature=0.7+
八、模型层防幻觉
8.1 训练数据的质量优化
训练数据质量直接决定幻觉率:
✅ 好的数据策略:
1. 去重(deduplication)
减少模型"记住"重复的错误信息
2. 知识注入(Knowledge Injection)
在训练数据中加入高质知识库
如维基百科、学术论文、权威书籍
3. 矛盾检测
检测训练数据中的矛盾信息
保留权威来源,删除低质来源
4. 时效性标注
标明信息的"有效期限"
"2021年的人口数据"vs"2024年的人口数据"
8.2 SFT反幻觉训练
专门训练模型"说不知道"的能力:
标准SFT数据:
用户:法国的首都是什么?
助理:巴黎
反幻觉SFT数据:
用户:现在几点了?
助理:抱歉,我无法获取当前时间。
用户:2028年奥运会将在哪里举办?
助理:根据我的训练数据,我无法确认2028年奥运会的信息。
目标:
教会模型识别"知识边界"
让"我不知道"成为模型的一个可用回答
打破"对齐压力"带来的"必须回答"倾向
8.3 工具调用:模型知道自己不知道
让模型学会"用工具查证":
2026年的标准做法:
用户:今天北京天气怎么样?
模型:让我查一下...
[调用天气API]
模型:北京今天晴,22-28°C...
用户:2026年GDP预测是多少?
模型:[调用搜索API]
模型:根据最新数据,2026年全球GDP增长预期为...
用户:请帮我预订明天从北京到上海的机票
模型:[调用订票API]
模型:已为你查询到以下航班...
关键:模型不再"猜测"实时信息
而是学会了"我不知道的时候,调用工具"
8.4 2026年最新防幻觉技术
1️⃣ 事实蒸馏(Factual Distillation)
用教师模型生成带引用标注的响应
学生模型在"有引用"的数据上训练
生成时自动附带引用来源
2️⃣ 自我批评训练(Self-Critique Training)
模型训练时也学习"评估自己的输出"
不是只学"怎么生成"
还学"生成后怎么验证"
3️⃣ 一致性约束
模型同时生成N个回答
如果N个回答不一致 → 降低置信度
只有N个回答一致时 → 输出
4️⃣ 知识图谱增强
不是只有向量数据库
还结合知识图谱的实体关系
确保实体关系一致性
例:"张三是李四的父亲"→"李四不可能是张三的父亲"
九、评估幻觉的量化指标
9.1 主流幻觉评估指标
1️⃣ Faithfulness(忠实度)
模型输出是否忠于提供的上下文
衡量:context-support rate
输出中有多少信息可以直接在上下文中找到
2️⃣ Factuality(事实性)
模型输出是否与已知事实一致
衡量:与知识库/搜索引擎的匹配率
需要外部知识验证
3️⃣ Hallucination Rate(幻觉率)
最直观的指标
幻觉率 = 包含幻觉的回答数 / 总回答数
4️⃣ Precision@K
对于RAG系统,检索到的K个文档中
有多少是真正相关的
检索质量直接决定幻觉风险
9.2 各模型的幻觉率(2026年)
不同模型的幻觉率对比(行业估算,特定测试集):
┌──────────────────┬────────────┬────────────┬─────────┐
│ 模型 │ 事实型幻觉 │ 逻辑型幻觉 │ 综合 │
├──────────────────┼────────────┼────────────┼─────────┤
│ GPT-4 (2023) │ ~10% │ ~8% │ ~18% │
│ Claude 3.5 │ ~8% │ ~7% │ ~15% │
│ GPT-4o (2024) │ ~7% │ ~6% │ ~13% │
│ DeepSeek-V3 │ ~6% │ ~5% │ ~11% │
│ Claude Opus 4.6 │ ~4% │ ~4% │ ~8% │
│ Claude Opus 4.7 │ ~3% │ ~3% │ ~6% │ ← 最佳
│ GPT-5.2 │ ~4% │ ~4% │ ~8% │
└──────────────────┴────────────┴────────────┴─────────┘
趋势:
旗舰模型的幻觉率在持续下降
但离"零幻觉"还很远
即使是2026年最好的模型,仍有约6%的幻觉率
注意:这是在标准化测试集上的数据
在实际的冷门领域,幻觉率可能高3-5倍
十、实战:构建一个低幻觉的问答系统
10.1 基础RAG实现
import chromadb
from sentence_transformers import SentenceTransformer
from openai import OpenAI
class LowHallucinationQA:
"""低幻觉问答系统 - 基于RAG"""
def __init__(self, api_key, collection_name="knowledge_base"):
# 向量数据库
self.client = chromadb.Client()
self.collection = self.client.get_or_create_collection(collection_name)
# embedding模型
self.embedder = SentenceTransformer('BAAI/bge-large-zh-v1.5')
# LLM
self.llm = OpenAI(api_key=api_key)
# 防幻觉温度
self.temperature = 0.1
def add_documents(self, documents, ids=None):
"""添加文档到知识库"""
embeddings = self.embedder.encode(documents).tolist()
if ids is None:
ids = [f"doc_{i}" for i in range(len(documents))]
self.collection.add(
embeddings=embeddings,
documents=documents,
ids=ids
)
def retrieve(self, query, top_k=3):
"""检索相关文档"""
query_embedding = self.embedder.encode([query]).tolist()
results = self.collection.query(
query_embeddings=query_embedding,
n_results=top_k
)
return results['documents'][0]
def generate(self, query, context_docs):
"""基于上下文生成回答"""
# 防幻觉System Prompt
system_prompt = """你是一个基于知识库回答的助手。
核心规则:
1. 只基于提供的上下文回答问题
2. 如果上下文不包含答案,说"根据提供的资料,我无法回答这个问题"
3. 绝不编造信息
4. 引用来源时标注文档编号
5. 如果只能部分回答,明确指出哪些有依据
回答模板:
- 明确答案:据[文档X]所述,...
- 部分答案:根据资料,...但关于...没有相关信息
- 无法回答:抱歉,资料中没有相关信息。"""
# 构建带上下文的prompt
context_text = "\n\n".join([
f"[文档{i+1}]: {doc}"
for i, doc in enumerate(context_docs)
])
user_prompt = f"""请基于以下资料回答问题:
{context_text}
问题:{query}
回答:"""
# 生成回答(低温度)
response = self.llm.chat.completions.create(
model="gpt-4.1-mini", # 或 deepseek-chat
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": user_prompt}
],
temperature=self.temperature,
max_tokens=1000
)
return response.choices[0].message.content
def ask(self, query):
"""完整流程:检索 → 生成"""
# 1. 检索
context_docs = self.retrieve(query)
# 2. 检查检索质量
if not context_docs or all(doc == "" for doc in context_docs):
return "抱歉,知识库中没有相关信息,我无法回答这个问题。"
# 3. 生成回答
answer = self.generate(query, context_docs)
return answer
# 使用示例
qa = LowHallucinationQA(api_key="your-api-key")
# 添加知识库
qa.add_documents([
"Transformer模型于2017年由Google在论文'Attention Is All You Need'中提出。",
"深度学习中的注意力机制最早由Bahdanau在2014年用于机器翻译。",
"GPT-4发布于2023年3月,拥有约1.8万亿参数。"
])
# 查询
answer = qa.ask("Transformer是什么时候提出的?")
print(answer)
# 输出:据[文档1]所述,Transformer模型于2017年由Google在论文'Attention Is All You Need'中提出。
answer = qa.ask("2026年的GDP是多少?")
print(answer)
# 输出:抱歉,提供的资料中没有关于2026年GDP的信息。
# → 模型没有编造,而是诚实地拒绝回答
10.2 使用搜索引擎补充知识(2026年最佳实践)
import requests
class AugmentedQA(LowHallucinationQA):
"""增强版问答系统 - 支持搜索引擎回退"""
def __init__(self, api_key, search_api_key=None):
super().__init__(api_key)
self.search_api_key = search_api_key
def web_search(self, query):
"""调用搜索引擎获取最新信息"""
# 以SerpAPI为例
url = "https://serpapi.com/search"
params = {
"q": query,
"api_key": self.search_api_key,
"num": 3
}
response = requests.get(url, params=params)
results = response.json()
return [r["snippet"] for r in results.get("organic_results", [])]
def ask_with_fallback(self, query):
"""分层检索:知识库 → 搜索引擎 → 拒绝回答"""
# 第一层:本地知识库
context = self.retrieve(query)
if context and context[0]:
# 检查检索相关性(简化版)
return self.generate(query, context)
# 第二层:搜索引擎(如果需要最新信息)
if self.search_api_key:
web_results = self.web_search(query)
if web_results:
return self.generate(query, [
f"[搜索结果]: {r}" for r in web_results
])
# 第三层:诚实拒绝
return "抱歉,我无法从现有知识库和互联网上找到这个问题的准确答案。\n" \
"建议您联系相关领域的专业人士获取更准确的信息。"
# 使用
qa_augmented = AugmentedQA(
api_key="your-openai-key",
search_api_key="your-serpapi-key"
)
result = qa_augmented.ask_with_fallback("2026年AI领域有哪些重大进展?")
print(result)
10.3 SelfCheckGPT:自检是否幻觉
def self_check_hallucination(llm, query, answer):
"""
自检:模型是否在幻觉?
原理:如果模型"知道",多次回答应该一致
如果模型"不知道",每次"猜"的结果会不同
"""
# 用同样的问题问模型多次
n_samples = 5
answers = []
for _ in range(n_samples):
response = llm.chat.completions.create(
model="gpt-4.1-mini",
messages=[{"role": "user", "content": query}],
temperature=0.8, # 故意高温度,看多样性
max_tokens=200
)
answers.append(response.choices[0].message.content)
# 判断一致性
# 如果5次回答高度一致 → 模型"知道"
# 如果5次回答差异很大 → 模型"不知道"→可能幻觉
# 简化版:用LLM判断一致性
consistency_check = llm.chat.completions.create(
model="gpt-4.1-mini",
messages=[{
"role": "user",
"content": f"""下面是同一个问题的5次回答。
判断这些回答在核心事实上是否一致。
如果核心事实一致,输出"一致";
如果核心事实不一致,输出"不一致"。
问题:{query}
回答1:{answers[0]}
回答2:{answers[1]}
回答3:{answers[2]}
回答4:{answers[3]}
回答5:{answers[4]}"""
}],
temperature=0.1
)
result = consistency_check.choices[0].message.content
if "不一致" in result:
return {
"risk": "high",
"message": "⚠️ 检测到潜在幻觉:模型多次回答不一致",
"suggestion": "建议结合知识库或搜索引擎核实后再使用"
}
else:
return {
"risk": "low",
"message": "✅ 回答一致性良好",
"suggestion": "回答可信度较高"
}
# 使用示例
check_result = self_check_hallucination(client, "Transformer架构的核心创新是什么?", answer)
print(check_result["message"])
📌 总结
幻觉核心要点:
1️⃣ 幻觉的本质
模型没有"知识",只有"统计规律"
不知道"对错",只知道"概率"
真话混假话最危险
2️⃣ 幻觉的8种原因
压缩损失 → 必然发生
训练目标偏差 → 预测vs事实不匹配
数据噪声 → 学了错误信息
注意力分散 → 长上下文遗忘
decoder放大 → 小错变大错
缺乏验证 → 不能自我纠正
覆盖不足 → 冷门知识学不到
对齐压力 → 宁可编不可拒
3️⃣ 三层防线(按成本排序)
提示工程 → 10-20%降低
RAG → 50-70%降低 ← 最推荐
模型训练 → 30-60%降低
4️⃣ RAG是2026年主流方案
"检索替代记忆,事实锚定生成"
分层回退:知识库→搜索→拒绝
不能100%消除,但改变幻觉性质
5️⃣ 实用建议
temperature=0用于事实性问答
要求模型"不知道就说不知道"
自检:多次回答一致性检查
不要因为模型在常见问题上好,就信任所有答案
🔗 延伸阅读
- 【AI基础篇01】AI大模型基础概念全景图
- 【AI基础篇05】注意力机制:Self-Attention详解
- 【AI基础篇07】预训练 vs 微调 vs 提示工程
- 【AI基础篇08】大模型评估指标
- 【AI基础篇10】RAG:检索增强生成详解(下一篇)
觉得有帮助?点赞收藏!下一篇我们讲RAG(检索增强生成)——大模型最核心的应用架构之一,从基础原理到高级优化全覆盖! 🚀
标签:人工智能、大模型、幻觉、Hallucination、RAG、防幻觉、可信AI、提示工程
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)