很多人第一次接触 RAG(Retrieval-Augmented Generation,检索增强生成)时,会有一个很自然的理解:
大模型自己会胡说,那我给它接一个知识库,让它先查资料再回答,不就不会胡说了吗?
这个思路没错,但只对了一半。
RAG 的确是目前降低大模型事实性错误、补充私有知识和更新知识最常用的方法之一。最早的 RAG 工作,就是把模型参数里的“内部记忆”和外部可检索知识结合起来,让生成结果更具体、更可更新,也更容易追溯来源。
但 RAG 从来不等于“事实数据库直出答案”。
它更像是:在模型回答之前,有一个搜索系统先从一堆资料里挑出几段“可能相关”的内容,然后把这些内容和问题一起塞给大模型。最后真正组织语言、做判断、拼接结论的,仍然是生成模型。
所以,RAG 解决的是“模型回答时能不能看到外部知识”,而不是“模型看到知识以后一定会严格按照知识回答”。
这也是为什么一个 RAG 系统完全可能出现一种很迷惑的现象:资料明明接进去了,回答甚至还带着引用,但内容依然错得很自信。
一、先把 RAG 拆开:它其实是一条流水线
一个最简单的 RAG,大致可以写成:
用户问题
↓
查询处理
↓
向量检索 / 关键词检索
↓
得到 Top-K 文档片段
↓
重排、过滤、拼接上下文
↓
大模型生成回答
↓
引用 / 校验 / 返回结果
只要理解这条链路,就会发现一个关键问题:
最终答案的可靠性,不只取决于大模型。
前面任何一个环节出问题,错误都会被一路传递到最终回答。
2024 年 ACL 的 RAGTruth 工作专门构建了 RAG 幻觉数据集。它说明了一个很现实的问题:即便已经使用了检索增强,模型仍然会生成检索内容没有支持的说法,甚至直接生成与检索内容矛盾的说法。
换句话说,RAG 是在降低幻觉,而不是消灭幻觉。
二、第一种胡说:检索器一开始就找错了
这是最容易被忽略的一类问题。
假设知识库里有两份文件:
- 《2025 年学生奖学金评定办法》
- 《2026 年学生奖学金评定办法》
用户问:
今年一等奖学金要求是什么?
如果向量检索因为语义相似度,把 2025 年的文件排在最前面,而 2026 年文件没有进入 Top-K,那么对生成模型来说,它看到的“世界”就是错的。
模型可能完全忠实地阅读了上下文,也完全忠实地复述了上下文,但最终答案依然是错误的。
这时候你去改 Prompt,通常没什么用。
因为问题根本不在生成,而在检索。
2025 年 ACL 的一项研究把这种现象概括得很形象:错误或带偏差的检索结果,会继续误导后面的生成,形成一种“在幻觉之上继续幻觉”的情况。
所以评价 RAG,不能只问:
模型回答得像不像?
还要先问:
正确证据到底有没有被检索出来?
三、第二种胡说:检索到了,但只检索到半句话
RAG 系统通常不会把整本 PDF 或整份制度文件直接塞进模型,而是先做切块(Chunking)。
问题就在这里。
比如原文是:
学生申请一等奖学金,原则上要求专业排名前 10%。对于参加重大科研项目并取得突出成果者,经学院评审委员会审核,可适当放宽排名要求。
如果切块刚好把它拆成:
Chunk A:
学生申请一等奖学金,原则上要求专业排名前 10%。
Chunk B:
对于参加重大科研项目并取得突出成果者,经学院评审委员会审核,
可适当放宽排名要求。
检索时只拿到 Chunk A,模型就很容易回答:
一等奖学金必须专业排名前 10%。
这句话看起来有来源,也不是模型凭空编的,但它把“原则上”变成了“必须”,还漏掉了例外条款。
所以 “检索到了相关内容”不等于“检索到了完整证据”。
很多 RAG 项目效果差,不是 embedding 模型不够强,而是文档结构在入库时就已经被切碎了。
表格、标题层级、附件、脚注、上下文引用、跨页段落,这些东西一旦在解析阶段丢失,后面的大模型再强也补不回来。
四、第三种胡说:资料都对,但模型看错重点
再进一步。
假设检索器真的找出了 10 个相关片段,其中 2 个是核心证据,8 个只是“沾边”。
很多系统会简单粗暴地把十段文字全部拼接起来:
Context 1
Context 2
Context 3
...
Context 10
然后让模型回答。
问题是,上下文越多,不一定越安全。
噪声可能稀释真正重要的证据,多个相似文件还可能互相冲突。
更麻烦的是,模型对上下文的位置也可能敏感。ACL 2026 的 Stable-RAG 研究指出,仅仅改变检索文档的排列顺序,都可能影响模型的推理和最终回答,并引发不同程度的幻觉。
这件事很反直觉:
明明是同样几份资料,只是顺序不一样,答案怎么还能变?
但生成模型不是 SQL 引擎。
它没有一个保证“逐条读取所有证据、比较冲突、按照确定规则求值”的执行器。它仍然是在一个长上下文里,根据注意力和概率分布生成下一个 token。
五、第四种胡说:外部知识和模型自己的“记忆”打架了
RAG 还有一个非常典型的问题:参数知识和外部知识冲突。
大模型在预训练阶段已经学过大量信息。
RAG 又给它塞了一份新的资料。
理想情况下,我们希望模型遵循新的外部证据。
但实际情况并不总是如此。
例如知识库写着:
本系统从 2026 年起不再支持密码登录,仅允许统一身份认证。
而模型训练语料里大量软件系统仍然是“用户名 + 密码”。
如果 Prompt、证据强度和模型本身的指令遵循能力不够好,它可能会把两者混起来,生成:
用户可以通过统一身份认证,也可以使用用户名和密码登录。
其中后半句根本没有证据。
这类错误尤其危险,因为答案通常听起来非常合理。
六、第五种胡说:模型开始“帮你补全逻辑”
大模型最擅长的能力之一,本来就是根据已有信息补全后续内容。
这在写作里是优点,在事实问答里却可能变成风险。
假设资料只说:
项目通过学院初审后提交学校复核。
用户问:
学校复核需要几个工作日?
知识库没有答案。
一个严格系统应该回复:
当前资料中没有找到学校复核时限。
但一个普通 RAG Prompt 很可能让模型继续发挥:
学校复核通常需要 3~5 个工作日。
“3~5 个工作日”听起来非常像正常制度,甚至比“不知道”更像一个有用的回答。
问题是,它是编的。
这其实揭示了 RAG 的核心矛盾:
语言模型天然倾向于完成答案,而可信系统更需要它在证据不足时停止回答。
七、为什么它能胡说得这么自信?
因为 RAG 并没有改变大模型最底层的生成机制。
一个简化的理解是:模型仍然在做
给定:问题 + 检索上下文 + 已生成文本
预测:下一个最合适的 token
它并没有一个内部按钮叫:
事实正确 = true
也不会天然执行:
if 没有证据:
return "不知道"
RAG 只是给它增加了更好的输入材料。
材料质量越高、约束越强,回答通常越可靠;但“更可靠”和“确定正确”完全不是一回事。
八、几个常见误区
1. Top-K 调大一点就好了?
未必。
Top-K 太小会漏证据,太大会引入噪声。
正确做法通常不是无脑增加数量,而是提高召回之后再做 rerank,并根据问题动态控制最终送给模型的上下文。
2. 换更大的模型就不会幻觉?
也不成立。
更强的模型往往能更好地理解资料,但如果检索出来的东西就是错的,它甚至可能把错误资料解释得更漂亮。
3. 让模型“必须引用来源”就安全了?
引用只能证明模型输出了一个引用标记。
它不能自动证明:
- 这条引用真的支持前面的结论;
- 模型没有过度推断;
- 引用的文件没有过期;
- 检索到的文件就是正确版本。
所以真正需要验证的是 Claim → Evidence,而不是“回答末尾有没有 [1]”。
4. 上长上下文模型,就不用 RAG 了?
长上下文解决的是“能装多少”,不是“该装什么”“证据是否可信”“冲突怎么处理”。
把几百页资料一次性塞进去,也可能只是把检索问题变成注意力分配问题。
九、工程上到底怎么降低 RAG 幻觉?
真正靠谱的方案,通常要同时管四层。
第一层:把知识库本身做好
先解决数据质量:
- 文档版本要明确;
- 过期制度要下线或降低优先级;
- 标题、章节、表格结构尽量保留;
- Chunk 不要只按固定字数硬切;
- 给片段附带来源、时间、部门、权限等 metadata;
- 同一事实如果存在冲突,要能够识别。
垃圾数据进入 RAG,不会 magically 变成正确答案。
第二层:把检索当搜索系统做,而不是当 Demo 做
生产环境一般至少要考虑:
- 向量检索 + BM25 等关键词检索的 Hybrid Search;
- Query Rewrite;
- Metadata Filter;
- Reranker;
- 动态 Top-K;
- 对时间、权限、组织范围进行过滤。
尤其是专有名词、编号、制度名称、代码、错误码这类信息,纯向量检索经常不如关键词检索稳定。
第三层:允许模型说“不知道”
这是很多系统最缺的一步。
可以明确设置 Answerability Gate:
如果检索证据不足以支持结论:
不要补充常识,不要猜测,不要根据经验推断;
明确告诉用户当前知识库没有足够信息。
这会让系统看起来没那么“聪明”,但会可靠很多。
第四层:生成以后再验证一次
不要把第一次生成直接当最终答案。
可以把回答拆成若干 claim,然后逐条检查:
结论 A → 来源 1 是否真的支持?
结论 B → 来源 2 是否真的支持?
结论 C → 没有证据 → 删除或标记不确定
对于高风险业务,还可以引入单独的 verifier、规则系统或者结构化校验。
ACL 2026 关于 RAG 错误分类的研究也强调了类似观点:真实 RAG 系统的错误来源很多,需要把错误拆成不同类型去评估,而不是只用一个“回答准确率”概括整个系统。
十、真正应该监控的,不只是最终准确率
如果要把 RAG 做成一个长期运行的系统,我更建议把指标拆开:
Retrieval Recall
正确证据有没有被召回?
Context Precision
送进模型的内容里,有多少是真正有用的?
Faithfulness
回答里的结论有多少能被上下文直接支持?
Answerability
没答案的时候,系统能不能正确拒答?
Freshness
使用的是不是最新版本资料?
Citation Correctness
引用是否真的支持对应结论?
只有这样,出问题的时候才知道该修 embedding、chunk、reranker、Prompt,还是模型本身。
否则所有问题最后都会变成一句:
大模型又胡说了。
这对排障几乎没有帮助。
结语:RAG 不是“知识外挂”,而是一条信息供应链
我更愿意把 RAG 理解成一条信息供应链。
知识库是原材料,解析和切块是加工,检索是选材,rerank 是质检,上下文组装是配送,大模型是最后的加工厂。
最后产品出了问题,你不能只盯着加工厂。
如果原材料就是旧的,检索拿错了版本,运输途中丢了一半,或者把真正重要的证据埋在几十段噪声里面,再强的模型也很难稳定地产出正确答案。
所以,一个真正可靠的 RAG 系统,重点从来不是“接上向量数据库以后能不能回答问题”,而是:
答案里的每一个关键结论,我们能不能知道它从哪里来,为什么成立;当证据不足时,系统又能不能克制住自己不去编。
做到这一步,RAG 才开始从一个 Demo,变成一个可以进入真实业务的知识系统。
参考资料
- Lewis et al., Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks, 2020.
https://arxiv.org/abs/2005.11401 - Niu et al., RAGTruth: A Hallucination Corpus for Developing Trustworthy Retrieval-Augmented Language Models, ACL 2024.
https://aclanthology.org/2024.acl-long.585/ - Hu et al., Removal of Hallucination on Hallucination: Debate-Augmented RAG, ACL 2025.
https://aclanthology.org/2025.acl-long.770/ - Leung et al., Classifying and Addressing the Diversity of Errors in Retrieval-Augmented Generation Systems, EACL 2026.
https://aclanthology.org/2026.eacl-long.147/ - Zhang et al., Stable-RAG: Mitigating Retrieval-Permutation-Induced Hallucinations in Retrieval-Augmented Generation, ACL 2026.
https://aclanthology.org/2026.acl-long.1188/
RAG 为什么还会一本正经地胡说?从检索到生成拆开看
https://wangling.hauchet.cn/archives/why-rag-still-hallucinates
评论