RAG 学习笔记:核心概念以及流程细节
RAG 学习笔记:核心概念与流程细节
什么是 RAG,他是干什么的?
检索增强生成(Retrieval-Augmented Generation,RAG)这个概念 2020 年由 Facebook 提出,但当时大模型没有那么火,性能也没有那么好。近两年 LLM 非常火热,也连带着 RAG 火了起来。
但是LLM目前存在许多问题:
- 知识断层:AI 训练依赖于静态的知识库,训练完成后就停在那了,所以回答可能是过时的。
- 私有数据:比如你问 LLM 公司的一些信息,它是不知道的,因为这些数据不是公开的。
- 幻觉问题:AI 本质上是在做预测,所以还是有可能胡说八道。
而这些问题可以通过RAG去缓解。
RAG 的核心思想
举个简单的例子:你要回答老师的问题,但问题涉及的知识点你没学过,怎么办?让你翻资料你就可以回答出来了。
RAG 也是这个思想——构建外部知识库,增强用户上下文。
基本流程
- 检索:通过外部知识库检索出和用户 prompt 相关的知识
- 增强:检索出来的信息和用户的 prompt 拼接作为增强,一起送入 LLM
- 生成:LLM 基于 prompt 生成回答
这样一来,LLM 的回答就有了依据,可以减少幻觉,补充知识,同时外部知识库还可以更新。
RAG 的三个组成部分
1. 知识库
知识库可以是预构建 + 动态生成的。比如某个公司内部的文档,我们可以构建成知识库,并且随时更新。
知识库构建流程:
数据采集和清洗 → 数据切块 → 向量化 → 存储到向量数据库
- 数据采集和清洗:将 docx、pdf、txt 等各种格式的数据准备好,统一格式化为纯文本,清洗掉脏数据(如无意义的空格、乱码等),保留文档的标题和层级关系。
- 数据切块:LLM 上下文有限,不能把所有文档都送入,需要切块。切块策略直接影响检索效果,常见的有固定长度切分、语义段落切分。
- 向量化:将文本块送入编码器,得到文本的 embedding,然后存储到向量数据库中。
2. 数据检索
用户提问后,将用户的输入也向量化,然后在向量数据库中匹配最相似的 Top-K 个向量,得到对应的文本块,重新排序后拼接用户 prompt,得到增强版的 prompt。
3. LLM
最后把增强版的 prompt 送入 LLM,得到最终回答。
RAG工作流程图:

以上是最简单的 RAG 实现。
文档如何分块
| 方法 | 说明 | 缺点 |
|---|---|---|
| 固定长度切块 | 最简单的方法 | 容易让语义不连贯 |
| 固定长度 + 重叠 | 每个块之间保留相同长度的字符(如 50 个字符) | 缓解语义不连续问题 |
| 递归字符分割 | 维护分隔符优先列表(优先换行符 → 句号 → 逗号/问号/感叹号等) | 保证语义连续,最常用 |
| 按文档结构分割 | 按照一级标题、二级标题等结构切分 | 依赖文档格式规范 |
实战建议:递归字符分割 + 重叠。
Re-rank(重排序)
解决的问题
检索得到的文本块可能语义相似,但与任务不相关。例如:
- 用户提问:"我喜欢吃什么"
- 知识库匹配到:"我以前喜欢吃菠萝"、"我现在喜欢吃芒果"
两个结果语义上都相似,但"我以前喜欢吃菠萝"与当前任务("喜欢吃什么")不相关,属于噪音。如果拼接到 prompt 中会影响输出质量。
Re-rank 的作用
- 增加匹配精度
- 避免浪费 token
- 影响回答质量
工程实践
一般是 embedding 粗筛 + re-rank 精选:
- 先用 embedding 检索出 Top-K(如 Top-50)
- 再用 re-rank 筛选出最相关的 Top-N(如 Top-5)
- 将筛选后的结果拼接送入 LLM
不能对全部知识库使用 re-rank,因为一次 re-rank 需要推理一次,成本较高。
Re-rank 如何评估?
评估 RAG 加入 re-rank 前后的提升,通常使用召回率:
- 准备
<query, docs>测试集 - 用 RAG 检索,看 re-rank 是否找到了相关文档
- 计算召回率
本文是对 RAG 浅显的理解,不涉及具体实现(如向量数据库的选型、编码器的选择、Re-rank 模型的具体用法等),也没有讨论更高级的 RAG 变体(如 Self-RAG、RAPTOR、Graph-RAG 等)。
RAG 的本质并不复杂——它只是让 LLM 在回答之前多了一步“查资料”的动作。但正是这一步,解决了知识过时、数据私有、胡编乱造这三个大问题。如果你正在搭建自己的 RAG 应用,希望这篇文章能帮你理清基本概念,少踩一些坑。后续有机会再整理具体实现和进阶变体的笔记。

浙公网安备 33010602011771号