name: rag-architecture
description: 检索增强生成(RAG)系统设计模式、分块策略、嵌入模型、检索技术和上下文组装。用于设计RAG管道、提高检索质量或构建知识基础的LLM应用。
allowed-tools: Read, Glob, Grep
RAG架构
何时使用此技能
使用此技能时:
- 为LLM应用设计RAG管道
- 选择分块和嵌入策略
- 优化检索质量和相关性
- 构建知识基础的AI系统
- 实现混合搜索(密集 + 稀疏)
- 设计多阶段检索管道
关键词: RAG、检索增强生成、嵌入、分块、向量搜索、语义搜索、上下文窗口、基础、知识库、混合搜索、重排、BM25、密集检索
RAG架构概述
┌─────────────────────────────────────────────────────────────────────┐
│ RAG管道 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────────┐ │
│ │ 摄入管道 │ │ 索引管道 │ │ 向量存储 │ │
│ │ │───▶│ │───▶│ (嵌入) │ │
│ └──────────────┘ └──────────────┘ └──────────────────────┘ │
│ │ │ │ │
│ 文档 分块 + 索引向量 │
│ 嵌入 │
│ │ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────────┐ │
│ │ 查询处理 │ │ 检索引擎 │ │ 上下文组装 │ │
│ │ │───▶│ │───▶│ + 生成 │ │
│ └──────────────┘ └──────────────┘ └──────────────────────┘ │
│ │ │ │ │
│ 用户查询 Top-K分块 LLM响应 │
│ │
└─────────────────────────────────────────────────────────────────────┘
文档摄入管道
文档处理步骤
原始文档
│
▼
┌─────────────┐
│ 提取内容 │ ← PDF、HTML、DOCX、Markdown
│ │
└─────────────┘
│
▼
┌─────────────┐
│ 清理和 │ ← 移除样板、标准化
│ 标准化 │
└─────────────┘
│
▼
┌─────────────┐
│ 分块文档 │ ← 分割成可检索单元
│ │
└─────────────┘
│
▼
┌─────────────┐
│ 生成嵌入 │ ← 创建向量表示
│ │
└─────────────┘
│
▼
┌─────────────┐
│ 存储索引 │ ← 持久化向量 + 元数据
│ │
└─────────────┘
分块策略
策略比较
| 策略 |
描述 |
最佳适用 |
分块大小 |
| 固定大小 |
按令牌/字符计数分割 |
简单文档 |
256-512令牌 |
| 句子基础 |
在句子边界分割 |
叙述性文本 |
可变 |
| 段落基础 |
在段落边界分割 |
结构化文档 |
可变 |
| 语义 |
按主题/意义分割 |
长文档 |
可变 |
| 递归 |
分层分割 |
混合内容 |
可配置 |
| 文档特定 |
自定义每文档类型 |
专门化(代码、表格) |
可变 |
分块决策树
内容类型?
├── 代码
│ └── 基于AST或函数级分块
├── 表格/结构化
│ └── 保持表格完整,分块周围文本
├── 长叙述
│ └── 语义或递归分块
├── 短文档(<1页)
│ └── 整个文档作为分块
└── 混合内容
└── 递归,带类型特定处理器
分块重叠
无重叠:
[分块1: "快速棕色"] [分块2: "狐狸跳过"]
↑
边界信息丢失
有重叠(20%):
[分块1: "快速棕色狐狸"]
[分块2: "棕色狐狸跳过"]
↑
边界间上下文保留
推荐重叠: 分块大小的10-20%
分块大小权衡
较小分块(128-256令牌) 较大分块(512-1024令牌)
├── 更精确检索 ├── 每分块更多上下文
├── 每分块较少上下文 ├── 可能包含无关内容
├── 更多分块搜索 ├── 较少分块搜索
├── 适用于事实Q&A ├── 适用于摘要
└── 更高检索召回 └── 更高检索精度
嵌入模型
模型比较
| 模型 |
维度 |
上下文 |
优势 |
| OpenAI text-embedding-3-large |
3072 |
8K |
高质量,昂贵 |
| OpenAI text-embedding-3-small |
1536 |
8K |
良好质量成本比 |
| Cohere embed-v3 |
1024 |
512 |
多语言,快速 |
| BGE-large |
1024 |
512 |
开源,有竞争力 |
| E5-large-v2 |
1024 |
512 |
开源,指令调整 |
| GTE-large |
1024 |
512 |
阿里巴巴,适用于中文 |
| Sentence-BERT |
768 |
512 |
经典,易于理解 |
嵌入选择
需要最佳质量,成本可接受?
├── 是 → OpenAI text-embedding-3-large
└── 否
└── 需要自托管/开源?
├── 是 → BGE-large 或 E5-large-v2
└── 否
└── 需要多语言?
├── 是 → Cohere embed-v3
└── 否 → OpenAI text-embedding-3-small
嵌入优化
| 技术 |
描述 |
何时使用 |
| 嵌套嵌入 |
可截断到较小维度 |
内存受限 |
| 量化嵌入 |
INT8/二进制嵌入 |
大规模搜索 |
| 指令调整 |
前缀任务指令 |
专门化检索 |
| 微调嵌入 |
领域特定训练 |
专门化领域 |
检索策略
密集检索(语义搜索)
查询: "如何部署容器"
│
▼
┌─────────┐
│ 嵌入查询 │
└─────────┘
│
▼
┌─────────────────────────────────┐
│ 向量相似性搜索 │
│ (余弦、点积、L2) │
└─────────────────────────────────┘
│
▼
Top-K语义相似分块
稀疏检索(BM25/TF-IDF)
查询: "Kubernetes pod部署YAML"
│
▼
┌─────────┐
│分词 + 评分│
└─────────┘
│
▼
┌─────────────────────────────────┐
│ BM25排名 │
│ (词频 × IDF) │
└─────────────────────────────────┘
│
▼
Top-K词汇匹配分块
混合搜索(两者最佳)
查询 ──┬──▶ 密集搜索 ──┬──▶ 融合 ──▶ 最终排名
│ │ │
└──▶ 稀疏搜索 ─┘ │
│
融合方法: ▼
• RRF(互惠排名融合)
• 线性组合
• 学习重排
互惠排名融合(RRF)
RRF分数 = Σ 1 / (k + rank_i)
其中:
- k = 常数(通常60)
- rank_i = 每个检索结果中的排名
示例:
文档A: 密集排名=1, 稀疏排名=5
RRF(A) = 1/(60+1) + 1/(60+5) = 0.0164 + 0.0154 = 0.0318
文档B: 密集排名=3, 稀疏排名=1
RRF(B) = 1/(60+3) + 1/(60+1) = 0.0159 + 0.0164 = 0.0323
结果:文档B排名更高(更好的综合相关性)
多阶段检索
两阶段管道
┌─────────────────────────────────────────────────────────┐
│ 阶段1: 召回(快速,高召回) │
│ • ANN搜索(HNSW, IVF) │
│ • 检索top-100候选 │
│ • 延迟: 10-50ms │
└─────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ 阶段2: 重排(慢速,高精度) │
│ • 交叉编码器或LLM重排 │
│ • 评分top-100 → 返回top-10 │
│ • 延迟: 100-500ms │
└─────────────────────────────────────────────────────────┘
重排选项
| 重排器 |
延迟 |
质量 |
成本 |
| 交叉编码器(本地) |
中等 |
高 |
计算 |
| Cohere重排 |
快速 |
高 |
API成本 |
| 基于LLM的重排 |
慢速 |
最高 |
高API成本 |
| BGE重排器 |
快速 |
良好 |
计算 |
上下文组装
上下文窗口管理
上下文预算: 128K令牌
├── 系统提示: 500令牌(固定)
├── 对话历史: 4K令牌(滑动窗口)
├── 检索上下文: 8K令牌(动态)
└── 生成缓冲区: ~115K令牌(可用)
策略: 在预算内最大化检索上下文质量
上下文组装策略
| 策略 |
描述 |
何时使用 |
| 简单拼接 |
连接top-K分块 |
小上下文,简单Q&A |
| 相关性排序 |
最相关优先 |
一般检索 |
| 时间顺序 |
时间排序 |
时间查询 |
| 分层 |
摘要 + 细节 |
长形式生成 |
| 交错 |
混合来源 |
多源查询 |
中间迷失问题
LLM注意力模式:
┌─────────────────────────────────────────────────────────┐
│ 开始 中间 结束 │
│ ████ ░░░░ ████ │
│ 高注意力 低注意力 高注意力 │
└─────────────────────────────────────────────────────────┘
缓解:
1. 将最相关内容放在开始和结尾
2. 可能时使用较短上下文窗口
3. 使用分层摘要
4. 微调长上下文注意力
高级RAG模式
查询转换
原始查询: "告诉我关于这个项目"
│
┌─────────────────┼─────────────────┐
▼ ▼ ▼
┌─────────┐ ┌──────────┐ ┌──────────┐
│ HyDE │ │ 查询扩展│ │ 子查询分解│
│ (假设 │ │ │ │ │
│ 文档) │ │ │ │ │
└─────────┘ └──────────┘ └──────────┘
│ │ │
▼ ▼ ▼
假设答案 "项目、目标、 "项目范围是什么?"
嵌入 时间线、交付物" "交付物是什么?"
HyDE(假设文档嵌入)
查询: "光合作用如何工作?"
│
▼
┌───────────────┐
│ LLM生成假设 │
│ 答案 │
└───────────────┘
│
▼
"光合作用是植物将阳光转化为能量的过程..."
│
▼
┌───────────────┐
│ 嵌入假设文档 │
└───────────────┘
│
▼
使用假设嵌入搜索
(更好匹配实际文档)
Self-RAG(带自反思的检索增强LM)
┌─────────────────────────────────────────────────────────┐
│ 1. 生成初始响应 │
│ 2. 决定:需要更多检索?(批判令牌) │
│ ├── 是 → 检索更多,重新生成 │
│ └── 否 → 检查事实性(isRel, isSup令牌) │
│ 3. 根据来源验证声明 │
│ 4. 如果需要,重新生成 │
│ 5. 返回验证响应 │
└─────────────────────────────────────────────────────────┘
代理式RAG
查询: "比较Q3跨区域收入"
│
▼
┌───────────────┐
│ 查询代理 │
│ (计划步骤) │
└───────────────┘
│
┌───────────┼───────────┐
▼ ▼ ▼
┌───────┐ ┌───────┐ ┌───────┐
│搜索 │ │搜索 │ │搜索 │
│ EMEA │ │ APAC │ │ AMER │
│ 文档 │ │ 文档 │ │ 文档 │
└───────┘ └───────┘ └───────┘
│ │ │
└───────────┼───────────┘
▼
┌───────────────┐
│ 综合比较 │
└───────────────┘
评估指标
检索指标
| 指标 |
描述 |
目标 |
| Recall@K |
top-K中相关文档百分比 |
>80% |
| Precision@K |
top-K中相关百分比 |
>60% |
| MRR(平均互惠排名) |
第一个相关排名的倒数 |
>0.5 |
| NDCG |
分级相关性排名 |
>0.7 |
端到端指标
| 指标 |
描述 |
目标 |
| 答案正确性 |
答案事实正确吗? |
>90% |
| 忠实性 |
答案基于上下文吗? |
>95% |
| 答案相关性 |
回答问题吗? |
>90% |
| 上下文相关性 |
检索上下文相关吗? |
>80% |
评估框架
┌─────────────────────────────────────────────────────────┐
│ RAG评估管道 │
├─────────────────────────────────────────────────────────┤
│ 1. 查询集:代表性提问 │
│ 2. 真实答案:预期答案 + 源文档 │
│ 3. 指标: │
│ • 检索:Recall@K, MRR, NDCG │
│ • 生成:正确性、忠实性 │
│ 4. A/B测试:比较配置 │
│ 5. 错误分析:识别失败模式 │
└─────────────────────────────────────────────────────────┘
常见失败模式
| 失败模式 |
原因 |
缓解 |
| 检索缺失 |
查询-文档不匹配 |
混合搜索、查询扩展 |
| 错误分块 |
分块差 |
更好分割、重叠 |
| 幻觉 |
基础差 |
忠实性训练、引用 |
| 上下文丢失 |
长上下文问题 |
分层、摘要 |
| 数据陈旧 |
索引过时 |
增量更新、TTL |
扩展考虑
索引扩展
| 规模 |
方法 |
| <1M文档 |
单节点,精确搜索 |
| 1-10M文档 |
单节点,HNSW |
| 10-100M文档 |
分布式,分片 |
| >100M文档 |
分布式 + 激进过滤 |
延迟预算
典型RAG管道延迟:
查询嵌入: 10-50ms
向量搜索: 20-100ms
重排: 100-300ms
LLM生成: 500-2000ms
────────────────────────────
总计: 630-2450ms
目标p95: 交互使用<3秒
相关技能
llm-serving-patterns - LLM推理基础设施
vector-databases - 向量存储选择和优化
ml-system-design - 端到端ML管道设计
estimation-techniques - RAG系统容量规划
版本历史
- v1.0.0 (2025-12-26): 初始发布 - RAG架构模式用于系统设计
最后更新
日期: 2025-12-26