本文属于 RAG 工程框架中的「6 模块化架构与评估闭环」环节,聚焦「Modular RAG」方法。可先阅读 RAG-00.方法概述 再进入本篇。
原理
把 RAG 拆成可插拔模块,通过统一接口连接,支持 A/B 与灰度替换。
1 | flowchart LR |
模块划分建议
- 离线链路:清洗、切块、嵌入、索引。
- 在线链路:查询理解、召回、重排、生成、后处理。
- 观测链路:日志、评估、告警、回滚。
优缺。
- 优点:组件可替换;便于团队协作;可快速定位瓶颈。
- 缺点:系统边界多,接口设计要求高。
性能/资源
- 组件拆分后可独立扩缩容。
- 初期开发时延增加,但长期维护成本下降。
应用场景
- 中大型企业 RAG 平台。
- 需要频繁迭代模型/索引策略的团队。
统一合成数据示例
输入数据片段
1 | { |
中间结果(离线评测)
1 | { |
最终输出示例(上线决策)
1 | { |
原始发表与工程实现
- 代表性原始发表:模块化 IR+LLM 工程实践。
- 核心解决问题:解决可替换可演进架构。
- 成熟实现工具:Haystack, LangChain, LlamaIndex。
详细原理拆解
- 模块接口稳定化,支持组件替换、A/B 与回滚。
- 典型实现可拆为:输入预处理 -> 方法核心计算 -> 候选/证据构建 -> 生成与引用。
- 工程调优重点:质量(准确率/引用率)与成本(时延/token)的联合优化。
1 | flowchart LR |
工程落地扩展示例
伪代码
1 | class RagService: |
参数示例
1 | interface_version: rag.v2 |
常见失败案例
- 失败模式 1:模块间 契约不稳(字段名/引用格式变),上线即炸。
- 失败模式 2:只测单模块不测 端到端,接口内最优≠系统最优。
- 失败模式 3:回滚只切模型不切 索引版本,状态不一致。
Demo 数据带入计算示例
1 | 在固定 Reranker+Generator 下,仅替换 Retriever:recall@10 0.82→0.86,p95 820→860ms。 |