如何减少 RAG 系统的幻觉问题?有哪些实用方法?
- 标签:RAG、幻觉问题
🏛 业务架构师
减少 RAG 幻觉的组合拳,我按"检索—生成—校验—运营"四道防线组织:
检索侧(让模型有据可依):
- 提高召回质量:混合检索+Rerank,确保正确文档进入上下文——检索不到是幻觉的头号来源;
- 相似度阈值兜底:低于阈值宁可返回"未找到相关资料",也不喂低质量内容让模型硬编;
- 上下文去噪:喂之前过滤无关分块、去重——噪声会诱导模型"联想发挥"。
生成侧(约束模型行为):
- 提示词强约束:"仅依据提供的资料回答,资料未提及就明确说明",并要求逐条标注引用来源;
- 低 temperature(0~0.3):降低"自由发挥"倾向;
- 结构化输出:要求答案分"结论/依据/引用"三段,强迫证据链完整。
校验侧(不信任生成结果):
- 忠实度校验:用 LLM-as-Judge 或 NLI 模型比对"答案是否被检索内容支持",不支持的段落拦截或标记;
- 关键数字走确定性来源:金额、日期、库存这类硬数据,从结构化系统直取,不让模型"转述"。
运营侧(持续降低):
- 幻觉率指标化:抽检+用户反馈(点踩)统计幻觉率,纳入版本发布门禁;
- badcase 回流:每周分析幻觉案例,归因到检索/切分/提示词层定向修复。
业务定调:幻觉治理不是技术终点线而是运营基线——上线只是开始,指标看板+回流机制才是长期压低幻觉率的关键。我的目标设定经验:把"带引用且引用正确"作为硬指标考核,比笼统的"准确率"更可执行。
🏗 系统架构师
RAG 幻觉治理我用全链路六道防线(按数据流顺序):
- 建库侧:知识质量:语料清洗(去重、纠错、版本管理),答案源头脏,后面全白搭;分块保语义完整(结构化切块 + 父子块),破碎 chunk 逼模型脑补;
- 检索侧:宁缺毋滥:相关性阈值过滤——低于阈值不给模型("检索不到"比"给了不相关的"安全得多);混合检索 + Rerank 提升相关性;元数据过滤(时间/来源可信度)保证引用的是"对的版本"的资料;
- Prompt 侧:强 grounding 约束:"仅依据提供的资料回答,资料无依据时回答'未找到相关信息'"——拒答合法化;要求先列依据原文再作答(证据链前置);
- 生成侧:解码收敛:低 temperature(0~0.3);结构化输出包含"依据片段 ID"字段,强制对齐;
- 校验侧:后验核查:faithfulness 校验(NLI 模型或 LLM Judge 判断答案每句是否被检索内容支撑),不通过 → 拦截/降级/重新生成;关键实体与数字和原文精确比对;
- 运营侧:反馈闭环:用户点踩/纠错回流 → badcase 归因(检索没召回?还是生成编造?分开统计)→ 定向修库或改 Prompt。
度量指标:faithfulness(忠实度)、groundedness、拒答正确率、用户纠错率——分检索与生成归因,别混在一个"幻觉率"里。
架构认知:幻觉无法清零(生成模型的本质),系统设计要假设幻觉发生:高风险领域(医疗金融)答案必须带引用 + 置信度,低置信自动转人工。
💻 全栈开发专家
我按「数据、检索、生成、后验」四段减幻觉,每条都是项目里验证过的:
数据源头:
- 知识库质量治理:去重、版本管理(旧版本文档是「合法的幻觉源」)、权限与时效标注;
- chunk 带元数据(来源、时间、可信级别),检索时可加权。
检索侧(提高依据质量):
- 混合检索(向量+BM25)+ Rerank——依据不对,生成再稳也没用;
- 相似度阈值:低于阈值的块不进上下文,宁可少给依据也不给噪声;
- 检索为空时走拒答分支,不要「硬答」。
生成侧(约束模型行为):
- Prompt 三件套:仅依据上下文 + 强制引用 [n] + 明确拒答许可;
- 低温度(0~0.3);
- 指令里给出「资料边界」:哪些资料是权威的、冲突时以哪个为准。
后验校验(最后一道闸):
python
from ragas import evaluate
from ragas.metrics import faithfulness
score = evaluate(dataset, metrics=[faithfulness]) # 答案是否被上下文支撑
# 低分答案拦截或降级为"请稍后转人工"NLI 忠实度校验、引用编号核对(引用的 chunk 是否真的包含该论断)。
运营闭环:幻觉案例回流——每周分析 badcase 归因(检索问题/生成问题/知识缺失),分别驱动索引优化、prompt 迭代、知识补录。
实测结果参考:我们客服 RAG 上线初期幻觉率 12%,做完「rerank+阈值+引用+忠实度拦截」降到 2% 以内。核心认知:幻觉治理是系统工程不是单点技巧,且永远到不了 0——目标是可控、可发现、有兜底。