RAG 怎样让模型先查资料再回答?

RAG 原理

约 13 分钟5 道自测更新于 2026-11-01

一句话记住RAG 的核心是先从外部资料中检索相关段落,再把段落连同问题交给模型生成;切片、相似度和混合检索决定能不能找对资料。

01学完你能做到

理解「先检索再生成」。

02为什么需要 RAG

第 15 讲(幻觉)讲过,模型会产生幻觉,而且它的知识停留在训练数据截止那一刻。公司内部的制度、昨天发布的公告、客户的合同,它都不知道。

有两条路可以让模型「知道」这些信息:

  • 微调(第 10 讲(指令微调 SFT 与 LoRA)):把知识训练进模型参数里。代价高,更新慢,也难以追溯答案出自哪里;
  • RAG(Retrieval-Augmented Generation,检索增强生成):回答前先从资料库里检索相关段落,放进上下文,再让模型基于这些资料生成回答。

RAG 这个名字来自 Lewis 等人 2020 年的论文。论文把两种记忆结合起来:

  • 参数记忆:一个预训练的生成模型;
  • 非参数记忆:一个维基百科的向量索引。

在三个开放域问答任务上,它取得了当时的最好成绩,生成的内容也比只靠参数的模型更具体、更符合事实。

用 RAG 的好处:

  • 资料更新时只需更新资料库;
  • 回答可以附上出处;
  • 可以按权限控制谁能检索到什么。
RAG 的核心思路
  1. 1准备资料库保存外部知识
  2. 2检索相关段落回答前查资料
  3. 3拼入上下文保留出处和权限
  4. 4生成回答资料不足就说明

03两条流水线

离线:建索引(资料变化时才运行)

  1. 加载:读入文档,比如 PDF、网页、知识库;
  2. 切片:把长文档切成小段;
  3. 向量化:用嵌入模型把每段变成一个向量;
  4. 入库:把向量和对应文本存进向量数据库。

在线:每次提问时

  1. 把用户的问题也变成向量;
  2. 在库里找出和问题向量最「接近」的 k 段;
  3. 把这 k 段和问题一起拼进提示词,例如:「请只根据以下资料回答,资料里没有就说不知道,并标注出处」;
  4. 模型生成回答。
RAG 两条流水线
  1. 1加载文档离线准备
  2. 2切片并向量化形成可检索表示
  3. 3问题检索 top-k在线取相关段落
  4. 4拼入上下文生成保留出处

04向量和相似度

第 4 讲(词向量与语言模型)讲过词向量:意思相近的词,向量也相近。嵌入模型(embedding model)把这个思路扩展到整句、整段话:输入一段文字,输出一个几百到几千维的向量。

怎么判断两个向量「接近」?最常用的是余弦相似度:比较两个向量的方向是否一致,结果在 -1 到 1 之间,越接近 1 越相似。

余弦相似度 = (a · b) / (|a| × |b|)

其中 a · b 是对应位置相乘再相加,|a| 是向量的长度。

手算演示(为了能画在纸上,用 2 维向量示意。真实向量有几百维,数字为示意)

用户问题「提现要多少手续费?」的向量是 q = (0.8, 0.6),长度是 1。库里有三段:

段落向量计算余弦相似度
A 退款流程(0.9, 0.4)(0.72 + 0.24) / (1 × 0.9849)0.975
B 提现手续费说明(0.7, 0.7)(0.56 + 0.42) / (1 × 0.9899)0.990
C 招聘公告(−0.2, 0.9)(−0.16 + 0.54) / (1 × 0.9220)0.412

(|A| = √(0.81 + 0.16) = √0.97 ≈ 0.9849,|B| = √0.98 ≈ 0.9899,|C| = √(0.04 + 0.81) = √0.85 ≈ 0.9220。)

取 top-2:B 和 A。招聘公告离得很远,被排除了。

也要注意,A「退款流程」的分数和 B 很接近。向量检索找的是「意思相近」,不是「一定相关」。这也是第 25 讲(RAG 进阶与常见失败)要讲的检索失败的来源之一。

Karpukhin 等人 2020 年的 DPR 论文表明,训练得好的稠密向量检索,在 top-20 段落准确率上比传统关键词检索 BM25 高 9–19 个百分点。

余弦相似度用二维向量的方向比较问题与段落的接近程度。
余弦相似度用二维向量的方向比较问题与段落的接近程度。

05切片:块多大、要不要重叠

切片大小要权衡:

  • 太大:一块里混着好几个主题,向量变得「模糊」,也占更多上下文;
  • 太小:一句话被切断,丢失前后文,比如「该费用」到底指什么费用。

常见做法:

  • 按段落、标题等自然边界切;
  • 相邻块之间留一点重叠,比如每块 500 字,前后重叠 50 字,避免关键句子正好被切在边界上。

块大小没有通用最优值,要用自己的数据测(第 38 讲(评测)讲评测)。

文档切片
  1. 1识别自然边界标题和段落优先
  2. 2切成多个区块控制主题范围
  3. 3保留适度重叠减少边界损失

06混合检索与 RRF

向量检索擅长「意思相近」,但对精确词不敏感,比如产品型号「X-200」、错误码「E1043」、人名。关键词检索(如 BM25)恰好相反。所以实践中常把两者结合,叫混合检索。

两路结果怎么合并?常用的方法是 RRF(倒数排名融合):每一路里排第 r 名的文档得 1/(k + r) 分,各路得分相加。k 通常取 60。

手算演示(k = 60):

  • 向量检索排名:A、B、C
  • 关键词检索排名:B、D、A
文档向量路关键词路总分
B1/62 = 0.016131/61 = 0.016390.03252
A1/61 = 0.016391/63 = 0.015870.03227
D—1/62 = 0.016130.01613
C1/63 = 0.01587—0.01587

B 在两路都排得靠前,最终第一。RRF 只用排名、不用原始分数,所以不必担心两种检索的分数尺度不同。

k 为什么是 60? 原论文说,k = 60 是在一次小规模试验里定下的,之后的验证中没有再调整,实验也显示 60 接近最优。k 的作用是「压平」排名差距:k 越大,第 1 名和第 10 名的分数差越小,一路里排第一的文档就不容易单凭这一路压过其他文档。论文的直觉是:排名靠前的文档更重要,但排名靠后的文档重要性不应该像指数衰减那样快速消失。

混合检索与 RRF
  1. 向量检索擅长语义相近
  2. 关键词检索擅长精确字符串
  3. RRF 合并按排名融合

07延伸阅读

  • Lewis et al., Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks, 2020:arxiv.org
  • Karpukhin et al., Dense Passage Retrieval for Open-Domain Question Answering, 2020:arxiv.org
  • Cormack, Clarke & Büttcher, Reciprocal Rank Fusion outperforms Condorcet and individual rank learning methods, SIGIR 2009 :cormack.uwaterloo.ca
  • Datawhale hello-agents,第八章「记忆与检索」:github.com

08一分钟讲给别人

试着用自己的话讲一遍RAG 是先检索再生成:回答前从资料库里取出相关段落放进上下文,以此减少幻觉、更新知识、给出出处。离线流程是加载、切片、向量化、入库;在线流程是把问题向量化,取最相似的 k 段,拼进提示词后生成回答。相似度常用余弦相似度,比较两个向量的方向。切片要大小适中,相邻块留重叠。向量检索和关键词检索各有长处,混合后可以用 RRF 按排名合并。

想一想

5 道自测

先在心里答一遍,再展开对照。能说清理由,比答对数字更重要。

  1. 01RAG 相对于微调有哪些优点?

  2. 02问题向量 q = (1, 0),段落向量 p = (0.6, 0.8),余弦相似度是多少?

  3. 03切片太大和太小分别有什么问题?

  4. 04为什么查错误码「E1043」时,关键词检索可能比向量检索更好?

  5. 05用 RRF(k = 60)合并:某文档在第一路排第 1,第二路没出现;另一文档在两路都排第 3。谁的分数高?

已看 0/5 题

练动手练习

找一份包含几个具体事实的公告或研报,先直接问 AI 一个细节问题,再把相关段落贴进对话并要求“只根据资料回答、标注出处”。比较两次答案,并指出资料库、切片、检索和生成分别可能在哪一步出错。

完成这一课

完成这一课

读完讲义、看完自测答案,这一课就算学完了。

  • 读完讲义
  • 看完全部自测

本课为投资者教育内容,案例数字均为示意,不构成任何投资建议,也不承诺收益。规则和费率会变,实际操作前请以交易所、监管机构和产品的最新公告为准。