01.2 - RAG 系统架构总览
定位: RAG 系统的"蓝图"——理解 RAG 从简单到复杂的架构演进以及核心设计决策 面试高频度: ⭐⭐⭐⭐⭐ 考查方式: 架构设计、系统演进理解、模块选择
一、这是什么?为什么需要它?
是什么
RAG 系统架构是描述 RAG Pipeline 各组件及其交互关系的顶层设计。它能帮助我们:
- 理解系统边界:哪些模块负责什么,输入输出是什么
- 做出设计决策:在质量、延迟、成本之间做权衡
- 定位问题瓶颈:系统出问题时快速定位到具体模块
为什么需要架构思维?
RAG 看起来简单(检索+生成),但实际生产系统中会有大量"看起来都对但效果不好"的问题:
"为什么 RAG 回答了我的问题但引用了不相关的来源?"
-> 可能是检索 Top-K 中混入了噪声
-> 可能是 Embedding 模型对领域术语理解不够
-> 可能是 Prompt 模板没有排序检索结果
没有架构视角,就只能盲目调参。
有架构视角,就能从模块边界定位问题。二、原理拆解
2.1 Naive RAG 架构(基准架构)
最基本的 RAG 架构,也是所有优化方案的起点:
+------------------------------------------------------------------+
| Naive RAG 架构 |
| |
| 索引阶段(离线): |
| +----------+ +----------+ +----------+ +---------+ |
| | 原始文档 |--> | 文本分块 |--> |Embedding |--> | 向量存储 | |
| | PDF/Web | | Splitter | | Model | |Database | |
| +----------+ +----------+ +----------+ +---------+ |
| |
| 推理阶段(在线): |
| +----------+ +----------+ +----------+ +---------+ |
| | 用户查询 |--> |查询向量化 |--> | 向量检索 |--> |LLM 生成 | |
| | | | (同模型) | | ANN搜Top-K| | + K块拼接| |
| +----------+ +----------+ +----------+ +---------+ |
| |
| 特点:简单直接、易于实现、适合快速验证 |
| 局限:无检索优化、无重排序、无查询转换 |
+------------------------------------------------------------------+核心代码(LangChain,约 10 行):
python
from langchain.chains import RetrievalQA
qa = RetrievalQA.from_chain_type(
llm=llm,
retriever=vectorstore.as_retriever(search_kwargs={"k": 3}),
return_source_documents=True
)
result = qa.invoke({"query": "问题"})2.2 Advanced RAG 架构(增强架构)
在 Naive RAG 前后增加优化环节,是生产中常用的架构:
+------------------------------------------------------------------+
| Advanced RAG 架构 |
| |
| 用户查询 |
| | |
| v |
| +------------------+ |
| | Pre-Retrieval | <-- 检索前优化:让查询更有效 |
| | 查询转换 | |
| | - HyDE | 假设文档嵌入:查询 -> LLM造伪文档 -> 向量检索 |
| | - Multi-Query | 多查询生成:把一个问题拆成多个角度分别检索 |
| | - Step-back | 后退提问:从具体问题后退到更抽象的问题 |
| | - Query Routing | 查询路由:判断需要检索还是直接回答 |
| +------------------+ |
| | |
| v |
| +------------------+ |
| | 向量检索 (ANN) | |
| | 返回 20-50 个候选 | <-- 第一轮粗筛,用低精度高召回率 |
| +------------------+ |
| | |
| v |
| +------------------+ |
| | Post-Retrieval | <-- 检索后优化:精炼检索结果 |
| | - Reranking | 用 Cross-Encoder 重排序 Top-k |
| | - Hybrid Search | 向量+关键词混合,互相补足 |
| | - Context Filter | 按元数据/时间/权限过滤检索结果 |
| | - Compression | 压缩/提取关键信息,减少噪声 |
| +------------------+ |
| | |
| v |
| +------------------+ |
| | LLM 生成 | |
| | + 排序后的 Top-K | |
| +------------------+ |
| |
| 特点:检索质量显著提升、可插拔优化模块 |
| 成本:增加延迟(Reranking 约 50-200ms)和复杂度 |
+------------------------------------------------------------------+优化效果量化对比:
| 优化方案 | 检索召回提升 | 延迟增加 | 适用场景 |
|---|---|---|---|
| 仅向量检索 | 基线 | 基线 | 简单问答 |
| + HyDE | +10-20% | +200-500ms | 短查询/表述差异大 |
| + Multi-Query | +15-25% | +300-800ms | 复杂查询/多角度问题 |
| + Reranking | +20-35% | +50-200ms | 检索结果噪声多 |
| + Hybrid Search | +15-30% | +50-100ms | 专有名词/代码检索 |
| + 全部优化 | +40-60% | +600ms-1.5s | 高质量生产系统 |
2.3 Modular RAG 架构(模块化架构)
当前 RAG 架构的最新范式,强调组件的可组合性和灵活性:
+------------------------------------------------------------------+
| Modular RAG 架构 |
| |
| +------------------+ |
| | 路由层 (Router) | <-- 决定如何路由每个查询 |
| | - 意图识别 | |
| | - 查询分类 | |
| +--------+---------+ |
| | |
| +-------+--------+--------+--------+ |
| | | | | |
| v v v v |
| +--------+ +-----------+ +------+ +------+ |
| |向量检索 | | 图检索 | |Web搜 | |直答 | <-- 多种搜索/回答方式 |
| |(Vector) | | (Graph) | |(Web) | |(QA) | |
| +--------+ +-----------+ +------+ +------+ |
| | | | | |
| +-------+--------+--------+--------+ |
| | |
| v |
| +------------------+ |
| | 融合层 (Fusion) | <-- 多路结果融合 |
| | 合并/去重/排序 | |
| +------------------+ |
| | |
| v |
| +------------------+ |
| | 生成层 (Gen) | |
| | 增强 Prompt 生成 | |
| +------------------+ |
| | |
| v |
| +------------------+ |
| | Agent层(可选) | <-- 多轮交互/自我反思 |
| | 记忆/规划/工具 | |
| +------------------+ |
| |
| 特点:高度灵活、可定制、适合复杂场景 |
| 成本:架构复杂度高、调试和维护成本高 |
+------------------------------------------------------------------+典型的路由策略:
python
# 查询路由的伪代码逻辑
def route_query(query: str) -> str:
intent = classify_intent(query) # 分类查询意图
if intent == "factual":
return "vector_search" # 事实性问题 -> 向量检索
elif intent == "relational":
return "graph_search" # 关系型问题 -> 图检索
elif intent == "realtime":
return "web_search" # 实时信息 -> 网页搜索
elif intent == "greeting":
return "direct_answer" # 问候 -> 直接回答
else:
return "hybrid_search" # 默认 -> 混合检索2.4 三种架构对比总结
| 维度 | Naive RAG | Advanced RAG | Modular RAG |
|---|---|---|---|
| 复杂度 | 低 | 中 | 高 |
| 检索质量 | 基线 | 中高 | 高 |
| 延迟 | 低 | 中 | 中高 |
| 灵活性 | 低(固定流程) | 中(可插拔优化) | 高(可编排) |
| 维护成本 | 低 | 中 | 高 |
| 适用场景 | 快速验证/PoC | 生产系统 | 复杂业务/多模态 |
| 典型用户 | 个人开发者 | 初创团队 | 大型企业 |
三、图解全景
RAG 系统的完整 Pipeline(含数据流)
离线索引阶段
=============
+----------+
+----------+ +----------+ +--------+ |向量数据库 |
| 文档加载 | | 文本分块 | |Embedder| | +-----+ |
| PDFLoader |--->| Recursive |--->| BGE |->| |Chunk|..|
| WebLoader | | 256/64 | | E5 | | +-----+ |
+----------+ +----------+ +--------+ +----------+
^
在线推理阶段 |
============= |
+----------+ +----------+ +--------+ |
| 用户输入 | | 查询转换 | |Embedder| |
| "..." |--->| HyDE |--->| (同模型)|-----+
+----------+ +----------+ +--------+
|
+----v----+ +----------+
| 向量检索 | | 重排序 |
| ANN搜索 |--->|Reranker |
| Top-100 | | Top-3 |
+---------+ +----+-----+
|
v
+----------+ +----------+
| Prompt | | LLM 生成 |
| 组装 |--->| 回答+引用 |
+----------+ +----------+架构选择决策树
你要构建的 RAG 系统需要什么?
+-- 快速验证一个想法?
| -> Naive RAG(几天内搭建完成)
|
+-- 生产系统,需要稳定可靠?
| -> Advanced RAG + Reranking(核心优化)
|
+-- 需要处理多种数据类型?
| -> Modular RAG + Router(灵活路由)
|
+-- 需要多轮交互/推理?
| -> Agentic RAG(见进阶板块)
|
+-- 需要处理复杂的实体关系?
-> Graph RAG(见进阶板块)四、实战验证
4.1 体验三种架构的代码递进
python
# 层级 1:Naive RAG
from langchain.chains import RetrievalQA
qa_v1 = RetrievalQA.from_chain_type(
llm=llm,
retriever=vectorstore.as_retriever(search_kwargs={"k": 3}),
)
# 层级 2:Advanced RAG - 加入 Reranker
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import CrossEncoderReranker
compressor = CrossEncoderReranker(
model_name="BAAI/bge-reranker-v2-m3"
)
retriever_v2 = ContextualCompressionRetriever(
base_compressor=compressor,
base_retriever=vectorstore.as_retriever(search_kwargs={"k": 20})
)
qa_v2 = RetrievalQA.from_chain_type(llm=llm, retriever=retriever_v2)
# 层级 3:Modular RAG - 路由 + 多路检索
# 使用 LangChain 的 RouterChain
from langchain.chains.router import MultiRetrievalQAChain
qa_v3 = MultiRetrievalQAChain.from_retrievers(
llm=llm,
retriever_infos=[
{"name": "技术文档", "description": "技术相关", "retriever": tech_retriever},
{"name": "公司政策", "description": "制度和HR", "retriever": policy_retriever},
],
default_retriever=vectorstore.as_retriever()
)4.2 架构质量对比实验
bash
# 用相同数据集对比不同架构的 RAGAS 分数
# 安装:pip install ragas
# 1. Naive RAG 评估
# 2. Advanced RAG(+Reranker)评估
# 3. Advanced RAG(+HyDE + Reranker)评估
# 典型的评估结果趋势:
# Naive RAG: faithfulness=0.72, relevancy=0.68
# +Reranker: faithfulness=0.81, relevancy=0.76
# +HyDE: faithfulness=0.84, relevancy=0.79
# 两者全加: faithfulness=0.87, relevancy=0.81五、面试视角
| 问题 | 答案要点 |
|---|---|
| Naive RAG 的主要缺陷是什么? | 1) 无查询优化,短查询/歧义查询效果差;2) 无重排序,Top-K 中可能混入噪声;3) 单次检索,不支持多步推理;4) 无反馈机制,无法自我纠正 |
| Reranking 为什么有效? | 向量检索用 Bi-Encoder(查询和文档独立编码,速度快但精度有限);Reranker 用 Cross-Encoder(查询和文档一起编码,速度慢但精度高)。组合使用兼顾效率与精度 |
| HyDE 解决了什么问题? | 查询和文档的表述方式不同(尤其短查询),导致向量距离不准确。HyDE 用 LLM 生成一个"伪文档",让查询->伪文档->检索,缩短语义差距 |
| Modular RAG 相比 Advanced RAG 的优势? | Modular RAG 把各模块解耦,可以灵活组合、替换、编排;支持路由决策(不同查询走不同路径);更容易扩展(加入图检索、Web 搜索等新模块) |
| 生产环境 RAG 首选架构?为什么? | Advanced RAG + Reranker。它在质量、延迟、复杂度之间取得了最佳平衡。Naive 质量不够,Modular 过度设计 |
| 如何选择检索的 K 值? | 取决于:1) LLM 的上下文窗口(越大能接受越多块);2) 文档块大小(小块需要更多 K);3) 质量需求(高精度少K,高召回多K)。典型值:3-10(有 Reranker 时粗筛 20-50+精排3-5) |
📚 相关链接
- **什么是RAG** — RAG 基础概念
- **RAGvs微调-技术选型对比** — RAG 与微调的场景决策
- **AgenticRAG** — Modular RAG 的延伸:Agent 驱动的 RAG
- **检索与重排序** — 检索和重排序的详细原理
- <- 返回 **RAG基础索引**