检索增强生成(RAG)
RAG(Retrieval-Augmented Generation)是当前解决大模型"知识截止"和"幻觉"问题最实用的技术方案。核心思想很简单:让模型在回答前先查阅相关资料,然后基于检索到的内容生成回答。 这类似于人类"开卷考试"——不需要记住所有知识,但需要知道在哪里找、怎么用。
RAG(Retrieval-Augmented Generation)是当前解决大模型"知识截止"和"幻觉"问题最实用的技术方案。核心思想很简单:让模型在回答前先查阅相关资料,然后基于检索到的内容生成回答。 这类似于人类"开卷考试"——不需要记住所有知识,但需要知道在哪里找、怎么用。
建议完成第 02 章
RAG 的核心架构、文档解析与预处理、文本分块(Chunking)
能力扩展 · 大模型关键能力
文章导航
- 引言
- 1. RAG 的核心架构
- 1.1 完整流水线
- 1.2 RAG 解决了什么问题
- 2. 文档解析与预处理
- 2.1 常见文档格式的处理
- 2.2 文档清洗
- 3. 文本分块(Chunking)
- 3.1 为什么要分块
- 3.2 分块策略
- 3.3 分块策略对比
- 4. 向量化(Embedding)
- 4.1 Embedding 原理
- 4.2 主流 Embedding 模型
- 4.3 向量数据库
- 5. 检索策略
- 5.1 基础检索流程
- 5.2 高级检索策略
- 5.3 检索策略对比
- 6. Advanced RAG 模式
- 6.1 查询分解(Query Decomposition)
- 6.2 迭代检索(Iterative Retrieval)
- 6.3 Graph RAG
- 6.4 Agentic RAG
- 7. RAG 系统的评估
- 7.1 评估维度
- 7.2 评估工具
- 7.3 常见优化方向
- 8. 本章小结
- 相关章节
- 延伸阅读
点击图中节点可定位到对应正文。
引言
RAG(Retrieval-Augmented Generation)是当前解决大模型"知识截止"和"幻觉"问题最实用的技术方案。核心思想很简单:让模型在回答前先查阅相关资料,然后基于检索到的内容生成回答。 这类似于人类"开卷考试"——不需要记住所有知识,但需要知道在哪里找、怎么用。
1. RAG 的核心架构
1.1 完整流水线
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
┌─── 离线索引阶段 ──────────────────────────────────┐
│ │
│ 文档 → 文档解析 → 分块 → 向量化 → 存入向量数据库 │
│ (PDF/Word/网页等) (提取文本) (切分段落) (Embedding) (FAISS/Milvus等) │
│ │
└────────────────────────────────────────────────────┘根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
┌─── 在线检索与生成阶段 ─────────────────────────────┐
│ │
│ 用户问题 → 问题向量化 → 在向量库中检索 → Top-K 相关文档块 │
│ ↓ │
│ 将检索结果 + 原始问题 拼入 Prompt │
│ ↓ │
│ LLM 基于检索内容生成回答 │
│ │
└────────────────────────────────────────────────────┘1.2 RAG 解决了什么问题
| 问题 | RAG 的解决方式 |
|---|---|
| 知识截止 | 检索实时更新的文档 |
| 幻觉 | 要求模型基于检索到的事实回答 |
| 专业领域知识 | 接入企业私有文档和知识库 |
| 成本 | 比微调便宜得多,不需要重新训练模型 |
| 可溯源 | 可以告诉用户答案来自哪个文档 |
2. 文档解析与预处理
2.1 常见文档格式的处理
| 格式 | 工具 | 挑战 |
|---|---|---|
| PyMuPDF, pdfplumber, Unstructured | 表格、图片、排版复杂 | |
| Word (.docx) | python-docx | 格式保留、嵌入对象 |
| HTML | BeautifulSoup, Trafilatura | 提取正文 vs 保留结构 |
| Markdown | 直接读取 | 保留标题层级和链接 |
| 代码文件 | 直接读取 | 保留缩进和语法结构 |
| 扫描件 | OCR(Tesseract, PaddleOCR) | 识别准确率 |
| 表格 | Camelot, Tabula | 表格结构的保留 |
2.2 文档清洗
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
原始文档 → 清洗流程:
1. 去除页眉页脚、广告等噪音
2. 修复乱码和特殊字符
3. 标准化格式(空格、换行、标点)
4. 保留关键结构信息(标题、段落、列表)
5. 提取和标注元数据(来源、日期、作者)3. 文本分块(Chunking)
3.1 为什么要分块
- LLM 上下文窗口有限,不能把所有文档塞进去
- 检索需要粒度匹配——太大则不够精确,太小则丢失上下文
- 嵌入模型对长文本的表征质量下降
3.2 分块策略
固定长度分块:
# 最简单的方法:按 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语义分块:
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
## 第一章 概述
这是一段完整的概述文字...
→ 整段作为一个 chunk根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
### 1.1 背景
这是背景描述...
→ 整段作为一个 chunk递归分块(Recursive Splitting):
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
1. 先按 "\n\n"(段落)切分
2. 段落太长 → 按 "\n"(换行)切分
3. 还是太长 → 按句子切分
4. 还是太长 → 按字符数切分结构化分块:
按文档结构切分:
- 按标题层级切分(H1/H2/H3)
- 每个 chunk 保留其所属标题路径作为元数据
- chunk 内容 = "第一章 > 1.1 背景 > 具体段落内容"3.3 分块策略对比
| 策略 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 固定长度 | 简单可靠 | 可能切断语义 | 通用场景 |
| 语义分块 | 保持语义完整性 | 切分不均匀 | 结构化文档 |
| 递归分块 | 灵活适应文档结构 | 实现复杂 | 大多数场景(推荐) |
| 结构化分块 | 保留层级上下文 | 依赖文档结构 | 技术文档、书籍 |
4. 向量化(Embedding)
4.1 Embedding 原理
将文本转换为高维稠密向量,语义相似的文本在向量空间中距离较近:
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
"人工智能是什么?" → [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 v3 | 1024 | 多语言支持好 |
4.3 向量数据库
| 数据库 | 特点 | 适用场景 |
|---|---|---|
| FAISS (Meta) | 内存向量库,速度快 | 原型开发、中小规模 |
| Milvus | 分布式向量数据库 | 大规模生产环境 |
| Pinecone | 全托管云服务 | 不想运维 |
| Weaviate | 内置混合搜索 | 需要关键词+向量混合检索 |
| Chroma | 轻量级嵌入式 | 快速原型、本地开发 |
| Qdrant | Rust 实现,高性能 | 高性能需求 |
| pgvector | PostgreSQL 扩展 | 已有 PG 基础设施 |
5. 检索策略
5.1 基础检索流程
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
用户问题: "如何配置 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):
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
向量检索(语义匹配) + 关键词检索(BM25/TF-IDF)
↓
融合排序(RRF 或加权融合)
↓
最终结果根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
优势:兼顾语义相似和精确关键词匹配
例如搜索错误代码 "ERR_5001" → 关键词检索更准确查询改写(Query Rewriting):
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
原始查询: "怎么让AI不胡说八道"
↓ LLM 改写为
改写查询: "如何减少大语言模型的幻觉问题 hallucination"
↓
检索效果显著提升HyDE(Hypothetical Document Embeddings):
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
原始查询: "什么是RAG?"
↓ LLM 生成假设性回答
假设回答: "RAG 是检索增强生成,通过检索外部知识来增强大模型的..."
↓ 用假设回答的向量去检索(比原始查询向量更接近文档)
检索结果: 更相关的文档块重排序(Reranking):
第一步:向量检索返回 Top-20 粗排结果
第二步:用重排序模型(如 bge-reranker)精排
第三步:取 Top-5 精排结果送入 LLM
精排模型对 query-document 对做交叉注意力计算,比双塔 Embedding 更准确5.3 检索策略对比
| 策略 | 召回率 | 精确度 | 复杂度 | 延迟 |
|---|---|---|---|---|
| 基础向量检索 | 中 | 中 | 低 | 低 |
| 混合检索 | 高 | 中高 | 中 | 中 |
| 查询改写 + 向量 | 中高 | 中高 | 中 | 中 |
| HyDE | 中 | 高 | 中 | 高 |
| 向量 + 重排序 | 高 | 高 | 高 | 高 |
| 混合 + 重排序 | 很高 | 很高 | 很高 | 很高 |
6. Advanced RAG 模式
6.1 查询分解(Query Decomposition)
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
复杂问题: "对比 Python 和 Java 在 Web 开发中的优缺点"
↓ 分解为子问题
子问题 1: "Python Web 开发的优缺点是什么?"
子问题 2: "Java Web 开发的优缺点是什么?"
子问题 3: "Python 和 Java Web 框架对比"
↓
分别检索 → 合并结果 → LLM 综合回答6.2 迭代检索(Iterative Retrieval)
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
第一轮:检索初始问题 → 获得初步信息
第二轮:根据初步信息生成新问题 → 进一步检索
第三轮:根据补充信息生成最终回答根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
类似人类做研究:查资料 → 发现新问题 → 再查 → 综合总结6.3 Graph RAG
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
传统 RAG:文本 → 向量 → 检索
Graph RAG:文本 → 知识图谱 → 图结构检索根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
知识图谱保留了实体之间的关系:
[张三] --是CEO--> [ABC公司] --位于--> [北京]
[ABC公司] --产品--> [智能客服系统] --使用--> [RAG技术]6.4 Agentic 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 是让大模型"有根据地回答"的核心技术:
- 离线索引:文档 → 解析 → 分块 → 向量化 → 存储
- 在线检索:问题 → 向量化 → 检索 → 重排序
- 生成回答:检索结果 + 问题 → Prompt → LLM → 回答
- 进阶策略:混合检索、查询改写、Graph RAG、Agentic RAG
RAG vs 微调的选择:
- RAG:知识经常变化、需要溯源、数据量大 → 选 RAG
- 微调:需要改变模型行为/风格、固定领域知识 → 选微调
- 两者可以结合:微调让模型更专业,RAG 提供最新知识
相关章节
- 提示工程(Prompt Engineering) — RAG 上游:如何组织检索结果与问题
- 工具调用(Function Calling) — 另一种为模型补充外部能力的方式
- RAG与Agent的深度结合 — Agentic RAG 的系统实践
- 记忆系统 — 向量检索作为 Agent 的长期记忆
延伸阅读
- 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