系列导航:这是"无训练型检索增强生成(RAG)经典架构梳理"系列的第二篇。 本系列路线:① Naive RAG 基线(T0)→ ② Modular RAG 图纸(F0,本篇)→ ③ 查询侧增强(T1)→ ④ 动态检索(T2)→ ⑤ 检索后治理(T3)→ ⑥ 边界讨论 → ⑦ 评价指标 → ⑧ 横向对比总表。 上一篇我们知道了 Naive RAG 的骨架是"检索 → 拼接 → 生成",也知道它最大的软肋是对检索质量完全不设防。但动手之前得先有图纸——否则你根本说不清自己改的是哪一块。
摘要:从 2020 到 2024 年,业界往 RAG 里塞进了几十种技巧:查询改写、多路检索、重排序、上下文压缩、混合检索……问题是这些技巧散落在几十篇论文里,谁也说不清它们彼此是什么关系。Modular RAG(Yunfan Gao 等,2024)做的事不是提出一个新算法,而是给出一套"模块 + 算子 + 编排"的共同语言,把 RAG 系统变成可以随意拆装的乐高。本文讲清它的三大模块、三种编排机制和六种流模式,并说明它对"无训练型 RAG"这个主题的特殊意义:它划定了无训练改造的全部合法空间。
关键词:Modular RAG、模块化 RAG、F0 框架层、算子、路由、调度、融合、RAG Flow、无训练
一、它要解决什么问题:RAG 患上了"补丁肥胖症"
上一篇我们列过 Naive RAG 的五个坑:检索是一锤子买卖、从不问该不该查、噪声文档进 prompt、切块破坏语义、做不了多跳。于是全世界开始了同一场运动——打补丁:
- 检索查不准?那就改写一下问题再查(Query Rewriting)。
- 还是不准?那就一次生成好几个问题分头查,再把结果合并(多路检索)。
- 结果排序不好?加一个重排序模型把最相关的排到前面(Rerank)。
- 上下文太长?压缩一下再喂给模型(Compression)。
- 关键词和语义各有所长?那就两个一起用(混合检索)。
每一个补丁单独看都有效,但放在一起就乱了。Modular RAG 这篇论文一针见血地指出了三个麻烦:
- 没有共同语言。同一个技巧在不同论文里叫不同名字(查询改写、查询扩展、HyDE 本质上都在改查询),新手根本不知道它们是同一类东西。
- "检索-然后-生成"这个说法装不下了。加了循环、加了分支、加了判断之后,流程早就不是一条直线,一个短语已经描述不清。
- 工程上没法替换和诊断。效果差了,你不知道该换哪个零件,只能整体重写;别人的系统你也没法照着复现。
打个比方:以前的 RAG 像一辆焊死的车,坏了只能整车回厂;Modular RAG 想给这个行业出一本零件目录 + 工位手册,让每个人都能指着图纸说"把第 3 号零件换成第 7 号"。
二、工作流程:三个车间加一个调度室
Modular RAG 把整个系统拆成三大模块(Module)加一层编排(Orchestration):
┌──────────── 编排层 Orchestration ────────────┐ │ Routing 路由:这个问题该走哪条管道? │ │ Scheduling 调度:要不要再查一轮?何时停? │ │ Fusion 融合:几条管道的结果怎么合并? │ └──────────────────────────────────────────────┘ ▲ 统一指挥 用户提问 │ ▼ 【车间一】索引 Indexing ── 决定"书怎么摆" 切块 → 向量化 → 建索引(可加摘要、元数据、图谱、混合索引) │ ▼ 【车间二】检索 Retrieval ── 决定"怎么找" 检索前:改写/扩展/分解问题 ← T1 查询侧增强在这 检索中:稀疏(BM25) / 稠密(向量) / 混合 检索后:重排序 Rerank、压缩 Compression、挑选 Selection ← T3 在这 │ ▼ 【车间三】生成 Generation ── 决定"怎么答" 选生成器 → 组织提示词 → 生成 → (可选)验证与引用标注 │ ▼ 答案 ────(不满意?回到调度层,再来一轮)请注意最后那个回环箭头:这正是 Modular RAG 和上一篇 Naive RAG 最本质的区别——Naive RAG 是一条单向直线,Modular RAG 允许回头、允许分叉、允许绕路。
图中我已经顺手标了两个位置:T1 在"检索前",T3 在"检索后"。从第三篇开始,每读一个新方法,你都可以先问一句"它落在哪个格子",思路会清晰很多。
三、核心机制拆三个点
关键点一:模块(Module)与算子(Operator)——两级抽象
这是全篇最重要的概念,但极其好懂:
- 模块= 车间 / 工位,回答"这一段流程在干什么"。只有三个:索引、检索、生成。
- 算子= 工位里可替换的具体工具,回答"这一步具体怎么做"。
比如"检索"这个模块里,可以插进这些算子:查询改写、查询扩展、多路召回、混合检索、重排序、上下文压缩、文档过滤。换算子不改模块:你想把"重排序"从 A 模型换成 B 模型,别的部分一行代码都不用动。
这套两级抽象带来的最大好处是可插拔与可诊断:效果不好时,你可以逐个替换算子做对照实验,而不是把整个系统推倒重来。
关键点二:三个车间各有哪些常用算子
模块 | 阶段 | 常用算子(举例) |
索引 | — | 固定切块、Small2Big(小块检索、大块回喂)、滑动窗口、摘要索引、元数据挂载、知识图谱索引、混合索引 |
检索 | 检索前 | 查询改写、查询扩展、查询分解(拆成子问题)、HyDE(先生成假答案再去检索) |
检索 | 检索中 | 稀疏检索(BM25,靠词频)、稠密检索(向量)、混合检索(两者都查) |
检索 | 检索后 | 重排序 Rerank、上下文压缩、文档选择 / 过滤 |
生成 | — | 生成器选择、提示词组织、结果验证、引用标注 |
看到这张表你大概会恍然大悟:原来那些看起来五花八门的 RAG 技巧,全都只是某个格子里的一个算子而已。这就是 Modular RAG 最大的价值——它把知识从"一堆散点"变成了"一张表格"。
关键点三:编排三件套——真正超越线性架构的地方
只有模块不算新鲜,真正让 Modular RAG 超越"检索-生成"直线的是编排层的三个机制:
- Routing(路由):问题进来先看一眼,再决定走哪条管道。比如闲聊直接答、时效问题走联网搜索、结构化问题走数据库查询。它解决了"不该检索时就别检索"。
- Scheduling(调度):决定什么时候检索、检索几轮、什么时候停。这一步把"一次检索定终身"变成了"可以迭代的过程",也是后面T2 动态检索(FLARE、DRAGIN、ITER-RETGEN)能成立的前提。
- Fusion(融合):几条管道各查各的,结果必须合并。最经典的做法是RRF(Reciprocal Rank Fusion,倒数排名融合):不去纠结各路的分数怎么比,而是按"排名越靠前得分越高"来加权合并,简单又稳健。第三篇会详细讲它。
一句话总结这三件套:路由决定走哪条路,调度决定走几遍,融合决定多条路的结果怎么并。
四、六种流模式:论文的精华,以及它好在哪、局限在哪
论文把常见系统的流程抽象成若干流模式(RAG Flow),其中摘要明确归纳了四种(线性、条件、分支、循环),图中还展示了递归、自适应等变体:
- 线性 Linear:检索一次 → 生成一次。这就是第一篇讲的 Naive RAG——所以 Naive RAG 不是被推翻了,而是被"收纳"成了 Modular RAG 的一个最简特例。
- 条件 Conditional:先判断,再选管道。典型是路由:问题分类型,走不同检索器(对应 Routing)。
- 分支 Branching:多条管道并行查(比如同时改写出三个问题分头检索),最后融合结果(对应 Fusion)——第三篇的 Multi-Query + RRF 就是它。
- 循环 Looping:检索 → 生成 → 再评估 → 再检索。第四篇的 T2 动态检索(FLARE、DRAGIN、ITER-RETGEN)就是它。
- 递归 Recursive:把复杂问题拆成子问题,一层层往下查,用上一层的答案做下一层的检索条件——多跳问答靠它。
- 自适应 / 调优 Adaptive:根据反馈自动调整阈值或策略,第五篇 MAIN-RAG 的自适应过滤阈值就有这个味道。
比上一代好在哪:它提供了统一坐标系,让每篇新论文都能被精确定位("这个方法在改检索后处理算子 + 循环流");工程上可插拔、可复现、可诊断;学术上把循环与分支合法化,为后面的动态检索与结果治理铺好了路。
局限在哪(同样要清醒):
- 它只给目录,不给答案。你的场景该选哪组算子?论文不告诉你,全靠实验。
- 组合爆炸:算子几十种,两两组合成千上万,穷举不现实。
- 缺乏自动搜索与统一评测:目前选组合基本还是经验活。
- 框架本身不产生新能力,效果上限取决于你挑的算子,选错了照样差。
五、它为什么属于"无训练型"
严格说,Modular RAG 不是某一个方法,而是一套框架 / 范式,它压根不涉及训练任何模型参数。用本系列统一的训练部位三分法来判定:
部位 | Modular RAG | 说明 |
生成器 | 冻结 | 框架不要求改动生成器,选谁都行 |
检索器 | 冻结 | 框架不要求改动检索器,选谁都行 |
判别器 / 分类器 | 无(可选) | 框架本身不引入,但你可以往里插一个训练型的重排器或分类器 |
判定结论:框架本身是纯无训练的,准确说法是"训练无关(training-agnostic)"——训练与否由你选择的算子决定,框架不干涉。
更具体地说:
- 绝大多数算子都是外部过程:切块是字符串操作,融合是一行排序公式,改写和重排只需要调用一个现成的模型(参数冻结、原样使用),压缩只是裁剪文本。整个过程不更新任何权重。
- 它是中立的:框架允许你把训练型算子插进去,比如微调一个 reranker、微调检索器。
这对我们这个系列特别重要:第一篇说过,无训练型 RAG 的改造位置是"检索侧、流程侧、提示词"。Modular RAG 正好把这句话落成了图纸——索引车间、检索车间、生成车间、编排层,就是无训练改造的全部合法空间。后面 T1 到 T4 的每一类方法,全都是在这张图纸的某个格子里放了一个新算子。
六、一个能记住它的类比:乐高,和中央厨房
类比一:乐高。
- Naive RAG = 一个出厂就粘死的成品模型,坏了只能整体换。
- 模块 = 零件大类(砖块 / 轮子 / 齿轮)。
- 算子 = 大类里具体的那一块零件(2×4 的红砖、带齿的黄轮)。
- 编排 = 拼装说明书:先拼哪一步、要不要重复、几套组件怎么接到一起。
- Modular RAG = 一盒散装乐高 + 一本说明书,人人都能照着图纸改。
类比二:中央厨房。洗菜、切菜、炒菜、装盘是几个工位(模块),每个工位有不同的工具(算子):切菜可以切丝、切片、切丁。而调度员站在中间喊:"这道菜没熟,回锅再来一轮"(Scheduling);"这桌客人要清淡,走清淡那条线"(Routing);"两个灶同时出的菜,装一个盘子"(Fusion)。
七、小结与下一篇预告
这一篇我们只要记住三件事:Modular RAG 是把 RAG 拆成"模块 + 算子 + 编排"的通用语言;Naive RAG 被收纳成了它的最简特例(线性流);它本身不涉及训练,是无训练改造的"图纸",划定了全部合法空间。
有了这张图纸,下一篇终于可以往格子里放真正的零件了。我们进入T1 查询侧增强,读一篇反直觉的论文:HyDE(arXiv 2212.10496)——它说,别拿问题去检索,先让大模型凭空编一篇"假答案",拿这篇假答案去检索真文档。听起来离谱,效果却出奇地好,而且一个参数都不训练。同一格里还有更朴素的Multi-Query + RRF:把问题改写成几个角度分头查,再按排名融合。
📊 本篇指标卡(系列统一字段,八篇汇总即对比矩阵)
维度 | 本篇:Modular RAG |
类型归属 | F0 编排框架层 |
训练依赖(生成器 / 检索器 / 判别器) | 冻结 / 冻结 / 无(框架本身不涉及训练,但允许插入训练型算子,故称 training-agnostic) |
改造位置 | 全部:索引 · 查询 · 检索时机 · 检索结果 · 生成——它不改造任何一环,而是给所有环节提供图纸 |
额外开销 | 不固定,取决于所选算子组合 |
是否需白盒访问 | 否 |
论文报告指标 | 无(框架类论文不报指标) |
抗噪性 | 取决于所选算子:接入过滤 / 重排算子则强,只走线性流则弱 |
拒答能力 | 取决于是否接入路由或条件流 |
适用边界 | 任何 RAG 系统——它是描述语言,不是具体方法;选型答案需要靠实验 |
附:本篇术语小抄
术语 | 一句话解释 |
Module(模块) | RAG 流程中的一个大阶段:索引 / 检索 / 生成 |
Operator(算子) | 模块内部可替换的具体做法,如重排序、查询改写 |
Orchestration(编排) | 指挥模块之间怎么配合:路由、调度、融合 |
Routing(路由) | 按问题类型选择不同的处理管道 |
Scheduling(调度) | 决定检索几轮、何时停止、何时回头 |
Fusion(融合) | 把多路检索结果合并成一份,如 RRF 倒数排名融合 |
Rerank(重排序) | 用更精细的模型把粗检索结果重新排序 |
Compression(压缩) | 裁剪掉无用文字,让上下文更短更纯 |
混合检索 | 关键词检索(BM25)与向量检索同时进行 |
递归检索 | 把复杂问题拆成子问题,逐层往下查(多跳问答) |
training-agnostic | 框架不规定训不训练,由你插入的算子决定 |
🗺️ 本系列的类型地图(后续各篇都按这个坐标定位)
代号 | 类型 | 核心命题 | 代表方法 | 开销 |
T0 | 基线型 | 先查再答 | Naive RAG(第 01 篇) | 1× |
T1 | 查询侧增强 | 把问题变得更可检索 | HyDE、Multi-Query + RRF | 1~2× |
T2 | 动态检索 | 由模型决定何时检索、检索几轮 | FLARE、DRAGIN、IRCoT、ITER-RETGEN | 1.5~4× |
T3 | 检索后治理 | 取回的文档先筛一遍再喂 | MAIN-RAG、现成 Reranker | 1.5~(K+2)× |
T4 | 知识组织(索引侧) | 换一种方式存知识 | RAPTOR、Small2Big、GraphRAG | 离线贵,线上 ≈1× |
F0 | 编排框架层 | 给所有零件提供拼装图纸 | Modular RAG(本篇) | — |
一句话串起来:无训练型 RAG 能动手的地方只有检索侧与流程侧,模型内部动不了——所以按"改造位置"分类,比按时间罗列论文更能看清这一类方法的本质。
版权声明:本文为原创学习笔记,转载请注明出处。系列标签:#RAG #检索增强生成 #Modular RAG #大模型 #论文精读 #无训练RAG #课程笔记上一篇:从零开始学无训练 RAG(一):RAG 到底在解决什么问题?——Naive RAG 基线(T0)与 Lewis et al. 2020 的原始思想下一篇预告:HyDE(arXiv 2212.10496)与多路检索 —— 别用问题去检索,先用假答案去检索