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

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

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

1. 为什么 RAG 还会产生幻觉?

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

  1. 检索失败(Retrieval Failure):最常见的原因。由于 Chunking(分块)策略不当或 Query(查询)语义模糊,导致向量数据库没有召回正确的上下文。此时模型只能依赖自身的预训练知识进行“盲猜”。
  2. 上下文冲突(Context Conflict):召回了多个相关的文档片段,但这些片段中的信息相互矛盾(例如,旧版文档和新版文档同时被召回)。模型在综合时产生了错误的推理。
  3. 指令遵循失效(Instruction Ignorance):模型“无视”了 Prompt 中“仅根据提供的信息回答”的约束,强行用预训练知识回答了文档中未提及的内容。

2. 策略一:高质量的 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"
  }
}

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

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

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

python
# Query Rewrite Prompt 示例
prompt = f"""
你是一个搜索引擎优化专家。用户的问题是:"{user_query}"
请结合上下文,将这个问题重写为 3 个不同角度的搜索关键词,以提高在知识库中的召回率。
只需输出关键词,不要包含多余的解释。
"""
# 输出示例: 
# 1. 退款流程
# 2. 如何申请退货退款
# 3. 售后政策

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

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

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

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

text
你是一个严谨的客服机器人。
你必须【严格】且【仅】基于提供的 <context> 回答用户的问题。

约束条件:
1. 如果 <context> 中没有包含回答问题所需的信息,你必须回答:“抱歉,目前的知识库中没有关于此问题的详细信息。”
2. 绝对不要使用你的预训练知识进行编造。
3. 你的回答必须客观中立,不要添加个人的猜测。

<context>
{retrieved_chunks}
</context>

用户问题:{user_query}

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

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

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

text
在你的回答中,每一个关键事实都必须附带来源引用,格式为 [来源: 文件名]。
例如:根据最新政策,退款将在 3 个工作日内原路返回 [来源: 售后政策.pdf]。

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

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

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

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

python
verification_prompt = f"""
你是一个事实核查员。
请检查以下【答案】是否完全由【参考资料】支撑,且没有包含任何【参考资料】之外的编造信息。

【参考资料】: {context}
【答案】: {generated_answer}

请输出 JSON 格式:
{{
  "is_hallucinated": true/false,
  "reason": "如果存在幻觉,请说明原因"
}}
"""

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

总结

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