RAG 架构深度解析:从朴素到模块化
RAG 的三代演进
第一代:朴素 RAG (Naive RAG)
最基础的流程:Query → Embedding → 向量检索 → 拼接 Prompt → LLM 回答。
问题 → 向量化 → 向量检索 → Top-K 文档 → LLM 生成回答
问题:检索质量差、没有查询优化、不支持多轮对话。
第二代:进阶 RAG (Advanced RAG)
在朴素 RAG 基础上增加预处理和后处理环节:
- 查询改写:将口语转为书面语、分解复杂查询、生成假设回答(HyDE)
- 混合检索:向量 + 关键词(BM25)+ 元数据过滤 → RRF 融合排序
- 重排序(Rerank):用 Cross-Encoder 对 Top-K 结果精排
- 分块策略优化:递归分割、语义分块、小块检索+大块阅读(Small2Big)
问题 → 查询改写 → 向量检索 + BM25 → RRF 融合 → Rerank → Prompt → LLM
第三代:模块化 RAG (Modular RAG)
将 RAG 拆解为可组合的模块,每个模块可独立替换和编排:
- Search:向量搜索、BM25、图搜索、SQL 查询
- Routing:根据问题类型路由到不同检索策略
- Fusion:RRF、CC(倒数排名融合)、Score 加权
- Rewrite:查询重写、分解、扩展
- Verify:检索结果验证、相关性检查
RAG 检索的常见策略
| 策略 | 原理 | 适用场景 |
|---|---|---|
| 向量相似度 | 语义搜索,embedding 后余弦距离 | 泛化知识问答 |
| BM25 关键词 | TF-IDF 变体,精确定位术语 | 专业术语、代码、编号查询 |
| 混合检索 | 向量+BM25 融合(RRF/加权) | 通用场景(取长补短) |
| HyDE | 先生成假设回答,再检索 | 查询简短但意图复杂的场景 |
| Self-RAG | LLM 自评估是否需要检索 | 减少不必要检索,节省成本 |
分块策略
- 固定大小分块:每 N 个 token 一刀切,简单但可能切断语义
- 递归字符分割:按段落→句子→短语层次切分,保留语义完整性
- 语义分块:检测内容边界(如换行、标题、主题变化)作为断点
- Small2Big:检索小块的向量,返回大块上下文(兼顾精度和上下文丰富度)
查询优化技术
- 查询分解:将复杂查询拆为多个子查询分别检索
- 查询扩展:用同义词、翻译、相关术语扩展查询
- 假设文档嵌入 (HyDE):先让 LLM 生成假设回答,用它做检索
- 多轮合并:将历史对话与当前问题合并成一个自包含查询
RAG 评估指标
- 检索质量:Recall@K、Precision@K、MRR、NDCG
- 生成质量:Faithfulness(忠实度)、Answer Relevance、Context Relevance
- 端到端:人工评分、LLM-as-a-Judge、RAGAS 框架