大模型 + RAG 幻觉治理方案总结

大模型 + 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 防幻觉的关键,是让模型只基于正确、完整、可信的证据回答;当证据不足时,系统要允许它拒答,而不是强行编答案。

相关推荐
小村儿1 小时前
(译文)重温:Karpathy 的 4 条 CLAUDE.md 规则将 Claude 错误率从 41% 降至 11%——历经 30 个代码库后,我又加了 8 条
前端·后端·ai编程
user69600737566171 小时前
3个前端性能优化技巧,我用后页面加载快了80%
后端
源码集结号1 小时前
基于 Spring Boot + JPA + MySQL的上门家政系统代码示例
java·前端·后端
该用户已不存在1 小时前
别再把 Claude 当聊天框,Claude Code CLI 安装与上下文管理指北(Part 1)
后端·ai编程·claude
蝎子莱莱爱打怪1 小时前
无废话!源自官网的Codex 命令速查手册!
人工智能·后端·agent
盖世英雄酱581361 小时前
6000条数据执行时间9s(二)
数据库·后端
该昵称用户已存在2 小时前
从成本中心到价值引擎:MyEMS 开源系统激活企业能源数据资产
java·后端·struts
舞影天上2 小时前
Docker Desktop 卡在启动界面?可能是你的 “.wslconfig” 写错了
后端