目录

一、为什么大模型需要 RAG?

(一)模型知识是静态的

(二)模型会产生幻觉

(三)模型不知道你的私有知识

(四)微调不是万能解法

(五)RAG 提供了一种更工程化的思路

二、什么是 RAG?

三、RAG 的标准架构

(一)离线索引阶段

(二)在线问答阶段

四、RAG 的核心模块拆解

(一)文档解析

(二)Chunking

1. 固定长度切分

2. 滑窗切分

3. 语义切分

4. 结构化切分

(三)Embedding

(四)Retrieval

1. 稠密检索

2. 稀疏检索

3. 混合检索

(五)Reranking

(六)Context Assembly

(七)Generation

五、RAG 的底层原理

(一)参数化知识 + 非参数化知识

(二)为什么向量检索能起作用?

(三)为什么海量向量还能检索得很快?

(四)RAG 的本质

(五)为什么 RAG 仍然会失败?

六、RAG 的常见问题与优化方向

(一)召回不到:该找的内容没找回来

(二)召回不准:检索回来了,但不是最相关的

(三)chunk 切分不合理

(四)embedding 效果不稳定

(五)rerank 缺失或效果弱

(六)上下文污染:检索到了错误或冲突内容

(七)生成阶段没有正确使用检索结果

(八)幻觉仍然存在

(九)多跳问题、复杂推理问题效果差

(十)知识更新不及时

(十一)权限与安全问题

(十二)成本和延迟高

七、为什么有人认为 RAG 还不如普通模糊检索?

(一)传统模糊检索为什么有时更强?

(二)为什么很多 RAG 项目上线后,体验不如搜索?

1. 原因一:把语义检索神化了

2. 原因二:过度追求直接回答,忽视证据展示

3. 原因三:知识库质量本身很差

4. 原因四:用错了场景

(三)一个更平衡的判断

八、权限问题

(一)为什么 RAG 的权限风险更高?

(二)权限风险会出现在 RAG 的哪些环节?

1. 索引阶段

2. 检索阶段

3. 生成阶段

4. 日志与缓存阶段

(三)企业级 RAG 的权限控制原则

1. 原则一:继承源系统 ACL

2. 原则二:权限过滤必须前置到检索阶段

3. 原则三:最小权限原则

4. 原则四:高敏数据不一定适合进入通用 RAG

5. 原则五:安全边界必须在模型之外

九、Naive RAG

(一)定义

(二)典型流程

(三)特点

(四)适用场景

(五)本质问题

十、Advanced / Modular RAG

(一)定义

(二)典型模块

(三)为什么它比 Naive RAG 强

(四)优点

(五)缺点

(六)适用场景

(七)和 Naive RAG 的本质区别

十一、GraphRAG

(一)定义

(二)为什么会出现 GraphRAG

(三)基本思路

(四)GraphRAG 的优势

(五)缺点

(六)适用场景

(七)和 Modular RAG 的区别

十二、Agentic RAG

(一)定义

(二)与前面几类的本质差异

(三)典型能力

(四)优点

(五)缺点

(六)适用场景

(七)与 Modular RAG 的区别

十三、Self-RAG / Corrective RAG

(一)Self-RAG

1. 定义

2. 核心思想

3. 优点

4. 缺点

(二)Corrective RAG

1. 定义

2. 典型流程

3. 重点

4. 优点

5. 缺点

十四、生产实践中的推荐方案

十五、一些容易被忽视的设计建议

十六、总结


这两年,大模型几乎成了所有智能系统的默认入口。很多团队第一次接触企业知识问答时,往往会有一种近乎直觉的设想:既然大语言模型已经能回答这么多问题,那么把公司的文档、制度、接口说明、FAQ 喂给模型,不就能很快做出一个知识助手了吗。

真正动手之后,事情通常不会这么顺利。模型对公开知识似乎懂得很多,但一问到企业内部流程、最新制度、某个刚更新的接口字段,回答就开始变得含糊、过时,甚至一本正经地编造细节。于是大家很快会发现,企业知识问答并不是单纯把模型接进来这么简单,它本质上是一个知识获取、检索、组织、生成、权限控制和工程治理共同参与的系统问题。

RAG 正是在这样的背景下成为主流方案的。它不是一个单独的算法名词,也不只是向量数据库加上大模型的组合,而是一种让模型具备先查资料、再基于资料回答能力的系统设计思路。很多人对 RAG 的理解停留在检索增强生成这六个字,但在生产环境里,真正决定效果的往往不是这个名字本身,而是文档怎么解析、chunk 怎么切、检索怎么做、上下文怎么组织、权限在哪里卡住、答案如何溯源,以及整条链路如何被评估和演进。

这篇文章希望系统讲清楚这些问题。


一、为什么大模型需要 RAG?

在很多产品 Demo 里,大模型看起来几乎无所不能。它能写代码、做翻译、总结长文、生成方案,甚至还能回答很多专业问题。也正因为如此,很多团队会自然地认为,企业知识问答不过是把问题发给模型,再把回答展示给用户。

但一旦从公开场景走向企业场景,问题就会急剧复杂化。企业知识和互联网知识完全不是一回事,知识的时效性、私有性、版本差异、权限边界、表达方式、业务语境都发生了变化。模型原本看起来足够聪明,但在真实系统里,聪明并不等于可靠。

(一)模型知识是静态的

大语言模型的知识主要来自预训练阶段,而预训练数据一定存在时间截止点。换句话说,模型知道的是它被训练时为止的世界,而不是现在这个时刻的世界。

这在开放聊天场景里不一定总是大问题,因为很多问题并不依赖最新信息。但在企业环境中,知识更新往往非常频繁,而且这些更新恰恰是最重要的内容。你问模型某个产品最新版本如何配置、公司最近发布的新制度是什么、最近一个月接口字段做了哪些调整,模型并不会天然知道。它能给出的,常常只是某个更早版本的近似答案。

问题的核心不是模型健忘,而是模型的知识注入方式决定了它对更新并不敏感。预训练是重资产过程,更新一次模型不可能像更新一篇文档那样轻量。因此,只要业务知识持续变化,模型就必然存在知识过期的问题。

(二)模型会产生幻觉

比知识过期更麻烦的是,模型即使不知道,也常常不愿意老老实实说不知道。它的生成机制决定了它更倾向于输出一个在语言上流畅、在统计上合理的答案,而不是先验证自己有没有依据。

这就是企业场景里最危险的地方。客服助手可能虚构政策细则,运维助手可能编造排障步骤,法务助手可能捏造制度条款,医疗场景更是不能容忍这种风险。模型的幻觉并不总是表现为明显错误,它更常见的形式,是把半真半假的信息组织得极具说服力。

也正因为如此,企业知识系统不能只追求回答得像不像人,而必须追求回答有没有依据、依据是否最新、来源是否可信、结论是否可回溯。

(三)模型不知道你的私有知识

企业最重要的知识,很多都不在公开互联网里。它们藏在内部 Wiki、Confluence、飞书文档、数据库、工单系统、代码仓库、产品规范、会议纪要和制度文件中。这些知识默认不在模型训练语料里,所以模型也不可能凭空掌握。

这意味着企业知识问答的难点,并不是让模型更会说,而是让模型在需要时能够接入和使用企业内部知识。只要知识不在参数里,就必须有参数之外的知识通道。

(四)微调不是万能解法

很多人第一次遇到这个问题时,会想到微调。既然模型不知道,那就把企业知识拿去微调,让它学会不就可以了吗。

这个思路并非完全错误,但它解决的问题与企业知识接入的核心诉求并不重合。微调更适合做风格适配、格式约束、任务行为调整和指令遵循增强。它当然也可以在一定程度上注入领域知识,但对于高频更新、版本不断变化的知识体系,微调的成本和维护复杂度都太高了。

我自己做过几次 Qwen 开源模型的微调,最大的感受并不是模型本身难不难训,而是整个链路的代价很容易被低估。租 GPU 是直接成本,收集训练集、清洗数据、设计样本、跑实验、做评估、回滚迭代,则是更隐性的时间成本。更关键的是,知识一旦更新,就意味着训练集可能又要重做一轮。这在知识更新频繁的场景里几乎不可持续。

因此,微调并不适合承担企业知识实时更新的职责。它可以优化行为,但不适合成为高频知识接入的主路径。

(五)RAG 提供了一种更工程化的思路

RAG 的价值就在这里体现出来了。它不试图把所有知识都写进模型参数,而是把知识和模型分开,让模型保留语言理解、推理和表达能力,把最新知识、私有知识、可追溯知识交给外部系统管理。

从系统视角看,这其实是在把知识能力拆成两部分。一部分是参数化知识,也就是模型已经内化在参数里的通用能力;另一部分是非参数化知识,也就是放在外部知识库中的动态知识。模型负责理解和生成,检索系统负责提供证据。

这种思路之所以工程化,在于它符合现实世界中知识的管理方式。企业知识本来就应该被版本化、可更新、可回收、可权限控制,而不是被一次性压进模型之后失去可控性。RAG 做的事情,不是让模型记住更多,而是让模型学会在回答前先去查资料。


二、什么是 RAG?

RAG 是 Retrieval-Augmented Generation 的缩写,中文通常翻译为检索增强生成。这个定义听起来并不复杂,但它真正重要的地方,不在于先检索再生成这个表面流程,而在于它改变了大模型使用知识的方式。

在没有 RAG 的情况下,模型回答问题主要依赖参数中已经压缩好的知识。它像一个读过很多书的人,但手边没有最新资料,也无法随时去查公司内网文档。而在引入 RAG 之后,模型回答问题时会先从外部知识库中检索与问题相关的内容,再把这些内容作为上下文提供给模型,让模型基于这些证据完成回答。

所以,RAG 可以理解为给大模型配了一套外部知识系统。模型不再是唯一知识来源,而变成了一个能阅读资料、整合信息并组织答案的智能接口。它的准确性、时效性、私有知识接入能力和可溯源性,都会因此显著增强。

从产品视角看,RAG 让大模型更像一个带阅读能力的知识助手;从工程视角看,RAG 让知识系统可以与模型能力解耦;从架构视角看,RAG 则是在参数化知识和非参数化知识之间搭了一座桥。


三、RAG 的标准架构

理解 RAG 最好的方式,不是背定义,而是先看它作为系统是如何运行的。一个典型的 RAG 系统,通常可以拆成两个阶段:离线索引阶段和在线问答阶段。前者负责把原始知识处理成可检索的形式,后者负责在用户提问时动态查找和组织证据。

(一)离线索引阶段

离线阶段决定的是知识库质量,也就是系统上限。很多人习惯把注意力放在在线问答效果上,但在真实项目里,在线效果往往早在离线阶段就已经被决定了。

离线阶段通常从原始文档开始,经过文档解析、文本清洗、结构提取、chunk 切分、embedding 向量化,最后建立索引。这里的原始文档未必只是纯文本,它可能来自 PDF、Word、PPT、网页、数据库记录、FAQ 表、代码仓库甚至图片扫描件。不同来源的数据质量和结构差异极大,这也是为什么 RAG 的工程复杂度远高于很多人的初始预期。

(二)在线问答阶段

在线阶段解决的是在用户当前问题下,如何把最相关、最可信、最适合回答的那部分知识找出来,并喂给模型。

一个标准流程通常包括 query 处理、检索召回、重排序、上下文组装和模型生成。不同团队的实现差异会非常大,有些系统只做最基础的一次向量检索,有些系统则会引入 query rewrite、hybrid retrieval、rerank、context compression、答案校验和引用生成等多个模块。

从整体上看,在线链路更像一个不断缩小搜索空间、逐步提升相关性的过程。系统并不是一上来就让模型自由回答,而是先替模型准备证据,再约束模型如何使用这些证据。


四、RAG 的核心模块拆解

如果把 RAG 只看成向量检索加大模型,很容易在项目初期获得一些看似不错的 Demo 结果,但很难在真正复杂的企业环境中稳定工作。原因在于,RAG 的效果不是由某个单点决定的,而是由一整条链路共同决定的。任何一个环节做得粗糙,后面都需要为它付出代价。

(一)文档解析

RAG 的起点不是向量库,而是文档。很多系统效果不好,并不是因为检索算法不行,而是因为输入知识从一开始就被处理坏了。

PDF 尤其是一个高风险源。多栏排版容易错位,页眉页脚可能混进正文,表格常常被打散,标题层级被丢失,图片里的文字没有 OCR,代码块和说明文字粘在一起。这些问题如果在解析阶段没有处理好,后面的 embedding 和检索就只能在错误文本上继续工作,再强的模型也无法凭空恢复文档原貌。

高质量的文档解析,不只是把文字抽出来,更重要的是尽量保留结构和元数据。标题层级、页码、原文链接、文档 ID、更新时间、业务标签、来源系统、权限标签,这些信息看起来不像正文内容那样显眼,但在后续检索、排序、溯源和权限控制中极其关键。

现实中,很多团队在做 RAG 时会低估文档工程的重要性,结果前面省下的工作,最终都会在召回不准、上下文污染和权限事故里成倍偿还。

(二)Chunking

RAG 的知识粒度,不是由原始文档决定的,而是由 chunk 决定的。换句话说,系统真正检索的不是文档,而是被切分后的知识块。chunking 看似只是文本切块,实际上是 RAG 中最影响召回效果的关键设计之一。

如果不切分,长文档无法直接成为高效检索单元,也无法在有限上下文窗口里被模型有效利用。切分的目的,本质上是把原始文本转换成适合检索、适合排序、适合阅读理解的知识单元。

1. 固定长度切分

固定长度切分是最常见也最容易实现的方式,通常按 token 数或字数把文本切成大小相近的块,比如每块 300 到 800 tokens。它的优点非常明显,简单、稳定、容易工程化,适合大规模离线处理。

但它的问题也同样明显。语义边界并不会因为 token 数到达某个阈值就自然结束。固定切分很容易把一个定义切一半,把一问一答拆开,把表格说明截断,导致每个 chunk 自身都不完整。对于模型而言,检索回来的是碎片;对于用户而言,看到的是似是而非的上下文。

2. 滑窗切分

滑窗切分是在固定长度基础上加入重叠区域的一种改进方案。它希望通过保留前后文重叠,降低语义被生硬截断的风险。

这种方式在很多场景下是有效的,尤其是段落边界不稳定或者文档结构较弱时,可以显著提升召回鲁棒性。但代价也很现实,重叠带来了冗余,冗余意味着更多存储、更高索引成本、更大召回噪声,以及后续上下文去重的额外复杂度。

因此,滑窗不是无脑增益项,它更像是在完整性与成本之间做一个折中。

3. 语义切分

语义切分试图按自然段、标题、小节、问答单元等语义边界来切块。相比固定长度,它更符合知识本身的组织方式,也更利于后续引用和用户阅读。

这类切分在制度、文档、FAQ、手册等场景里通常效果更好,因为它尽可能保留了一个知识单元的完整性。不过,它的前提是文档结构足够清晰,或者解析阶段已经较好地恢复了结构信息。否则所谓语义切分,很可能只是另一种不稳定的启发式规则。

4. 结构化切分

结构化切分是在语义切分基础上更进一步的方法。它不只是按段落切,而是按照文档层级结构切成章节、小节、段落甚至表格单元,强调保留原始文档的结构语义。

对于制度文件、技术手册、法律文书、API 文档这类高度结构化资料,它通常能提供更强的检索可解释性和上下文完整性。代价在于它高度依赖解析质量,也需要更复杂的索引设计。

chunk 并不是越小越好,也不是越大越好。太小会导致答案被切碎,太大又会稀释主题、增加噪声。真正重要的是找到适合业务场景的知识粒度。FAQ 适合问答对切分,制度文档适合按条款和章节切分,接口文档可能需要保留字段说明与示例代码的关联。chunking 不是预处理细节,而是知识表示设计。

(三)Embedding

如果说 chunk 决定了系统拿什么检索,那么 embedding 决定了系统如何理解这些 chunk。它的作用是把文本映射成高维向量,让语义相近的内容在向量空间中更靠近。

embedding 的价值在于,它能跨越字面差异识别语义相似。例如用户问忘记密码怎么办,文档写的是密码找回流程,两者虽然字面不同,但在语义空间中可能足够接近,从而被检索到。

这正是语义检索优于纯关键词检索的地方。但 embedding 也不是万能的。它通常擅长自然语言表达上的相似性,却不一定稳定处理错误码、版本号、产品型号、专有缩写、数字字段和强约束术语。这些内容在向量空间里未必能被很好地区分,甚至可能因为上下文语义相近而被错误聚合。

因此,在生产环境中,纯 embedding 检索很少是最佳方案。它适合作为语义召回基础,但通常需要与关键词检索、元数据过滤、重排序共同工作。

(四)Retrieval

检索是 RAG 的第一道门。模型再强,如果正确资料没有被找回来,它也无从发挥。很多 RAG 的失败,本质上不是生成问题,而是检索问题。

1. 稠密检索

稠密检索也就是 Dense Retrieval,核心是用 embedding 向量之间的相似度做检索。它最大的优势是能处理同义表达、自然语言改写和非精确措辞。在用户不会使用标准术语、问题表达不规范时,它通常比传统关键词搜索更鲁棒。

但它的边界也很明确。面对版本号、编号、术语、接口名、错误码等需要字面精确匹配的场景,向量相似度并不可靠。它很可能检索到主题差不多的内容,却不是用户真正要找的那一段。

2. 稀疏检索

稀疏检索的代表是 BM25,本质上仍是关键词匹配逻辑。它不懂太多语义,但对术语、编号、类名、字段名、产品型号之类强字面特征的查询非常稳。

在很多技术文档和企业知识场景里,BM25 的效果往往被低估。尤其当用户问题本质上是精确定位某条信息,而不是自然语言理解时,传统全文检索往往比纯语义检索更可靠。

3. 混合检索

真正的工程主流并不是在 Dense 和 Sparse 之间二选一,而是 Hybrid Retrieval。也就是把 BM25 的精确匹配能力和向量检索的语义泛化能力结合起来,再做排序融合。

混合检索之所以成为主流,不是因为它概念先进,而是因为企业知识本身就同时包含两类需求。一类是语义问答,另一类是精确查找。只用向量检索容易丢精确性,只用 BM25 又容易丢语义召回。把两者结合,系统的下限和上限都会更稳。

(五)Reranking

初次检索返回的只是候选集,不代表最终顺序就是最适合给模型的顺序。这也是为什么很多系统即使召回了一些看似相关的内容,最终回答仍然不准。问题不在有没有找到,而在找到之后排得对不对。

Rerank 的作用就是做第二阶段精排。通常做法是先用高效方法召回 Top-K 候选,再用 Cross-Encoder 或其他更强的相关性模型对 query 和候选文本做联合建模,重新排序。和仅靠向量距离相比,cross-encoder 往往能更细粒度地判断用户问题和文本是否真正匹配。

在企业问答里,rerank 往往是效果显著提升的一环。它的代价是增加计算和延迟,但如果场景对准确率要求较高,这笔成本通常是值得的。很多所谓效果一般的 RAG,本质上只是停留在粗召回层,没有走到精排层。

(六)Context Assembly

检索结果最终并不是直接展示给用户,而是要先被组装成模型可读的上下文。这一步经常被低估,但它实际上决定了模型最终能否正确利用检索结果。

上下文组装涉及很多具体问题,比如取多少条 chunk,是否做去重,是否按相关性排序,是否保留标题和页码,是否按来源分组,是否对长段落做压缩,是否优先保留权威来源,是否拼接原文引用。这里没有一个统一正确答案,不同业务会有不同策略。

一个很常见的误区是,以为给模型塞越多资料越安全。实际上并不是。过长上下文不仅会增加成本,还会引入噪音,稀释关键信息,让模型注意力分散,甚至把不同来源的内容混在一起导致错误归纳。

RAG 真正重要的不是多,而是准。少而准的上下文,通常比多而杂的上下文更容易得到高质量回答。

(七)Generation

经过前面的准备之后,最终才轮到模型生成答案。此时模型的角色已经不是唯一知识源,而更像一个阅读理解器和总结表达器。它负责理解问题、整合证据、做有限推理、组织语言,并在必要时说明证据不足。

这一点非常重要。很多团队在做 RAG 时,仍然把模型当作主角,把检索当作辅助。更合理的理解应该反过来:在企业知识问答里,证据才是主角,模型只是负责把证据变成更适合人阅读和使用的答案。


五、RAG 的底层原理

如果只从流程层面理解 RAG,很容易把它当成一个工程拼装系统。真正理解它为什么有效、为什么会失败,需要再往下一层,看到它在知识表示和检索机制上的本质。

(一)参数化知识 + 非参数化知识

传统大模型是典型的参数化知识系统。知识通过训练被压缩进参数,模型依靠这些参数完成语言建模和知识回答。RAG 则在这套系统之外引入了第二种知识形式,也就是非参数化知识:它存在于外部知识库中,不依赖模型参数更新就可以被管理、修改和检索。

这相当于把一个原本封闭的知识系统,改造成了一个开放式知识系统。模型负责语言能力和推理能力,外部检索系统负责提供最新知识、私有知识和可追溯证据。两者结合之后,模型不再需要记住一切,而是学会在需要时借助外部记忆。

(二)为什么向量检索能起作用?

向量检索的核心原理,是 embedding 模型在训练过程中学会了把语义相近的文本映射到相近区域。也就是说,语义结构被转译成了几何结构。

例如,申请退款、退钱怎么走、订单取消后多久退款,这几句话字面不同,但语义相似,因此在高维空间中会相互靠近。用户问题也会被编码成向量,然后在知识库向量中寻找最近邻,得到语义上最相关的候选内容。

它之所以有效,并不是因为向量本身神奇,而是因为 embedding 模型把复杂语言现象压缩成了一种可计算的相似度表示。这种表示不完美,但在很多自然语言场景里已经足够实用。

(三)为什么海量向量还能检索得很快?

理解这个问题,有助于明白为什么 RAG 能真正落地。如果知识库里有上百万甚至上千万个向量,逐个计算相似度显然成本太高。向量检索之所以可用,是因为底层通常不会做精确全量扫描,而是采用 ANN,也就是近似最近邻算法。

常见的索引结构包括 HNSW、IVF、PQ、ScaNN,以及 FAISS 提供的各种索引实现。它们的共同目标,是在可接受的精度损失下,显著提升检索速度。换句话说,向量数据库并不是魔法,而是通过近似搜索在速度和精度之间做了一次工程平衡。

这也解释了一个关键事实:RAG 中的检索并不是完美的,它从底层开始就是近似的。这个近似性会沿着整条链路继续传播。

(四)RAG 的本质

如果把 RAG 链路从头看到尾,会发现它并不是一个简单的先检索后生成过程,而是一个不断压缩、筛选和裁剪信息的过程。

文档解析会丢失版面信息,chunk 切分会打断上下文,embedding 会把原文压缩成向量表示,ANN 是近似搜索,Top-K 召回会舍弃长尾候选,rerank 继续收缩候选空间,而上下文窗口又迫使我们在有限 token 内继续裁剪信息。最终进入模型的,其实只是原始知识的一个经过多轮压缩后的子集。

所以,RAG 的本质不是把知识原样交给模型,而是在一系列工程约束下,尽可能让最关键、最可信、最适合回答的那部分知识进入模型视野。它是一个知识压缩与选择系统,而不是一个完美知识搬运系统。

(五)为什么 RAG 仍然会失败?

理解 RAG 的失败原因,往往比理解它的成功逻辑更重要。因为只有知道系统会在哪些地方出错,工程优化才有方向。

RAG 失败可能发生在任何一环。检索失败时,正确文档根本没被召回;切分失败时,答案被拆成几个互相孤立的碎片;排序失败时,相关内容在候选集中却排得太后;上下文污染时,旧版本和错误资料一起进入模型;生成失控时,模型即使看到证据也可能过度概括甚至自由发挥。

因此,RAG 绝不是加了检索就能一劳永逸地解决幻觉。它只是把问题从模型内部知识缺陷,转移成了一整条系统链路上的信息获取和使用问题。这个转移是有价值的,因为它让问题变得可工程化、可治理、可观测,但它并不会让问题自动消失。


六、RAG 的常见问题与优化方向

做过 RAG 项目的人,通常很快就会发现,系统的问题很少是单点故障,更常见的是连锁偏差。一个 query 改写得不好,会影响召回;召回不准会让 rerank 无米可炊;上下文组装不当会让模型忽略关键证据;而即使答案本身看起来合理,也可能因为权限或版本问题而不能上线。

因此,RAG 的优化不能只盯着某一个模型或某一类算法,而要按层次看待问题:知识准备层、检索层、生成层和系统层。下面把企业场景中最典型的坑逐一展开。

(一)召回不到:该找的内容没找回来

这是最常见,也是最容易让人误判的问题。很多时候知识库里明明有答案,系统却告诉你没有相关信息,或者返回一堆沾边但不命中的内容。

这通常不是一个单一原因造成的。可能是用户问题和文档表述方式不一致,比如用户说退款失败,文档写的是支付撤销异常处理流程;也可能是 chunk 切得太碎,真正的答案被拆散了;或者 embedding 模型对某些业务表达理解不足;再或者 top-k 太小,候选空间在第一轮就被截断。

这类问题的优化方向非常明确,但需要系统化组合使用。query rewrite 和 query expansion 可以缓解表达差异,混合检索能同时覆盖语义和关键词,适当提高召回 top-k 再结合 rerank 通常比只调向量模型更有效。对于复杂问题,还需要考虑问题分解和多轮检索,而不是期待一次检索命中所有证据。

(二)召回不准:检索回来了,但不是最相关的

相比完全召回不到,召回不准更隐蔽,因为系统看起来已经在工作了。用户问如何关闭自动续费,结果系统召回会员充值规则、支付说明、退款协议,看似都和支付相关,却没有真正命中操作路径。

这个问题的本质在于,语义相关不等于回答相关。向量相似度常常只能学到主题接近,却不一定能精准识别用户意图。再加上 chunk 中可能混有多个主题,没有 rerank 的系统就更容易把泛相关内容排在前面。

改善这一点,核心不是继续盲目扩大召回,而是让排序更懂意图。引入 reranker 是最直接的办法;同时,优化 chunk 纯度、补充标题与章节信息、引入 metadata filter,也能显著降低主题混杂带来的误召回。对于很短很模糊的问题,还需要在 query 入口做意图识别和标准化。

(三)chunk 切分不合理

RAG 很多问题表面上像检索问题,实际上是 chunk 问题。因为系统最终检索的是 chunk,而不是原文。如果 chunk 粒度设计不对,再先进的检索算法也只能在错误的知识单元上工作。

切得太小,定义和结论会分开,FAQ 的问答对会拆散,模型拿到片段却无法独立作答。切得太大,又会让一个 chunk 塞进太多主题,embedding 表示被稀释,检索相关性下降,还会浪费上下文窗口。

工程上比较稳妥的思路通常不是找一个万能 chunk 大小,而是按文档类型制定策略。FAQ、制度、接口文档、排障手册、本就应该有不同的知识粒度。很多效果提升并不来自更换模型,而是来自更尊重内容结构本身。

一个常用实践是父子块设计。检索时用较小的子块保证召回精度,返回上下文时回溯到较大的父块,兼顾命中率和完整性。这类设计往往比单一固定切分更稳。

(四)embedding 效果不稳定

embedding 模型选型常常被简化成排行榜比较,但真正落到业务里,稳定性才是核心问题。一个模型可能在通用 benchmark 上表现不错,却在你的业务术语、混合中英文、长文本说明、接口字段名场景里表现平平。

这种不稳定性很正常,因为 embedding 本质上是一种语义压缩表示,它对不同类型知识的表达能力并不均匀。尤其是专有词、缩写、型号、数字特征密集的领域,如果没有做术语标准化和领域适配,结果很容易大起大落。

实际项目里,比盲目追新模型更有效的,往往是围绕业务做一些朴素但关键的增强,比如术语归一、同义词映射、中英文分库、标题与正文分开编码,或者在垂直领域采用更适配的 embedding 模型。

(五)rerank 缺失或效果弱

很多团队在 PoC 阶段为了快速验证,只做一次向量 top-k 召回,然后直接把结果塞给模型。这种方案在小规模知识库或简单 FAQ 中可能够用,但一旦文档规模增大、表达复杂度提升,就很容易暴露出排序能力不足的问题。

向量检索更适合做粗召回,它负责把一批可能相关的候选拉回来;精确排序则通常需要更强的交叉建模能力。Cross-Encoder reranker 就是在这里发挥作用。它不仅能看 query,还能同时看候选文本,因此比仅靠独立向量距离更能理解匹配关系。

在高质量知识问答场景中,没有 rerank 的系统通常很难稳定上线。即使在线成本有限,也至少应该在高价值问题上做精排,而不是把所有精力都耗在第一轮召回模型上。

(六)上下文污染:检索到了错误或冲突内容

RAG 最大的风险之一,不是检索不到,而是检索到了错误、过时或相互冲突的内容,并且这些内容带着证据的外衣进入了模型上下文。

这种情况在企业知识库里并不少见。历史版本混乱、过期文档未清理、测试文档混入生产库、不同产品线材料交叉污染、FAQ 与正式制度不一致,都会让模型在看似有依据的情况下生成错误结论。

从工程上看,这不是模型问题,而是知识治理问题。版本、时间、来源、状态、产品线、权威级别,都应该成为基础元数据,并在检索前就参与过滤,而不是等模型来自己判断哪份更可信。模型可以辅助归纳冲突,但不能替代文档治理本身。

(七)生成阶段没有正确使用检索结果

很多人会默认认为,只要把相关资料喂给模型,它自然就会正确回答。实践中这并不成立。模型可能忽略检索结果,直接按常识回答;也可能看到了答案,却在组织语言时引入了原文没有的细节;或者因为上下文太长,关键片段被淹没,最终回答偏离证据。

这类问题通常和 prompt 设计、上下文排序、模型指令遵循能力以及上下文压缩策略有关。比较稳妥的方式,是在生成前先把证据结构化,让模型知道哪些是优先证据、哪些是补充信息,并明确要求依据上下文作答、证据不足时拒答或标注不确定性。

如果业务风险较高,可以采用两阶段生成:先抽取事实证据,再基于事实组织答案。这样做虽然会增加一些链路复杂度,但能显著降低模型自由发挥的空间。

(八)幻觉仍然存在

RAG 能降低幻觉,但不会彻底消灭幻觉。因为幻觉不只是知识缺失问题,它还与模型的生成机制、证据完整性、上下文冲突和用户问题边界有关。

即使检索到了相关内容,模型也可能补全原文未提及的细节;即使召回了多个片段,模型也可能在整合时擅自调和冲突;即使用户问题超出知识库范围,模型也可能为了显得有帮助而硬给一个答案。

企业场景中,真正重要的不是让模型永远不犯错,而是让它在没有依据时能够显式暴露不确定性,并给出证据引用。无依据就拒答、引用原文、区分已知与推断、对答案再做一层校验,这些措施往往比简单追求更大模型更有效。

(九)多跳问题、复杂推理问题效果差

RAG 非常擅长简单事实问答,但对跨文档整合、多跳推理、复杂比较类问题,效果往往会明显下降。原因并不神秘,因为这些问题不是靠一个 chunk 就能回答的,而是需要多份证据之间建立关系,再做推理或比较。

用户问两个方案在成本、延迟和适用场景上的差异,问某项制度是否适用于海外分公司员工,问某个错误码与特定配置项之间的关系,本质上都要求系统跨多个来源整合信息。这时,单轮检索加单轮生成往往不够。

解决思路通常包括问题拆解、多轮检索、GraphRAG、Agentic RAG,或者至少先抽取多份事实,再做综合分析。复杂问题的解决,往往意味着 RAG 从单次问答链路,演化成带规划能力的工作流。

(十)知识更新不及时

RAG 的优势之一是知识可更新,但这个前提成立的关键,不是理念,而是 ingestion pipeline 是否健全。现实中经常发生的是,新文档已经上传,索引却没有及时更新;旧文档仍留在向量库里;embedding 模型已经切换,老向量却没有重建;增量更新和全量重建之间产生不一致。

这种问题很工程,但也非常致命,因为它会直接伤害用户信任。系统明明号称基于最新文档回答,结果给出的是旧版本结论。用户很难从表面上区分这是模型错误还是数据延迟,但无论哪一种,都会把信任损失归到系统头上。

真正可上线的 RAG,一定需要有稳定的文档接入、变更检测、增量索引、失效删除、版本控制和重建策略。知识更新从来不是额外功能,而是主流程的一部分。

(十一)权限与安全问题

在企业里,权限问题不是附加约束,而是系统能不能上线的前提条件。很多团队在做 Demo 时会先把所有文档统一入库,等效果跑通后再补权限。这个顺序在生产环境里几乎注定出问题。

RAG 的权限风险比传统搜索更隐蔽,因为用户未必要看到原文,只要敏感 chunk 被检索进上下文,模型就可能在回答里归纳出本不该被暴露的内容。这意味着权限控制必须前置到检索阶段,而不是后置到展示阶段。

同时,还要考虑多租户隔离、prompt injection、retrieval injection、缓存和日志泄露、输出层敏感内容审查等一整套安全问题。RAG 把模型接入知识系统,也就把知识系统原本的安全边界暴露在了模型链路上。

(十二)成本和延迟高

RAG 是一个效果和成本都很容易膨胀的系统。embedding 需要算钱,向量库存储需要算钱,rerank 需要额外推理,大模型长上下文调用更昂贵,多轮检索和 agent 流程还会显著拉高延迟。

很多团队在初期只盯着准确率,等到真正上线时,才发现 QPS、响应时间、推理成本、缓存命中率都成了问题。高质量 RAG 不是简单叠模块,而是要根据价值密度做分层设计。FAQ 可以走缓存和直答链路,高价值复杂问题再走完整 RAG,大模型做最终生成,小模型承担 query rewrite 或 rerank,这种分工往往比一刀切更合理。


七、为什么有人认为 RAG 还不如普通模糊检索?

RAG 很火,但真正上线后,常常会收到一种并不意外的反馈:还不如直接搜文档。这句话听上去像是在否定 RAG,但很多时候,它恰恰指出了企业知识系统设计中最容易被忽视的问题。

(一)传统模糊检索为什么有时更强?

所谓普通模糊检索,通常指全文检索、BM25、站内搜索、关键词搜索以及带筛选条件的企业搜索引擎。它们并不时髦,但在很多场景下非常有效,尤其是当用户目标是精确定位某条信息,而不是让系统替自己总结时。

如果用户搜索的是错误码、接口名、字段名、类名、版本号、产品型号、合同编号、专有术语,这类查询天然偏向字面匹配。传统搜索在这里的优势非常明显,因为它能稳定找到包含这些关键字的原文片段,而语义检索反而可能因为主题相近而召回大量不够精确的内容。

此外,传统搜索结果通常更透明。标题、摘要、关键词高亮、作者、来源、时间、链接,这些信息让用户可以自己判断可信度和适用性。专业用户往往更愿意看到原文入口,而不是直接接受系统归纳后的结论。

(二)为什么很多 RAG 项目上线后,体验不如搜索?

1. 原因一:把语义检索神化了

很多团队在做 RAG 时,会不自觉地把语义检索想象成下一代搜索引擎,仿佛只要接入 embedding 和向量库,检索质量就会天然优于传统搜索。现实是,如果没有 hybrid retrieval、metadata filter、rerank、结构保留和来源治理,一个普通的 BM25 搜索系统很可能比初级 RAG 更稳。

语义检索擅长解决表达差异问题,但它并不天然理解业务边界、文档权威性和版本优先级。把它神化,最后常常会高估它的上限、低估它的失败场景。

2. 原因二:过度追求直接回答,忽视证据展示

很多 RAG 产品特别强调一问一答的流畅体验,试图让系统像一个真正懂业务的人一样直接给出答案。但企业知识场景中,用户关心的往往不只是答案本身,更关心答案来自哪里,引用的是哪篇文档,是否为最新版本,能不能点开原文确认。

如果系统只给一个自然语言答案,不给出处、不展示证据、不保留原文入口,用户就很难建立信任。一旦答案有偏差,用户对系统的失望也会比普通搜索更强,因为他失去了自主判断过程。

3. 原因三:知识库质量本身很差

这是一个非常朴素,但经常被忽略的现实。企业知识库常常并不干净。历史版本混乱、标题命名不规范、重复文档太多、权威来源不明确、测试资料和正式资料混在一起,这些问题平时在搜索里已经存在,只是用户还能靠经验勉强避开;一旦交给 RAG,系统会把这些问题自动放大,并且以更流畅的方式暴露出来。

换句话说,RAG 并不会自动修复糟糕的知识库,反而会更加依赖知识库治理质量。

4. 原因四:用错了场景

并不是所有知识访问需求都适合 RAG。有些场景本质上是查文档、找字段、定位原文、确认版本,这类需求更适合搜索。有些场景则需要跨文档整合、总结多个来源、自然语言问答、给出操作建议,这时 RAG 才真正发挥价值。

很多上线体验不如搜索的项目,不是 RAG 技术路线错了,而是把它用在了不该用的任务上。

(三)一个更平衡的判断

与其说 RAG 不如普通模糊检索,不如说它们解决的是不同层级的问题。搜索擅长找资料,RAG 擅长基于资料组织答案。成熟的知识系统通常不是二选一,而是两者协同:既保留搜索能力,也提供 AI 摘要;既给答案,也给引用;既支持直接问答,也允许用户切换回结果列表和原文阅读模式。

下面这张表,可以更直观地看出两者的适用边界:

八、权限问题

如果说效果决定 RAG 是否好用,那么权限决定 RAG 是否能上线。在企业环境里,权限不是一个边角问题,而是系统边界的一部分。很多 Demo 在内测阶段看起来效果很好,一到真实用户环境就必须重构,最常见的原因就是权限没设计进去。

(一)为什么 RAG 的权限风险更高?

传统搜索系统里的权限问题相对直观。用户打不开某篇文档,搜索结果里就不显示,或者点进去提示无权限。边界通常还算清晰。

RAG 的风险更高,是因为它不只是暴露文档入口,而是可能直接暴露文档内容的总结结论。用户不需要打开合同原文,也许只要问一句某客户最近合同折扣是多少,系统就可能在回答里把敏感信息总结出来。即使用户从未拥有原文访问权,系统也可能通过模型摘要间接完成泄露。

这意味着,RAG 的风险不是看不看得到文档,而是模型是否使用了本不该使用的知识。

(二)权限风险会出现在 RAG 的哪些环节?

1. 索引阶段

权限问题最早可以从索引阶段就埋下。很多高敏数据本就不该进入通用 RAG,包括未公开财务数据、HR 隐私文档、高敏会议纪要、草稿制度、内部讨论材料等。如果在接入阶段就没有做好数据分级和隔离,后面再补权限,只会越来越被动。

2. 检索阶段

最危险的错误做法,是先全库检索,再在展示层做权限过滤。因为即使你不把文档展示给用户,敏感 chunk 也可能已经进入模型上下文,模型仍然会在回答中泄露结论。

所以,权限过滤必须发生在检索之前,至少要在候选进入模型上下文之前完成。只有这样,模型才不会接触到越权知识。

3. 生成阶段

即使每个单独 chunk 看起来不算敏感,模型也可能通过组合多个片段,推导出原本不该暴露的结论。这类推断型泄露在传统搜索中不那么常见,但在 RAG 中非常值得警惕。

因此,高敏场景除了检索权限,还应考虑输出审计和敏感结论检测。

4. 日志与缓存阶段

很多团队会记录用户问题、检索结果、Prompt、模型回答、调试日志。这些数据如果没有按租户或权限隔离,同样会形成二次泄露。RAG 项目做得越深,日志与观测系统反而越可能成为新的风险源。

(三)企业级 RAG 的权限控制原则

1. 原则一:继承源系统 ACL

RAG 不应该重新发明一套权限体系,而应该尽量继承源系统的 ACL。谁在原系统里能看什么,RAG 就只能在这个边界内工作。这样做不是为了省事,而是为了避免出现并行权限体系带来的不一致。

2. 原则二:权限过滤必须前置到检索阶段

正确流程应该是用户认证、获取权限范围、在允许范围内检索、再做 rerank 和上下文组装,最后才进入模型。权限校验如果后置,就已经失去了意义。

3. 原则三:最小权限原则

用户只应访问完成任务所需的最小知识范围。这不仅是安全原则,也能顺便降低上下文噪音,提升答案质量。安全和效果在这里并不矛盾,很多时候反而是一致的。

4. 原则四:高敏数据不一定适合进入通用 RAG

不是所有知识都值得接入通用知识助手。高敏内容可能更适合独立隔离、脱敏后接入,或者根本不接入。系统边界的设计,有时比算法优化更重要。

5. 原则五:安全边界必须在模型之外

不要寄希望于 Prompt 里写一句不要泄露敏感信息,就能形成安全边界。大模型可以辅助安全控制,但绝不能承担最终防线。真正可靠的边界必须建立在模型之外,包括认证、ACL 校验、检索前过滤、缓存隔离、日志治理和输出审计。


九、Naive RAG

在理解复杂架构之前,先看最基础的 Naive RAG 很有必要。因为几乎所有 RAG 系统,都是从这个形态起步的。

(一)定义

Naive RAG 就是最经典、最直接的链路:用户提问,系统从知识库检索一些相关片段,把这些片段拼进 Prompt,再由大模型基于这些内容回答。它通常只有一条线性流程,没有太多中间模块,也没有复杂的纠错、路由和多轮检索机制。

(二)典型流程

离线阶段,系统会做文档清洗、chunk 切分、embedding,然后把向量存进向量库。在线阶段,用户问题被编码成向量,在库里检索 top-k 相似 chunk,随后直接拼接成上下文交给模型生成答案。

(三)特点

Naive RAG 的优点很明显。实现简单,开发速度快,适合做 PoC 和 Demo,对小规模知识库和简单 FAQ 场景往往足够有效。很多团队第一次验证价值,也确实应该从这里开始,而不是一上来就堆满复杂模块。

但它的问题也很集中。它默认一次检索就足够、默认向量 top-k 就近似正确知识、默认模型拿到片段就会正确使用。这几个默认在真实场景里往往都不成立。因此,一旦知识库规模扩大、文档类型复杂化、用户问题多样化,Naive RAG 的波动会很明显。

(四)适用场景

Naive RAG 适合内部 FAQ、小规模文档问答、简单客服知识库和快速验证阶段。它是很好的起点,但通常不是生产终点。

(五)本质问题

Naive RAG 最大的问题,不是简单,而是它把检索想得太简单。它默认知识获取是一次性的,默认检索结果是干净的,默认模型会听话。这种假设在 Demo 中经常成立,在生产环境里则经常失效。


十、Advanced / Modular RAG

当团队发现 Naive RAG 不够稳定时,通常不会立刻跳到 Agent 或图谱,而是先进入更现实的一步:把 RAG 拆成多个可优化模块。也就是大家常说的 Advanced RAG 或 Modular RAG。

(一)定义

Advanced 或 Modular RAG 的核心思想是,不再把 RAG 看成检索加生成两个步骤,而是把整条链路拆成多个模块,分别优化 query、召回、排序、上下文、生成和校验。这里的重点不在于术语差异,而在于一个认知转变:RAG 不是一个功能,而是一条流水线。

(二)典型模块

在检索之前,可以有 query rewrite、query expansion、意图分类和知识源路由。检索过程中,可以用 hybrid retrieval、metadata filter、多路并行召回。检索之后,可以做 rerank、去重、上下文压缩、父子块合并。生成前后,还可以做来源附加、幻觉校验、答案润色、fallback 拒答或转人工。

这些模块并不一定都要上,但模块化的价值在于,每一个环节都可以被单独观测、评估和替换。

(三)为什么它比 Naive RAG 强

因为它承认了一个现实:RAG 的问题大多不是模型不够聪明,而是给模型的知识不够准、不够完整、不够干净。Modular RAG 的重点,是系统性提升知识进入模型之前的质量。

这类架构之所以更适合企业场景,不是因为看起来更复杂,而是因为企业知识天然复杂。知识源异构、文档质量参差、权限严格、问题类型混合,如果没有模块化治理,很难在效果、成本和安全之间取得平衡。

(四)优点

Modular RAG 的主要优势,在于它把问题拆小了。你可以分别优化召回率、排序准确率、上下文利用率和答案可控性,可以对每个模块做 A/B Test,也更容易做指标观测和故障定位。从工程上说,它是把 RAG 从黑盒链路,逐渐变成了可治理系统。

(五)缺点

代价也很明确。链路更长、延迟更高、成本更高、调参更复杂,需要更成熟的数据治理和评估体系。很多团队从 Naive RAG 走向 Modular RAG 后,会明显感受到系统从玩具变成工程产品的那种复杂度跃迁。

(六)适用场景

只要是准确率有一定要求、知识库规模不小、文档结构复杂、需要上线给真实用户使用的场景,Modular RAG 几乎都是更合理的主流方案。企业知识库问答、客服助手、制度问答、内部 Copilot、API 文档问答,基本都在这个区间。

(七)和 Naive RAG 的本质区别

Naive RAG 的逻辑是检索一下,交给模型。Modular RAG 的逻辑是,检索不是一步,而是一整套可治理流程。两者区别不是多几个模块,而是对问题本质的理解发生了变化。


十一、GraphRAG

当文本检索链路优化到一定程度后,很多团队会遇到新的瓶颈:问题不是找不到相关文本,而是需要理解文本之间的关系。GraphRAG 正是在这种需求下出现的。

(一)定义

GraphRAG 是在 RAG 中引入图结构来组织知识和检索过程的一类方案。它不再只把知识表示为孤立的文本块,还会额外构建实体、关系、社区和子图,让知识形成一个结构化网络。

(二)为什么会出现 GraphRAG

纯文本 chunk 检索适合找相似内容,但对于关系型问题和多跳问题,往往显得吃力。例如 A 和 B 的关系是什么,某项政策影响哪些部门,某技术方案涉及哪些模块与依赖,这类问题需要跨文档连接多个实体和关系,而不是只找一个最相似段落。

GraphRAG 之所以出现,是因为很多真实问题本来就不是相似度问题,而是结构关系问题。向量相似检索可以帮助找到局部相关文本,但并不天然擅长组织全局关系。

(三)基本思路

离线阶段,系统会从文档中抽取实体、关系、主题和摘要信息,构建知识图谱或近似图结构。有些实现还会做社区发现、聚类摘要以及局部和全局摘要生成。

在线阶段,系统会先识别问题中的关键实体和主题,再在图中定位相关节点,扩展邻居或相关子图,最后把结构化证据和对应文本一起交给模型完成回答。

(四)GraphRAG 的优势

它最显著的优势,是天然适合多跳关系推理。相比只做最近邻搜索,图结构能沿着关系链展开,更适合组织架构、依赖拓扑、法规关联、供应链关系、代码依赖等问题。

此外,图结构还能更好地支持全局总结。通过社区或主题子图,系统可以回答这个系统整体架构是怎样的、这些资料主要在讨论哪些主题这类问题,而不只是返回一些局部片段。

(五)缺点

GraphRAG 的代价很高。构图本身就复杂,实体关系抽取质量直接决定上限,图更新比向量索引更新更麻烦,工程体系也明显更重。如果抽取错误,图结构反而会把错误关系放大。因此,它并不适合所有问题,也不应该被当成通用 RAG 的默认升级路线。

(六)适用场景

金融、法律、科研文献分析、组织关系分析、系统依赖拓扑、代码知识网络、多文档综合分析,这些场景更容易从 GraphRAG 中获得明显收益。它适合关系密度高、跨文档连接强的问题,而不是简单 FAQ。

(七)和 Modular RAG 的区别

Modular RAG 仍然主要围绕文本检索链路做优化,GraphRAG 则是在知识表示方式上做了升级。前者优化流程,后者改变知识组织结构。两者不是互斥关系,很多系统实际上会把图结构作为 Modular RAG 中的一种额外知识源。


十二、Agentic RAG

如果说 Modular RAG 代表的是流程可治理,那么 Agentic RAG 代表的就是流程可决策。它是近年来讨论非常多的一类架构,但也是最容易被过度期待的一类架构。

(一)定义

Agentic RAG 指的是让大模型像一个 agent 一样,自主决定是否检索、检索什么、检索几次、是否拆解问题、是否调用其他工具,以及何时停止并生成结果。它不再是固定流水线,而是一个带规划和决策能力的动态过程。

(二)与前面几类的本质差异

Naive、Modular、GraphRAG,大多还是系统预先定义好流程,用户问题进来后,按设定链路执行。Agentic RAG 则把一部分流程控制权交给模型,让它根据中间结果决定下一步动作。

例如面对一个复杂问题,agent 可以先判断一次检索不够,再把问题拆成多个子问题,分别检索远程办公制度、差旅报销制度、信息安全制度和海外员工适用范围,再做新旧版本对比,最后汇总出分析结果。这种行为已经接近一个研究助手,而不是单纯的问答系统。

(三)典型能力

Agentic RAG 通常具备任务分解、动态检索、工具调用、中间反思和最终整合等能力。它的价值不只是多检索几次,而是能够根据当前证据不足的地方主动补充信息。

(四)优点

它非常适合复杂任务、多跳问题、多知识源整合以及带约束的分析型任务。对于传统固定链路很难处理的问题,Agentic RAG 往往能显著提升覆盖能力。

(五)缺点

代价同样明显。延迟高、成本高、不确定性大、流程更不可控,评估难度也上升。Agent 可能过度思考、乱调工具、重复检索,甚至在本可以简单回答的问题上走出一条很长的链路。

在企业场景里,这种不可控性意味着更高的稳定性风险。你不仅要评估最终答案对不对,还要评估中间决策是否合理、是否越权、是否引入了不必要的外部依赖。

(六)适用场景

复杂研究助手、报告生成、跨系统知识整合、多步分析与决策支持,这些场景更适合 Agentic RAG。它不太适合高 QPS、强实时、低延迟、结果形式高度标准化的问答场景。

(七)与 Modular RAG 的区别

Modular RAG 的流程大多预定义,强调稳和可控。Agentic RAG 的流程动态决定,强调灵活和适应复杂任务。很多企业实践最后会收敛到一个比较务实的方案:简单问题走固定链路,复杂问题再升级到 agent 模式。也就是以 Modular RAG 为主,以 Agentic RAG 为辅。


十三、Self-RAG / Corrective RAG

在 RAG 架构继续演进的过程中,有两类思路越来越受到关注:一类强调让系统自己判断什么时候需要检索、当前证据够不够,也就是 Self-RAG;另一类强调如果检索效果不好,系统要有补救闭环,也就是 Corrective RAG。它们都在解决同一个核心问题:不要盲目检索,也不要盲目回答。

(一)Self-RAG

1. 定义

Self-RAG 更强调把自我判断能力融入生成过程。系统不是固定先检索后回答,而是让模型在生成过程中决定是否需要外部知识、是否需要继续检索、当前回答是否被证据支持、是否应该修正自己的输出。

2. 核心思想

它背后的思路很有代表性:RAG 不应该总是假设检索是必要的,也不应该总是假设一次检索就够。模型应该具备一种元认知能力,知道自己什么时候需要资料,什么时候证据不足,什么时候应停止生成而请求更多信息。

3. 优点

这种方式的灵活性很高,也可能减少不必要的检索调用,从而节省成本。对于开放域问答,它也有机会降低无依据回答的比例。

4. 缺点

但 Self-RAG 的落地门槛并不低。它往往依赖特定训练、特殊控制 token 或更复杂的推理控制机制。线上稳定性和解释性通常不如固定流程,评估也更难。对于大多数企业知识系统来说,它更像一个值得关注的方向,而不是默认主流架构。

(二)Corrective RAG

1. 定义

Corrective RAG 的重点没有那么理论化,它更偏工程闭环。核心思想是,如果初始检索结果质量不好,系统要能识别这一点,并采取补救动作,比如重写 query、切换搜索源、过滤噪声、重新检索。

2. 典型流程

用户问题进入后,系统先做一轮初始检索,再对检索结果质量进行判断。如果判断结果不佳,就触发纠错流程,可能重新改写问题、增加关键词、切换到 Web 搜索或另一套索引,再把新的结果送入生成阶段。

3. 重点

Corrective RAG 的价值在于,它承认初次检索并不总是可靠,并且愿意为此增加一个纠错回路。这种思路非常符合工程实践,因为很多真实失败案例,本质上都是初次检索质量不稳定导致的。

4. 优点

它通常比 Self-RAG 更容易工程化,也更适合逐步接入现有系统。对于明明有资料却没召回的问题,Corrective RAG 往往能明显提升鲁棒性。

5. 缺点

它的代价是流程更复杂、延迟和成本上升,而且你必须定义什么叫检索质量差。这个判定本身并不简单,往往需要结合召回分数、结果多样性、来源一致性甚至小模型判断。


十四、生产实践中的推荐方案

到这里,其实已经能看出一个很现实的结论:真正可用的 RAG,通常既不是最朴素的 Naive RAG,也不是最激进的 Agentic RAG,而是一套围绕业务场景做过权衡的分层方案。

对于大多数企业知识问答项目,我更推荐从一条可演进的 Modular RAG 主链路开始,先把文档解析、chunk 策略、混合检索、rerank、上下文组装、引用展示、权限前置、评估闭环这些基础打牢。只有当你明确发现复杂问题无法被固定链路很好处理时,再引入 GraphRAG 或 Agentic RAG 作为专项增强,而不是把它们当作默认架构。

一个相对稳妥的生产形态,往往是这样的:

这条链路背后的思路,不是为了让系统看起来功能很多,而是承认不同问题应该走不同路径。高频 FAQ 没必要每次都调用大模型,精确定位问题不应该强行走生成式问答,真正复杂的问题才值得使用更重的链路。

更进一步,如果你的系统面向的是企业内部用户,那么产品设计上最好不要把答案模式作为唯一出口。成熟系统通常会同时保留这几种能力:直接答案、引用证据、原文入口、搜索结果列表、版本与来源标注。这样用户既能享受到 AI 的效率,也不会完全失去判断权。


十五、一些容易被忽视的设计建议

讲了这么多架构和模块,最后想补充几条在实际项目里反复验证过的设计建议。这些建议未必新鲜,但往往比追逐新术语更重要。

第一,不要把知识库接入看成技术问题,它首先是知识治理问题。文档版本混乱、权威来源不明、过期内容未清理,这些问题不解决,再好的 RAG 都会受限。

第二,不要让 AI 答案成为唯一交互方式。对企业用户来说,答案、引用、原文入口、搜索切换应该同时存在。真正成熟的系统不是替用户做一切判断,而是让用户在 AI 帮助下更快完成判断。

第三,不要为了追求回答率而牺牲可信度。很多系统上线后最伤用户信任的,不是偶尔答不上来,而是看起来很自信地答错。企业知识系统宁可适度拒答,也不要用流畅语言掩盖依据不足。

第四,权限和安全要从第一天就进架构,不要等 Demo 成功后再补。越到后面,越难修。

第五,RAG 的优化顺序通常应该是:先修文档,再修 chunk,再修检索,再修 rerank,再修上下文,最后才轮到大模型和 Prompt。很多团队一开始就频繁换模型,结果始终不稳定,本质上是把优化顺序搞反了。


十六、总结

RAG 解决的,从来不是大模型够不够强的问题,而是大模型如何可靠地使用知识的问题。它把知识从模型参数中部分解耦出来,交给外部系统管理,再让模型基于证据完成回答。这种设计让我们第一次能够比较工程化地处理最新知识、私有知识、可追溯知识和权限隔离问题。

但也正因为如此,RAG 的真正难点从来不在单一模型上,而在整个系统上。文档解析、chunk 设计、embedding 选型、混合检索、rerank、上下文组装、生成控制、权限边界、日志治理、评估体系、成本延迟,这些环节任何一处处理粗糙,最终都会反映到用户体验上。

从架构演进的角度看,Naive RAG 适合起步,Modular RAG 是当前多数企业场景的主流形态,GraphRAG 适合关系密集和多跳场景,Agentic RAG 更适合复杂分析任务,Self-RAG 和 Corrective RAG 则代表着系统开始具备自适应和自纠错能力。它们并不是互相替代的线性关系,而更像是在不同问题复杂度下的不同工具箱。

如果要用一句更偏工程方法论的话来总结,那就是:RAG 不是一个模型能力问题,而是一个知识系统工程问题。谁能真正把知识治理、检索设计、生成约束、安全边界和产品交互串起来,谁才能把 RAG 从一个看起来很聪明的 Demo,做成一个真正可信、可控、可上线的生产系统。


~码文不易,留个赞再走吧~

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐