前言:内容参考于 B 站视频
UP 主讲解的很好很清晰,感兴趣可以移步观看
一、什么是 RAG
RAG 全称 Retrieval Augmented Generation(检索增强生成),是目前企业级 AI 问答系统中最常用的技术方案。它的核心思想可以概括为两个步骤:
检索(Retrieval):从知识库中搜索与用户问题相关的内容片段
增强生成(Augmented Generation):将检索到的内容作为上下文,与用户问题一起发给大模型,让模型基于这些 "参考资料" 生成答案
许多企业内部的智能客服、知识助手、文档问答系统,底层采用的都是 RAG 技术。
1.1 RAG 解决了什么问题
设想一个场景:你想做一个能回答公司产品问题的智能客服。客服内部需要一个模型(如 GPT-4o、DeepSeek 等),但只有模型不够——模型不知道你公司的产品信息。
最直接的思路是把产品手册和用户问题一起发给模型。但如果产品手册有上百页甚至上千页,这个方案会立刻暴露出三个致命问题:
上下文窗口溢出:每个模型都有上下文窗口上限(Context Window),上百页的文档远超这个限制。模型会 "读了后面,忘了前面",回答准确率直线下降
推理成本高昂:模型的 API 计费与输入的 Token 量直接相关。每次提问都带上一本厚厚的手册,成本会迅速膨胀到不可接受
推理速度严重退化:输入的内容越多,模型需要处理的信息就越多,响应速度就越慢
RAG 的解决思路是:不把整本手册发给模型,而只发与当前问题真正相关的那几段内容。在一本上百页的手册中,真正与某个具体问题相关的内容通常只有寥寥几个段落。把这些关键段落精准找出来,问题就迎刃而解。
二、RAG 全流程概览
RAG 的完整流程分为两个阶段、五个环节:

阶段一(数据准备) 发生在用户提问之前,属于知识库的 "构建期";
阶段二(回答生成) 发生在用户提问之后,属于知识库的 "服务期"。下面逐一拆解每个环节。
三、阶段一:数据准备
3.1 分片(Chunking)
将原始文档切分为多个小片段(Chunk)。分片是 RAG 链路中最基础也最容易被忽视的环节——切分质量直接影响后续检索的准确度。
常见的分片策略:
分片时还有两个重要的设计决策:片段大小(Chunk Size) 和重叠量(Overlap)。片段太大则检索精度下降(召回太多不相关内容),太小则语义不完整(关键信息被切断)。适当的重叠可以避免关键信息正好落在两个片段的边界上被 "腰斩"。
分片完成后,每个片段就是后续检索的基本单元。
补充说明:在生产级 RAG 系统中,分片策略往往需要根据文档类型灵活组合。例如对于 API 文档,按函数 / 方法级别切分;对于法律合同,按条款切分;对于百科类文本,按词条 + 章节结合切分。没有放之四海皆准的最优参数,需要在实际数据集上迭代验证。
3.2 索引(Indexing)
索引是将每个文本片段转换为向量并存入向量数据库的过程。它包含两个核心步骤:
步骤一:Embedding(向量化)
将每个文本片段送入 Embedding 模型,生成该片段对应的向量(Vector)。Embedding 模型是专门用于文本向量化的模型,与大语言模型(如 GPT-4o、DeepSeek)不同——LLM 用于生成文本,Embedding 模型用于将文本编码为数学向量。
Embedding 的核心特性:语义相近的文本,其向量在向量空间中的位置也相近。例如:
“马克喜欢吃水果” → 向量
[1, 2](示意)“马克爱吃水果” → 向量
[1, 1](示意)“天气真好” → 向量
[-3, -1](示意)
前两句语义几乎相同,它们的向量距离很近;"天气真好" 与两者语义无关,向量距离就很远。正是这个特性使得 "用向量距离来衡量文本相关性" 成为可能。
选择 Embedding 模型时,可以参考 MTEB 排行榜(Massive Text Embedding Benchmark),它对各类 Embedding 模型做了系统性评测和排名。
步骤二:存入向量数据库
向量数据库(Vector Database)是专门为存储和查询高维向量而优化的数据库。它不仅存储向量本身,还提供计算向量相似度的内置函数。
存入时需要同时保存两列数据:
向量只是中间结果——我们最终需要的是原始文本。通过向量找到相似的记录后,要把对应的原始文本提取出来交给大模型。因此向量数据库中 "文本 + 向量" 的配对存储是必不可少的。
四、阶段二:回答生成
4.1 召回(Retrieval)
召回是从所有片段中搜索与用户问题最相关的一组片段的过程。
详细步骤:
用户输入问题(如 "马克喜欢吃什么?")
将问题发送给 Embedding 模型,转换为问题向量
将问题向量传入向量数据库
向量数据库逐一计算问题向量与每个片段向量的相似度
按相似度降序排列,返回 Top-K 个最相似的片段(K 通常取 10 左右)
向量相似度的计算方法
向量数据库判断 "哪些片段与用户问题最相关" 的核心手段是计算向量相似度。常见的三种计算方法:
余弦相似度(Cosine Similarity)
计算两个向量之间夹角的余弦值。余弦值越接近 1,说明夹角越小,两个向量方向越接近,相似度越高。它只关注方向,不关注长度——这意味着一个很短的文本和一个很长的文本,只要方向一致,余弦相似度就会认为它们高度相关。
欧式距离(Euclidean Distance)
计算两个向量在空间中端点之间的直线距离。距离越小,相似度越高。它同时考虑了方向和大小两个因素。
点积(Dot Product)
将两个向量的对应维度相乘后求和。它不仅考虑方向关系,也考虑向量长度。从 A 向 B 作垂线,点积 = 投影长度 × B 的长度。两个向量方向一致时越长乘积越大(正相关),方向相反则点积为负,方向垂直则为零。因此点积可以同时衡量 "是否同向" 和 "强度如何"。
在实际选型中,如果向量已经做过归一化处理(模长为 1),余弦相似度和点积是等价的。如果向量长度包含语义信息(如 TF-IDF 加权后的向量),则点积或欧式距离更有意义。
4.2 重排(Reranking)
重排的全称是重新排序(Re-ranking),它的目标与召回一样——找出最相关的片段——但它用于做 "精挑细选"。
召回阶段从成千上万个片段中粗筛出 10 个;重排阶段则从这 10 个中再精选出 3 个与用户问题最相关的。
为什么有了召回还需要重排?
两者的核心区别在于使用的相似度计算模型不同:
用一个类比来理解:
公司招聘流程:HR 先从成千上万份简历中快速筛选出 10 份看起来最优秀的(召回),然后对这 10 个人逐一面试,仔细评估,最终确定 3 个入职人选(重排)。简历筛选成本低但准确率有限,面试成本高但能做出精准判断——两者配合才能兼顾效率和准确性。
Cross-Encoder 不同于 Embedding 模型将文本独立编码为向量再比较,它会将 "用户问题" 和 "候选片段" 拼接为一对输入,由模型直接输出一个相关性分数。这种 "全注意力" 的交互式编码方式使得 Cross-Encoder 能捕捉到更精细的语义匹配关系,但代价是每对(问题 - 片段)都需要完整推理一次,无法像向量检索那样提前建立索引。
因此最佳实践是:召回阶段用向量检索将候选集缩到几十个,重排阶段用 Cross-Encoder 精筛到 3~5 个,兼顾速度与精度。
4.3 生成(Generation)
经过重排后,我们手头有了:
用户提出的问题
3 个与问题最相关的文本片段
将这两部分组织成 Prompt,发送给大语言模型(LLM),让它基于片段内容来回答用户问题。Prompt 的典型结构:
基于以下参考资料回答用户问题。如果参考资料中没有相关信息,请如实说明。
## 参考资料
[片段1的内容]
[片段2的内容]
[片段3的内容]
## 用户问题
[用户提出的问题]
## 回答要求
仅基于上述参考资料作答,不要编造信息。
模型收到这个 Prompt 后,会基于给定的参考资料生成答案,而非依赖训练数据中的陈旧知识。这正是 "增强生成" 的含义——用检索到的外部知识增强模型的生成能力。
五、核心概念词汇总
六、RAG 的实际应用考量
RAG 的理论流程简洁清晰,但在实际工程落地中还有很多需要权衡和优化的细节:
分片策略的调优:片段过大会降低检索精度(召回噪声多),片段过小会导致关键上下文断裂,且单个片段缺乏完整的语义单元。适当的片段间重叠(Overlap)可以缓解边界切断的问题。最优参数因文档类型而异,需要在真实数据集上做迭代实验。
Embedding 模型的选择:不同 Embedding 模型在不同语言(中文 vs 英文)、不同领域(通用 vs 专业)上的表现差异显著。MTEB 排行榜是重要的选型参考,但对中文场景还需要关注中文专项评测。
向量数据库的选型:Milvus、Pinecone、Weaviate、Qdrant、Chroma 等各有所长——有的适合大规模分布式,有的适合轻量级本地部署,选型取决于数据规模和运维能力。
多轮对话的 RAG:单轮问答场景中 RAG 链路比较直接;但多轮对话场景下,用户可能在追问中提到前一轮的信息,需要将历史对话上下文也纳入检索和生成的考量——这就涉及查询改写(Query Rewriting)和对话历史管理等进阶技术。
幻觉问题:即使给出了参考资料,LLM 有时仍会偏离事实、编造信息。可以通过约束性 Prompt(如 "仅基于提供的参考资料回答,若无相关信息请明确说明")和引用标注机制来缓解。