RAG 技术全景解析:从原理到优化的完整指南
当大模型遇到"不知道"的问题,RAG 让它拥有了外部知识的翅膀。
一、RAG 是什么?为什么需要它?
大型语言模型(LLM)虽然知识渊博,但存在两个致命短板:知识截止和幻觉问题。模型训练完成后,新发生的事情它一无所知;被问到不确定的问题时,它可能一本正经地胡说八道。
RAG(Retrieval-Augmented Generation,检索增强生成)应运而生。它的核心思想很简单:在回答问题之前,先去外部知识库里找相关资料,再结合资料生成答案。
这就好比开卷考试——闭卷考试可能记不住,但允许翻书的话,答案就准确多了。
RAG 的三大核心价值
- 知识实时性:外部知识库可以随时更新,无需重新训练模型
- 答案可追溯:每个回答都有据可查,来源清晰可见
- 降低幻觉:基于真实资料生成,大幅减少无中生有
二、RAG 系统架构全景
一个完整的 RAG 系统包含两大阶段:知识库构建和在线问答。
知识库构建阶段
原始文档 → 文档解析 → 知识切片 → 向量化 → 存入向量数据库
这个阶段是"备课"过程——把各种格式的文档资料整理成机器可理解的形式,存入知识库备用。
在线问答阶段
用户问题 → 问题向量化 → 向量检索 → 召回候选 → 重排序 → 构建提示词 → 大模型生成答案
这个阶段是"答题"过程——把问题转化为向量,在知识库中找到相关内容,再让大模型组织成通顺的回答。
三、知识切片:将文档变成知识块
知识切片(Chunking)是 RAG 系统的基础环节,直接影响后续检索效果。切得太碎,语义不完整;切得太长,检索不精准。
常见切片策略
1. 固定长度切片
最简单直接的方式,按字符数或 token 数切割。比如每 500 字一块,块之间重叠 50 字。
优点:实现简单,速度飞快
缺点:可能切断句子,破坏语义完整性
适用场景:格式统一的文档、快速原型验证
2. 语义切片
基于句子边界、段落分隔等自然语义单元进行切割。
优点:保留语义完整性,检索效果更好
缺点:需要 NLP 工具支持,处理速度稍慢
适用场景:高质量要求的生产环境
3. 递归切片
分层级处理:先按章节切,章节太长就按段落切,段落太长再按句子切。LangChain 的 RecursiveCharacterTextSplitter 就是典型代表。
优点:兼顾结构和粒度,灵活性高
缺点:参数调优需要经验
适用场景:结构化文档(技术手册、政策文件)
4. 父子切片
一个文档同时存储大小两种粒度的切片。检索时用小切片精准匹配,返回时用大切片提供完整上下文。
优点:兼顾检索精度和上下文完整性
缺点:存储空间翻倍
适用场景:对答案质量要求极高的场景
切片参数怎么调?
三个关键参数需要反复实验:
| 参数 | 建议范围 | 影响效果 |
|---|---|---|
| chunk_size | 200-1000 tokens | 太小语义破碎,太大检索不精准 |
| chunk_overlap | 10%-20% | 保证跨块信息的连续性 |
| separators | 按文档结构选择 | 决定切分边界 |
实战建议:用真实数据做 A/B 测试。准备一批问答对,用不同参数构建知识库,对比召回率和答案准确率,选择最优配置。
四、Embedding:文本的向量表示
Embedding 是将文本转化为向量的过程。向量是高维空间中的坐标,语义相近的文本,向量在空间中距离更近。
为什么选择向量检索?
传统关键词检索只能匹配字面相同的词,但语义检索可以找到"意思相近"的内容:
问题:"如何提升销售业绩?"
关键词检索:只返回包含"销售业绩"的文档
向量检索:还能返回"增加营收技巧"、"业绩增长策略"等语义相关内容
主流 Embedding 模型对比
| 模型 | 提供商 | 维度 | 特点 |
|---|---|---|---|
| text-embedding-3-small | OpenAI | 1536 | 性价比高,适合大规模应用 |
| text-embedding-3-large | OpenAI | 3072 | 效果最佳,成本较高 |
| bge-large-zh | BGE | 1024 | 中文效果好,开源免费 |
| m3e-base | Moka | 768 | 轻量级,适合快速验证 |
| 智谱 Embedding | 智谱 AI | 1024 | 中文优秀,性价比高 |
Embedding 选型建议
- 中文场景优先:bge-large-zh、智谱 Embedding
- 成本敏感:开源模型自部署
- 效果优先:text-embedding-3-large
- 快速验证:直接用 API 服务
五、向量检索:从海量知识中召回候选
向量化完成后,需要存储到向量数据库中。检索时,把问题也转化成向量,找出距离最近的几条知识。
主流向量数据库
| 数据库 | 特点 | 适用场景 |
|---|---|---|
| Milvus | 开源高性能,支持分布式 | 大规模生产环境 |
| Pinecone | 全托管,开箱即用 | 快速上线,免运维 |
| Weaviate | 原生支持混合检索 | 需要关键词+向量混合 |
| Qdrant | Rust 实现,性能优异 | 高性能要求场景 |
| Chroma | 轻量级,Python 友好 | 原型开发、小规模应用 |
相似度计算方法
三种主流的向量距离计算方式:
余弦相似度(Cosine Similarity)
衡量两个向量方向的夹角,忽略长度差异。是最常用的度量方式。
欧氏距离(Euclidean Distance)
计算向量端点之间的直线距离。适合需要考虑数值大小的场景。
点积(Dot Product)
余弦相似度的简化版,当向量已归一化时,两者等价。计算更快。
召回策略
Top-K 召回
最简单直接——返回相似度最高的 K 个切片。K 值需要根据场景调优:
- K 太小:可能漏掉相关信息
- K 太大:噪音增多,token 消耗增加
经验值:初始 K 设为 5-10,根据效果调整。
多路召回
单一向量检索可能遗漏。组合多种召回策略可以提高覆盖率:
向量检索召回 → Top 20
关键词检索召回 → Top 10
合并去重 → 输送给重排序
多路召回的典型组合:
- 向量检索 + BM25 关键词检索
- 稠密向量 + 稀疏向量
- 不同 Embedding 模型的结果融合
六、重排序:精挑细选最相关内容
召回阶段追求"不遗漏",可能带回大量相关度不高的内容。重排序(Rerank)负责"精选",把真正相关的内容排在前面。
为什么需要重排序?
向量检索的相似度计算是粗粒度的——它只能判断"大概相关"。但具体问题具体分析,需要更精细的相关性判断。
举个例子:
问题:"苹果公司的股价是多少?"
召回结果:
1. 苹果公司 2024 年财报摘要
2. 如何种植苹果树
3. 苹果手机最新款介绍
向量检索可能认为三者都与"苹果"相关。但重排序模型能理解问题意图,把第一条排在最前,第二条剔除。
重排序模型原理
重排序模型是专门训练的交叉编码器(Cross-Encoder),它同时接收问题和候选文档,输出精确的相关性分数。
输入:[问题] + [SEP] + [候选文档]
输出:相关性分数(0-1 之间)
相比向量检索的双编码器(分别编码问题和文档),交叉编码器能看到问题与文档的交互关系,判断更精准。
主流重排序模型
| 模型 | 提供商 | 特点 |
|---|---|---|
| bge-reranker-v3 | BGE | 最新版本,多语言支持,开源免费 |
| DeepSeek Rerank | DeepSeek | 中文顶尖,推理能力强 |
| GLM-4-Rerank | 智谱 AI | 中文优化,长文本支持 |
| Cohere Rerank v4 | Cohere | 商业服务,效果优秀 |
| Jina Reranker v3 | Jina | 支持多语言,开源轻量 |
重排序最佳实践
召回数量与重排序数量的配比
召回 Top 50 → 重排序 Top 10 → 输送给大模型
经验比例:召回数量是最终使用数量的 3-5 倍。给重排序足够的候选,才能选出真正优质的内容。
阈值过滤
重排序模型输出的分数可以用于过滤:
保留分数 > 0.7 的候选
低于阈值的内容可能是噪音,直接剔除
多轮重排序
对超大规模知识库,可以采用两阶段重排序:
第一轮:轻量模型快速筛选(Top 100 → Top 30)
第二轮:重量模型精细排序(Top 30 → Top 10)
七、知识库构建实战流程
理论知识有了,下面是完整的知识库构建流程。
第一步:数据收集与清洗
文档来源
- 内部文档:Wiki、知识库、产品手册
- 外部资料:行业报告、技术文档
- 结构化数据:数据库、API 返回
数据清洗
- 去除重复内容
- 过滤低质量文本(乱码、无意义符号)
- 统一编码格式(UTF-8)
- 保留元数据(来源、时间、作者)
第二步:文档解析
不同格式需要不同处理方式:
| 格式 | 推荐工具 | 注意事项 |
|---|---|---|
| PyPDF、pdfplumber | 注意表格和图片中的文字 | |
| Word | python-docx | 保留格式层级 |
| HTML | BeautifulSoup | 提取正文,过滤导航和广告 |
| Markdown | 直接解析 | 注意代码块的保留 |
| 图片 | OCR 工具 | 准确率依赖图片质量 |
第三步:知识切片
根据文档特点选择切片策略:
- 技术文档:按章节层级递归切片
- FAQ 问答:按问答对切片
- 长篇文章:语义切片 + 固定长度兜底
第四步:向量化存储
遍历切片 → 调用 Embedding API → 写入向量数据库
写入时保留元数据:
{
"id": "chunk_001",
"content": "知识内容...",
"embedding": [0.123, -0.456, "..."],
"metadata": {
"source": "产品手册.pdf",
"page": 15,
"chunk_index": 3
}
}
元数据非常重要,它决定了能否按来源过滤、能否追溯原文。
第五步:索引优化
向量数据库支持多种索引类型,影响检索速度和精度:
- FLAT:暴力搜索,精度最高,速度最慢
- IVF:倒排索引,速度与精度平衡
- HNSW:图索引,检索速度最快
根据数据规模选择:
| 数据量 | 推荐索引 |
|---|---|
| < 10 万 | FLAT |
| 10-100 万 | IVF |
| > 100 万 | HNSW |
八、提升问答准确率的关键技巧
知识库建好了,如何让问答效果更好?以下是实战中总结的关键技巧。
技巧一:问题改写与扩展
用户的提问方式千奇百怪,直接检索可能匹配不到。可以通过问题改写和扩展来提高召回:
同义词扩展
原问题:"怎么退钱?"
扩展后:"怎么退钱 OR 退款流程 OR 如何申请退款"
问题改写
让大模型把口语化的问题改写成更规范的检索语句:
原问题:"这个破玩意儿怎么用啊"
改写后:"产品使用方法教程"
多问题生成
一个问题拆成多个子问题分别检索:
原问题:"小米 SU7 的价格和配置参数"
拆分为:"小米 SU7 价格" + "小米 SU7 配置参数"
技巧二:混合检索
单一检索方式都有盲区,混合检索可以互补:
向量检索 + 关键词检索
向量检索:召回语义相关内容
关键词检索:召回精确匹配内容
结果融合:RRF(倒排排名融合)算法合并
稠密向量 + 稀疏向量
稠密向量(Dense):语义丰富,泛化能力强
稀疏向量(Sparse):关键词精确,适合专业术语
两者结合:兼顾语义理解和精确匹配
技巧三:上下文窗口优化
召回的内容怎样喂给大模型也很有讲究。
长度控制
大模型有 token 限制,召回内容不能无限堆砌:
- DeepSeek V3:支持 128K 超长上下文,推理能力强劲
- 智谱 GLM-4-Plus:128K 上下文,中文理解优秀
- Kimi:200K 超长上下文,擅长长文档处理
- Claude 4:200K 上下文窗口
策略:优先保留重排序分数高的内容,按分数降序填充,留足回答空间。
位置优化
研究发现,放在提示词开头或结尾的内容,大模型关注度更高。把最相关的内容放在这两个位置。
内容压缩
召回的内容可能有冗余,可以让大模型先做摘要压缩:
原始内容:5000 字
压缩后:1500 字(保留核心信息)
技巧四:Prompt 工程
提示词模板直接影响回答质量。
基础模板
你是一个专业的问答助手。请根据以下参考资料回答用户问题。
参考资料:
{context}
用户问题:
{question}
要求:
1. 只使用参考资料中的信息回答
2. 如果资料中没有答案,请诚实告知
3. 回答要简洁准确
优化模板
你是一个专业的问答助手。请根据以下参考资料回答用户问题。
参考资料(按相关性排序):
【最相关】{chunk_1}
【相关】{chunk_2}
【可能相关】{chunk_3}
用户问题:
{question}
回答要求:
1. 优先使用【最相关】的内容
2. 如果多个资料有冲突,以更权威来源为准
3. 标注信息来源(如:根据产品手册第 15 页)
4. 资料中没有答案时,明确告知用户
技巧五:答案验证与后处理
大模型生成的答案不一定是完美的,可以增加验证环节:
一致性检查
让大模型自检:答案是否与参考资料一致?
问题:{question}
参考资料:{context}
答案:{answer}
请判断上述答案是否准确反映了参考资料的内容。
引用标注
强制要求答案标注来源,方便用户验证:
根据产品手册第 15 页的内容,小米 SU7 标准版起售价为 21.59 万元。
九、评估与迭代:用数据驱动优化
RAG 系统不是建完就完事,需要持续评估和优化。
核心评估指标
召回率(Recall)
召回的相关内容占所有相关内容的比例。
召回率 = 召回的相关切片数 / 知识库中所有相关切片数
衡量:检索系统能否找到所有相关信息。
精确率(Precision)
召回的内容中,真正相关的比例。
精确率 = 召回的相关切片数 / 召回的总切片数
衡量:检索系统是否精准,有无带回太多噪音。
MRR(Mean Reciprocal Rank)
衡量第一个正确答案的排名位置。
MRR = 1 / 第一个正确答案的排名
值越大说明正确答案排得越靠前。
答案准确率
最终答案的正确率,需要人工评估或用评测集自动评估。
评估方法
人工评估
准备一批问答对,人工判断答案质量。虽然耗时,但最可靠。
自动评估
构建评测集,用 GPT-4 等模型评估答案质量:
评测提示词:
请判断以下答案是否正确回答了问题。
问题:{question}
标准答案:{ground_truth}
待评估答案:{answer}
输出:正确/错误/部分正确
A/B 测试
同时运行两个版本的系统,对比用户满意度、答案采纳率等指标。
迭代优化方向
根据评估结果,针对性优化:
| 问题现象 | 可能原因 | 优化方向 |
|---|---|---|
| 召回率低 | 切片粒度不对、Embedding 不合适 | 调整切片参数、更换 Embedding 模型 |
| 精确率低 | 召回数量太多、缺少重排序 | 减少 Top-K、引入重排序 |
| 答答不准 | Prompt 模板不好、上下文太长 | 优化提示词、压缩上下文 |
| 回答幻觉 | 召回内容不相关 | 提高召回阈值、增加答案验证 |
十、生产环境最佳实践
最后,分享一些生产环境的实战经验。
知识库更新策略
知识不是一成不变的,需要定期更新:
- 增量更新:新文档实时入库
- 全量重建:定期重建索引,清理过期数据
- 版本管理:保留历史版本,支持回滚
性能优化
缓存策略
热门问题的答案缓存起来,下次直接返回,不用再检索生成。
异步处理
大批量文档处理采用异步队列,避免阻塞主服务。
负载均衡
检索服务和生成服务分离,独立扩展。
监控告警
关键指标监控:
- 检索延迟(P99 < 500ms)
- 生成延迟(P99 < 3s)
- 召回内容相关性分布
- 用户反馈(点赞/点踩比例)
结语
RAG 技术让大模型突破了知识边界的限制,成为企业智能问答、知识管理的基础设施。从知识切片到向量检索,从重排序到答案生成,每个环节都有优化空间。
记住:没有银弹,只有不断迭代。从简单方案开始,用真实数据评估,针对性优化,才能打造出真正好用的 RAG 系统。
愿你的每一次检索,都能找到最精准的答案。