万字深度:RAG 架构设计全景——从 Chunk 策略到生产级 Agentic RAG

4 阅读1分钟

万字深度:RAG 架构设计全景——从 Chunk 策略到生产级 Agentic RAG

作者:AI 技术架构师
标签:#RAG #检索增强生成 #AI架构 #向量数据库 #生产级AI
适合读者:中高级 AI 应用开发者、大模型架构师


引言:为什么 RAG 仍是 2026 年最重要的 AI 架构范式

2024 年初,RAG(Retrieval-Augmented Generation,检索增强生成)还被认为是"给 LLM 外挂一个向量库"的简单模式。到了 2026 年,RAG 已经演变为企业级 AI 应用的核心认知架构——它不再只是解决幻觉问题和知识过时问题的权宜之计,而是构建具有持久记忆、可解释推理、多源知识融合能力的 AI 系统的基础框架。

根据 UC Berkeley 最新研究(2025 年 6 月),生产环境中部署的 LLM 应用里有超过 70% 采用了某种形式的 RAG 架构。而在这 70% 中,仍然使用"Naive RAG"(直接向量检索 + 拼装上下文)的应用,用户满意度比采用 Advanced RAG 架构的应用低 34%

本文将系统梳理 RAG 架构的完整技术栈——从最基础的文档分块策略,到最前沿的 Agentic RAG 范式,并给出可直接落地的代码示例和架构决策建议。


一、RAG 架构演进:五代技术范式

1.1 Naive RAG(2023 年前)

用户提问 → 向量检索 Top-K → 拼接上下文 → LLM 生成

问题

  • 检索精度低:向量检索对关键词匹配差,BM25 对语义理解差
  • 缺乏上下文过滤:无关内容占据 Token 窗口
  • 无自我校正:错误检索结果直接导致错误回答

1.2 Advanced RAG(2023-2024)

核心改进:

  • 混合检索(Hybrid Search):BM25 + 向量检索 + RRF 融合排序
  • 重排序(Re-ranking):用 Cross-Encoder 对初筛结果精排
  • 上下文压缩(Context Compression):用 LLM 或小型模型过滤无关内容
用户提问
  ↓
[Query 改写/扩展][混合检索:BM25 ∪ 向量检索][RRF 融合排序,取 Top-N][Cross-Encoder 重排序,取 Top-K][上下文压缩]
  ↓
LLM 生成

1.3 Modular RAG(2024)

将 RAG 流水线拆解为可组合的模块:

┌─────────────── Modular RAG 架构 ───────────────┐
│                                                 │
│  Input[Query Preprocessing]                  │
│           ↓                                     │
│          [Retriever Pool] ← 可并行多个检索器    │
│           ↓                                     │
│          [Post-Retrieval Filter]                │
│           ↓                                     │
│          [Context Post-Processing]               │
│           ↓                                     │
│          [Generator (LLM)]                      │
│           ↓                                     │
│          [Output Validation]                    │
│           ↓                                     │
│         Output                                  │
└─────────────────────────────────────────────────┘

关键创新:检索器可插拔、可并行、可加权融合

1.4 Graph RAG(2024-2025)

Microsoft Research 提出的 Graph RAG 范式,用知识图谱替代纯向量检索:

  • 全局查询:利用图谱的社区结构做抽象摘要
  • 局部查询:从实体出发做多跳推理
  • 优势:解决传统 RAG 在"全局性问题"(如"这份报告的主要趋势是什么?")上的根本性缺陷

1.5 Agentic RAG(2025-2026)

当前最前沿范式。RAG 系统本身作为一个 Agent,具备:

  • 自适应检索:判断是否需要检索、检索几轮
  • 工具调用:可调用搜索引擎、数据库、API
  • 自我反思:验证检索结果质量,必要时重新检索
  • 多步推理:将复杂问题拆解为多个子查询
用户提问
  ↓
[Router Agent:是否需要检索?]
  ├─ 不需要 → 直接回答
  └─ 需要 ↓
[Query Planner:拆解子问题][并行检索(向量/图谱/关键词)][Self-Reflection:结果足够吗?]
  ├─ 不够 → 改写查询,重新检索
  └─ 足够 ↓
[答案生成 + 引用标注]

二、Chunk 策略深度解析:决定 RAG 上限的基石

Chunking(分块)是 RAG 系统中最基础却最关键的决策。 chunk 质量直接决定检索召回率上限。

2.1 五种核心 Chunking 策略对比

策略原理优点缺点适用场景
固定大小分块按 Token/字符数均匀切分简单、速度快破坏语义完整性结构化文档(日志、代码)
递归分块按分隔符优先级递归切分保持自然语义边界需要调参通用文档(推荐默认)
语义分块用 Embedding 相似度识别语义边界语义连贯性最好计算开销大高质量问答系统
滑动窗口固定大小 + Overlap保留跨块上下文冗余度高需要上下文连续性的场景
父子分块小块检索 + 大块上下文检索精度与上下文兼顾存储开销翻倍生产环境推荐

2.2 递归分块(Recursive Chunking)实现

递归分块是按分隔符优先级进行分层切分,分隔符优先级通常为:

[\n\n\n(三换)> \n\n(双换)> \n(单换)> 。(句号)>  ,(逗号)> 空格 > 字符]

Python 实现示例

from langchain_text_splitters import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(
    separators=["\n\n\n", "\n\n", "\n", "。", ",", " ", ""],
    chunk_size=512,           # 每个 chunk 的目标大小(token)
    chunk_overlap=50,         # 重叠 token 数,保留跨 chunk 上下文
    length_function=len,      # 可替换为 token 计数器
)

docs = text_splitter.create_documents([raw_text])

关键参数调优建议

  • chunk_size:通常 256-1024 token,取决于 Embedding 模型的最佳输入长度
  • chunk_overlap:建议 chunk_size * 0.1 ~ 0.2,过低会丢失跨块信息,过高浪费 Token
  • 对于中文文档,按字符数计算更接近实际 Token 消耗(中文约 1.5-2 字符 = 1 Token)

2.3 语义分块(Semantic Chunking)原理

语义分块的核心思路:先对每个句子做 Embedding,然后在语义发生显著变化的地方切分

文档:"RAG 是检索增强生成。它结合了检索和生成。
      LSTM 是一种循环神经网络。它在序列建模中表现出色。
      Transformer 架构革命了 NLP。BERT 和 GPT 都基于 Transformer。"

Step 1: 对每个句子做 Embedding
  s1_emb = embed("RAG 是检索增强生成。")
  s2_emb = embed("它结合了检索和生成。")
  ...

Step 2: 计算相邻句子的语义相似度
  sim(s1, s2) = cosine_similarity(s1_emb, s2_emb) = 0.85  ← 高相似,同一主题
  sim(s2, s3) = cosine_similarity(s2_emb, s3_emb) = 0.31  ← 低相似,主题切换!

Step 3: 在相似度低于阈值的位置切分
  切分点:s2 和 s3 之间

LangChain 实现

from langchain_experimental.text_splitter import SemanticChunker
from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings()
semantic_chunker = SemanticChunker(
    embeddings,
    breakpoint_threshold_type="percentile",  # 或 "standard_deviation"
    breakpoint_threshold_amount=95,           # 百分位数阈值
)

docs = semantic_chunker.create_documents([raw_text])

性能对比(基于 2026 年基准测试):

方法检索 NDCG@10答案忠实度处理速度Token 成本
固定大小0.620.71⭐⭐⭐⭐⭐$0.001/千文档
递归分块0.680.75⭐⭐⭐⭐$0.001/千文档
语义分块0.790.84⭐⭐$0.05/千文档
父子分块0.770.82⭐⭐⭐$0.003/千文档

2.4 父子分块(Parent-Child Chunking)生产实践

这是目前生产环境最推荐的策略:

┌─ 父块(Large Chunk,2048 token)─── 用于提供完整上下文 ──┐
│ "RAG 是检索增强生成框架。它结合了信息检索和文本生成两项 │
│  核心技术。RAG 于 2020 年由 Meta AI 提出..."            │
└────────────────────────────────────────────────────────────┘
          ↓ 检索时拆为子块
┌─ 子块 1(Small Chunk,512 token)── 用于精确检索 ──┐
│ "RAG 是检索增强生成框架。它结合了信息检索..."       │
└──────────────────────────────────────────────────────┘
┌─ 子块 2 ──┐
│ "...和文本生成两项核心技术。RAG 于 2020 年..."    │
└────────────┘

检索阶段:用子块做向量检索(精度高)
生成阶段:用子块对应的父块作为上下文(上下文完整)

LangChain 实现

from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Chroma

# 父块分割器(大块,用于上下文)
parent_splitter = RecursiveCharacterTextSplitter(chunk_size=2000, chunk_overlap=200)
# 子块分割器(小块,用于检索)
child_splitter = RecursiveCharacterTextSplitter(chunk_size=400, chunk_overlap=50)

# 使用 ParentDocumentRetriever
from langchain.retrievers import ParentDocumentRetriever
from langchain_openai import OpenAIEmbeddings

retriever = ParentDocumentRetriever(
    vectorstore=Chroma(embedding_function=OpenAIEmbeddings()),
    docstore=InMemoryStore(),       # 存储父块
    parent_splitter=parent_splitter,
    child_splitter=child_splitter,
)

三、混合检索架构:BM25 + 向量 + RRF

3.1 为什么需要混合检索?

向量检索(Dense Retrieval)擅长语义理解但:

  • 对专有名词、产品型号、ID 等精确匹配差
  • 在低频术语上表现不佳

BM25(Sparse Retrieval)擅长关键词匹配但:

  • 无法理解语义相似("AI" vs "人工智能")
  • 对 paraphrasing 完全失效

混合检索 = 语义理解能力 + 精确匹配能力,两者互补。

3.2 RRF(倒数排名融合)算法

RRF 是混合检索中最常用的融合算法:

对于查询 Q,有两个检索源:
  - 向量检索返回排序: [doc_A, doc_B, doc_C, ...]
  - BM25 返回排序:   [doc_B, doc_A, doc_D, ...]

RRF 计算公式:
  RRF(d) = Σ 1 / (k + rank_i(d))
  
  其中:k 为常数(通常取 60),rank_i(d) 为文档 d 在第 i 个检索结果中的排名

示例(k=60):
  RRF(doc_A) = 1/(60+1) + 1/(60+2) = 0.01639 + 0.01613 = 0.03252
  RRF(doc_B) = 1/(60+2) + 1/(60+1) = 0.01613 + 0.01639 = 0.03252
  RRF(doc_C) = 1/(60+3) + 0           = 0.01613
  RRF(doc_D) = 0          + 1/(60+3)   = 0.01613

关键洞察:RRF 不需要调权重,自动平衡不同检索源的贡献。

3.3 LangChain 混合检索实现

from langchain.retrievers import EnsembleRetriever
from langchain_community.retrievers import BM25Retriever
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings

# 向量检索器
vectorstore = FAISS.from_documents(docs, OpenAIEmbeddings())
vector_retriever = vectorstore.as_retriever(search_kwargs={"k": 5})

# BM25 检索器
bm25_retriever = BM25Retriever.from_documents(docs)
bm25_retriever.k = 5

# 融合检索器(默认使用 RRF)
ensemble_retriever = EnsembleRetriever(
    retrievers=[bm25_retriever, vector_retriever],
    weights=[0.4, 0.6]   # 可手动调整权重,或用 RRF 自动融合
)

# 使用
results = ensemble_retriever.get_relevant_documents("RAG 混合检索原理")

四、重排序(Re-ranking):检索精度的倍增器

4.1 为什么需要 Re-ranker?

第一阶段检索(Bi-Encoder)为了速度,用向量距离做相似度计算,精度有限。
第二阶段用 Cross-Encoder 对 Query-Document 对做深度交互计算,精度大幅提升。

第一阶段(检索):Query → [Bi-Encoder] → 向量相似度排序 → Top-100
        ↓
第二阶段(重排):[Cross-Encoder] 对 Query-Doc 对做注意力交互
        ↓
最终输出:Top-K(K=5~10

精度对比

  • Bi-Encoder(无重排):NDCG@10 ≈ 0.65
    • Cross-Encoder 重排:NDCG@10 ≈ 0.78(+20% 提升)

4.2 Cohere / BGE Re-ranker 实践

from langchain_community.document_compressors import CrossEncoderReranker
from langchain_community.cross_encoders import HuggingFaceCrossEncoder

# 使用 BGE Re-ranker(开源,中文友好)
model = HuggingFaceCrossEncoder(model_name="BAAI/bge-reranker-v2-m3")
reranker = CrossEncoderReranker(model=model, top_n=5)

# 嵌入检索链
from langchain.retrievers.document_compressors import DocumentCompressorPipeline
from langchain_community.document_transformers import EmbeddingsRedundantFilter

# 完整检索管道
retriever = ensemble_retriever | reranker

生产建议

  • 第一阶段取 Top-50~100(保证召回率)
  • 第二阶段重排取 Top-5~10(保证精确度)
  • 中文场景优先用 bge-reranker-v2-m3(支持多语言)

五、高级 RAG 模式

5.1 Graph RAG:知识图谱增强

Microsoft Graph RAG 的核心创新:用图谱社区摘要应对全局查询

传统 RAG 处理全局问题的缺陷:
  问:"这份 50 页报告的主要趋势是什么?"
  → 向量检索只能返回局部片段,无法获取全局视图

Graph RAG 的解决方案:
  1. 从文档提取实体和关系 → 构建知识图谱
  2. 对图谱做社区检测(Leiden 算法)
  3. 对每个社区生成摘要
  4. 全局查询:将所有社区摘要作为上下文

LangChain 实现图谱检索

from langchain.graphs import Neo4jGraph
from langchain.chains import GraphCypherQAChain
from langchain_openai import ChatOpenAI

graph = Neo4jGraph(
    url="bolt://localhost:7687",
    username="neo4j",
    password="password"
)

# 让 LLM 生成 Cypher 查询
chain = GraphCypherQAChain.from_llm(
    ChatOpenAI(temperature=0),
    graph=graph,
    verbose=True
)

result = chain.invoke({"query": "受到影响最大的实体有哪些?"})

5.2 Self-RAG:自我反思式检索

Self-RAG 引入反思 Token(reflection tokens),让模型在生成过程中自主决定:

[Retrieve]:是否需要检索?
  → 是 → 检索相关文档
  → 否 → 直接生成

[IsRel]:检索结果是否相关?
  → 是 → 继续
  → 否 → 重新检索或标注"无相关信息"

[IsSup]:生成内容是否有检索结果支持?
  → 是 → 输出(带引用)
  → 否 → 标注为模型自有知识

核心价值:减少不必要的检索(降低延迟和成本),提高答案可溯源性和可靠性。

5.3 Agentic RAG:RAG 系统的自主决策

Agentic RAG 是 2026 年最热门的方向,核心特征是检索过程的自适应和自校正

┌───────────── Agentic RAG 决策循环 ─────────────┐
│                                                │
│   User Query                                   │
│       ↓                                        │
│   [Intent Classifier]                         │
│       ↓                                        │
│   需要检索?──否──→ 直接生成                   │
│       ↓ 是                                     │
│   [Query Planner]                             │
│   单跳?  多跳?                              │
│   ↓       ↓                                   │
│  单次检索  拆解子查询 → 并行检索               │
│       ↓                                       │
│   [Result Evaluator]                         │
│   结果足够?──否──→ 改写查询 → 重新检索       │
│       ↓ 是                                     │
│   [Answer Generator + Citation]               │
│       ↓                                       │
│   Output                                      │
└────────────────────────────────────────────────┘

LangGraph 实现 Agentic RAG

from langgraph.graph import StateGraph, END

class AgentState(TypedDict):
    query: str
    sub_queries: List[str]
    retrieved_docs: List[Document]
    answer: str
    needs_retry: bool

workflow = StateGraph(AgentState)

# 定义节点
workflow.add_node("planner", query_planner_node)
workflow.add_node("retriever", retrieval_node)
workflow.add_node("evaluator", evaluate_retrieval_node)
workflow.add_node("generator", answer_generation_node)

# 定义边(条件跳转)
workflow.add_conditional_edges(
    "evaluator",
    lambda s: "retrieve" if s["needs_retry"] else "generate",
)

六、RAG 评估框架:从"感觉还行"到量化优化

6.1 RAGAS 五大核心指标

RAGAS 是当前最流行的 RAG 评估框架,五大指标覆盖完整流水线:

┌────────── RAGAS 指标体系 ──────────┐
│                                    │
│  检索质量                           │
│  ├─ Context Precision(上下文精度) │
│  └─ Context Recall(上下文召回率) │
│                                    │
│  生成质量                           │
│  ├─ Faithfulness(忠实度)         │
│  ├─ Answer Relevance(答案相关性)  │
│  └─ Answer Correctness(答案正确性)│
│                                    │
└────────────────────────────────────┘

指标详解

指标定义计算方式目标
Faithfulness答案是否完全基于检索上下文NLI 模型判断答案中每个事实是否有上下文支持→ 1.0
Answer Relevance答案是否回答了问题用 LLM 对"答案回复了问题的程度"打分→ 1.0
Context Precision相关文档是否排在前面PR 曲线下面积(近似)→ 1.0
Context Recall答案所需信息是否都在上下文中答案中的可验证声明是否都能在上下文中找到→ 1.0
Answer Correctness答案与标准答案的匹配度语义相似度 + 关键词重叠→ 1.0

6.2 RAGAS 评估代码示例

from ragas import evaluate
from ragas.metrics import (
    faithfulness,
    answer_relevancy,
    context_precision,
    context_recall,
)

# 准备评估数据集
eval_dataset = Dataset.from_dict({
    "question": ["RAG 是什么?", "如何优化 RAG 检索?"],
    "answer": ["RAG 是检索增强生成...", "优化 RAG 检索的方法包括..."],
    "contexts": [
        ["RAG 全称 Retrieval-Augmented Generation...", "..."],
        ["混合检索可以提升 RAG 效果...", "..."]
    ],
    "ground_truth": [
        "RAG(检索增强生成)是一种结合检索和生成的技术...",
        "优化 RAG 检索的主要方法包括:混合检索、重排序..."
    ]
})

# 执行评估
results = evaluate(
    eval_dataset,
    metrics=[faithfulness, answer_relevancy, context_precision, context_recall],
    llm=ChatOpenAI(model="gpt-4o"),
    embeddings=OpenAIEmbeddings()
)

print(results)
# 输出:
# {'faithfulness': 0.92, 'answer_relevancy': 0.88, 
#  'context_precision': 0.85, 'context_recall': 0.90}

6.3 评估驱动的迭代优化闭环

┌───────── RAG 优化闭环 ─────────┐
│                                │
│  1. 用 RAGAS 评估当前系统      │
│         ↓                      │
│  2. 识别短板指标               │
│     ├─ Faithfulness 低 → 检索精度问题 → 优化 Chunk 策略/混合检索│
│     ├─ Answer Relevance 低 → 提示词问题 → 优化 System Prompt │
│     └─ Context Recall 低 → 召回率问题 → 增加检索数量/换 Embedding 模型│
│         ↓                      │
│  3. 针对性优化                  │
│         ↓                      │
│  4. 重新评估(A/B Test)       │
│         ↓                      │
│  5. 部署优化版本                │
│                                │
└────────────────────────────────┘

七、生产级 RAG 系统最佳实践

7.1 架构 Checklist

✅ Chunking
   - [ ] 选择了与文档类型匹配的分块策略
   - [ ] chunk_size 经过实验调优(建议 256-1024)
   - [ ] 实现了父子分块(生产推荐)

✅ 检索
   - [ ] 使用了混合检索(BM25 + 向量)
   - [ ] 实现了 RRF 或加权融合
   - [ ] 使用了 Re-ranker(BGE / Cohere)

✅ 生成
   - [ ] System Prompt 中包含答案格式要求和引用要求
   - [ ] 实现了流式输出(提升用户体验)
   - [ ] 有 Hallucination 防护(Faithfulness 检查)

✅ 评估
   - [ ] 用 RAGAS 建立了基线指标
   - [ ] 每次迭代都有量化对比
   - [ ] 有在线评估(用户反馈收集)

✅ 工程化
   - [ ] 实现了语义缓存(相同问题不重复检索)
   - [ ] 有完整的调用链追踪(LangSmith / Phoenix)
   - [ ] 有成本控制(Token 统计 + 预算告警)

7.2 语义缓存:降低 40% 成本的利器

from langchain_community.cache import InMemoryCache
from langchain.globals import set_llm_cache
from langchain_openai import ChatOpenAI

# 启用语义缓存(相同/相似问题直接返回缓存答案)
set_llm_cache(InMemoryCache())

# 或用 Redis 语义缓存(生产推荐)
from langchain_community.cache import RedisSemanticCache
set_llm_cache(
    RedisSemanticCache(
        redis_url="redis://localhost:6379",
        embedding=OpenAIEmbeddings(),
        score_threshold=0.85   # 语义相似度阈值
    )
)

效果:语义缓存可以将重复问题的响应时间从 2-5 秒降低到 50ms 以内,成本降低 30-50%

7.3 安全防护

生产级 RAG 必须防范以下风险:

┌────────── RAG 安全防护层 ──────────┐
│                                    │
│  Input 防护                        │
│  ├─ 注入检测:防止 Prompt Injection│
│  ├─ 敏感信息过滤:防止 PII 泄露   │
│  └─ 查询改写白名单                │
│                                    │
│  Retrieval 防护                    │
│  ├─ 访问控制:多租户数据隔离      │
│  ├─ 敏感文档过滤                  │
│  └─ 检索结果合规性检查            │
│                                    │
│  Output 防护                       │
│  ├─ PII 脱敏                     │
│  ├─ 有害内容过滤                  │
│  └─ 答案忠实度检查(Faithfulness) │
│                                    │
└────────────────────────────────────┘

八、总结与展望

RAG 架构在 2026 年已经形成了相对成熟的技术栈:

RAG 技术栈全景
│
├─ 数据层:文档解析 → Chunking → Embedding → 向量存储
├─ 检索层:混合检索(BM25+向量+RRF) → Re-ranking
├─ 增强层:上下文压缩 → 查询扩展 → 自我反思
├─ 生成层:LLM 生成 → 引用标注 → 格式校验
├─ 评估层:RAGAS 指标 → A/B 测试 → 持续优化
└─ 工程层:语义缓存 → 调用链追踪 → 成本监控

未来方向(2026-2027):

  1. 端到端优化的 RAG:检索器和生成器联合训练(而非独立优化)
  2. 多模态 RAG:支持图像、表格、视频帧的联合检索
  3. 个性化 RAG:根据用户历史和行为做个性化检索排序
  4. 自我进化的 RAG:系统自动识别短板并触发优化流程

参考资料

  1. UC Berkeley RAG Survey(2025):Retrieval-Augmented Generation: A Comprehensive Survey
  2. Microsoft Research - Graph RAG(2024):From Local to Global
  3. Meta AI - Self-RAG(2023):Learning to Retrieve, Generate, and Critique
  4. RAGAS Frameworkgithub.com/explodinggr…
  5. LangChain RAG 文档python.langchain.com/docs/tutori…
  6. BGE Rerankergithub.com/FlagOpen/Fl…

本文约 3200 字,覆盖 RAG 架构设计的核心技术点。如有疑问或希望深入讨论某个子话题,欢迎评论区交流。