跳到主要内容

检索增强生成 — 让模型开卷考试

这一章讲四件事: 为什么「把知识放进参数里」这条路天然有天花板(长尾记不住、 幻觉难根除);检索增强生成(RAG:先查资料、再让模型照着资料作答)怎么从 「结果拼进提示」长成「模型自己决定查不查」;检索这一侧四十年的论文接力; 以及生成这一侧的自查与多步串联。原书把这一章排在最后,但它却是今天落地项目最多的主题。

1. 这一章讲什么

一个对照你自己就能做:问商用模型「我们公司差旅报销上限是多少」,它多半一本正经 地编一个数。模型的所有知识都在参数里,而你的私有知识从没进过任何训练集。

第 05 章的模型编辑是「把知识改进参数」;这一章是另一条路:知识放外面, 模型开卷考试——先检索(照着问题去资料库把相关段落捞出来),再让模型 照着资料作答。原书这一章五节:从简介与架构,到检索侧、生成侧,最后收实践。 我们的拆解把它们讲成一条流水线:每一站列的论文,就是那一站的工艺史。

2. 顶层全景:六站流水线

问题「差旅报销上限是多少」

├─ ① 切块 文档拆成小段(每段一块)
├─ ② 嵌入 每块变成一串数(向量),意思近的块、数也近
├─ ③ 索引 向量装进可快查的结构(HNSW 一线)
├─ ④ 检索 问题同样变向量,取最相近的 top-k 块
├─ ⑤ 重排 拿更重的模型给候选块精挑细选
├─ ⑥ 生成 问题 + 选中的块拼成提示,模型照着答

└─ 校验 答案和资料对得上吗(幻觉自查)

图说:① 是离线一次性做的,④⑤⑥ 每次提问都要走;每一站后面的论文,本章各有一节。

图里第 ② 站要先说清:把一段话变成一串数,意思近的段落、数也近——这一步叫 嵌入(embedding)。第 01 章那台做完形填空的 BERT,今天仍常干这个活。

本章主走查就是这道题:一笔「差旅报销」知识,从 50 页 PDF 走到答案, 每一站给出具体的数(演示口径:50 页切成 300 块、每块 1536 维向量、 取前 5 名、经重排(把候选再精挑一次)留 3 块)。

3. 核心原理(上):立论——为什么知识该放外面

简介一节只收两篇,一旧一新,正好一破一立:

  • (1997 年的「没有免费午餐」定理)1:不加任何假设时,没有一个模型能在 所有任务上都赢——单靠参数记忆包打天下,数学上就不成立;
  • (2020 年的 RAG 原始论文)2:把「去查资料的零件」和「作答的零件」接在一起做端到端(从查到答整条链一起调)训练,问答、事实核查多项任务见效——「先查再答」从此有了正式名字与范式地位。

参数记忆靠不住的证据收在「生成增强」一节,两条最硬:

  • 长尾知识3:出现次数越少的事实,模型答得越差——低频知识是参数记忆的盲区, 而企业的知识恰恰全是低频的;
  • 何时该查4:实测流行度高的问题模型直答就很好,冷门问题才需要检索—— 「全都查」浪费,「全不查」翻车,该不该查成了可学习的判断。

顺带把「幻觉」(模型一本正经地编造事实)的检测问题也预埋在这里

^5
不看模型内部、只让它对同一问题多次作答,答案互相矛盾的地方就是可疑点—— 黑盒自查的第一站。

4. 核心原理(中):架构演进——主导权一步步移进模型

阶段论文怎么做主导权在谁
拼进上下文RALM(2023)5检索结果原样拼在问题前面,模型照常续写管道:模型无感知
检索器可调REPLUG(2023)6把检索结果当「多个输入版本」,用各自输出概率反过来调检索器管道与模型互相喂
海量外存RETRO(2022)7 / Atlas(2023)8架构里专门留「读检索结果」的零件;万亿词元(模型切文本的最小单位)级外部库上做少样本学习模型体内
自己决定查不查Self-RAG(2023)9模型生成特殊记号,自评「需要查吗、查来的靠谱吗」模型自己

这条线的读法:RAG 从「外挂管道」进化成「模型的一种行为」。 终点的形态—— 模型自己发起检索、自己批评检索结果——已经是智能体(会自主行动的系统)的雏形, 接回了第 03 章结尾那条线。

5. 核心原理(下):检索侧——四十年接力修一个瓶颈

「知识检索」一节收了 22 篇,时间跨度 1975 到 2024。按「修谁的瓶颈」分四段。

第一段:数词频

tf-idf10 与 BM2511:哪些词在这个文档里出现得多、又在全局里少见,文档就越 相关。便宜、可解释,今天仍是每个检索系统的底线配置。这一线后来得了个名字叫 稀疏(只记词、不记意思)方法。瓶颈:同义改写抓不住——「报销上限」搜不到 「差旅额度」。

第二段:算意思

把问题与段落都各变成一串数,按数的距离取最近——这路数行话叫稠密 (意思压进一串数里)检索。DPR(2020)12 率先做成,意思近就查得到,改写不再是 障碍。ColBERT13 更精细:问题与段落的每个词两两算相似度、保留细节。

两台模型各编各的、最后比总分——这种省事结构叫双编码器(快,但粗)。

反过来,问题和段落拼进同一台模型里打分的,叫交叉编码器(准,但慢); poly-encoder14 在两者之间取折中。

我们书架里有这条管线的源码拆解可对照(补充(不在书里,依据我们的 frontier 书架): 依据: shelf=ai-frontier-reference/llamaindex#03-retrieval.md 事实=检索流程是问题变 一串数、查库存取前几名、回正本、返回带分数的节点,并可叠加多路融合 RRF)。

第三段:索引

瓶颈:数多了怎么查得快? 主走查 300 块要算 300 次距离(演示口径),3 亿块就要 3 亿次——所以要有索引(把数组织起来、让查找不必逐个比的结构)。

这条支线从 1975 年的 kd 树15一路到 HNSW(2018)16——把数组织成多层 「跳级图」,查的时候从粗到细跳着走,不用挨个比;再到乘积量化17(把数压短存储, 牺牲一点准确度换十倍内存)。

HNSW 至今是各家向量数据库(专门存这些数、专管快查的库)的默认引擎, 书架里的 RAG 实现也带着它的备选实现(补充(不在书里,依据我们的 frontier 书架): 依据: shelf=ai-frontier-reference/hkuds-videorag#04-storage-and-llm.md 事实=向量存储 可插拔,备选实现 vdb_hnswlib.py 就是 HNSW 索引)。

第四段:让模型参与检索本身

生成式检索(DSI18、NCI19)反过来——把文档编号当「生成目标」,模型直接 生成要查的文档编号;重排环节则请大模型出场:RankGPT(2023)20 让大模型对候选 段落直接排座次,效果超传统重排器。另有 GenRead21 干脆「别查了,让模型自己生成 背景资料」——查与写的边界开始模糊。

6. 生成侧增强:查到之后还有四关

「生成增强」一节收 14 篇,是流水线后三站的工艺史:

  1. 该不该查:流行度判断4 (§3 已讲)——先省掉不必要的检索;

  2. 查来的放哪:「迷失在中间」在第 03 章讲过——查到的东西拼提示时, 最相关的放头尾;输入太长就用压缩

    ^23
    把提示里的冗余 词元(模型切文本的最小单位)剪掉,保信息、缩长度;

  3. 答得对不对:SelfCheckGPT 的多答互证22之外,还有「语义一致性」估计23、 查后反馈修正24——评测框架里的工程对应物是「忠实度」指标 (答案是否忠于资料;补充(不在书里,依据我们的 frontier 书架):依据: shelf=ai-frontier-reference/ragas#01-metrics-engine.md 事实=faithfulness 类指标把答案 拆成原子判断、逐条让 LLM 核对是否被资料支持,再聚合成 0~1 分);

  4. 多步串联:DSP(2022)25 把「查资料→推理→再查资料」写成程序——它就是后来 DSPy 框架的前身。

    两家同出斯坦福,那间实验室做 NLP——自然语言处理——这套是通用知识。书架里有 DSPy 的拆解:输入文字与示范样例成了编译器自动调整的参数(补充(不在书里,依据我们的 frontier 书架):依据: shelf=ai-frontier-reference/dspy#04-optimizers-teleprompt.md 事实=每个模块的示范样例与指令都由编译器自动搜索调整,MIPROv2 联合搜索)。

效率补丁两篇:TriForce(层次化投机解码,长文生成提速)26、RAGCache27 (把查过的结果存进缓存——临时存着备用的快存区——下次直接复用)——说明到 2024 年,RAG 的战场已经延伸到「怎么又快又省」。

7. 实践与应用:RAG 的适用半径

收尾一节圈出的地盘远超「企业问答」:金融长答案问答 FinTextQA28

分子生成——检索已知分子当模板、把要造的结构往已知结构上靠29

文生图——先检索参考图、照着画30

语音识别——把人说的话转成文字——也靠外挂一张「词→替换写法」的对照表31; 视频理解32

共同配方一句话:凡是「有现成参考资料、单靠参数记忆不够」的任务,都套得上这套做法。

判断(我们的,不是书里的): 本章与第 05 章互为对照——改参数是「把知识搬进去」, 检索是「把知识放外面」。企业知识天天变,搬进去追不上;参数记忆擅长「语言能力」, 外挂库擅长「新鲜事实」,分工比替代更符合 2024 年后的证据。 如果错,会错在: 如果超长上下文(整库塞进窗口)成本降到可忽略, 「检索」与「塞上下文」的边界会重划,本章检索侧的索引工艺价值会被压缩。

8. 编者的判断与证据

  • 「知识检索」一节 22 篇,1975 年的 kd 树都收——全列表年份跨度最大的一节, 说明编者把 RAG 当「有深厚前史的工程学科」而非 2020 年的新发明;
  • 「生成增强」一节把 ROME 又收了一次(text/01-full.txt:914(搜「Locating and editing factual」)):暗暗把 「改参数」与「外挂检索」摆成互替选项(第 05 章 §7 已点破);
  • 「简介」两篇一破一立的编排:没有免费午餐立「必须外挂」的哲学依据, RAG 2020 立「怎么做」——两篇之间没有过渡条目,是刻意的。

9. 边界与局限

局限说明
图谱式检索缺席用图谱当查询结构的支线(GraphRAG 一类)不在列表;书架另有其源码拆解(补充(不在书里,依据我们的 frontier 书架):依据: shelf=ai-frontier-reference/graphrag#02-graph-extraction.md 事实=GraphRAG 从文档抽实体和关系、建成图再供查询)
评测基准缺席开卷考试系统怎么整体打分(答得忠不忠、查得全不全)只有零星论文,系统评测框架要看书架的 ragas 拆解
「实践与应用」一节首条作者串行agent 综述条目挂的是 TriForce 作者名(text/01-full.txt:949(搜「Frontiers of Computer Science」))
时效2024 年后的长上下文与检索之争、多模态 RAG 大整合不在列表

10. 可带走的

  1. 参数记忆的盲区是低频知识——企业场景默认该考虑开卷;
  2. 「没有免费午餐」是 RAG 的哲学地基:不假设、不外挂,没有万能模型;
  3. RAG 六站:切块→嵌入→索引→检索→重排→生成;离线做一次的是前三站;
  4. 按意思查(稠密一路)解决改写问题,索引结构解决「快」的问题,重排解决「准」的问题——三段是叠加的;
  5. 不是每个问题都值得查:流行度高直答、冷门才检索,该不该查可以学;
  6. 答案要自查:多答互证(SelfCheckGPT)或忠实度核对,别默认「查过就答对」;
  7. 检索结果摆放照「头尾优先」,长上下文先压缩再拼;
  8. 把多步查证串成程序(DSP→DSPy),是 RAG 通向智能体的一步;
  9. 改参数(编辑)与外挂(检索)是改知识的两条路:知识常变用检索,能力要长在体内才考虑动刀。

11. 原文地图

主题原书节原文位置
立论两篇检索增强生成简介text/01-full.txt:800(搜「No free lunch」) · text/01-full.txt:803(搜「Retrieval-augmented generation」)
架构四阶段检索增强生成架构text/01-full.txt:810(搜「In-context retrieval-augmented」) · text/01-full.txt:813(搜「Replug」) · text/01-full.txt:819(搜「trillions of tokens」) · text/01-full.txt:816(搜「Few-shot learning with retrieval」) · text/01-full.txt:825(搜「self-reflection」)
稀疏与稠密检索知识检索text/01-full.txt:841(搜「tf--idf」) · text/01-full.txt:844(搜「BM25」) · text/01-full.txt:853(搜「Dense passage retrieval」) · text/01-full.txt:856(搜「late interaction」) · text/01-full.txt:859(搜「Poly-encoders」)
索引结构知识检索text/01-full.txt:871(搜「Multidimensional binary search trees」) · text/01-full.txt:883(搜「hierarchical navigable small world」) · text/01-full.txt:886(搜「Product quantization」)
生成式检索与大模型重排知识检索text/01-full.txt:862(搜「differentiable search index」) · text/01-full.txt:868(搜「Neural Corpus Indexer」) · text/01-full.txt:895(搜「re-ranking agent」) · text/01-full.txt:838(搜「Generate rather than retrieve」)
生成侧四关生成增强text/01-full.txt:908(搜「long-tail knowledge」) · text/01-full.txt:911(搜「When not to trust」) · text/01-full.txt:902(搜「Selfcheckgpt」) · text/01-full.txt:929(搜「Longllmlingua」) · text/01-full.txt:923(搜「Demonstrate-search-predict」)
效率补丁生成增强text/01-full.txt:938(搜「hierarchical speculative」) · text/01-full.txt:941(搜「RAGCache」)
适用半径实践与应用text/01-full.txt:955(搜「FinTextQA」) · text/01-full.txt:958(搜「controllable molecule」) · text/01-full.txt:961(搜「Retrieval-augmented text-to-image」)

Footnotes

  1. 出处:「检索增强生成简介」第 800 段(text/01-full.txt:800,搜「No free lunch」)。Wolpert 与 Macready,1997。

  2. 出处:「检索增强生成简介」第 803 段(text/01-full.txt:803,搜「Retrieval-augmented generation」)。Lewis 等人,NeurIPS 2020。

  3. 出处:「生成增强」第 908 段(text/01-full.txt:908,搜「long-tail knowledge」)。Kandpal 等人,ICML 2023。

  4. 出处:「生成增强」第 911 段(text/01-full.txt:911,搜「When not to trust」)。Mallen 等人,ACL 2023。 2

  5. 出处:「检索增强生成架构」第 810 段(text/01-full.txt:810,搜「In-context retrieval-augmented」)。Ram 等人,AI21,2023。

  6. 出处:「检索增强生成架构」第 813 段(text/01-full.txt:813,搜「Replug」)。

  7. 出处:「检索增强生成架构」第 819 段(text/01-full.txt:819,搜「trillions of tokens」)。RETRO,DeepMind,2022。

  8. 出处:「检索增强生成架构」第 816 段(text/01-full.txt:816,搜「Few-shot learning with retrieval」)。Atlas,Meta,2023。

  9. 出处:「检索增强生成架构」第 825 段(text/01-full.txt:825,搜「self-reflection」)。Self-RAG,2023。

  10. 出处:「知识检索」第 841 段(text/01-full.txt:841,搜「tf--idf」)。Aizawa,2003。

  11. 出处:「知识检索」第 844 段(text/01-full.txt:844,搜「BM25」)。Robertson 与 Zaragoza,2009。

  12. 出处:「知识检索」第 853 段(text/01-full.txt:853,搜「Dense passage retrieval」)。Karpukhin 等人,2020。

  13. 出处:「知识检索」第 856 段(text/01-full.txt:856,搜「late interaction」)。ColBERT,2020。

  14. 出处:「知识检索」第 859 段(text/01-full.txt:859,搜「Poly-encoders」)。

  15. 出处:「知识检索」第 871 段(text/01-full.txt:871,搜「Multidimensional binary search trees」)。Bentley 的 kd 树,1975——全列表最早的一条。

  16. 出处:「知识检索」第 883 段(text/01-full.txt:883,搜「hierarchical navigable small world」)。Malkov 与 Yashunin 的 HNSW。

  17. 出处:「知识检索」第 886 段(text/01-full.txt:886,搜「Product quantization」)。

  18. 出处:「知识检索」第 862 段(text/01-full.txt:862,搜「differentiable search index」)。DSI,2022。

  19. 出处:「知识检索」第 868 段(text/01-full.txt:868,搜「Neural Corpus Indexer」)。

  20. 出处:「知识检索」第 895 段(text/01-full.txt:895,搜「re-ranking agent」)。RankGPT,2023。

  21. 出处:「知识检索」第 838 段(text/01-full.txt:838,搜「Generate rather than retrieve」)。GenRead,2023。

  22. 出处:「生成增强」第 902 段(text/01-full.txt:902,搜「Selfcheckgpt」)。Manakul 等人,EMNLP 2023。

  23. 出处:「生成增强」第 905 段(text/01-full.txt:905,搜「Semantic Consistency」)。

  24. 出处:「生成增强」第 920 段(text/01-full.txt:920,搜「Plug-and-Play Retrieval」)。

  25. 出处:「生成增强」第 923 段(text/01-full.txt:923,搜「Demonstrate-search-predict」)。Khattab 等人,2022。

  26. 出处:「生成增强」第 938 段(text/01-full.txt:938,搜「hierarchical speculative」)。TriForce,2024(条目末尾多打了一个字母「r」,原列表瑕疵)。

  27. 出处:「生成增强」第 941 段(text/01-full.txt:941,搜「RAGCache」)。

  28. 出处:「实践与应用」第 955 段(text/01-full.txt:955,搜「FinTextQA」)。

  29. 出处:「实践与应用」第 958 段(text/01-full.txt:958,搜「controllable molecule」)。RetMol。

  30. 出处:「实践与应用」第 961 段(text/01-full.txt:961,搜「Retrieval-augmented text-to-image」)。Re-Imagen。

  31. 出处:「实践与应用」第 964 段(text/01-full.txt:964,搜「speech-to-text mappings」)。

  32. 出处:「实践与应用」第 967 段(text/01-full.txt:967,搜「few-shot video-language」)。即 VidIL。