检索增强生成 (RAG - Retrieval-Augmented Generation)¶
背景知识
RAG 通过将外部知识检索与大语言模型结合,解决了 LLM 知识截止和幻觉问题,是企业级 AI 应用的核心架构之一。
1. 概述¶
什么是 RAG¶
RAG (Retrieval-Augmented Generation) 是一种将信息检索与文本生成结合的技术框架。核心思想:在生成回答之前,先从外部知识库中检索相关信息,然后基于检索到的内容生成回答。
为什么需要 RAG¶
| 问题 | RAG 解决方案 |
|---|---|
| 知识截止 | 检索最新文档,突破训练数据时间限制 |
| 幻觉问题 | 基于真实文档生成,减少编造内容 |
| 领域知识 | 接入企业私有数据,无需重新训练 |
| 可溯源 | 回答可追溯到具体文档来源 |
| 成本效率 | 比微调更快速、更经济 |
RAG vs 微调 vs 提示工程¶
| 方法 | 适用场景 | 成本 | 实时性 |
|---|---|---|---|
| 提示工程 | 简单任务,信息量小 | 低 | 高 |
| RAG | 需要外部知识,知识常变 | 中 | 高 |
| 微调 | 需要特定行为/风格 | 高 | 低 |
| RAG + 微调 | 最高质量要求 | 最高 | 中 |
原始论文: Lewis et al., 20201
2. RAG 架构¶
基本流程¶
┌─────────────────────────────────────────────────────┐
│ 离线阶段 (Indexing) │
│ │
│ 文档 → 分块(Chunking) → 嵌入(Embedding) → 向量数据库 │
└─────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ 在线阶段 (Query) │
│ │
│ 用户提问 → 查询嵌入 → 向量检索 → 上下文组装 → LLM生成 │
└─────────────────────────────────────────────────────┘
详细流程¶
1. 文档加载 (Document Loading)
├── PDF, DOCX, HTML, Markdown, CSV...
└── API, 数据库, 网页爬取...
2. 文档分块 (Chunking)
├── 按固定大小
├── 按语义边界
└── 按文档结构
3. 向量化 (Embedding)
└── 文本 → 高维向量 (768/1536/3072 维)
4. 索引存储 (Indexing)
└── 存入向量数据库
5. 查询检索 (Retrieval)
├── 向量相似度搜索
├── 关键词搜索
└── 混合搜索
6. 重排序 (Reranking)
└── 对检索结果精排
7. 生成回答 (Generation)
└── 将检索内容 + 问题 → LLM → 回答
3. 文档处理与分块 (Chunking)¶
分块策略¶
| 策略 | 说明 | 适用场景 |
|---|---|---|
| 固定大小 | 按字符/token 数切分 | 通用场景 |
| 递归分割 | 按分隔符层级切分 (段落→句子→词) | 大多数文本 |
| 语义分块 | 按语义相似度切分 | 高质量要求 |
| 文档结构 | 按标题/章节切分 | 结构化文档 |
| Sliding Window | 滑动窗口+重叠 | 防止信息断裂 |
关键参数¶
- chunk_size: 通常 256-1024 tokens,取决于嵌入模型和应用场景
- chunk_overlap: 通常为 chunk_size 的 10-20%,保持上下文连贯
- 元数据: 保留文档来源、页码、标题等信息用于过滤和引用
4. 向量索引原理¶
向量相似度度量¶
在 RAG 系统中,需要找到与查询向量最相似的文档向量。常用的距离度量包括:
余弦距离¶
余弦距离衡量两个向量之间的角度差异,不受向量长度影响:
特点:
- 关注方向而非大小,适合文本嵌入
- 值域:0, 2,越小越相似
- 常用于语义相似度搜索
示例:向量 A = 1, 2, 3,向量 B = 2, 4, 6
- A · B = 1×2 + 2×4 + 3×6 = 28
- ||A|| = √(1²+2²+3²) = √14 ≈ 3.74
- ||B|| = √(2²+4²+6²) = √56 ≈ 7.48
- 余弦相似度 = 28 / (3.74 × 7.48) = 1.0(完全同向)
欧氏距离¶
欧氏距离是两点之间的直线距离:
特点: - 受向量长度影响 - 值域:[0, ∞),越小越相似 - 适合需要考虑向量大小的场景
示例:向量 A = 1, 2, 3,向量 B = 2, 4, 6
- d(A, B) = √((1-2)² + (2-4)² + (3-6)²) = √(1 + 4 + 9) = √14 ≈ 3.74
向量索引¶
向量索引通过近似最近邻(ANN)算法加速大规模向量检索:
核心思想¶
暴力搜索需要与所有向量计算距离,时间复杂度 O(n)。向量索引通过以下方式优化:
- 分区:将向量空间划分为多个区域,只搜索相关区域
- 图结构:构建向量间的连接图,沿图快速导航
- 量化:用粗略表示减少计算和存储开销
常见索引类型¶
| 索引类型 | 原理 | 特点 |
|---|---|---|
| IVF (Inverted File) | 聚类分区,只搜索最近的聚类中心 | 平衡精度和速度 |
| HNSW (Hierarchical NSW) | 分层图结构,从顶层粗定位到底层精搜索 | 高精度,高召回 |
| Annoy | 随机投影树 | 内存高效 |
| FAISS | Meta 开发,支持多种索引算法 | 高性能,GPU 加速 |
HNSW 工作原理¶
HNSW 构建分层图,类似跳表:
第 2 层: ── 节点 ── 节点 ── 节点 ──
第 1 层: ── 节点 ── 节点 ── 节点 ── 节点 ──
第 0 层: ── 节点 ── 节点 ── 节点 ── 节点 ── 节点 ──
搜索时: 1. 从顶层入口点开始 2. 在每层找到最近的邻居 3. 逐层下降到底层进行精确搜索
时间复杂度:O(log n),比暴力搜索快几个数量级
5. 检索策略¶
- 稠密检索 (Dense Retrieval):基于嵌入向量的语义相似度搜索,适合处理同义词和语义相近的查询
- 稀疏检索 (Sparse Retrieval):基于关键词匹配的传统搜索,使用 BM25 或 TF-IDF 算法,擅长精确匹配专有名词 → BM25 详解
- 混合搜索 (Hybrid Search):结合稠密检索和稀疏检索的优势,通过 RRF 或加权融合提升检索质量 → 混合检索详解
- 重排序 (Reranking):在初步检索后使用更精确的模型对结果重新排序,提高相关性
- Multi-Query:将问题改写为多个查询,合并检索结果以扩大召回范围
- Parent Document:检索小块内容但返回其父文档,提供更完整的上下文
- Self-Query:使用 LLM 自动提取过滤条件和语义查询,支持结构化过滤
- HyDE:先生成假设答案,再用答案的嵌入向量进行检索
- Step-back:先提出更通用的问题进行检索,再基于结果回答原问题
6. 实践指南¶
何时选择 RAG¶
- 需要最新信息(知识库持续更新)
- 需要引用来源(合规/可信度要求)
- 私有数据不能用于训练
- 需要快速上线
- 知识域较广
生产部署考虑¶
1. 数据管道自动化 (文档变更 → 自动重新索引)
2. 多租户隔离 (不同用户/组织的数据隔离)
3. 监控和可观测性 (检索质量、延迟、成本)
4. 缓存策略 (高频查询缓存)
5. 回退机制 (检索失败时的处理)
6. 安全防护 (防止提示注入访问未授权数据)
成本优化¶
| 策略 | 说明 |
|---|---|
| 分层检索 | 先粗粒度筛选再精细检索 |
| 缓存嵌入 | 避免重复计算 |
| 批量处理 | 合并多次嵌入请求 |
| 开源替代 | 使用开源嵌入模型降低 API 成本 |
| 按需索引 | 只索引高价值文档 |
7. 发展趋势¶
7.1 多模态 RAG¶
不仅检索文本,还检索图像、表格、图表: - 多模态嵌入(CLIP 等) - 文档中图表的理解和检索 - 视觉问答 + 检索
7.2 长上下文 vs RAG¶
随着上下文窗口增大 (1M+ tokens),RAG 是否还有必要?
- 长上下文并不能替代 RAG
- 长上下文适合: 已知的少量文档深度分析
- RAG 适合: 从大量文档中找到相关内容
- 最佳实践: 用 RAG 检索 + 长上下文深度处理
7.3 RAG + Agent¶
RAG 与 Agent 的融合是大趋势: - Agent 自主决定检索策略 - 多轮检索和推理 - 自适应检索 (根据问题复杂度调整)
7.4 结构化 RAG¶
- Text-to-SQL RAG (将自然语言转为 SQL 查询)
- Table RAG (专门针对表格数据)
- Code RAG (代码库检索)
参考资料¶
-
Lewis et al. Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks. 2020. https://arxiv.org/abs/2005.11401 ↩