首页 › RAG › RAG与向量检索实战 › 解决 RAG 幻觉的 5 种工程化策略

解决 RAG 幻觉的 5 种工程化策略

检索增强生成(RAG)被认为是解决大语言模型(LLM)“幻觉(Hallucination)”和“知识更新滞后”的银弹。它的逻辑非常直白:既然模型会胡编乱造,那我就把标准答案(文档片段)塞给它,让它照着念。​

然而,在实际的企业级落地中,开发者们很快发现了一个令人沮丧的事实:即使使用了 RAG,模型依然会产生幻觉。​

​

👓

为什么会这样?如何从工程上系统性地缓解这个问题?本文将为你揭开 RAG 幻觉的成因,并提供 5 种行之有效的工程化防御策略。​

​

​

​

为什么 RAG 还会产生幻觉?​

在 RAG 架构中,幻觉的产生主要有以下三个原因:​

检索失败(Retrieval Failure):最常见的原因。由于 Chunking(分块)策略不当或 Query(查询)语义模糊,导致向量数据库没有召回正确的上下文。此时模型只能依赖自身的预训练知识进行“盲猜”。​

上下文冲突(Context Conflict):召回了多个相关的文档片段,但这些片段中的信息相互矛盾(例如,旧版文档和新版文档同时被召回)。模型在综合时产生了错误的推理。​

指令遵循失效(Instruction Ignorance):模型“无视”了 Prompt 中“仅根据提供的信息回答”的约束,强行用预训练知识回答了文档中未提及的内容。​

​

​

策略一:高质量的 Chunking 与元数据(Metadata)增强​

垃圾进,垃圾出(Garbage In, Garbage Out)。解决幻觉的第一步是在数据入库(Ingestion)阶段下功夫。​

2.1 避免“一刀切”的 Chunking​

不要简单地按固定长度(如 500 字符)切分文档。这很容易切断完整的语义逻辑(例如,将一个表格或一段代码强行切成两半)。​

改进方案:​

•

按语义切分:利用 Markdown 标题、HTML 标签或段落换行符进行切分(如 LangChain 的 MarkdownHeaderTextSplitter)。​

•

重叠(Overlap):在相邻的 Chunk 之间保留 10%-20% 的重叠,以保持上下文连贯性。​

2.2 注入 Metadata 提供全局视角​

单独的一个 Chunk 往往缺乏全局上下文。例如,一个 Chunk 内容是“该接口的 QPS 限制为 100”。模型并不知道“该接口”指的是哪个 API。​

改进方案: 在向量化之前,为每个 Chunk 注入 Metadata(如文档标题、章节名称、更新时间):​

​

代码块​

JSON

{"content": "该接口的 QPS 限制为 100","metadata": {"source": "api_v2_docs.md","section": "User Authentication API","last_updated": "2026-03-01"}}​

​

​

​

策略二:Query Rewrite(查询重写)与扩展​

用户在提问时往往是非常简短或模糊的(例如:“怎么退款?”)。直接用这句话去向量数据库检索,效果通常很差。​

改进方案:利用 LLM 重写查询 在检索前,先让 LLM 把用户的 Query “翻译”成更适合检索的形态。​

​

代码块​

Python

# Query Rewrite Prompt 示例​

prompt = f"""​

你是一个搜索引擎优化专家。用户的问题是:"{user_query}"​

请结合上下文,将这个问题重写为 3 个不同角度的搜索关键词,以提高在知识库中的召回率。​

只需输出关键词,不要包含多余的解释。​

"""# 输出示例: # 1. 退款流程# 2. 如何申请退货退款# 3. 售后政策​

​

将这 3 个扩展后的查询分别去检索,然后对结果进行去重(Deduplication)和 RRF 融合。​

​

​

策略三:严格的 Prompt 约束与“不知道”机制​

这是防范模型“强行作答”的最有效手段。你可以在 QubitTool 的 Prompt 导航库 中找到更多相关的安全模板。​

改进方案:设定强硬的边界 在 System Prompt 中,必须明确且强硬地规定模型的行为准则。​

text​

​

代码块​

Plain Text

你是一个严谨的客服机器人。​

你必须【严格】且【仅】基于提供的 回答用户的问题。​

​

约束条件:​

1. 如果 中没有包含回答问题所需的信息,你必须回答:“抱歉,目前的知识库中没有关于此问题的详细信息。”​

2. 绝对不要使用你的预训练知识进行编造。​

3. 你的回答必须客观中立,不要添加个人的猜测。​

​

​

{retrieved_chunks}​

​

​

用户问题:{user_query}​

​

​

​

策略四:引入引用归因(Citation)机制​

为了让模型的回答具有可解释性(Explainability),并强迫它在生成内容时“三思而后行”,可以要求模型在回答中附带引用的来源。​

改进方案:要求输出来源标识 在 Prompt 中增加如下要求:​

​

代码块​

Plain Text

在你的回答中,每一个关键事实都必须附带来源引用,格式为 [来源: 文件名]。​

例如:根据最新政策,退款将在 3 个工作日内原路返回 [来源: 售后政策.pdf]。​

​

这不仅能极大降低幻觉,还能在幻觉发生时,让开发者快速定位是检索(Retrieval)出了问题,还是生成(Generation)出了问题。​

策略五:后置校验(Self-Correction / Verification)​

这是最重的一步,通常用于对准确率要求极高的场景(如医疗、法律或金融问答)。​

改进方案:引入一个“裁判员”模型 在生成初步答案后,不直接返回给用户,而是调用另一个(或同一个)LLM 进行后置校验(Self-Check)。可以使用 正则测试工具 提取校验结果。​

​

代码块​

Python

verification_prompt = f"""​

你是一个事实核查员。​

请检查以下【答案】是否完全由【参考资料】支撑,且没有包含任何【参考资料】之外的编造信息。​

​

【参考资料】: {context}​

【答案】: {generated_answer}​

​

请输出 JSON 格式:​

{{​

"is_hallucinated": true/false,​

"reason": "如果存在幻觉,请说明原因"​

}}​

"""​

​

如果 is_hallucinated 为 true,则拒绝返回该答案,或者要求生成模型重新生成。​

​

​

总结​

RAG 的幻觉问题不是一个可以通过单一算法解决的魔法,而是一个系统性的工程问题。从高质量的 Chunking 和 Metadata 注入(数据层),到 Query Rewrite(检索层),再到严格的 Prompt 约束、引用归因和后置校验(生成层),这 5 种策略相互配合,才能构建出真正可靠、可信的企业级 AI 知识库系统。​