大模型关键能力 / 检索增强生成(RAG)
CHAPTER 04 · TOPIC 03

检索增强生成(RAG)

RAG(Retrieval-Augmented Generation)是当前解决大模型"知识截止"和"幻觉"问题最实用的技术方案。核心思想很简单:让模型在回答前先查阅相关资料,然后基于检索到的内容生成回答。 这类似于人类"开卷考试"——不需要记住所有知识,但需要知道在哪里找、怎么用。

一句话理解

RAG(Retrieval-Augmented Generation)是当前解决大模型"知识截止"和"幻觉"问题最实用的技术方案。核心思想很简单:让模型在回答前先查阅相关资料,然后基于检索到的内容生成回答。 这类似于人类"开卷考试"——不需要记住所有知识,但需要知道在哪里找、怎么用。

阅读前置

建议完成第 02 章

本文关注

RAG 的核心架构、文档解析与预处理、文本分块(Chunking)

所在知识层

能力扩展 · 大模型关键能力

文章导航
主教学视觉检索增强生成(RAG) · 知识结构

点击图中节点可定位到对应正文。

核心主题关系与流向

引言

RAG(Retrieval-Augmented Generation)是当前解决大模型"知识截止"和"幻觉"问题最实用的技术方案。核心思想很简单:让模型在回答前先查阅相关资料,然后基于检索到的内容生成回答。 这类似于人类"开卷考试"——不需要记住所有知识,但需要知道在哪里找、怎么用。


1. RAG 的核心架构

1.1 完整流水线

语义 SVG 重绘检索增强生成(RAG) · 结构 1

根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。

查看原文结构
┌─── 离线索引阶段 ──────────────────────────────────┐
│                                                    │
│  文档 → 文档解析 → 分块 → 向量化 → 存入向量数据库   │
│  (PDF/Word/网页等)  (提取文本)  (切分段落)  (Embedding) (FAISS/Milvus等) │
│                                                    │
└────────────────────────────────────────────────────┘
语义 SVG 重绘检索增强生成(RAG) · 结构 2

根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。

查看原文结构
┌─── 在线检索与生成阶段 ─────────────────────────────┐
│                                                    │
│  用户问题 → 问题向量化 → 在向量库中检索 → Top-K 相关文档块  │
│                ↓                                   │
│         将检索结果 + 原始问题 拼入 Prompt            │
│                ↓                                   │
│         LLM 基于检索内容生成回答                     │
│                                                    │
└────────────────────────────────────────────────────┘

1.2 RAG 解决了什么问题

问题RAG 的解决方式
知识截止检索实时更新的文档
幻觉要求模型基于检索到的事实回答
专业领域知识接入企业私有文档和知识库
成本比微调便宜得多,不需要重新训练模型
可溯源可以告诉用户答案来自哪个文档

2. 文档解析与预处理

2.1 常见文档格式的处理

格式工具挑战
PDFPyMuPDF, pdfplumber, Unstructured表格、图片、排版复杂
Word (.docx)python-docx格式保留、嵌入对象
HTMLBeautifulSoup, Trafilatura提取正文 vs 保留结构
Markdown直接读取保留标题层级和链接
代码文件直接读取保留缩进和语法结构
扫描件OCR(Tesseract, PaddleOCR)识别准确率
表格Camelot, Tabula表格结构的保留

2.2 文档清洗

语义 SVG 重绘检索增强生成(RAG)

根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。

原始文档清洗流程:1. 去除页眉页脚、广告等噪音2. 修复乱码和特殊字符3. 标准化格式(空格、换行、标点)4. 保留关键结构信息(标题、段落、列…
查看原文结构
原始文档 → 清洗流程:
  1. 去除页眉页脚、广告等噪音
  2. 修复乱码和特殊字符
  3. 标准化格式(空格、换行、标点)
  4. 保留关键结构信息(标题、段落、列表)
  5. 提取和标注元数据(来源、日期、作者)

3. 文本分块(Chunking)

3.1 为什么要分块

  • LLM 上下文窗口有限,不能把所有文档塞进去
  • 检索需要粒度匹配——太大则不够精确,太小则丢失上下文
  • 嵌入模型对长文本的表征质量下降

3.2 分块策略

固定长度分块:

PYTHON
# 最简单的方法:按 token 数切分
chunk_size = 512  # tokens
chunk_overlap = 50  # 重叠部分,保证上下文连续性

def fixed_chunk(text, chunk_size, overlap):
    chunks = []
    for i in range(0, len(text), chunk_size - overlap):
        chunks.append(text[i:i + chunk_size])
    return chunks

语义分块:

语义 SVG 重绘检索增强生成(RAG) · 结构 1

根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。

第一章 概述这是一段完整的概述文字...整段作为一个 chunk
查看原文结构
## 第一章 概述
这是一段完整的概述文字...
→ 整段作为一个 chunk
语义 SVG 重绘检索增强生成(RAG) · 结构 2

根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。

1.1 背景这是背景描述...整段作为一个 chunk
查看原文结构
### 1.1 背景
这是背景描述...
→ 整段作为一个 chunk

递归分块(Recursive Splitting):

语义 SVG 重绘检索增强生成(RAG)

根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。

1. 先按 "\n\n"(段落)切分2. 段落太长按 "\n"(换行)切分3. 还是太长按句子切分4. 还是太长
查看原文结构
1. 先按 "\n\n"(段落)切分
2. 段落太长 → 按 "\n"(换行)切分
3. 还是太长 → 按句子切分
4. 还是太长 → 按字符数切分

结构化分块:

TEXT
按文档结构切分:
- 按标题层级切分(H1/H2/H3)
- 每个 chunk 保留其所属标题路径作为元数据
- chunk 内容 = "第一章 > 1.1 背景 > 具体段落内容"

3.3 分块策略对比

策略优点缺点适用场景
固定长度简单可靠可能切断语义通用场景
语义分块保持语义完整性切分不均匀结构化文档
递归分块灵活适应文档结构实现复杂大多数场景(推荐)
结构化分块保留层级上下文依赖文档结构技术文档、书籍

4. 向量化(Embedding)

4.1 Embedding 原理

将文本转换为高维稠密向量,语义相似的文本在向量空间中距离较近:

语义 SVG 重绘检索增强生成(RAG)

根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。

"人工智能是什么?"0.12, -0.34, 0.56, …"什么是AI?"0.11, -0.33, 0.55, …"今天天气怎么样?"0.45, 0.67, -0.12, …
查看原文结构
"人工智能是什么?" → [0.12, -0.34, 0.56, ..., 0.78]  (1536维)
"什么是AI?"       → [0.11, -0.33, 0.55, ..., 0.77]  (与上面很接近)
"今天天气怎么样?"  → [-0.45, 0.67, -0.12, ..., 0.23] (与上面距离远)

4.2 主流 Embedding 模型

模型维度特点
text-embedding-3-small (OpenAI)1536性价比高,API 调用
text-embedding-3-large (OpenAI)3072更高质量
bge-large-zh (BAAI)1024中文优化,开源
bge-m3 (BAAI)1024多语言、多粒度
e5-mistral-7b (Microsoft)4096基于 LLM 的 Embedding
Cohere Embed v31024多语言支持好

4.3 向量数据库

数据库特点适用场景
FAISS (Meta)内存向量库,速度快原型开发、中小规模
Milvus分布式向量数据库大规模生产环境
Pinecone全托管云服务不想运维
Weaviate内置混合搜索需要关键词+向量混合检索
Chroma轻量级嵌入式快速原型、本地开发
QdrantRust 实现,高性能高性能需求
pgvectorPostgreSQL 扩展已有 PG 基础设施

5. 检索策略

5.1 基础检索流程

语义 SVG 重绘检索增强生成(RAG)

根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。

输入与上下文用户问题: "如何配置 Nginx 反向代理?"系统核心问题向量化: embed("如何配置 Nginx …0.23, -0.11, ...向量检索: 在向量库中找 Top-K 最相似的文档…工具、结果与反馈得到相关文档块:Chunk 1: "Nginx 反向代理配置...…
查看原文结构
用户问题: "如何配置 Nginx 反向代理?"
    ↓
问题向量化: embed("如何配置 Nginx 反向代理?") → [0.23, -0.11, ...]
    ↓
向量检索: 在向量库中找 Top-K 最相似的文档块(如 K=5)
    ↓
得到相关文档块:
  Chunk 1: "Nginx 反向代理配置... proxy_pass http://backend"
  Chunk 2: "Nginx 基本配置... server_name example.com"
  Chunk 3: "负载均衡配置... upstream backend { ... }"
  Chunk 4: ...

5.2 高级检索策略

混合检索(Hybrid Search):

语义 SVG 重绘检索增强生成(RAG) · 结构 1

根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。

向量检索(语义匹配) + 关键词检索(…融合排序(RRF 或加权融合)最终结果
查看原文结构
向量检索(语义匹配) + 关键词检索(BM25/TF-IDF)
    ↓
融合排序(RRF 或加权融合)
    ↓
最终结果
语义 SVG 重绘检索增强生成(RAG) · 结构 2

根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。

优势:兼顾语义相似和精确关键词匹配例如搜索错误代码 "ERR5001"关键词检索更准确
查看原文结构
优势:兼顾语义相似和精确关键词匹配
例如搜索错误代码 "ERR_5001" → 关键词检索更准确

查询改写(Query Rewriting):

语义 SVG 重绘检索增强生成(RAG)

根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。

原始查询: "怎么让AI不胡说八道"LLM 改写为改写查询: "如何减少大语言模型的幻觉…检索效果显著提升
查看原文结构
原始查询: "怎么让AI不胡说八道"
  ↓ LLM 改写为
改写查询: "如何减少大语言模型的幻觉问题 hallucination"
  ↓
检索效果显著提升

HyDE(Hypothetical Document Embeddings):

语义 SVG 重绘检索增强生成(RAG)

根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。

原始查询: "什么是RAG?"LLM 生成假设性回假设回答: "RAG 是检索增强生成,…用假设回答的向量去检索(比原始查询向量…检索结果: 更相关的文档块
查看原文结构
原始查询: "什么是RAG?"
  ↓ LLM 生成假设性回答
假设回答: "RAG 是检索增强生成,通过检索外部知识来增强大模型的..."
  ↓ 用假设回答的向量去检索(比原始查询向量更接近文档)
检索结果: 更相关的文档块

重排序(Reranking):

TEXT
第一步:向量检索返回 Top-20 粗排结果
第二步:用重排序模型(如 bge-reranker)精排
第三步:取 Top-5 精排结果送入 LLM

精排模型对 query-document 对做交叉注意力计算,比双塔 Embedding 更准确

5.3 检索策略对比

策略召回率精确度复杂度延迟
基础向量检索
混合检索中高
查询改写 + 向量中高中高
HyDE
向量 + 重排序
混合 + 重排序很高很高很高很高

6. Advanced RAG 模式

6.1 查询分解(Query Decomposition)

语义 SVG 重绘检索增强生成(RAG)

根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。

查看原文结构
复杂问题: "对比 Python 和 Java 在 Web 开发中的优缺点"
  ↓ 分解为子问题
  子问题 1: "Python Web 开发的优缺点是什么?"
  子问题 2: "Java Web 开发的优缺点是什么?"
  子问题 3: "Python 和 Java Web 框架对比"
  ↓
分别检索 → 合并结果 → LLM 综合回答

6.2 迭代检索(Iterative Retrieval)

语义 SVG 重绘检索增强生成(RAG) · 结构 1

根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。

第一轮:检索初始问题获得初步信息第二轮:根据初步信息生成新问题进一步检索第三轮:根据补充信息生成最终回答
查看原文结构
第一轮:检索初始问题 → 获得初步信息
第二轮:根据初步信息生成新问题 → 进一步检索
第三轮:根据补充信息生成最终回答
语义 SVG 重绘检索增强生成(RAG) · 结构 2

根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。

类似人类做研究:查资发现新问题再查综合总结
查看原文结构
类似人类做研究:查资料 → 发现新问题 → 再查 → 综合总结

6.3 Graph RAG

语义 SVG 重绘检索增强生成(RAG) · 结构 1

根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。

传统 RAG:文本向量检索Graph RAG:文本知识图谱图结构检索
查看原文结构
传统 RAG:文本 → 向量 → 检索
Graph RAG:文本 → 知识图谱 → 图结构检索
语义 SVG 重绘检索增强生成(RAG) · 结构 2

根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。

知识图谱保留了实体之间的关系:张三 --是CEOABC公司 --位于北京ABC公司 --产品智能客服系统 --使
查看原文结构
知识图谱保留了实体之间的关系:
[张三] --是CEO--> [ABC公司] --位于--> [北京]
[ABC公司] --产品--> [智能客服系统] --使用--> [RAG技术]

6.4 Agentic RAG

语义 SVG 重绘检索增强生成(RAG)

根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。

这比传统的"总是检索总是生成"更加智能
查看原文结构
这比传统的"总是检索 → 总是生成"更加智能

7. RAG 系统的评估

7.1 评估维度

维度衡量什么如何评估
检索相关性检索到的文档是否相关Recall@K, MRR, NDCG
答案忠实度回答是否忠实于检索内容Faithfulness(人工或 LLM 评估)
答案相关性回答是否回答了用户的问题Answer Relevancy
答案完整性回答是否覆盖了所有相关信息Answer Completeness

7.2 评估工具

  • RAGAS:专为 RAG 设计的评估框架,包含上述所有指标
  • DeepEval:开源 LLM 评估框架
  • TruLens:可观测性和评估平台

7.3 常见优化方向

问题可能原因优化方向
检索不到相关文档向量质量差 / chunk 太大或太小换 Embedding 模型 / 调整分块策略
检索到但答案不对LLM 忽略了检索内容优化 Prompt,强调"基于以下内容回答"
答案不完整K 太小或相关文档分散增大 K / 使用重排序
答案包含无关信息检索了不相关内容提高检索精度 / 使用重排序

8. 本章小结

RAG 是让大模型"有根据地回答"的核心技术:

  1. 离线索引:文档 → 解析 → 分块 → 向量化 → 存储
  2. 在线检索:问题 → 向量化 → 检索 → 重排序
  3. 生成回答:检索结果 + 问题 → Prompt → LLM → 回答
  4. 进阶策略:混合检索、查询改写、Graph RAG、Agentic RAG

RAG vs 微调的选择:

  • RAG:知识经常变化、需要溯源、数据量大 → 选 RAG
  • 微调:需要改变模型行为/风格、固定领域知识 → 选微调
  • 两者可以结合:微调让模型更专业,RAG 提供最新知识

相关章节


延伸阅读

  • Lewis, P. et al. (2020). "Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks". NeurIPS
  • Gao, Y. et al. (2024). "Retrieval-Augmented Generation for Large Language Models: A Survey". arXiv
  • Edge, D. et al. (2024). "From Local to Global: A Graph RAG Approach to Query-Focused Summarization". arXiv