跳到主要内容

RAG 的进阶 — 生成增强与实践

这一章讲四件事: 什么时候该检索、什么时候千万别检索(何时增强);检索结果从哪里灌进模型(何处增强);复杂与模糊问题怎么多轮检索(多次增强);以及成本怎么压(降本增效)——最后落地到框架与实践。 链条位置:第 13 章把「查」做对了,这一章回答「查到之后呢」——增强是一门时机与剂量的学问,不是多多益善。

1. 何时增强:非必要不增强

大模型在训练中已经掌握的知识叫内部知识;内部知识够用的问题,增强不仅白费,还可能「画蛇添足」——效率上,检索文本拉长输入、推高算力;质量上,带噪音的知识反而把答案带歪1。书用树袋熊给了最直观的对照组2:

问:树袋熊一般在哪里生活?
不给资料:模型答对(澳大利亚,树上,桉树林)。
给一段「袋熊」的知识(穴居,挖 10 米深的洞,白天睡觉……):
模型被带偏,答成「利用擅长的挖洞能力在树洞或地洞中建造巢穴」。
图说:名字相近的噪音知识,比没有知识更糟。

于是核心问题变成:怎么判断模型「知不知道」? 书分两路3:

  • 外部观测法(类比面试,不碰参数):直接问「你需要额外资料吗」——但模型有过度自信的毛病,不会装不会,准确率低;反复问同一题看答案一致性——不会的题答案会飘,但模型也可能「执拗」地重复同一个错误答案,而且多问费时费钱;翻训练数据看出现频率——数万亿 token 的统计太贵,闭源模型更看不到;于是有替代指标:实体流行度(如维基页面浏览量)——流行知识(考拉是什么)答得对,冷门知识(考拉基因数量,正确答案 26,558)答错,阈值一划就能当判据,但它依赖数据的时间截面4

  • 内部观测法(类比测谎,要碰参数):看模型内部的隐藏状态——内部知识的检索主要发生在中间层 FFN,知道与不知道的问题在中间层动态不同;训练一个探针(一个线性分类器——只画一条分界线的小判断器)读中间层表示,判断「已知/未知」,分类准确率相当高。局限:黑盒模型用不了;而且问题本身的歧义也会让模型「不确定」,会误报5

2. 何处增强:三个注入点

确定要增强了,检索结果从哪进模型?书给三个位置(各自独立,可组合)6:

位置做法代价
输入端拼进 Prompt(主流);配合知识排序与 CoT 技巧文本过长撞上下文上限,推理成本涨
中间层知识编码成向量,经交叉注意力进入隐藏状态(RETRO 一路)要改模型结构,黑盒用不了
输出端后矫正:先生成初稿,再拿检索知识校准(REFEED)效果全看检索质量,检索错则校准错

输入端胜在简单直接;中间层影响最深、省输入长度;输出端保证输出与资料一致——按场景选,也能三层叠加7

3. 多次增强:复杂题拆,模糊题问

一次检索不够的两类问题,两条路子8:

  • 复杂问题→分解式增强。「世界上睡眠时间最长的动物爱吃什么?」是多跳问题:先要知道睡最长的是考拉(每天约 22 小时),再查考拉吃什么(桉树叶)。代表框架 DSP 三模块:DEMONSTRATE 用上下文学习演示怎么拆(示例:最大的动物→蓝鲸→平均体重);SEARCH 对子问题迭代检索,第一个子问题的答案自动变成第二个子问题的素材;PREDICT 汇总作答。它的性能上限取决于拆得好不好9

  • 模糊问题→渐进式增强。「国宝动物爱吃什么?」指代不明(各国国宝不同,有的一国多个)。代表框架 TOC:递归生成澄清问题树(中国的国宝动物吃什么?澳洲的呢?),按与原问题的相关性和知识一致性剪枝,再对每个叶子检索细化(澳洲的国宝动物考拉吃什么?),最终汇总多条答案路径——熊猫吃竹子、考拉吃桉树叶、袋鼠吃杂草灌木。代价实打实:计算量随复杂度指数增长,多路径还引入不稳定性10

4. 降本增效:压 token,复用缓存

检索文本又长又杂,两路省法11:

  • 去除冗余文本,按粒度分三级。

    Token 级——困惑度低的 token 是模型闭着眼都能预测的,信息量小,可删;LongLLMLingua 用小模型算困惑度,先按文档平均困惑度粗排文档、再逐 token 细删,另配文档重排、动态压缩比与子序列恢复。

    子文本级——FIT-RAG 用双标签打分器(事实性:有没有答案;模型偏好:好不好懂)给滑窗切出的子文档打分删低分。

    全文本级——PRCA 训一个信息提取器,先以「压缩文本贴近原文」监督训练,再用大模型当奖励模型做强化学习,端到端(从原文一口气到压缩文本)地提炼12

  • 复用计算结果:自回归生成时每个新 token 都要用之前所有 token 的 Key/Value 结果,缓存下来(KV-cache)免得重算;但 RAG 输入长,KV 缓存的显存会剧增,甚至超过模型参数本身。RAGCache 的思路:不同查询常检索到相同文档,那就把文档级 KV 张量存进一个树形缓存库,配上缓存检索器与控制器;替换策略 PGDSF 综合访问频率、大小、成本与最近访问时间,重排策略优先处理能吃缓存的请求,再用动态流水线并行「取缓存」与「推理」13

5. 实践与应用

搭建:两大框架各有所长——LangChain 六模块(Model IO/Retrieval/Chains/Memory/Agents/Callbacks)是全家桶,提供一整套程序调用入口;LlamaIndex 专注数据索引与检索,多源接入,查询效率突出,两者可结合14

书给了可跑的最小流水线(WebBaseLoader 加载→RecursiveCharacterTextSplitter 按 chunk_size=1000、重叠 200 切块→Chroma+OpenAIEmbeddings 建索引→as_retriever 检索→gpt-3.5-turbo 生成→LCEL 把检索、模板、模型、输出用解析(把结果拆开取用)串成链)15

应用两则:Agent——四模块(配置/记忆/计划/行动)全面接入 RAG,书走查「我在澳大利亚想抱考拉怎么办」:旅游顾问角色→规划(地点/法规/交通)→记忆与工具检索→整合输出龙柏考拉动物园等方案16。多模态垂域——医疗最典型,X 光、MRI、CT 与病历文本共存,检索器要能跨模态:书例里一张 X 光片经图像+文本双特征检索医学知识库,模型给出的答案是「心肌肥大」;金融、生物、音频、视频场景也有落地17

6. 作者的判断与证据

  • 给了证据的:袋熊噪音知识翻车对照;流行度与 26,558 的冷门知识对照;探针分类的高准确率;DSP 与 TOC 的完整流程图;LangChain 逐行代码。

  • 书自己的框架判断:把「何时/何处/多次/降本」立为生成增强的四个正交问题——这是本章(也是书)的组织创新,原始文献没有这个四分框架。

  • 诚实的边界:内部观测法被书标为「尚处于初步探索阶段」;TOC 的指数级计算量书照实写出18

7. 边界与局限

  • 「流行度判据」有时代偏差:新事件发生前模型必然「不知道」,但流行度指标也读不出「刚发生」——时效性判断书未覆盖。

  • 输出端后矫正(REFEED)增加一次完整生成,延迟翻倍,书未算这笔账。

  • KV 缓存复用依赖「查询命中相同文档前缀」,长尾查询收益有限;PGDSF 的调参书未展开。

  • LangChain 代码是 2024 版 API,接口(程序调用入口)迭代快,读思路不抄代码。

  • 多模态 RAG 的评测(跨模态检索命中率)书未给出,只有框架示意。

8. 可带走的

  1. 非必要不增强:内部知识够用就别检索——带噪音的知识比没知识更糟(袋熊案)。
  2. 判「知不知道」:问模型(过度自信)、看一致性(执拗)、算流行度(时间偏差)、探中间层(黑盒不可用)——四条各有一坑。
  3. 内部知识检索发生在中间层 FFN——与第 11、12 章的模型编辑发现互为印证。
  4. 增强三入口:输入端拼 Prompt(主流)、中间层交叉注意力(要改结构)、输出端后矫正(看检索质量)。
  5. 多跳复杂题用 DSP(演示→迭代检索→汇总);模糊题用 TOC(澄清树+剪枝),代价指数涨。
  6. 困惑度低的 token 可删;压缩三级:token/子文本/全文。
  7. RAG 的隐性大账是 KV 缓存显存,可超模型参数本身;RAGCache 靠「文档级缓存复用」回血。
  8. 搭建选型:要全家桶用 LangChain,重检索用 LlamaIndex;先切块(1000/200)再建索引再串链。

9. 原文地图

主题原书章原文位置
内部知识与画蛇添足6.4.1 何时增强text/22-ch06-04-6-4.txt:55(搜「内部知识」) · text/22-ch06-04-6-4.txt:60(搜「画蛇添足」)
袋熊噪音对照6.4.1 何时增强text/22-ch06-04-6-4.txt:70(搜「树袋熊一般在哪里生活」) · text/22-ch06-04-6-4.txt:101(搜「挖洞」)
两路判断法6.4.1 何时增强text/22-ch06-04-6-4.txt:87(搜「外部观测法」) · text/22-ch06-04-6-4.txt:91(搜「内部观测法」)
过度自信与执拗6.4.1 何时增强text/22-ch06-04-6-4.txt:167(搜「过度自信」) · text/22-ch06-04-6-4.txt:167(搜「执拗」)
流行度判据6.4.1 何时增强text/22-ch06-04-6-4.txt:208(搜「流行度」) · text/22-ch06-04-6-4.txt:210(搜「页面浏览量」) · text/22-ch06-04-6-4.txt:218(搜「26,558」)
测谎类比与探针6.4.1 何时增强text/22-ch06-04-6-4.txt:240(搜「测谎」) · text/22-ch06-04-6-4.txt:256(搜「中间层的前馈网络」) · text/22-ch06-04-6-4.txt:266(搜「线性分类器」)
三位置总览6.4.2 何处增强text/22-ch06-04-6-4.txt:317(搜「知识融合」) · text/22-ch06-04-6-4.txt:357(搜「输入端增强」) · text/22-ch06-04-6-4.txt:381(搜「中间层增强」) · text/22-ch06-04-6-4.txt:396(搜「输出端增强」)
REFEED6.4.2 何处增强text/22-ch06-04-6-4.txt:406(搜「REFEED」)
分解式与渐进式6.4.3 多次增强text/22-ch06-04-6-4.txt:424(搜「multi-hop」) · text/22-ch06-04-6-4.txt:428(搜「分解式」) · text/22-ch06-04-6-4.txt:431(搜「渐进式」)
DSP 三模块6.4.3 多次增强text/22-ch06-04-6-4.txt:453(搜「DEMONSTRATE」) · text/22-ch06-04-6-4.txt:495(搜「22 个小时」)
TOC 澄清树6.4.3 多次增强text/22-ch06-04-6-4.txt:530(搜「TOC」) · text/22-ch06-04-6-4.txt:561(搜「指数级增长」)
困惑度删 token6.4.4 降本增效text/22-ch06-04-6-4.txt:618(搜「困惑度」) · text/22-ch06-04-6-4.txt:624(搜「LongLLMLingua」)
FIT-RAG 与 PRCA6.4.4 降本增效text/22-ch06-04-6-4.txt:637(搜「FIT-」) · text/22-ch06-04-6-4.txt:641(搜「事实性」) · text/22-ch06-04-6-4.txt:653(搜「PRCA」) · text/22-ch06-04-6-4.txt:661(搜「奖励模型」)
KV-cache 与 RAGCache6.4.4 降本增效text/22-ch06-04-6-4.txt:687(搜「KV-cache」) · text/22-ch06-04-6-4.txt:690(搜「显存占用会随之剧增」) · text/22-ch06-04-6-4.txt:700(搜「RAGCache」) · text/22-ch06-04-6-4.txt:678(搜「PGDSF」)
两大框架6.5.1 搭建简单 RAG 系统text/23-ch06-05-6-5.txt:29(搜「LangChain」) · text/23-ch06-05-6-5.txt:49(搜「六大模块」) · text/23-ch06-05-6-5.txt:69(搜「数据索引与检索」)
最小流水线代码6.5.1 搭建简单 RAG 系统text/23-ch06-05-6-5.txt:122(搜「chunk_size」) · text/23-ch06-05-6-5.txt:139(搜「OpenAIEmbeddings」) · text/23-ch06-05-6-5.txt:206(搜「StrOutputParser」)
Agent 应用6.5.2 RAG 的典型应用text/23-ch06-05-6-5.txt:236(搜「扮演着重要角色」) · text/23-ch06-05-6-5.txt:274(搜「抱考拉」) · text/23-ch06-05-6-5.txt:307(搜「亲密接触」)
医疗多模态6.5.2 RAG 的典型应用text/23-ch06-05-6-5.txt:346(搜「CT 扫描」) · text/23-ch06-05-6-5.txt:354(搜「Ossowski」) · text/23-ch06-05-6-5.txt:370(搜「心肌肥大」)

Footnotes

  1. 出处:「6.4.1 何时增强」第 60 段(text/22-ch06-04-6-4.txt:60,搜「画蛇添足」)。效率与质量两头的代价在同段(text/22-ch06-04-6-4.txt:66,搜「计算资源」)。

  2. 出处:「6.4.1 何时增强」第 70 段(text/22-ch06-04-6-4.txt:70,搜「树袋熊一般在哪里生活」)与图 6.18(text/22-ch06-04-6-4.txt:101,搜「袋熊营穴居生活」;text/22-ch06-04-6-4.txt:101,搜「挖洞」)。

  3. 出处:「6.4.1 何时增强」第 87 段(text/22-ch06-04-6-4.txt:87,搜「外部观测法」)与第 91 段(text/22-ch06-04-6-4.txt:91,搜「内部观测法」)。

  4. 出处:「6.4.1 何时增强」第 167 段(text/22-ch06-04-6-4.txt:167,搜「过度自信」)、第 167 段(text/22-ch06-04-6-4.txt:167,搜「执拗」)、第 208 段(text/22-ch06-04-6-4.txt:208,搜「流行度」)、第 210 段(text/22-ch06-04-6-4.txt:210,搜「页面浏览量」)与第 218 段(text/22-ch06-04-6-4.txt:218,搜「26,558」)。出现频率与记忆程度正相关在第 191 段(text/22-ch06-04-6-4.txt:191,搜「正相关的」)。

  5. 出处:「6.4.1 何时增强」第 240 段(text/22-ch06-04-6-4.txt:240,搜「测谎」)、第 256 段(text/22-ch06-04-6-4.txt:256,搜「中间层的前馈网络」)、第 266 段(text/22-ch06-04-6-4.txt:266,搜「线性分类器」)与第 293 段(text/22-ch06-04-6-4.txt:293,搜「黑盒语言模型」)。

  6. 出处:「6.4.2 何处增强」第 317 段(text/22-ch06-04-6-4.txt:317,搜「知识融合」)。三个位置的独立与可组合在本章末(text/22-ch06-04-6-4.txt:418,搜「组合」)。

  7. 出处:「6.4.2 何处增强」第 357 段(text/22-ch06-04-6-4.txt:357,搜「输入端增强」)、第 381 段(text/22-ch06-04-6-4.txt:381,搜「中间层增强」)、第 396 段(text/22-ch06-04-6-4.txt:396,搜「输出端增强」)与第 406 段(text/22-ch06-04-6-4.txt:406,搜「REFEED」)。最大序列长度限制在第 373 段(text/22-ch06-04-6-4.txt:373,搜「最大序列长度」)。

  8. 出处:「6.4.3 多次增强」第 424 段(text/22-ch06-04-6-4.txt:424,搜「multi-hop」)、第 428 段(text/22-ch06-04-6-4.txt:428,搜「分解式」)与第 431 段(text/22-ch06-04-6-4.txt:431,搜「渐进式」)。

  9. 出处:「6.4.3 多次增强」第 453 段(text/22-ch06-04-6-4.txt:453,搜「DEMONSTRATE」)。考拉每天睡约 22 小时与桉树叶见图 6.24(text/22-ch06-04-6-4.txt:495,搜「22 个小时」;text/22-ch06-04-6-4.txt:501,搜「桉树叶」)。分解质量决定上限在第 512 段(text/22-ch06-04-6-4.txt:512,搜「分解的质量」)。

  10. 出处:「6.4.3 多次增强」第 530 段(text/22-ch06-04-6-4.txt:530,搜「TOC」)与第 561 段(text/22-ch06-04-6-4.txt:561,搜「指数级增长」)。熊猫竹子/考拉桉树叶/袋鼠杂草的汇总在同章(text/22-ch06-04-6-4.txt:479,搜「桉树叶」)。

  11. 出处:「6.4.4 降本增效」第 571 段(text/22-ch06-04-6-4.txt:571,搜「去除冗余文本」)与第 669 段(text/22-ch06-04-6-4.txt:669,搜「复用」)。

  12. 出处:「6.4.4 降本增效」第 618 段(text/22-ch06-04-6-4.txt:618,搜「困惑度」)、第 624 段(text/22-ch06-04-6-4.txt:624,搜「LongLLMLingua」)、第 639 段(text/22-ch06-04-6-4.txt:639,搜「子文本级别方法」)、第 641 段(text/22-ch06-04-6-4.txt:641,搜「事实性」)、第 653 段(text/22-ch06-04-6-4.txt:653,搜「PRCA」)与第 661 段(text/22-ch06-04-6-4.txt:661,搜「奖励模型」)。

  13. 出处:「6.4.4 降本增效」第 683 段(text/22-ch06-04-6-4.txt:683,搜「Key 和 Value」)、第 690 段(text/22-ch06-04-6-4.txt:690,搜「显存占用会随之剧增」)、第 700 段(text/22-ch06-04-6-4.txt:700,搜「RAGCache」)与第 678 段(text/22-ch06-04-6-4.txt:678,搜「PGDSF」)。

  14. 出处:「6.5.1 搭建简单 RAG 系统」第 29 段(text/23-ch06-05-6-5.txt:29,搜「LangChain」)、第 49 段(text/23-ch06-05-6-5.txt:49,搜「六大模块」)与第 69 段(text/23-ch06-05-6-5.txt:69,搜「数据索引与检索」)。

  15. 出处:「6.5.1 搭建简单 RAG 系统」第 122 段(text/23-ch06-05-6-5.txt:122,搜「chunk_size」)、第 139 段(text/23-ch06-05-6-5.txt:139,搜「OpenAIEmbeddings」)与第 206 段(text/23-ch06-05-6-5.txt:206,搜「StrOutputParser」)。安装依赖在第 96 段(text/23-ch06-05-6-5.txt:96,搜「langchain_chroma」)。

  16. 出处:「6.5.2 RAG 的典型应用」第 236 段(text/23-ch06-05-6-5.txt:236,搜「扮演着重要角色」)、第 274 段(text/23-ch06-05-6-5.txt:274,搜「抱考拉」)与第 307 段(text/23-ch06-05-6-5.txt:307,搜「亲密接触」)。

  17. 出处:「6.5.2 RAG 的典型应用」第 346 段(text/23-ch06-05-6-5.txt:346,搜「CT 扫描」)、第 354 段(text/23-ch06-05-6-5.txt:354,搜「Ossowski」)与第 370 段(text/23-ch06-05-6-5.txt:370,搜「心肌肥大」)。

  18. 出处:「6.4.1 何时增强」第 299 段(text/22-ch06-04-6-4.txt:299,搜「初步探索阶段」)。