跳到主要内容

RAG — 原理、架构与知识检索

这一章讲三件事: 幻觉的两种病根与 RAG 的开卷思路;黑盒/白盒两族架构各怎么协作;检索侧从建库到重排的全流水线。 链条位置:模型编辑(第 11–12 章)改参数内的知识,RAG 完全不碰参数——给模型外挂一个图书馆,让它带着资料考试。 这是全书四大调教手段的最后一个,也是今天产业落地最热的最后一个。

1. 幻觉的两种病根

书用同一只考拉做了两组对照实验,把幻觉拆成两类1:

  • 训练数据导致的:知识过时——ChatGPT(训练止于 2022)答「2023 年考拉数量约 5000–8000 只」,正确答案是 8.6 万到 17.6 万只,差了一个数量级;知识边界——考拉的基因数量这类小众事实,语料里压根没有;知识偏差——网爬语料未核验,带着偏见进模型2

  • 模型自身导致的:更微妙的一种——问「树袋熊和考拉是什么关系」,模型把它们答成两种近亲动物;但直接问「考拉的别名是什么」,它又能答对「树袋熊」。知识在参数里,推理时还是用错。 书归因四条:知识长尾(低频学得差)、曝光偏差、对齐不当、解码偏差3

验证 RAG 思路只需一步:把正确的外部知识以 Prompt 形式放进上下文(政府考拉监测页、维基百科),两个案例立刻答对4

2. RAG 本体:三件套与黑白两盒

RAG(检索增强生成)的概念出自 Facebook AI Research 2020 年的论文;集成三个模块——外部知识库、信息检索器、生成器(即大模型):问题编码后从知识库检索相关文档,文档与问题一起以 Prompt 交给大模型作答5。核心优势一句话:不动模型内部知识,从而避开更新的算力成本与灾难性遗忘(第 11 章编辑技术的动机,在这里反向成立)6

协作方式按「能不能微调大模型」分两族7:

黑盒增强(闭源模型,只有 API):
无微调:In-Context RALM —— 检索文档直接拼在问题前
检索器微调:REPLUG LSR —— 拿模型的困惑度当监督信号训练检索器
白盒增强(开源模型,可动参数):
仅微调大模型:RETRO(检索结果进交叉注意力)/ SELF-RAG(反思标记自决是否检索)
协同微调:Atlas —— 检索器与大模型参数同步更新
图说:分界线是「参数摸不摸得着」,四种协作由松到紧。

值得展开的两个机制。REPLUG LSR 怎么在黑盒下训练检索器:检索器对文档有一个相似度分布,大模型对「每个文档+原上下文」各自生成一次预测、形成一个「哪个文档真帮上了忙」的贡献分布——用 KL 散度把前者对齐后者,让检索器学会「检索模型真正用得上的文档」;配异步(不必每一步都同步做)的目录更新,控制算力8RETRO 是白盒的结构派:知识库切块、BERT 编码,生成时每个文本块检索最相似邻居,经外置编码器送进块交叉注意力层——外部知识直接进入隐藏状态,而不是挤在输入窗口里9

3. 检索流水线:建库到重排

检索质量直接决定 RAG 成败——书给的翻车例:问「树袋熊一般在哪里生活?」,检索器返回了名字相近的袋熊(穴居、挖洞)的知识,模型照单全收答错10

3.1 建库:分块与锚点

「巧妇难为无米之炊」。采集来的文档带元信息(标题/分类/时间/关键词),清洗掉特殊字符、异常编码、HTML 标签和重复文档;然后文本分块——把长文切成小块,一来适应检索模型的上下文窗口限制,二来去掉无关内容降噪11。块怎么切直接影响下游:按句还是按段、块多大、相邻块留多少重叠,都要定。再往上可以加语义锚点:用大模型给文档生成伪查询(从提问视角表达文档,充当匹配的「键」)和生成标题——检索时以查询对查询,命中率更高12

3.2 查询增强:让问题够得着知识库

用户的问法千奇百怪,与知识库的表达往往对不上。两路增强13:

  • 语义增强:同义改写——「考拉的饮食习惯是什么」改写成「考拉主要吃什么」「考拉的食物有哪些」等,各自检索后合并去重;多视角分解——「考拉面临哪些威胁」拆成栖息地丧失、气候变化、人类活动、自然灾害四个子查询,各查各的再综合。

  • 内容增强:生成背景文档——让大模型先写一篇「考拉栖息地在东部沿海桉树林」的背景材料,作为查询的补充信息一起检索。

3.3 派别一:稀疏——数词频——的检索器

代表是 TF-IDF(词的常见度×稀有度)与 BM25(它的改进版)。不用训练、大规模成熟稳定(搜索引擎标配);弱项是不懂同义改写,词面不匹配就抓瞎。

3.4 派别二:稠密——比语义向量——的检索器

双编码器(查询和文档各编码一次再比):代表是 DPR、ColBERT、Poly-encoder。文档向量可离线预计算,在线匹配极快,工业部署首选;弱项是查询与文档编码时不见面,精细度受限14

先把两个词备好:正例(相关段落,该拉近的)。

与它相对的是负例(不相关段落,该推远的)。

把「缺交互」补回来的关键设计:DPR 用对比学习(教模型拉近对的、推远错的)来训练——正例被拉近,负例被推远;ColBERT 做 token 级的后期交互;Poly-encoder 用 m 个向量表示长查询再与文档做注意力。

3.5 派别三:交叉编码器——拼在一起细读

BERT 类拼接打分。深度交互,最准;弱项是每对都要现算,只能用于少量候选精排。

3.6 派别之外:生成式——直接报文档号

这一派不建索引——索引,即帮检索加速的目录——把知识记在参数里,查询来了直接生成相关文档的编号。效果仍逊前两派,长文档与动态新增是待解难题。

TF-IDF 的直觉也值得记:词频高且在其他文档少见=权重高,天然过滤「的、是、了」15

3.7 索引与重排:快与准的最后两公里

百万级文档两两算相似度不可行,要相似度索引。基于空间划分:KD 树/Ball 树递归分空间;局部敏感哈希——LSH,把相近的东西扔进同一个桶的散列法——把相似向量分进同桶。

基于图:建邻近图把检索变成图遍历,源自小世界网络思想,稀疏图每步便宜、稠密图路径更短的权衡,代表 HNSW。

基于乘积量化:把高维(几百上千个数表示的方向)空间切成子空间聚类成码本,用码字近似向量,省内存快计算,代价是量化误差,必要时再精排16

工具链上 Faiss 是 Meta 出的索引工具库(不是完整数据库);完整的向量数据库(专存这种数字表示、按相似度快查的库)有 milvus、qdrant、chroma、weaviate、pinecone 等17

最后一步重排:检索结果里混着相关度不高的文档,直接喂模型会拉低生成质量;用交叉编码器(MiniLM 最常用,层数砍小+知识蒸馏)、或干脆让大模型当重排器——RankGPT 给文档编号让 LLM 输出排序,文档太多就滑动窗口从尾往前逐窗排18

4. 作者的判断与证据

  • 给了证据的:考拉数量(5000–8000 对 8.6 万–17.6 万)与树袋熊/考拉两组对照;REPLUG LSR 的双分布对齐;BM25/TF-IDF 公式与算例;袋熊检索事故。

  • 书自己的框架判断:黑盒/白盒、以及「检索器与大模型协作方式对 RAG 性能影响最显著」——这是书对架构分章的立论。

  • 作者保留的余地:生成式检索器「效果仍稍逊一筹」,书明确说它还面临输入长度、大规模、动态新增三道坎19

5. 边界与局限

  • 书的架构谱系截至 2024 年中;GraphRAG(用知识图谱——实体和关系的网络——来增强)、Agentic RAG(让模型自己决定查什么、查几轮)等此后的主流方向不在书内——本库 RAG 书架可接续。

  • 「何时增强、多次增强、降本增效」在下一章;本章的重排只讲了「排」,没讲「该不该把这段给模型」。

  • 向量数据库表(GitHub star 数)是时点快照,选型看当下。

  • 幻觉的第三种病根——模型故意编造而非知识缺失——书归在「模型自身」,但没有区分「不会」与「胡说」的检测手段。

6. 可带走的

  1. 幻觉=知识过时/缺失(数据侧)+知识会用错(模型侧);RAG 治前者立竿见影,治后者靠给对材料。
  2. RAG 三件套:知识库、检索器、大模型;核心卖点是参数一个不动。
  3. 黑盒也能优化:REPLUG LSR 拿困惑度当监督训练检索器。
  4. 分块两目的:迁就窗口、降低噪音;伪查询和生成标题是文档的语义锚点。
  5. 查询侧三板斧:同义改写、多视角分解、生成背景文档。
  6. 检索器选型:要快用双编码器(DPR/ColBERT),要准用交叉编码器,要省心用 BM25。
  7. 索引三派:空间划分(树/哈希)、图(HNSW)、量化(PQ);Faiss 是工具库不是数据库。
  8. 最后必重排:MiniLM 交叉编码或 RankGPT 滑动窗口。

7. 原文地图

主题原书章原文位置
没有免费午餐与幻觉6 检索增强生成text/19-ch06-01-6-1.txt:7(搜「没有免费午餐」) · text/19-ch06-01-6-1.txt:11(搜「幻觉」)
知识过时(考拉)6.1.1 检索增强生成的背景text/19-ch06-01-6-1.txt:67(搜「截止到 2022 年」) · text/19-ch06-01-6-1.txt:86(搜「86,000 到 176,000」)
知识边界与偏差6.1.1 检索增强生成的背景text/19-ch06-01-6-1.txt:92(搜「知识边界」) · text/19-ch06-01-6-1.txt:98(搜「知识偏差」)
模型自身幻觉(树袋熊)6.1.1 检索增强生成的背景text/19-ch06-01-6-1.txt:108(搜「音译别名」) · text/19-ch06-01-6-1.txt:127(搜「偏差的回答」)
四因素6.1.1 检索增强生成的背景text/19-ch06-01-6-1.txt:130(搜「知识长尾」) · text/19-ch06-01-6-1.txt:139(搜「解码偏差」)
外部知识验证6.1.1 检索增强生成的背景text/19-ch06-01-6-1.txt:153(搜「相关的外部知识」)
RAG 起源与三模块6.1.2 检索增强生成的组成text/19-ch06-01-6-1.txt:191(搜「Facebook AI Research」) · text/19-ch06-01-6-1.txt:195(搜「Retriever」)
核心优势6.1.2 检索增强生成的组成text/19-ch06-01-6-1.txt:208(搜「内部知识进行更新」)
黑白盒分类6.1.2 检索增强生成的组成text/19-ch06-01-6-1.txt:256(搜「黑盒增强架构」)
In-Context RALM 与步长6.2.2 黑盒增强架构text/20-ch06-02-6-2.txt:122(搜「In-Context RALM」) · text/20-ch06-02-6-2.txt:138(搜「检索步长」)
REPLUG LSR6.2.2 黑盒增强架构text/20-ch06-02-6-2.txt:180(搜「困惑度分数」) · text/20-ch06-02-6-2.txt:182(搜「KL 散度损失」) · text/20-ch06-02-6-2.txt:219(搜「异步索引更新」)
AAR 与闭源可用6.2.2 黑盒增强架构text/20-ch06-02-6-2.txt:225(搜「AAR」) · text/20-ch06-02-6-2.txt:231(搜「闭源大模型」)
RETRO 与 SELF-RAG6.2.3 白盒增强架构text/20-ch06-02-6-2.txt:256(搜「反思标记」) · text/20-ch06-02-6-2.txt:262(搜「RETRO」) · text/20-ch06-02-6-2.txt:270(搜「交叉编码器」)
Atlas 协同微调6.2.3 白盒增强架构text/20-ch06-02-6-2.txt:312(搜「Atlas」) · text/20-ch06-02-6-2.txt:318(搜「同步被更新」)
袋熊检索事故6.3 知识检索text/21-ch06-03-6-3.txt:15(搜「袋熊」)
分块两好处6.3.1 知识库构建text/21-ch06-03-6-3.txt:70(搜「上下文窗口长度限制」) · text/21-ch06-03-6-3.txt:68(搜「分割成较小文本块」)
伪查询与标题生成6.3.1 知识库构建text/21-ch06-03-6-3.txt:96(搜「伪查询」) · text/21-ch06-03-6-3.txt:108(搜「标题生成」)
同义改写与多视角分解6.3.2 查询增强text/21-ch06-03-6-3.txt:139(搜「同义改写」) · text/21-ch06-03-6-3.txt:159(搜「多视角分解」)
背景文档6.3.2 查询增强text/21-ch06-03-6-3.txt:184(搜「背景文档」)
稀疏检索器与 TF-IDF/BM256.3.3 检索器text/21-ch06-03-6-3.txt:222(搜「稀疏检索器」) · text/21-ch06-03-6-3.txt:229(搜「TF-IDF」) · text/21-ch06-03-6-3.txt:256(搜「BM25 是一种改进」)
双编码器与交叉编码器6.3.3 检索器text/21-ch06-03-6-3.txt:270(搜「Cross-Encoder」) · text/21-ch06-03-6-3.txt:311(搜「离线计算」) · text/21-ch06-03-6-3.txt:316(搜「Dense Passage Retriever」) · text/21-ch06-03-6-3.txt:326(搜「ColBERT」)
生成式检索器与 DocID6.3.3 检索器text/21-ch06-03-6-3.txt:346(搜「标识符」) · text/21-ch06-03-6-3.txt:371(搜「DocID」)
三类索引算法6.3.4 检索效率增强text/21-ch06-03-6-3.txt:408(搜「空间划分」) · text/21-ch06-03-6-3.txt:418(搜「局部敏感哈希」) · text/21-ch06-03-6-3.txt:430(搜「小世界网络」) · text/21-ch06-03-6-3.txt:438(搜「HNSW」) · text/21-ch06-03-6-3.txt:440(搜「乘积量化」)
Faiss 与向量数据库6.3.4 检索效率增强text/21-ch06-03-6-3.txt:481(搜「Faiss」) · text/21-ch06-03-6-3.txt:489(搜「工具库」) · text/21-ch06-03-6-3.txt:504(搜「milvus」)
重排两类6.3.5 检索结果重排text/21-ch06-03-6-3.txt:23(搜「重排」) · text/21-ch06-03-6-3.txt:527(搜「MiniLM」) · text/22-ch06-04-6-4.txt:17(搜「RankGPT」) · text/22-ch06-04-6-4.txt:21(搜「滑动窗口」)

Footnotes

  1. 出处:「6.1.1 检索增强生成的背景」第 44 段(text/19-ch06-01-6-1.txt:44,搜「幻觉」)。两类成因的划分在同段。

  2. 出处:「6.1.1 检索增强生成的背景」第 67 段(text/19-ch06-01-6-1.txt:67,搜「截止到 2022 年」)与第 86 段(text/19-ch06-01-6-1.txt:86,搜「86,000 到 176,000」)。知识边界与知识偏差在第 92 段(text/19-ch06-01-6-1.txt:92,搜「知识边界」)。

  3. 出处:「6.1.1 检索增强生成的背景」第 108 段(text/19-ch06-01-6-1.txt:108,搜「音译别名」)、第 127 段(text/19-ch06-01-6-1.txt:127,搜「偏差的回答」)与第 130 段(text/19-ch06-01-6-1.txt:130,搜「知识长尾」)。四因素完整列举在第 139 段(text/19-ch06-01-6-1.txt:139,搜「解码偏差」)。

  4. 出处:「6.1.1 检索增强生成的背景」第 151 段(text/19-ch06-01-6-1.txt:151,搜「简单的实验」)与第 153 段(text/19-ch06-01-6-1.txt:153,搜「相关的外部知识」)。

  5. 出处:「6.1.2 检索增强生成的组成」第 191 段(text/19-ch06-01-6-1.txt:191,搜「Facebook AI Research」)与第 195 段(text/19-ch06-01-6-1.txt:195,搜「Retriever」)。

  6. 出处:「6.1.2 检索增强生成的组成」第 208 段(text/19-ch06-01-6-1.txt:208,搜「内部知识进行更新」)与第 212 段(text/19-ch06-01-6-1.txt:212,搜「Catastrophic Forgetting」)。

  7. 出处:「6.1.2 检索增强生成的组成」第 256 段(text/19-ch06-01-6-1.txt:256,搜「黑盒增强架构」)。

  8. 出处:「6.2.2 黑盒增强架构」第 180 段(text/20-ch06-02-6-2.txt:180,搜「困惑度分数」)与第 186 段(text/20-ch06-02-6-2.txt:186,搜「贡献分布」)。异步索引更新在第 219 段(text/20-ch06-02-6-2.txt:219,搜「异步索引更新」)。

  9. 出处:「6.2.3 白盒增强架构」第 262 段(text/20-ch06-02-6-2.txt:262,搜「RETRO」)与第 270 段(text/20-ch06-02-6-2.txt:270,搜「块交叉编码器」)。SELF-RAG 反思标记在第 256 段(text/20-ch06-02-6-2.txt:256,搜「反思标记」)。

  10. 出处:「6.3 知识检索」第 13 段(text/21-ch06-03-6-3.txt:13,搜「袋熊」)。

  11. 出处:「6.3.1 知识库构建」第 41 段(text/21-ch06-03-6-3.txt:41,搜「Metadata」)与第 70 段(text/21-ch06-03-6-3.txt:70,搜「上下文窗口长度限制」)。

  12. 出处:「6.3.1 知识库构建」第 96 段(text/21-ch06-03-6-3.txt:96,搜「伪查询」)与第 108 段(text/21-ch06-03-6-3.txt:108,搜「标题生成」)。

  13. 出处:「6.3.2 查询增强」第 139 段(text/21-ch06-03-6-3.txt:139,搜「同义改写」)、第 159 段(text/21-ch06-03-6-3.txt:159,搜「多视角分解」)与第 184 段(text/21-ch06-03-6-3.txt:184,搜「背景文档」)。

  14. 出处:「6.3.3 检索器」第 311 段(text/21-ch06-03-6-3.txt:311,搜「离线计算」)、第 316 段(text/21-ch06-03-6-3.txt:316,搜「Dense Passage Retriever」)、第 326 段(text/21-ch06-03-6-3.txt:326,搜「ColBERT」)与第 336 段(text/21-ch06-03-6-3.txt:336,搜「Poly-encoder」)。交叉编码器端到端打分在第 287 段(text/21-ch06-03-6-3.txt:287,搜「端到端」)。

  15. 出处:「6.3.3 检索器」第 229 段(text/21-ch06-03-6-3.txt:229,搜「TF-IDF」)与第 252 段(text/21-ch06-03-6-3.txt:252,搜「高词频」)。BM25 的文档长度归一化与词项饱和在第 256 段(text/21-ch06-03-6-3.txt:256,搜「BM25」)。

  16. 出处:「6.3.4 检索效率增强」第 408 段(text/21-ch06-03-6-3.txt:408,搜「空间划分」)、第 418 段(text/21-ch06-03-6-3.txt:418,搜「局部敏感哈希」)、第 434 段(text/21-ch06-03-6-3.txt:434,搜「稀疏性和稠密性」)、第 438 段(text/21-ch06-03-6-3.txt:438,搜「HNSW」)与第 440 段(text/21-ch06-03-6-3.txt:440,搜「乘积量化」)。量化误差与精排在第 465 段(text/21-ch06-03-6-3.txt:465,搜「误差」)。

  17. 出处:「6.3.4 检索效率增强」第 481 段(text/21-ch06-03-6-3.txt:481,搜「Faiss」)与第 489 段(text/21-ch06-03-6-3.txt:489,搜「工具库」)、表 6.1(text/21-ch06-03-6-3.txt:504,搜「milvus」)。

  18. 出处:「6.3.5 检索结果重排」第 517 段(text/21-ch06-03-6-3.txt:517,搜「精选」)与第 527 段(text/21-ch06-03-6-3.txt:527,搜「MiniLM」)。「6.3.5 检索结果重排」续(text/22-ch06-04-6-4.txt:17,搜「RankGPT」)与(text/22-ch06-04-6-4.txt:21,搜「滑动窗口」)。

  19. 出处:「6.3.3 检索器」第 387 段(text/21-ch06-03-6-3.txt:387,搜「稍逊一筹」)与第 391 段(text/21-ch06-03-6-3.txt:391,搜「亟待解决」)。