大模型 + RAG 幻觉治理方案总结
本文是与GPT深度聊天后总结的文章 非本人编写
1. 核心结论
大模型 + RAG 的幻觉问题,不能只靠 Prompt 解决。
Prompt 只能约束模型"怎么回答",但如果前面的文档源、切分、检索、重排、上下文组装本身有问题,模型依然会基于错误或缺失的信息生成不可靠答案。
更准确地说:
RAG 防幻觉的核心,不是单纯让模型更听话,而是让模型拿到正确、完整、可信的证据,并且禁止它在证据之外发挥。
一个成熟的 RAG 防幻觉方案,应该从完整链路治理:
bash
文档源治理
↓
文档解析
↓
文本切分
↓
向量化
↓
检索召回
↓
Reranker 重排序
↓
上下文组装
↓
LLM 生成
↓
答案校验
↓
评估监控
2. RAG 幻觉的常见来源
2.1 没有检索到正确内容
用户问的是某个具体问题,但向量库返回的是语义相近、却不能真正回答问题的内容。
例如用户问:
bash
公司年假规则是什么?
但检索结果返回的是:
bash
公司调休制度
考勤打卡制度
请假审批流程
这些内容看起来相关,但没有真正回答"年假规则"。此时模型很容易根据已有上下文硬猜。
2.2 检索到了错误内容
知识库里可能同时存在旧文档和新文档。
例如:
bash
2023 年假规则
2025 年假规则
如果系统检索到了旧版本文档,模型就可能基于过期内容认真地回答错误答案。
这种问题本质上不是模型生成阶段的问题,而是检索源和文档管理的问题。
2.3 Chunk 切分不合理,导致上下文缺失
如果文档被切得太碎,关键限制条件可能会丢失。
原文可能是:
bash
正式员工入职满一年后,每年享有 5 天年假。
试用期员工不享受年假。
但检索时只召回了:
bash
每年享有 5 天年假。
模型没有看到"入职满一年"和"试用期员工不享受"这些条件,就容易回答不完整或错误。
2.4 检索内容正确,但模型自由发挥
有些时候,检索内容是正确的,但模型在生成答案时补充了上下文里没有的信息。
例如上下文里只说明了年假天数,但模型额外回答了离职折算规则、审批流程等内容。若这些内容没有来源支撑,就属于生成阶段的幻觉。
这类问题可以通过 Prompt、低 temperature、引用机制、答案校验来缓解。
3. 第一层:文档源治理
RAG 的基础是知识库质量。
如果知识库本身存在旧文档、重复文档、冲突文档、错误文档,那么后续检索和生成都会受到影响。
3.1 需要治理的内容
建议在入库前处理:
3.2 推荐的 metadata 设计
每个 chunk 入库时,建议保留 metadata:
bash
{
"doc_id": "hr_policy_2025",
"title": "2025 员工休假制度",
"version": "2025",
"effective_date": "2025-01-01",
"department": "HR",
"source": "official",
"status": "active"
}
这样后续检索时可以做过滤:
bash
只检索 status = active 的文档
只检索最新版本
只检索当前用户有权限访问的文档
只检索指定部门或业务范围下的文档
4. 第二层:优化文本切分
Chunk 切分质量会直接影响 RAG 的准确率。
4.1 Chunk 太小的问题
如果 chunk 太小,容易丢失上下文。
例如:
bash
chunk_1:员工入职满一年后
chunk_2:每年享有 5 天年假
chunk_3:试用期员工不享受年假
用户问年假规则时,系统如果只召回 chunk_2,答案就会缺失关键限制条件。
4.2 Chunk 太大的问题
如果 chunk 太大,里面可能包含太多噪声。
例如一个 chunk 同时包含:
bash
年假
病假
婚假
产假
调休
考勤
用户只问年假,模型可能会混用其他假期规则。
4.3 推荐切分方式
实际项目中可以采用:
一个更好的 chunk 内容示例:
bash
文档:2025 员工休假制度
章节:第三章 年假规则
页码:第 5 页
正文:正式员工入职满一年后,每年享有 5 天年假。试用期员工不享受年假。
这样模型不仅能看到正文,也能知道这段内容来自哪里、属于哪个章节。
5. 第三层:提高检索召回质量
很多幻觉来自"正确内容没有被召回"。
5.1 topK 不要太小
如果只取:
bash
topK = 3
正确 chunk 可能排在第 5 名,就被漏掉。
常见做法是:
bash
第一阶段召回 top50 / top100
第二阶段 reranker 重排
最后选 top5 / top10 给 LLM
也就是:
bash
先多召回,再精排
5.2 使用混合检索
单纯向量检索擅长语义匹配,但对关键词、编号、专有名词有时不稳定。
例如用户问:
bash
BGE-M3 的维度是多少?
这里 BGE-M3 是明确关键词,BM25 关键词检索可能比纯向量检索更稳。
推荐使用:
bash
向量检索 + BM25 关键词检索 + RRF 融合
可以理解为:
bash
向量检索:负责语义相似
BM25:负责关键词精确匹配
RRF:负责融合两个检索结果
5.3 加入 Reranker
Embedding / Bi-Encoder 检索速度快,但排序不一定准。
Reranker 可以对第一轮召回的候选 chunk 重新打分。
常见流程:
bash
Embedding 召回 top50
Reranker 重排 top50
选 top5 给 LLM
例如:
bash
BAAI/bge-m3:负责向量召回
BAAI/bge-reranker-v2-m3:负责重排序
Reranker 的价值是判断:
bash
这个 chunk 是否真的能回答用户问题?
6. 第四层:上下文组装
检索到了正确 chunk,不代表可以直接全部塞给模型。
上下文组装也会影响幻觉。
6.1 需要避免的问题
不要把互相冲突的内容直接混在一起。
例如:
bash
2023 规则:年假 3 天
2025 规则:年假 5 天
如果都给模型,模型可能混用规则。
6.2 推荐的上下文组装策略
建议做:
推荐上下文格式:
bash
【资料1】
来源:2025 员工休假制度
章节:第三章 年假规则
生效时间:2025-01-01
内容:正式员工入职满一年后,每年享有 5 天年假。
【资料2】
来源:HR 常见问题
更新时间:2025-03-10
内容:试用期员工不享受年假。
这样模型更容易基于证据回答,也更方便后续做引用溯源。
7. 第五层:Prompt 约束
Prompt 是必要的,但不是唯一手段。
它主要解决生成阶段的问题,让模型:
7.1 推荐 Prompt 模板
bash
你是一个知识库问答助手。请严格根据【参考资料】回答用户问题。
要求:
1. 只能使用参考资料中的信息。
2. 如果参考资料不足以回答,请直接说"根据当前资料无法确定"。
3. 不要编造未出现在资料中的事实、数字、政策、时间。
4. 如果资料之间存在冲突,请指出冲突,并优先使用更新时间最新、来源更权威的资料。
5. 回答后列出引用的资料编号。
【参考资料】
{context}
【用户问题】
{question}
7.2 Prompt 的局限
Prompt 不能解决:
bash
没有检索到正确资料
检索到了旧资料
chunk 切分不合理
知识库本身存在冲突
metadata 过滤错误
所以 Prompt 应该作为最后一层约束,而不是唯一方案。
8. 第六层:拒答机制
RAG 系统必须允许模型说"不知道"。
如果强行要求模型必须回答,幻觉概率会明显上升。
8.1 推荐拒答条件
可以设计这些规则:
8.2 拒答话术示例
bash
根据当前知识库资料,无法确认这个问题的准确答案。建议补充相关文档后再查询。
或者:
bash
当前检索到的资料不足以支持一个确定答案,因此不能直接给出结论。
9. 第七层:答案生成后校验
生成答案后,可以再加一层校验,检查答案是否被资料支持。
9.1 LLM 自检
让模型检查自己的答案:
bash
请检查下面答案中的每个关键结论是否都能被参考资料支持。
如果不能支持,请删除或标记为"资料不足"。
9.2 引用校验
要求每个关键结论带来源:
bash
员工入职满一年后享有 5 天年假。[资料1]
试用期员工不享受年假。[资料2]
如果某句话没有引用来源,说明这句话风险较高。
10. 第八层:生成参数控制
生成参数也会影响幻觉。
RAG 场景一般追求准确、稳定、少幻觉,不追求创造性。
推荐设置:
bash
temperature = 0 ~ 0.3
top_p = 0.9 ~ 0.95
企业知识库、客服、规章制度问答可以更保守:
bash
temperature = 0
top_p = 0.9
但要注意:
低 temperature 只能降低随机发挥,不能保证事实正确。
如果检索内容本身是错的,模型会基于错误内容稳定地输出错误答案。
11. 第九层:评估集和监控
RAG 系统不能只靠感觉调参,需要建立评估集。
11.1 评估集应包含
11.2 核心评估指标
建议关注:
否则很容易出现:
bash
这个问题好了,另一个问题坏了。
12. 推荐的完整 RAG 防幻觉流程
一个比较成熟的流程可以设计为:
bash
用户问题
↓
Query 改写 / 扩展
↓
混合检索:向量检索 + BM25
↓
召回 top50 / top100
↓
Reranker 重排
↓
过滤低分 chunk
↓
去重 + 版本过滤 + 权限过滤
↓
组装带来源的上下文
↓
低 temperature 生成
↓
要求引用来源
↓
答案校验
↓
低置信度则拒答
13. 实战优先级
如果正在开发一个 RAG 项目,可以按下面优先级治理幻觉:
| 优先级 | 要做的事 | 作用 |
|---|---|---|
| 1 | 清理知识库,处理旧文档、重复文档、冲突文档 | 避免源头污染 |
| 2 | 优化 chunk 切分 | 避免上下文缺失 |
| 3 | 提高 topK,加入 Reranker | 提高检索准确率 |
| 4 | 使用 metadata 过滤版本、权限、来源 | 避免检索错范围 |
| 5 | Prompt 要求基于资料、可拒答、带引用 | 约束生成 |
| 6 | 设置低 temperature | 降低随机发挥 |
| 7 | 答案生成后校验 | 防止最后输出乱编 |
| 8 | 建立评估集持续测试 | 长期稳定优化 |
14. 最终总结
大模型 + RAG 的幻觉治理不是单点优化,而是一个系统工程。
完整方案应该是:
bash
高质量文档源
+ 合理切分
+ 高召回检索
+ Reranker 精排
+ metadata 过滤
+ 干净的上下文组装
+ 严格 Prompt
+ 低随机参数
+ 拒答机制
+ 答案校验
+ 评估监控
一句话记忆:
RAG 防幻觉的关键,是让模型只基于正确、完整、可信的证据回答;当证据不足时,系统要允许它拒答,而不是强行编答案。