跳转至

检索增强生成 (RAG - Retrieval-Augmented Generation)

背景知识
  • LLM 幻觉:模型生成看似合理但事实错误的内容,RAG 通过注入真实文档缓解此问题
  • 向量嵌入 (Embedding):将文本映射为高维向量,语义相近的文本在向量空间中距离近
  • Transformer:RAG 中 LLM 和嵌入模型的底层架构 → 详见
  • 上下文窗口:LLM 单次能处理的最大 token 数,限制了可注入的检索文档量
  • 信息检索基础:BM25、向量检索、混合检索等检索算法原理 → 详见

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 系统中,需要找到与查询向量最相似的文档向量。常用的距离度量包括:

余弦距离

余弦距离衡量两个向量之间的角度差异,不受向量长度影响:

余弦相似度 = cos(θ) = (A · B) / (||A|| × ||B||)
余弦距离 = 1 - 余弦相似度

特点: - 关注方向而非大小,适合文本嵌入 - 值域: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(完全同向)

欧氏距离

欧氏距离是两点之间的直线距离:

d(A, B) = √(Σ(Ai - Bi)²)

特点: - 受向量长度影响 - 值域:[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)。向量索引通过以下方式优化:

  1. 分区:将向量空间划分为多个区域,只搜索相关区域
  2. 图结构:构建向量间的连接图,沿图快速导航
  3. 量化:用粗略表示减少计算和存储开销

常见索引类型

索引类型 原理 特点
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 (代码库检索)

参考资料


  1. Lewis et al. Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks. 2020. https://arxiv.org/abs/2005.11401