目录
[一、RAG 的使用场景](#一、RAG 的使用场景)
[为什么需要 RAG?](#为什么需要 RAG?)
[RAG 的核心价值](#RAG 的核心价值)
[二、RAG 的基本运行流程](#二、RAG 的基本运行流程)
[三、RAG 的核心技术环节](#三、RAG 的核心技术环节)
[1. 分片(Chunking)](#1. 分片(Chunking))
[2. 索引(Indexing)](#2. 索引(Indexing))
[3. 召回(Retrieval)](#3. 召回(Retrieval))
[4. 重排(Reranking)](#4. 重排(Reranking))
[5. 生成(Generation)](#5. 生成(Generation))
[四、RAG 的整体流程](#四、RAG 的整体流程)
[五、RAG 系统的进阶优化](#五、RAG 系统的进阶优化)
[1. 混合检索](#1. 混合检索)
[2. 查询改写](#2. 查询改写)
[3. 多跳检索](#3. 多跳检索)
[4. 缓存机制](#4. 缓存机制)
引言
在大语言模型(LLM)广泛应用的今天,如何让 AI 系统访问私有数据、保持信息时效性、减少幻觉成为关键挑战。RAG(Retrieval-Augmented Generation,检索增强生成) 正是解决这些问题的核心技术方案。
RAG 的工作机制,从使用场景到技术细节,从分片索引到召回重排,完整呈现了一个高质量知识库背后的技术全流程。本文将这些知识点进行系统化梳理,为你深入理解 RAG 技术提供清晰的学习路径。
一、RAG 的使用场景
为什么需要 RAG?
传统 LLM 存在以下局限性:
-
知识截止:训练数据有时间限制,无法获取最新信息
-
私有数据缺失:无法访问企业内部文档、数据库等私有数据
-
幻觉问题:可能生成看似合理但实际错误的信息
-
成本高昂:微调大模型需要大量计算资源和数据
RAG 的核心价值
| 优势 | 说明 |
|---|---|
| 实时性 | 可接入最新数据源,保持信息时效性 |
| 准确性 | 基于真实文档生成回答,减少幻觉 |
| 可追溯 | 每个回答都有明确的来源引用 |
| 低成本 | 无需微调模型,只需构建知识库 |
| 灵活性 | 轻松更新、扩展知识库内容 |
典型应用场景
-
企业知识库问答:员工查询公司政策、流程文档
-
客服智能助手:基于产品手册回答用户问题
-
法律/医疗咨询:引用法规条文或医学文献
-
学术研究辅助:检索相关论文并生成综述
-
代码文档查询:快速定位 API 使用方法
二、RAG 的基本运行流程
RAG 系统的工作流程可以概括为以下四个阶段:
用户提问
↓
【检索阶段】从知识库中查找相关文档
↓
【增强阶段】将检索结果与问题结合
↓
【生成阶段】LLM 基于增强上下文生成回答
↓
返回答案 + 引用来源
核心思想:不依赖 LLM 的内部记忆,而是通过外部检索获取相关信息,再让 LLM 基于这些信息生成回答。
三、RAG 的核心技术环节
1. 分片(Chunking)
什么是分片?
分片是将长文档拆分为较小片段的过程,是构建向量索引的第一步。
为什么要分片?
-
LLM 的上下文窗口有限,无法一次性处理整本手册
-
小片段更容易精确匹配用户查询
-
提高检索效率和准确度
分片策略:
| 策略 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 固定长度分片 | 通用文档 | 实现简单 | 可能切断语义完整性 |
| 按段落分片 | 结构化文档 | 保持语义连贯 | 片段长度不均 |
| 递归分片 | 复杂文档 | 平衡长度与语义 | 实现较复杂 |
| 语义分片 | 专业领域 | 最大化语义完整性 | 需要额外模型支持 |
最佳实践:
-
常见分片大小:200-500 tokens
-
重叠设置:相邻分片保留 10-20% 重叠,避免信息丢失
-
保留元数据:记录原始文档位置、页码等信息
2. 索引(Indexing)
什么是索引?
索引是将分片后的文本转换为向量,并存储到向量数据库中的过程。
核心技术:Embedding(嵌入)
Embedding 模型将文本转换为高维向量,使得语义相似的文本在向量空间中距离更近。
文本:"如何重置密码?"
↓ Embedding 模型
向量:[0.23, -0.45, 0.78, ..., 0.12] (768 维或更高)
向量数据库选型:
| 数据库 | 特点 | 适用场景 |
|---|---|---|
| Chroma | 轻量级,易上手 | 小型项目、原型开发 |
| Pinecone | 云端托管,高性能 | 生产环境、大规模应用 |
| Milvus | 开源,功能丰富 | 自建部署、定制化需求 |
| Weaviate | 支持混合搜索 | 需要关键词+向量检索 |
| FAISS | Facebook 开源,极速 | 超大规模数据集 |
索引优化技巧:
-
选择合适的 Embedding 模型(如 text-embedding-ada-002、bge-m3)
-
对重要字段加权(标题 > 正文 > 脚注)
-
定期重建索引以保持数据新鲜度
3. 召回(Retrieval)
什么是召回?
召回是根据用户查询,从向量数据库中找出最相关的文档片段的过程。
工作原理:
-
将用户查询转换为向量
-
计算查询向量与库中所有向量的相似度
-
返回 Top-K 个最相似的片段
相似度度量方法:
| 方法 | 公式 | 特点 |
|---|---|---|
| 余弦相似度 | cos(θ) = A·B / ( | |
| 欧氏距离 | d = √Σ(Ai - Bi)² | 直观,但受向量模长影响 |
| 点积 | A·B = ΣAi × Bi | 计算快,需归一化 |
召回策略优化:
-
Top-K 选择:通常返回 3-10 个片段,过多会增加噪声
-
阈值过滤:设置最低相似度阈值,过滤不相关结果
-
多路召回:结合向量检索和关键词检索(BM25),提升覆盖率
常见问题:
-
语义漂移:查询与文档表述方式不同导致漏检
-
长尾问题:罕见查询难以找到匹配文档
4. 重排(Reranking)
为什么需要重排?
向量检索返回的结果按相似度排序,但相似度不等于相关性。重排阶段使用更精细的模型对候选结果重新打分,提升最终质量。
重排模型 vs Embedding 模型:
| 特性 | Embedding 模型 | 重排模型 |
|---|---|---|
| 输入 | 单段文本 | 查询 + 文档对 |
| 输出 | 向量 | 相关性分数 |
| 速度 | 快 | 较慢 |
| 精度 | 一般 | 更高 |
| 用途 | 初筛 | 精排 |
工作流程:
向量检索返回 Top-50 候选
↓
重排模型逐一评估相关性
↓
按相关性分数重新排序
↓
选取 Top-5 送入 LLM
常用重排模型:
-
BGE Reranker
-
Cohere Rerank
-
Cross-Encoder 架构模型
性能权衡:
-
重排会显著增加延迟,建议仅在高质量要求场景使用
-
可以先用轻量级重排模型快速筛选,再用高精度模型细排
5. 生成(Generation)
什么是生成?
生成阶段是将检索到的文档片段与用户查询组合成 Prompt,交由 LLM 生成最终回答。
Prompt 设计要点:
你是一个专业的知识助手。请基于以下参考资料回答问题。
如果资料中没有相关信息,请明确告知"根据现有资料无法回答"。
【参考资料】
1. [文档标题] 文档内容片段...
2. [文档标题] 文档内容片段...
【用户问题】
{user_query}
【回答要求】
- 引用具体来源(如:根据文档《XXX》第3章)
- 保持客观,不添加个人观点
- 如信息不足,说明局限性
关键原则:
-
忠实于资料:不编造资料中不存在的信息
-
标注来源:让用户可以追溯答案出处
-
处理冲突:当多个资料矛盾时,说明差异并给出判断依据
-
拒绝回答:资料不足时明确告知,而非强行作答
生成优化技巧:
-
控制参考片段数量(3-5 个为宜)
-
对片段进行去重和合并
-
添加指令让 LLM 优先使用最新资料
四、RAG 的整体流程
将上述环节整合,完整的 RAG 系统工作流程如下:
┌─────────────────────────────────────────────┐
│ 离线阶段:知识库构建 │
├─────────────────────────────────────────────┤
│ 原始文档 → 分片 → Embedding → 向量索引 │
└─────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 在线阶段:问答服务 │
├─────────────────────────────────────────────┤
│ 用户查询 │
│ ↓ │
│ Query Embedding │
│ ↓ │
│ 向量检索(召回 Top-K) │
│ ↓ │
│ 重排(可选,提升精度) │
│ ↓ │
│ 构建 Prompt(查询 + 参考片段) │
│ ↓ │
│ LLM 生成回答 │
│ ↓ │
│ 返回答案 + 引用来源 │
└─────────────────────────────────────────────┘
关键指标监控:
-
召回率:相关文档被检索到的比例
-
准确率:返回结果中真正相关的比例
-
响应时间:端到端延迟(目标:< 3 秒)
-
用户满意度:通过反馈收集持续优化

数据准备,构建知识库


五、RAG 系统的进阶优化
1. 混合检索
结合向量检索和关键词检索的优势:
# 伪代码示例
vector_results = vector_search(query, top_k=20)
keyword_results = bm25_search(query, top_k=20)
combined = merge_and_deduplicate(vector_results, keyword_results)
reranked = rerank(query, combined, top_k=5)
2. 查询改写
在检索前对用户查询进行优化:
-
query expansion:扩展同义词、相关词
-
hyde:先生成假设性答案,再用答案检索
-
step-back prompting:提取更抽象的问题再检索
3. 多跳检索
对于复杂问题,进行多轮检索:
第一轮:检索基础概念
↓
第二轮:基于第一轮结果,检索关联信息
↓
综合两轮结果生成回答
4. 缓存机制
对高频查询建立缓存,降低重复计算成本:
-
缓存查询向量
-
缓存检索结果
-
缓存最终回答(设置过期时间)
六、实战建议
起步阶段(MVP)
-
选择轻量级工具链:LangChain + Chroma + OpenAI
-
从小规模文档集开始(< 100 篇)
-
先实现基本流程,暂不加权重排
-
手动评估效果,收集反馈
生产阶段
-
升级到企业级向量数据库(Pinecone / Milvus)
-
引入重排模型提升精度
-
建立自动化索引更新管道
-
监控系统性能和用户满意度
-
A/B 测试不同参数配置
常见陷阱
❌ 分片过大 :导致检索不精确 ✅ 建议:200-500 tokens,带重叠
❌ 忽略元数据 :无法追溯来源 ✅ 建议:保留文档名、页码、章节等信息
❌ 过度依赖向量检索 :漏掉关键词匹配 ✅ 建议:采用混合检索策略
❌ 不设阈值 :返回不相关结果 ✅ 建议:设置最低相似度阈值(如 0.7)
七、延伸阅读与资源
官方文档
开源项目
结语
RAG 技术为大语言模型注入了"外部记忆",使其能够访问最新、最准确的私有数据。从分片、索引、召回到重排、生成,每个环节都影响着最终的回答质量。
理解 RAG 的工作机制,不仅有助于构建高质量的 AI 应用,更能帮助我们在实际项目中做出正确的技术选型和优化决策。
记住:好的 RAG 系统不是堆砌最先进的技术,而是根据业务需求,在每个环节找到最适合的平衡点。