跳到主要内容

RAG with Python Cookbook — 全书拆解

30 秒导读: 书名里的 RAG 是一套做法的名字,就是「先去你的资料里搜一下, 再让 AI 照着搜到的东西回答」——它整本书讲的都是这一件事。

它回答一个很具体的问题——你手上有一堆自己的资料 (合同、报告、会议录音、幻灯片),怎么让 AI 拿它们来回答你的问题,而不是瞎编。

它不讲理论,它讲最脏的那一段:怎么把这些东西弄进去。 而这一段恰恰是整件事里最容易做砸、公开材料最少的部分。

本组文档是我们重写的完整拆解,七章。读完不必看原书。

1. 先交代清楚:这是谁在什么时候写的,以及我们手上的是哪一版

作者Dominik Polzer
出版方O'Reilly Media
我们手上这一版2025 年 3 月的「抢先版」(Early Release)
这一版有多少内容只有第 1、2 两章——「加载数据」和「数据准备」
它自己承认还欠着多少正文里十二处写着「这个稍后再讲」,而那些「稍后」在这一版里全是空白1

三件事必须先说,否则会误读这本书。

第一,「抢先版」意味着这是没编辑过的初稿。 书里自己在每章开头就写明了: 抢先版给你的是「作者边写边给的、未经编辑的原始内容」, 而且书里的示例代码还没地方下载——作者用来公开示例代码的那个地址 (行话叫「代码仓库」)当时还没开放2

这不是挑刺,而是一条实用提醒:书里的代码不能直接抄。 我们逐段核过,里面有真实的、能让程序直接崩掉的错误 (比如把一个 Word 文件的路径,喂给了专门用来读 PDF 的那段现成代码)。

具体哪几处、错在哪,第 07 章列了一张表。读它的思路,不要读它的字符。

第二,它是一本「配方书」,不是一本「原理书」。 它的组织方式是:一个问题 → 一段可跑的代码 → 一段「什么时候该用它、什么时候别用」的讨论。 真正的价值在第三段那些讨论里,那是有经验的人才会写出来的取舍;代码本身网上到处都是。

第三,它把宝全押在一家公司身上。 先把一个从头用到尾的词说清: 「模型」就是这类 AI 程序的通称——读过海量资料,你给它一段话,它给你一段结果。 全书示例里会写字的那个模型,清一色用 OpenAI 的;换一家厂商,代码要重写,思路不用。

书里还用到另外两种模型:能看图的,和能把录音里的话变成文字的。 它们同样全部来自这一家。

除了模型,书里还押上了 LangChain。它是一个「工具包」—— 别人把一整串步骤都写好打包在一起,你装上就能直接叫来用。

有意思的是,作者自己在开篇就警告过:这类工具包「仍处于早期阶段、一直在变」, 上线之前先想清楚你是不是真的需要它3

2. 全书一条主线(读完这一节,你就懂了这本书)

这一节把整件事从头到尾走一遍。不看后面任何一章,只读这一节,你也能把这本书讲给别人听。 具体怎么做,全部留给对应章节;这里只讲「发生了什么、为什么只能这样」。

① 起点:你手上的资料,AI 读不到

你问 AI 一个关于你公司的问题,它答不上来,或者一本正经地编。 原因很朴素:它没见过你的资料。

而你的资料在哪儿?按书里的说法,公司里大约八成的信息不在数据库里, 而是散在幻灯片、Word 文档、Excel、邮件和会议记录里4。 (这个「八成」是个流传很广、来路不明的行业说法,第 01 章会专门掰扯一下。)

② 那把资料整个塞给它不就行了?—— 两堵墙

第一堵墙:一次能塞多少是有上限的。 模型每次对话能读进去的量有个天花板,超了就是超了。

第二堵墙,而且更要命:塞得越多,答得越慢、越贵。

第二堵墙才是真正卡死这条路的原因。作者说得很直白: 没人愿意为一个精心组织的答案等上 10 秒钟——因为搜索引擎几乎是瞬间给结果的5

你的对手不是「另一个 AI」,是用户的耐心。

③ 唯一的出路:先找再答,这就是 RAG

不塞全部,只塞相关的那几小段

用户提问 → 先从你的资料里「搜」出最相关的几段 → 只把这几段 + 问题交给模型 → 模型照着这几段写答案

图说:模型从「知识来源」降级成了「写作工具」。知识来自你的资料,不来自它的记忆。

这套做法有个名字:RAG,三个英文单词的首字母。 前半截叫检索增强:就是先去你的资料里搜一遍,把搜到的东西补给模型; 后半截叫生成:就是让模型把答案写出来。 作者的一句话总结最好记:一个 RAG 系统 = 一个搜索引擎 + 一个会写字的模型6

④ 但「搜」不能靠关键词,得靠意思

用户问「去年欧洲业务为什么下滑」,你的文档里写的可能是「EMEA 区营收同比走弱」 (EMEA 是不少公司对「欧洲、中东、非洲」这一整片区域的内部叫法)。 一个关键词都对不上,但说的是同一件事。

所以这里换了一种搜法:把每一小段文字变成一串数字,并且让意思相近的段落,这串数字也相近。 搜的时候,把用户的问题也变成一串数字,然后找离它最近的那几段。

这一步是整件事的地基。「意思」变成了「距离」,机器才有东西可算。 (怎么变的,靠一种专门做这件事的模型;书里管它叫「无名英雄」—— 所有人都在谈会写字的大模型,可真正让搜索成立的是这个不起眼的东西7。 遗憾的是,讲它的那一章正好不在我们这一版里。)

⑤ 于是整件事分成两条流水线,一条慢一条快

【入库线】提前跑好,没人在等,慢一点没关系
你的文件 ──→ 读成文字 ──→ 切成小块 ──→ 每块变成一串数字 ──→ 存进库里

【问答线】用户在等,必须快
用户的问题 ──→ 变成一串数字 ──→ 找出最近的几块 ──→ 连同问题交给模型 ──→ 答案

图说:两条线用的是同一个「变数字」的工具——必须是同一个,否则算出来的远近没有意义。

这两条线就是这本书的骨架8而这本书的前两章,整整两章,只讲入库线的前半截: 读进来,和切成块。

⑥ 为什么前半截值得写两章?因为它是这件事真正的难点

问答线很短:把问题变成数字、找出几块、拼成一段话、发给模型。难点全在入库线。

作者的说法是:流程听起来直白,可一旦要处理来源不同、形态也不同的数据, 事情立刻变复杂——所以加载流水线的设计**「如此关键,而且需要创造力」**9

后面四步,就是这条线上依次要过的四道关—— 和前面那「两堵墙」不是一回事:墙是「此路不通」,关是「路能走,但得一道一道过」。

⑦ 第一关:资料压根不是文字

录音、照片、扫描件、会议录像——这些东西都没有「文字」可读。

书里给的是一条统一策略,而且只有一条:先把它变成文字,再走同一条线。

  • 录音和视频里的说话声 → 用一种专门把说话声变成文字的模型转成字;
  • 图片和扫描件 → 要么用老办法认字,要么直接让看图模型用一段话把这张图讲一遍;
  • 表格 → 让模型写一段「这张表说明了什么」的话。

注意第二条和第三条:存进去的不是原图、不是原表,是模型写的一段描述。 这是全书最反直觉、也最实用的一招。为什么这么做、代价是什么,第 04 章讲。

⑧ 第二关:表格不是文章

一张四万八千行的员工表(书里示例用的就是这么一份),你没法「读一遍」。 而上面那套「切成小段、比谁离得近」的搜法, 一次只搬得回几小段——问「64 号候选人的学历是什么」它答得对, 问「本科学历里有多大比例年收入超过 5 万」它必然答错。

要命的是它不会说自己答不了,它会给你一个像模像样的百分比。

所以到了表格这里,没有一条通用做法,只有三条岔路; 选哪条不取决于你的数据,取决于你的用户会问什么样的问题。 选错的代价不是慢,是一个安静的错答案。(三条路各自怎么做、各自的极限在哪,第 03 章)

⑨ 第三关:切成小块,切在哪里

必须切——因为「变成一串数」的那个工具一次只吃得下有限的量。 可一刀落在哪儿,决定了这段话以后还搜不搜得到:落在一句话中间,这一小段就谁也看不懂了。

书里排了五种切法,从最省事到最讲究,一种比一种聪明,也一种比一种贵。 作者对最省事那种的评价毫不留情:它会把句子和段落从中间撕开, 连带把文字的整个意思一起撕掉——作者为了组织好这篇文档所做的一切努力,就此报废10

判断切得好不好只有一条标准:一块 = 一个完整的意思。 (五种切法各自怎么做、各自在哪儿失手,第 05 章)

⑩ 第四关:找得「像」不等于找得「对」

这是最容易被忽略、也最能解释「我的 AI 助手为什么老是答非所问」的一道关。

前面说搜索靠「意思相近」。可相近有三种骗人的方式:

骗法一个例子
意思确实相近,但对这个用户没用医生问「抗氧化剂有什么好处」,系统搬来一段讲抗氧化剂如何改善原材料性能的工程文献——字字相关,完全没用
块自己看不懂自己一段合同里写着「PO 已核准」。PO 是采购单?产品负责人?邮局?脱离前后文,它谁也不是
问题和资料长得不像用户提的是问句,而资料是表格、代码、聊天记录。说的是一回事,形状差太远

三种骗法各有各的补救,而它们有一个共同点值得先记住: 全都发生在把资料存进去的时候,不是在用户提问的时候。 用户在等着,提问那一侧几乎腾挪不开;而存进去这一侧,你有的是时间。 (三种补救各自怎么做,第 06 章)

⑪ 一句话收尾

把这本书压缩成一句:

RAG 做得好不好,九成不取决于你用哪个模型,取决于进库之前你把资料收拾成了什么样。

作者自己没有写下这句话,但整整两章、十九个配方,讲的都是这一件事。

3. 七章地图

这张表不用记任何术语——每一章后面写的是「读完你能回答什么问题」。

读完你就能回答
01 为什么要有这一整套东西为什么不能把资料整个塞给 AI?这套系统到底由几部分组成?先读这一章,后面六章都在往下接
02 Word 和 PDF 怎么进来从一份文档里,除了文字之外还该带走什么?为什么有人主张「把所有格式先转成 PDF」?
03 表格和数据库为什么 AI 助手会把「算比例」这类问题答错? 三条路各自的极限在哪?
04 录音、图片、视频一段两小时的会议录像,怎么变成能被搜到的东西?为什么存的是描述而不是原图?
05 切成小块一份长文档该在哪儿下刀?为什么最省事的切法反而最伤?
06 找得像 ≠ 找得对我的 AI 助手为什么老是找来一堆看起来相关、其实没用的东西?
07 缺了什么、过时了什么这一版没写完的部分该去哪儿补?书里哪些做法已经不该照抄了?

推荐顺序: 01 → 02 → 03 → 04 → 05 → 06 → 07。 只想拿结论的话,读本页第 2 节加第 05、06 两章就够。 如果你已经在做这件事、只是想避坑,直接跳到 06 和 07。

4. 这本书覆盖什么、不覆盖什么

覆盖(而且讲得比多数材料细):

  • 十几种格式怎么读进来:Word、PDF、Excel、用逗号隔开每一列的表格文件、 公司里那种一张张表互相引用的数据库、录音、图片、扫描件、视频;
  • 一条反复出现的统一策略:非文字的东西,先让模型把它写成文字,再走同一条线;
  • 表格的三条路线,以及各自能回答什么问题、答不了什么问题;
  • 五种切分方法,从最笨到最贵,每一种配了「什么时候该用它」;
  • 三种让检索找得更准的做法:先按文件名、页码、作者这类附带信息把范围缩窄; 把缩写换成全称;事先给每一块编几个「用户可能会这么问」的问题;
  • 大量「我平时其实不用这个」式的坦白——这类话往往比结论有用。

不覆盖(我们这一版里根本没有):

缺什么说明
把文字变成数字的那一步全书的地基,书里反复用「详见后文」指过去,而后文不在这一版里1
怎么算两段文字像不像同上,同样被指向了不存在的章节11
检索本身存进去之后怎么找出来:先用关键词粗筛再按意思细排、把搜回来的几块再评一次分重新排先后——一个字没有
怎么判断这套系统好不好一个字没有。 十九个配方、几十条建议,没有一条给出效果数据
会自己反复琢磨、自己调整打法的 RAG书里两次提到这个名字,两次都指向后文——而后文不在这一版里12
成本、部署、上线完全没有

判断(我们的,不是书里的): 缺掉的这几块里,「变成数字」和「怎么算像不像」是最伤的—— 那是这条链上唯一真正需要理解一点原理的地方,前两章所有的努力都是为它服务的。 我们在第 01 章用一节把这两件事讲到「够用」的程度,但那是我们补的,不是书给的。 如果错,会错在: 如果你读这套文档只是为了搞清楚「资料怎么收拾」, 那这两块缺不缺无所谓;它只对想从头搭一套系统的人是致命的。

还有一类东西是「书里有,但今天不能照着做」: 它写于 2025 年初,里面点名的那些工具和模型,今天基本都换过一茬了; 示例代码里另有九处抄进去就跑不通、或者跑得起来但行为不对。 逐条清单和替代做法在第 07 章——那一章就是专门干这件对账的活儿的。

5. 我们的判断

判断(我们的,不是书里的): 这本书的价值排序是—— ① 每个配方后面那段「什么时候别用它」的讨论 > ② 各种格式的处理思路 > ③ 代码本身(基本不能用)。 引用它的时候引①和②。别引它的代码,也别引它点名的那些工具和版本号。 如果错,会错在: 如果完整版出版时代码经过了编辑和实测,那么③的评价只适用于我们手上这一版抢先版, 不适用于成书。判据是:看配套代码仓库开没开、跑不跑得通。

判断(我们的,不是书里的): 这本书最值得带走的一条思路,是它对非文字资料的处理—— 不要想办法让机器直接理解图片和表格,而是先让模型把它们改写成一段话,然后当普通文字处理。 这一招把一个很难的问题(多种形态的资料怎么统一检索)换成了一个已经解决的问题(文字怎么检索), 代价是多花一次模型调用,并且接受信息在这一步被削掉一部分如果错,会错在: 如果模型写的那段描述漏掉了后来被问到的细节,这条信息就等于永久丢失了, 而且你不会收到任何报错——系统只会告诉你「没找到」。所以书里那条「摘要要连着原件一起存」 的补丁不是可选项,是必须的。

判断(我们的,不是书里的): 配方书这种体裁有一个结构性的坏处,读的时候要有意识地防: 它把每个问题都写成「有解」的样子。 十九个配方,十九个「Solution」, 读完容易产生一种「这些坑都有现成解法」的错觉。 实际上其中好几个(按意思切分、让模型来切分)作者自己都写了「现成的工具还不成熟」「贵」「可能过度设计」。 如果错,会错在: 如果你要做的只是一个小范围的内部问答工具, 那这种「每个坑都有解」的乐观其实无害——最笨的那几种做法就够用了。 这条提醒只对准备上生产的人成立。

6. 兑现表:这套文档里每一句「后面会讲」,后面到底讲没讲

这张表是给我们自己立的规矩:正文里每一处往后指的话、每一处吊胃口的话,都在这里记一行, 写完逐行回去核过——那一章真的讲了吗?讲的是不是许诺的那件事? 表里三十六行,核完之后有两处对不上,已经改掉(见表下方那两条)。

许诺在哪应兑现在哪
index §1「具体哪几处、错在哪,第 07 章列了一张表」07 §5 代码错误全表——九行,每行写了错在哪、会不会当场报错
index §1「真正的价值在第三段那些讨论里」index §5 第一条判断(价值排序:讨论 > 处理思路 > 代码)
index §1「示例代码里另有九处抄进去就跑不通」07 §5,正好九行,数目对得上
index §2①「这个「八成」…第 01 章会专门掰扯一下」01 §4「那个「八成」的数字,打个折再用」
index §2④「讲它的那一章正好不在我们这一版里」01 §6 是我们补的那一节;缺口本身列在 07 §3 第 1、2 行
index §2⑥ 小标题「因为它是这件事真正的难点」01 §9「为什么这本书用两整章讲入库线」
index §2⑦「为什么这么做、代价是什么,第 04 章讲」04 §5「关键的一跳」讲为什么,§6「必配补丁」讲代价
index §2⑦「这是全书最反直觉、也最实用的一招」04 §5,同一节
index §2⑧「三条路各自怎么做、各自的极限在哪,第 03 章」03 §4(路一)、§5(路二)、§6(路三)、§7(判据表)
index §2⑨「五种切法各自怎么做、各自在哪儿失手,第 05 章」05 §5–§9,一节一种
index §2⑩「三种补救各自怎么做,第 06 章」06 §3(过滤)、§4(自解释)、§5(假设性问题)
index §4「变成数字」「怎么算像不像」两块的缺口01 §6 补到够用;缺口本身列在 07 §3 第 1、2 行
index §4「我们在第 01 章用一节把这两件事讲到够用」01 §6
index §4「逐条清单和替代做法在第 07 章」07 §5(错的)、§6(过时的)
index 脚注 [^10]「逐处清单见第 07 章第 3 节」07 §3,十二行,每行一个原文位置
01 §3「这个换算…后面第 05 章讲切分大小时还会用」05 §4「切多大」,那个换算在那里被真正用上了
01 §3「这堵墙其实在慢慢后退」01 §3 同段当场兑现(书里承认上限「越来越大」),不欠后文
01 §6「相似度和距离其实是同一件事的正反两面」01 §6 同节那张对照表,不欠后文
01 §8 主走查开头「这些数是为演示编的」01 §8 全节,每一步旁边都写了数
01 §9 四道关表:格式各不相同、结构里藏着信息02 全章
01 §9 四道关表:表格和数据库不是「文章」03 全章
01 §9 四道关表:录音、图片、视频里没有文字04 全章
01 §9 四道关表:切成小块,切在哪儿05 全章
01 §11「(见第 4 节)」「(见第 10 节)」01 §4、§10,同章内
02 §2「文件名页码这类附带信息…第 04、05、06 三章都会用到」04 §7 入库那一步、05 §4 切块那一节、06 §3 全节
02 §4「第 06 章会讲它一般化之后长什么样、救的是哪一类错误」06 §3 先按标签把范围收窄,治的是骗法一
02 §5「具体怎么做在第 04 章」04 §4(图片)、§5(表格)
02 §6「这个库今天不该再用了,见第 8 节」02 §8 第一条
02 §8「全书四处过时用法的完整清单在第 07 章第 6 节」07 §6,四行
02 §8「全书九处代码错误…在第 07 章第 5 节」07 §5,九行
02 §8「今天读 PDF 有比书里更好的选择」07 §7 第 3 行(专门的文档解析器)
03 §1「这一章讲的就是:怎么让丙这类问题也答得对」03 §6 路三:让模型写一句查询语句
04 §10「完整清单在第 07 章第 5 节 / 第 6 节」07 §5、§6
05 §12「这本书之后出现的一条新思路」07 §7 第 2 行(先算完再下刀)
06 §2「第 6 节会展开讲它为什么重要」06 §6「三招的共同点:全都在入库时做」
06 §4「这本书之后出现的更强做法」07 §7 第 1 行(入库前给每块补一段说明)

逐行核完,两处对不上,已经就地改掉:

  1. 02 §2 原先写的是「这个词后面每一章都会用到」(说的是「文件名、页码这类附带信息」 在那一章立的名字)。核下来第 03 章正文一次没用,第 05 章原稿也一次没用——这句话是假的。 现在改成「第 04、05、06 三章都会用到」,并在 05 §4 补上了那一环: 切块的时候,这些附带信息要跟着每一块走;
  2. index 脚注 [^10] 许诺的是「逐处清单」,而 07 §3 原先给的是一张按去向归并的六行汇总表, 十二处里有一处(讲那个数据库能同时存两样东西的那一句)在任何地方都没被列出。 现在 07 §3 已改成十二行, 每行带一个可回核的原文位置。

拆解写于 2026-08-25,依据 2025 年 3 月的 O'Reilly 抢先版(仅含第 1、2 章)。 原始书籍文件不入库,本组文档是我们自己的重写; 每条引用都可用 node scripts/book-verify.mjs rag-python-cookbook 回核。

Footnotes

  1. 出处:「Chapter 2. Data Preparation」第 13 段(text/05-ch02-chapter-2-data-preparation.txt:13,搜「see [Link to Come] for how to create these embeddings」)。[Link to Come] 是抢先版里的占位符,意思是「这里本该有个链接指向后面某一章,但那一章还没写」。我们把两章正文全文数了一遍,这样的占位符共十二处,逐处清单见第 07 章第 3 节。 2

  2. 出处:「Chapter 1. Loading Data」第 7 段(text/04-ch01-chapter-1-loading-data.txt:7,搜「raw and unedited content」)与第 9 段(text/04-ch01-chapter-1-loading-data.txt:9,搜「GitHub repo will be made active later on」)。同样的声明也出现在第 2 章开头。关于完整版何时出版、一共几章,我们不写——出版方的图书页要登录才看得到,我们打不开,查不实的事不进正文。

  3. 出处:「Chapter 1. Loading Data」第 51 段(text/04-ch01-chapter-1-loading-data.txt:51,搜「still at an early stage and constantly changing」)。这段警告出现在第 1 章开头的「Warning」框里,原文还补了一句:这些工具包本身「不过是一堆更成熟的框架的集合」,你也可以直接用它们背后的那些框架。

  4. 出处:「Chapter 1. Loading Data」第 13 段(text/04-ch01-chapter-1-loading-data.txt:13,搜「80% of information is unstructured」)。原文列举的载体是幻灯片、Word 文档、Excel、邮件和会议记录。

  5. 出处:「Chapter 1. Loading Data」第 19 段(text/04-ch01-chapter-1-loading-data.txt:19,搜「The context size defines how much content」)与第 21 段(text/04-ch01-chapter-1-loading-data.txt:21,搜「10 seconds for a well-crafted answer」)。

  6. 出处:「Chapter 1. Loading Data」第 23 段(text/04-ch01-chapter-1-loading-data.txt:23,搜「RAG combines the strengths of search engines」)与第 41 段(text/04-ch01-chapter-1-loading-data.txt:41,搜「combines a search engine and a LLM」)。补充(不在书里):RAG 这个叫法出自 2020 年那篇同名论文,作者是 Patrick Lewis 等人,发表于 2020 年 5 月 22 日。来源:《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》https://arxiv.org/abs/2005.11401(查阅于 2026-08-25)。

  7. 出处:「Chapter 1. Loading Data」第 17 段(text/04-ch01-chapter-1-loading-data.txt:17,搜「unsung heroes」)。原文的原话是:真正的无名英雄是那些把词句的意思变成多维向量的模型。

  8. 出处:入库线见「Chapter 1. Loading Data」第 25 段(text/04-ch01-chapter-1-loading-data.txt:25,搜「processing and indexing steps」),问答线见同章第 33 段(text/04-ch01-chapter-1-loading-data.txt:33,搜「the app can use it during runtime」)。各自的三步分别列在这两段之后。

  9. 出处:「Chapter 1. Loading Data」第 45 段(text/04-ch01-chapter-1-loading-data.txt:45,搜「so essential and requires creativity」)。

  10. 出处:「Chapter 2. Data Preparation」第 408 段(text/05-ch02-chapter-2-data-preparation.txt:408,搜「ripping not only the sentences and paragraphs apart」)。

  11. 出处:「Chapter 2. Data Preparation」第 567 段(text/05-ch02-chapter-2-data-preparation.txt:567,搜「Measure the semantic similarity between consecutive text pieces」)。同一段末尾又是一个 [Link to Come]

  12. 出处:「Chapter 1. Loading Data」第 621 段(text/04-ch01-chapter-1-loading-data.txt:621,搜「The most advanced use is the agentic RAG concept」)与第 717 段(text/04-ch01-chapter-1-loading-data.txt:717,搜「The most advanced application is the agentic RAG concept」)。原文两次都只给了一句话——「最高级的用法是让系统像人解决问题那样,反复琢磨、一轮轮调整自己的打法」——然后跟一个 [Link to Come],再没有下文。