Loading......

文章背景图

RAG 工作机制详解

2026-05-19
11
-
- 分钟
|

前言:内容参考于 B 站视频

RAG 工作机制详解——一个高质量知识库背后的技术全流程

UP 主讲解的很好很清晰,感兴趣可以移步观看

一、什么是 RAG

RAG 全称 Retrieval Augmented Generation(检索增强生成),是目前企业级 AI 问答系统中最常用的技术方案。它的核心思想可以概括为两个步骤:

  1. 检索(Retrieval):从知识库中搜索与用户问题相关的内容片段

  2. 增强生成(Augmented Generation):将检索到的内容作为上下文,与用户问题一起发给大模型,让模型基于这些 "参考资料" 生成答案

许多企业内部的智能客服、知识助手、文档问答系统,底层采用的都是 RAG 技术。

1.1 RAG 解决了什么问题

设想一个场景:你想做一个能回答公司产品问题的智能客服。客服内部需要一个模型(如 GPT-4o、DeepSeek 等),但只有模型不够——模型不知道你公司的产品信息。

最直接的思路是把产品手册和用户问题一起发给模型。但如果产品手册有上百页甚至上千页,这个方案会立刻暴露出三个致命问题:

  • 上下文窗口溢出:每个模型都有上下文窗口上限(Context Window),上百页的文档远超这个限制。模型会 "读了后面,忘了前面",回答准确率直线下降

  • 推理成本高昂:模型的 API 计费与输入的 Token 量直接相关。每次提问都带上一本厚厚的手册,成本会迅速膨胀到不可接受

  • 推理速度严重退化:输入的内容越多,模型需要处理的信息就越多,响应速度就越慢

RAG 的解决思路是:不把整本手册发给模型,而只发与当前问题真正相关的那几段内容。在一本上百页的手册中,真正与某个具体问题相关的内容通常只有寥寥几个段落。把这些关键段落精准找出来,问题就迎刃而解。


二、RAG 全流程概览

RAG 的完整流程分为两个阶段、五个环节:

阶段一(数据准备) 发生在用户提问之前,属于知识库的 "构建期";

阶段二(回答生成) 发生在用户提问之后,属于知识库的 "服务期"。下面逐一拆解每个环节。


三、阶段一:数据准备

3.1 分片(Chunking)

将原始文档切分为多个小片段(Chunk)。分片是 RAG 链路中最基础也最容易被忽视的环节——切分质量直接影响后续检索的准确度。

常见的分片策略:

策略

做法

适用场景

按字数分

每 N 个字一个片段(如每 500 字)

通用文本,简单粗暴

按段落分

每个自然段落一个片段

语义较规整的文档

按章节分

每个章节 / 小节一个片段

结构清晰的正式文档

按页码分

每页一个片段

PDF 等固定排版的文档

语义分片

基于模型判断语义边界来切分

高质量知识库首选

分片时还有两个重要的设计决策:片段大小(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)是专门为存储和查询高维向量而优化的数据库。它不仅存储向量本身,还提供计算向量相似度的内置函数。

存入时需要同时保存两列数据:

原始文本(Text)

向量(Vector)

片段一的完整文本内容

[0.23, -0.45, 0.78, ...]

片段二的完整文本内容

[0.15, 0.32, -0.61, ...]

向量只是中间结果——我们最终需要的是原始文本。通过向量找到相似的记录后,要把对应的原始文本提取出来交给大模型。因此向量数据库中 "文本 + 向量" 的配对存储是必不可少的。


四、阶段二:回答生成

4.1 召回(Retrieval)

召回是从所有片段中搜索与用户问题最相关的一组片段的过程。

详细步骤

  1. 用户输入问题(如 "马克喜欢吃什么?")

  2. 将问题发送给 Embedding 模型,转换为问题向量

  3. 将问题向量传入向量数据库

  4. 向量数据库逐一计算问题向量与每个片段向量的相似度

  5. 按相似度降序排列,返回 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 个与用户问题最相关的。

为什么有了召回还需要重排?

两者的核心区别在于使用的相似度计算模型不同

召回(Retrieval)

重排(Reranking)

计算方式

向量相似度(余弦 / 欧式 / 点积)

Cross-Encoder 模型

成本

耗时

短(毫秒级)

长(秒级)

准确率

较低

作用

粗筛,海量候选中快速缩减范围

精挑,小范围内精确判断相关性

用一个类比来理解:

公司招聘流程: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

Retrieval Augmented Generation,检索增强生成——先检索相关文档,再基于文档生成答案

Chunking(分片)

将大文档切分为多个小片段,是检索的基本单元

Embedding(向量化)

用专门的 Embedding 模型将文本转换为高维向量

Vector(向量)

文本的数学表示,一组有序数字,维度通常几百到几千维

Vector Database(向量数据库)

专为存储和检索高维向量优化的数据库,内置相似度计算

Vector Similarity(向量相似度)

衡量两个向量 "有多像" 的数值,常用余弦相似度、欧式距离、点积

Retrieval(召回)

从海量片段中基于向量相似度快速筛选出 Top-K 个候选

Reranking(重排)

用 Cross-Encoder 模型对候选片段精排序,取最相关的几个

Cross-Encoder

将问题与候选拼接后直接输出相关性分数的模型,精度高但计算成本大

Context Window(上下文窗口)

模型单次能处理的最大 Token 数量,超出部分会被截断


六、RAG 的实际应用考量

RAG 的理论流程简洁清晰,但在实际工程落地中还有很多需要权衡和优化的细节:

分片策略的调优:片段过大会降低检索精度(召回噪声多),片段过小会导致关键上下文断裂,且单个片段缺乏完整的语义单元。适当的片段间重叠(Overlap)可以缓解边界切断的问题。最优参数因文档类型而异,需要在真实数据集上做迭代实验。

Embedding 模型的选择:不同 Embedding 模型在不同语言(中文 vs 英文)、不同领域(通用 vs 专业)上的表现差异显著。MTEB 排行榜是重要的选型参考,但对中文场景还需要关注中文专项评测。

向量数据库的选型:Milvus、Pinecone、Weaviate、Qdrant、Chroma 等各有所长——有的适合大规模分布式,有的适合轻量级本地部署,选型取决于数据规模和运维能力。

多轮对话的 RAG:单轮问答场景中 RAG 链路比较直接;但多轮对话场景下,用户可能在追问中提到前一轮的信息,需要将历史对话上下文也纳入检索和生成的考量——这就涉及查询改写(Query Rewriting)和对话历史管理等进阶技术。

幻觉问题:即使给出了参考资料,LLM 有时仍会偏离事实、编造信息。可以通过约束性 Prompt(如 "仅基于提供的参考资料回答,若无相关信息请明确说明")和引用标注机制来缓解。

评论交流