RAG 检索增强生成:原理、流程与实现机制详解
RAG 是一种通过“先检索、后生成”的方式,从资料库中找出与用户问题最相关的片段,再交给大语言模型生成答案的技术,是目前企业构建知识库问答系统与智能客服最常用的技术方案之一。
核心概念与使用场景
RAG 是什么
RAG(Retrieval Augmented Generation,检索增强生成)是一种解决大模型无法回答特定领域问题的技术方案。它做的事情本质上只有两件:
- 检索——先从资料库中检索出与用户问题相关的内容;
- 生成——再基于检索到的内容生成答案。
因为它先执行检索步骤、再执行生成步骤,所以被称为“检索增强生成”。
为什么需要 RAG
大模型(如 GPT-4o、DeepSeek 等)本身具有很强的通用能力,但对企业内部的产品信息一无所知。如果要做一个能回答公司产品问题的智能客服,一个直接的思路是:在给模型发送问题的同时,把产品手册也一起发给模型。
然而,当产品手册篇幅极大(例如上百页甚至上千页)时,这种“全量输入”的做法会带来三个严重问题:
- 上下文窗口限制:每个模型只能接收一定量的信息,这个上限称为“上下文窗口大小”。当手册内容超过模型窗口大小时,模型会“读了后面忘了前面”,回答准确率无法保障。
- 推理成本高:模型输入量越大,推理成本越高。每次问答都要携带整本厚手册,成本开销巨大。
- 推理速度慢:输入内容越多,模型需要消化的内容就越多,产生输出的速度也就越慢。
解决问题的方式
RAG 的思路是:只把文档中与用户问题真正相关的内容发给模型。具体做法是:
- 提前将文档切分为多个片段;
- 用户提问后,在所有片段中检索相关内容;
- 只挑出真正相关的少数几个片段(例如只找到 3 个相关的片段);
- 将这 3 个片段与用户问题一起发给大模型。
这样一来,模型感知到的只有几个相关片段,而不是整篇文档,上下文窗口限制、成本和速度问题都随之解决。
RAG 整体流程概览
RAG 的完整流程由两个部分构成,共包含五个核心环节:
| 流程阶段 | 所处时间 | 包含环节 | 作用 |
|---|---|---|---|
| 数据准备部分 | 用户提问前 | 分片、索引 | 将文档处理为可供检索的结构化存储 |
| 回答部分 | 用户提问后 | 召回、重排、生成 | 检索出相关内容并生成最终答案 |
为理解 RAG 完整流程,需要先掌握几个关键专业术语:向量、Embedding 模型、向量数据库、向量相似度等。下文将深入拆解每一个环节的原理与实现机制。
环节一:分片
分片(Chunking) 是将文档切分为多个片段的过程,是整个 RAG 流程的第一步。
分片的方式
分片的切分方式有多种选择,常见的有:
- 按字数切分,例如每 1,000 个字为一个片段;
- 按段落切分,每个自然段为一个片段;
- 按章节切分,按文档语义结构划分;
- 按页码切分,以页为单位。
无论采用哪种策略,最终目标一致:将一篇长文档拆分成多个较小单元。分片完成后,就进入下一个环节——索引。
环节二:索引
索引(Indexing) 是通过 Embedding 模型将每一个片段文本转换为向量,然后将“片段文本”和“对应向量”都存入向量数据库的过程。
这一环节只有两步,但涉及三个必须理解的基础概念:向量、Embedding 和向量数据库。
2.1 向量(Vector)
向量是数学概念,表示一个有大小、有方向的量。在计算机中通常用一个数组来表示,向量的维度等于数组中数字的个数。
- 一维向量,如
1、3,可放置在一维坐标轴中; - 二维向量,如
[2, 2]、[1, 2],需放在二维坐标轴中; - 三维向量需放在三维坐标轴中;
- RAG 中实际使用的向量维度通常很大,通常是几百甚至几千维。
一个重要性质:维度越大,每个向量所包含的信息越丰富,用这些向量做各种计算的可靠性也越强。高维向量虽然无法在三维空间中直接可视化,但其存在性与有效性不受影响。
2.2 Embedding(嵌入)
Embedding 是将文本转换为向量的过程。它由专门的 Embedding 模型完成——注意,它不是 GPT-4o、DeepSeek 这类对话式大模型,而是专用的嵌入模型。
Embedding 的核心目的在于:含义相近的文本经过 Embedding 后,对应的向量在空间中也相近。
以二维向量为例:
| 文本 | 向量 |
|---|---|
| “马克喜欢吃水果” | [1, 2] |
| “马克爱吃水果” | [1, 1] |
| “天气真好” | [3, -1] |
前两句语义相似,向量非常接近;第三句与前两者无关,距离则较远。正是基于这种性质,当用户提问“马克喜欢吃什么”时,系统可以先对该问题做 Embedding 得到向量,再通过向量相似度搜索找到语义相关的文本片段,最终让大模型给出“马克喜欢吃水果”的答案。
2.3 向量数据库(Vector Database)
向量数据库是专门用于存储和查询向量的数据库。它为存储向量做了大量优化,并内置了向量相似度计算等相关函数。
使用与存储时需注意以下关键点:
- Embedding 后得到的向量会存入向量数据库中,但原始文本必须一并存储;
- 因为最终提供给大模型处理的是原始文本,向量只是中间结果;
- 一般的向量数据库表中至少包含两列:原始文本列与向量列。
索引操作流程回顾
将前面三个概念串联起来,索引环节的完整操作就是:
- 处理片段一 → 将片段一文本发给 Embedding 模型 → 得到向量 → 文本+向量存入向量数据库;
- 处理片段二 → 重复上述操作;
- 以此类推,直到所有片段处理完毕,索引流程结束。
注意:分片和索引均发生在用户提问之前,属于提前准备的离线步骤。
环节三:召回
召回(Retrieval) 是搜索与用户问题相关片段的过程,发生在用户提问之后。
召回的工作流程
- 用户将问题发送给 Embedding 模型;
- Embedding 模型将用户问题转换为向量;
- 该向量被发送给向量数据库;
- 向量数据库查询与用户问题最相关的十个片段并返回。
召回结果的数量(如 10 个)并非固定,可以选择 15 个、20 个等,只要数量不是太多即可。向量数据库会返回一批与用户问题最相似的片段。
向量相似度计算
向量数据库判断“哪些片段与用户问题最相关”,依靠的是向量相似度计算。其基本逻辑是:将每个片段向量与用户问题向量分别代入相似度计算公式,得出一个相似度数值,将所有数值排序后取最大的前 N 个。
目前主流的向量相似度计算方法有三种:
| 方法 | 原理 | 判断标准 |
|---|---|---|
| 余弦相似度 | 计算两个向量之间夹角的余弦值 | 夹角越小→相似度越高 |
| 欧式距离 | 计算两个向量之间的直线距离 | 距离越小→相似度越高 |
| 点积 | 通过代数方式同时考量向量方向与长度 | 乘积越大→相似度越高 |
补充说明——点积的判定逻辑:计算向量 A 与 B 的点积时,从 A 向 B 引垂线,点积等于投影长度与 B 的长度的乘积。两个向量方向一致时,向量越长点积越大;方向相反时点积为负;方向垂直时点积为零。因此可通过点积判断两个向量是否在相同方向上“努力”以及努力的程度。
召回阶段的重要结论:召回阶段查出了与用户问题最匹配的十个片段,这十个片段会发送到重排阶段继续处理。
召回环节适用的计算特点
召回阶段使用的是向量相似度,无论采用三种方法中的哪一种,共同特点是:成本低、耗时短、准确率相对较低。正因如此,它适合做初步的粗筛选——在短时间内将上千条片段的相似度值全部计算完毕,从中挑出最高的十个。
环节四:重排
重排,全称“重新排序”(Rerank),核心任务是从召回阶段选出的十个片段中,再筛选出三个与用户问题最相似的片段,作为最终结果。
为什么不能跳过重排、直接在召回阶段取三个?
一次直接挑出三个片段当然可以,但实际效果不如“召回 + 重排”的两阶段方案。根本原因在于:召回与重排阶段使用的文本相似度计算逻辑不一样。
召回与重排的核心区别
| 对比维度 | 召回阶段 | 重排阶段 |
|---|---|---|
| 所用方法 | 向量相似度(余弦相似度、欧式距离、点积) | CrossEncoder 模型 |
| 成本与耗时 | 成本低、耗时短 | 成本高、耗时长 |
| 准确率 | 准确率较低 | 准确率高很多 |
| 适用角色 | 初步粗筛选 | 精挑细选 |
重排阶段通常使用一种叫做 CrossEncoder 的模型来计算每个片段与用户问题的相似度。CrossEncoder 成本较高、耗时较长,但其准确率显著高于向量相似度方法,非常适合对召回结果进行精细化筛选。
类比理解:公司招聘的两阶段筛选
RAG 的两阶段检索与公司招聘流程高度相似:
- 召回 → 简历筛选:候选人太多,公司只能用粗略方法,从成千上万份简历中挑出十个“看起来最优秀”的人,准确率可能不高,但这是成本约束下的必要妥协;
- 重排 → 面试:公司对十位候选人逐一面试、仔细考察,尽可能保证判断正确,从中挑出最优秀的三人录用。
环节五:生成
生成(Generation) 是整个流程的最终产出环节。此时系统已拥有两类输入:
- 用户问题;
- 与用户问题相关的三个片段(经过重排精筛后的结果)。
将这两部分一起发送给大模型(如 GPT-4o、DeepSeek),由大模型根据片段内容生成回答。至此,RAG 全流程结束。
全流程拉通的两种视角
提问前的准备流程(离线部分)
- 将相关资料文档进行分片;
- 将所有片段依次发送给 Embedding 模型,为每个片段生成对应向量;
- 将“文本 + 向量”存入向量数据库。
此步骤完成后,知识库构建完毕,系统即可等待用户提问。
提问后的回答流程(在线部分)
- 用户问题发送给 Embedding 模型,转化为向量;
- 将问题向量传给向量数据库,查询出十个与问题最相近的片段;
- 将十个片段送给 CrossEncoder 模型做重排,从中筛选出三个相关程度最高的片段;
- 将三个片段 + 用户问题一起发给大模型,由大模型生成最终答案。
总结:RAG 的五个关键要点
| 要点 | 内容 |
|---|---|
| 总体思路 | 检索相关内容 + 基于内容生成答案,避免将整个知识库全文送入大模型 |
| 离线准备 | 分片 → Embedding → 存入向量数据库,构建可检索的知识库 |
| 在线问答 | 问题 Embedding → 向量检索(召回 Top 10)→ CrossEncoder 重排(选出 Top 3)→ 大模型生成 |
| 核心依赖 | 向量、Embedding 模型、向量数据库、向量相似度计算、CrossEncoder 模型五大技术组件 |
| 设计精髓 | 召回阶段用低成本方法快速筛除无关内容,重排阶段用高成本高精度方法精细挑选,在成本与质量间取得平衡 |