跳到主要内容

把意思变成距离 — 嵌入原理与索引流水线

这一章讲三件事: 为什么「直接把整个资料库塞进提示词」走不通; 「嵌入」如何把一句话变成一串可计算的数字、又凭什么让意思相近的文字距离相近; 以及一份 PDF 从读入到能被提问,中间那条流水线的每一站。 读完你会拿到全书的核心机制:机器不懂你的意思,但它会算两个点离得近不近—— 这就够了。

1. 先看现象:它一本正经地不知道

拿一个只有私有文档里才有答案的问题去问模型,比如「Tesla 2022 年报里的主要风险是什么?」。 模型大概率开始编。这不是它坏了,而是两件结构性的事1:

结构性原因后果
私有数据:没公开过的东西,定义上不在任何训练集里模型只能瞎猜
知识截止(knowledge cutoff):训练集有个封版日期,其后的事一概不知新信息同样瞎猜

改提示词救不了场——提示词依赖的是模型已有的知识2。而「你有多大的库」才是真正的约束: 这就是为什么 RAG(Retrieval-Augmented Generation,检索增强生成)要分两步—— 先索引(把文档预处理成容易查找的形态),再检索(每次提问时捞出相关段落当 context)3。 本章讲第一步,下一章讲第二步。

2. 顶层全景:一条入库流水线

你的 PDF ──▶ 提取文本 ──▶ 切块 ──▶ 每块算一串数 ──▶ 存进向量库
(loader) (splitter) (embedding) (vector store)

提问时从这里捞最像的几块
图说:「入库」四个动作是一次性的;此后每个问题都只在最后一步发生查询。

原书以 Tesla 年报为例定下这个目标:问「What key risks did Tesla face in 2022?」, 希望回答有理有据地来自风险章节4

3. 核心原理

3.1 第一个拦路虎:装不下

先泼冷水:就算你愿意硬塞,Tesla 这份年报文本超过十万字符,而绝大多数模型 的上下文窗口(context window,一次调用能处理的输入加输出总量的硬上限, 通常按 token 计,例如 8192 个)根本装不下5

所以问题从「怎么让它读完」变成一个挑选问题: 每次调用,该从一大堆文字里挑哪一小撮放进窗口?6 全书第三章以前讲的都是这一句怎么落地。

3.2 词袋:最早的「把文字变数字」

要挑得准,得让文字先变成计算机能算的东西。最早的方案朴素到可爱:数词频

拿三个句子:「What a sunny day.」「Such bright skies today.」「I haven't seen a sunny day in weeks.」。 列出它们用到的所有词,对每个句子逐词打分——出现一次记 1,两次记 2,没出现记 07

第三句就变成了这样一串数:0 1 1 1 0 0 0 0 1 1 1 1 1—— 这是原书亲手列出的真表8(顺序对应 what/a/sunny/day/such/bright/skies/today/I/haven't/seen/in/weeks 十三个词; 开头是 0 因为这句里没有 what)。

这叫词袋(bag-of-words)模型。产出的向量(vector,就是一串数的别名)大部分位置是 09

这种大量留零的写法就叫稀疏(sparse):一句话只用得到全部词汇的一小角。

它能干实事:关键词搜索(哪些文档含某词)、垃圾邮件分类(把已标记样本的向量求平均, 邮件来了比一比离哪个平均更近)10。但它有一个致命的天花板:

它只认字面,不认意思。 「sunny day」和「bright skies」在词袋里没有任何共同词汇,看起来毫无关系—— 而我们一眼就知道它们说的是差不多的事。垃圾邮件发送者只要换个同义词就能骗过滤波器11

3.3 稠密嵌入:让「意思」变成「距离」

把方向掉个头:不再记录「用了哪些词」,而让一个模型读完整句话后输出一份意思的摘要—— 通常是一百到两千个小数。这就是稠密嵌入(dense embedding):几乎每个位置都不再是零12

可以把嵌入模型理解为语言模型训练过程的副产品:模型为了预测下一个词, 被迫学会了词语搭配中的意义关系;这份理解可以被抽取成数值表示单独使用 (如今多数嵌入模型已经独立训练,架构类似但更高效)13

关键性质只有一条:意思相近的两段话,这两串数在多维空间里靠得近14。 书里用三个词演示:lion、pet、dog——人和人的直觉都判 pet 与 dog 最近, 而机器的判断依据就是这三个向量之间的夹角与距离15

量「近不近」的标准尺子叫余弦相似度(cosine similarity): 算两个向量的夹角,输出 −1 到 1 的分数,0 表示无关,1 表示方向完全一致。 书的示例数:pet 和 dog 可能是 0.75,lion 和 pet 只有 0.1(这两个数为讲解编设)。 夹角越小分越高,「相似」从此是一道几何题16

一条重要的工程纪律:不同模型产出的嵌入互不可比,哪怕长度恰好相同也不能混用 ——每个模型有一套自己的「方言坐标系」17

顺带一提这套数字的花式玩法:求平均可得整体含义(逐页嵌一本书再平均); 做减法可以「消掉」某个属性——著名的 king – man + woman = queen; 图、视频、声音也有对应的嵌入模型18。RAG 只用到其中最基本的一条,其余留着以后复用。

3.4 入库流水线四站

有了嵌入,现在按全景观那张图走一遍。每一站 LangChain 都给了一个统一接口的工具:

第一站,loader(提取)。 DocumentLoader 把各种格式读出来、装进统一的 Document 对象 (正文与元数据(metadata:来源、位置等随行信息)两栏)。txt 用 TextLoader;网页用 WebBaseLoader; PDF 用 PyPDFLoader——都用同一个三步套路:挑工具→配置路径→调 load() 拿列表19

第二站,splitter(切块)。 切多少是个权衡。LangChain 的默认主力是递归(recursive)字符切分器——这层切不平就换更细的一层接着切。

给它规定块大小(如 1000 字符)和重叠量(如 200 字符), 它按「段落换行→单行换行→空格」的分隔符(即预先约定好的切割记号)优先级往下找切缝,保证切出来的尽量是意思完整的一块20。 重叠这 200 个字符是保险丝:防止关键句子刚好横跨切割线被腰斩成两段废话21。 代码文件还有专门的切法(from_language),用各语言自己的关键字(比如 def、#)当分隔符(即预先约定好的切割记号),函数体永远不会被切开, 也因此几乎不需要重叠22

第三站,embed(编码)。 Embeddings 接口一对方法:一次喂一批的 embed_documents 给每个块产出一串数;查询单条的 embed_query 给问题产出同款。一把喂进去更高效23

第四站,store(入库)。 向量库(vector store:专门按「数与数离得近不近」来取货的数据库)就是为存这些数串与快速算相似度而造的数据库, 和传统数据库并列着一整套增删改查(CRUD)^24。本书选了 PGVector——Postgres 数据库的 向量扩展——作者的偏好理由写得很实在:老朋友 Postgres 一个库同时管业务表和向量表, 少运维一套系统25

走查③:一次查询的四步

库建好之后,每次用户提问,similarity_search(query, k=4) 内部发生这四件事26:

「Which model providers offer LLMs?」 ← 用户问题
│ ① 问题送去嵌入模型,得一串数

在库里对所有已存向量算相似度 ← Postgres 里跑
│ ② 挑出最相似的 k(此例 4)个

取回这几个向量对应的原文与元数据 ← ③

按相似度从高到低排序返回 Document 列表 ← ④

图说:标注①—④的四步没有任何一步需要人参与。
k 在这里是「取几篇」的意思,不是别的参数。

底层怎么快速找到「最像的几个」而不必逐个比对百万向量?那是专门的索引结构在干活 (本书图注一笔带过地提了一个名字 HNSW,没有展开机制)27

入库侧还有一个日常问题:文档变了怎么办? 重算全部嵌入既贵又会重复堆积。 LangChain 的 indexing API 用一个小账本(RecordManager)解决:每个文档记三条账—— 内容加元数据的哈希(内容指纹)、写入时间、来源 ID;配三种清理模式28: none 不清理;incremental 只替换有变化的旧版本;full 连「本次清单里没有的存量」一并删掉。 书里的三轮实验很直观:第一轮两条全写入;第二轮同样的东西原样跳过; 改了其中一条的内容再跑,新版本写入、同源的旧版本自动清走29

3.5 三种进阶策略:当朴素切法不够用时

作者直说:朴素切分+嵌入在含图表的数据源上会导致幻觉(即一本正经地编造)会增多,检索也不稳30,然后给了三个升级方向:

预告一个名字:第三个策略的姓氏是 BERT(一类老牌文本数串模型的名字缩写),下文见到不必慌。

策略解决什么怎么做
MultiVectorRetriever表格没法按文字切块嵌让 LLM 给表格生成摘要;摘要进向量库管「被搜到」,原始表格存在另一个仓库里管「被引用」;命中摘要后按 doc_id 把完整原件取回来交给模型31
RAPTOR一层切块答不了跨文档的高层概括题把文档按远近归堆成簇、逐簇总结,再对总结归堆总结……长出一棵摘要树,树和原始块一起入库——细节题落在叶子,概括题落在高处32
ColBERT整段压成一串数太粗暴,压缩时混进的无用信息会诱发幻觉细到标记级:问题的每个标记和文档的每个标记两两比对,各取最高分配对求和当成篇得分(ColBERT——名字后半截 BERT(一类老牌文本数串模型的名号)只是姓氏)33

三者共同点是同一个思想:检索用的表示,不必等于喂给模型的原料—— 前者求「好找」,后者求「全乎」,解耦之后各自打磨。

4. 作者的判断与证据

  • 「嵌入模型可视为 LLM 训练的副产品」是作者给的直觉性框架;紧跟着他又承认工程现实 ——多数嵌入模型其实是独立训练的13。这段一虚一实的对照本身就是可信度的体现。
  • 选 PGVector 而非专用向量库的理由写得诚实:专用向量库「相对年轻、可能经不起时间考验, 运维学习曲线陡,多养一个库徒增负担」34——这三条是用产品经理口吻写的工程判断。
  • 一把喂进去优于逐条,作者归因于「模型构造方式」23,未展开数学,属于经验结论。

5. 边界与局限

  • kNN(k-nearest neighbors,最近邻:拿离得最近的 k 个当答案)之外的检索世界没有进入本章。BM25 这类词频检索、混合检索(HNSW+关键词融合)书中都未提。

    补充(不在书里,来自通用知识):生产系统常把关键词检索与向量检索(按「意思」找)同时跑再融合排序,以补齐各自的盲区。

  • HNSW 只出现在一张图的注释里,向量库为什么快这个问题书里没有正面回答27; 我们的 frontier 书架里有 rag 相关的多份拆解可补位。

  • 示例代码自相矛盾一处:同一节从头到尾的演示里 Python 版的重叠参数写成 20, JS 版写成 20035——校验或照抄时应择一处口径自行统一。

  • 本书写作时主流嵌入模型输出 1536 维;部署章的建表语句也是按 vector(1536) 写死的36, 换更新的嵌入模型时要同步改表结构。

6. 可带走的

  1. 私有数据查不到不是 bug,是定义使然;知识截止同理,改提示词救不了知识空白;
  2. 词袋只认字面——换个说法就搜不到是它的死刑判决,也是稠密嵌入存在的理由;
  3. 嵌入 = 意思的数值摘要;核心性质只有一句:意思近,距离近;相似度用余弦度量;
  4. 不同家的嵌入永不可混用,哪怕数串长度恰好一致;
  5. 入库四站流水线:loader 读入 → splitter 保意思完整地切(重叠防腰斩)→ embed 整批编码 → store 入向量库;
  6. 文档会变,重算很贵:哈希账本 + incremental/full 清理模式是增量同步的标准答案;
  7. k 不是越大越好——取多了慢、贵,还往提示词里灌噪声(即与问题无关的干扰内容)诱发幻觉(下一章展开);
  8. 表格型数据用 MultiVector;跨文档概括用 RAPTOR;精度要求高用 ColBERT; 检索用的表示 ≠ 喂模型的原料,这句话值得背下来。

7. 原文地图

主题原书章原文位置
私有数据与知识截止两大限制Chapter 2text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:9(搜「Private data」) · text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:15(搜「knowledge cutoff」)
数量问题与两步走Chapter 2text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:23(搜「quantity problem」) · text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:27(搜「Indexing your documents」)
Tesla 例与 ingestion 定义Chapter 2text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:33(搜「Tesla」) · text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:47(搜「Ingestion」)
嵌入的有损性与「对词做数学」Chapter 2text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:51(搜「lossy representation」)
词袋三句例与稀疏嵌入Chapter 2text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:67(搜「List all unique words」) · text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:145(搜「bag-of-words model」)
词袋用途与无意义局限Chapter 2text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:149(搜「Keyword search」) · text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:157(搜「no awareness of meaning」)
稠密嵌入、维度范围Chapter 2text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:169(搜「100 and 2,000 numbers」)
嵌入模型作为 LLM 副产品Chapter 2text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:165(搜「offshoot」) · text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:167(搜「trained for that purpose alone」)
不可跨模型比较Chapter 2text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:173(搜「Combining embeddings」)
lion/pet/dog 与余弦相似度Chapter 2text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:177(搜「lion, pet, and dog」) · text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:189(搜「pet and dog vectors」) · text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:191(搜「Cosine similarity」)
嵌入其他玩法(king-man 等)Chapter 2text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:209(搜「queen」) · text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:31(搜「Search」)
Loader 统一三步与种类Chapter 2text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:263(搜「similar pattern」) · text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:271(搜「Slack and Notion」)
context window 定义Chapter 2text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:323(搜「context window」)
十万字符塞不下Chapter 2text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:319(搜「100,000 characters」)
分隔符优先级与重叠Chapter 2text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:329(搜「separators, in order of importance」) · text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:354(搜「chunk_overlap」)
代码/Markdown 语言切分Chapter 2text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:375(搜「body of each function」)
Embeddings 双方法与批量建议Chapter 2text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:496(搜「two methods」) · text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:550(搜「more efficient」)
向量库定位与劣势三条Chapter 2text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:654(搜「steep learning curve」)
PGVector 选型理由Chapter 2text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:658(搜「pgvector extension」)
from_documents 四件事Chapter 2text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:736(搜「Establish a connection」)
相似度搜索四步Chapter 2text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:756(搜「The search query」)
RecordManager 与三种清理模式Chapter 2text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:823(搜「re-indexing」) · text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:825(搜「hashes are computed」) · text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:833(搜「cleanup modes」)
三轮增量实验Chapter 2text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:889(搜「Index attempt 1」) · text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:902(搜「mutate a document」)
朴素索引的问题Chapter 2text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:1036(搜「inconsistent retrieval results」)
MultiVectorRetriever 解耦思想Chapter 2text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:1042(搜「decouple documents」) · text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:1046(搜「entire referenced raw table」)
RAPTOR 摘要树Chapter 2text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:1244(搜「higher-level questions」) · text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:1246(搜「tree of summaries」)
ColBERT 逐 token 配对Chapter 2text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:1252(搜「fixed-length (vector) representations」) · text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:1256(搜「contextual embeddings for each token」)
小结与下一章预告Chapter 2text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:1046(搜「Summary」)

Footnotes

  1. 出处:「Chapter 2. RAG Part I: Indexing Your Data」第 9–15 段(text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:11,搜「by definition, not included」)。「认知截止日通常即训练集定稿日」出自第 13 段。

  2. 出处:「Chapter 2. RAG Part I: Indexing Your Data」第 17 段(text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:17,搜「Adapting the prompt won't resolve」)。

  3. 出处:「Chapter 2. RAG Part I: Indexing Your Data」第 27–31 段(text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:31,搜「retrieval-augmented generation (RAG)」)。

  4. 出处:「Chapter 2. RAG Part I: Indexing Your Data」第 33–35 段(text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:35,搜「four key steps」)。

  5. 出处:「Chapter 2. RAG Part I: Indexing Your Data」第 319 段(搜「over 100,000 characters」)与第 323 段 Tip(text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:323,搜「hard limit」);「输入 90 输出最多剩 10」的同款说明亦在此段。

  6. 出处:「Chapter 2. RAG Part I: Indexing Your Data」第 21–23 段(text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:23,搜「subset of your large collection」)。

  7. 出处:「Chapter 2. RAG Part I: Indexing Your Data」第 69 段(text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:69,搜「assign the number 0」)。

  8. 出处:「Chapter 2. RAG Part I: Indexing Your Data」第 145 段(text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:145,搜「sequence of numbers 0 1 1 1」)。十三词词频表见第 75–143 段。

  9. 出处:「Chapter 2. RAG Part I: Indexing Your Data」第 145 段(text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:145,搜「sparse embeddings」);vector 即一串数的别名亦在此段括号内。

  10. 出处:「Chapter 2. RAG Part I: Indexing Your Data」第 147–155 段(text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:155,搜「spam or not spam」)。

  11. 出处:「Chapter 2. RAG Part I: Indexing Your Data」第 157 段(text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:157,搜「sunny day and bright skies」)。

  12. 出处:「Chapter 2. RAG Part I: Indexing Your Data」第 169 段(text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:169,搜「dense embeddings」)。

  13. 出处:「Chapter 2. RAG Part I: Indexing Your Data」第 165–167 段(text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:165,搜「offshoot from the training process」)。 2

  14. 出处:「Chapter 2. RAG Part I: Indexing Your Data」第 183 段(text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:183,搜「closer than those of unrelated words」)。

  15. 出处:「Chapter 2. RAG Part I: Indexing Your Data」第 177–189 段(text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:189,搜「wider angle」)。

  16. 出处:「Chapter 2. RAG Part I: Indexing Your Data」第 191 段(text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:191,搜「dot product」)。0.75 与 0.1 为作者给出的可能取值示意。

  17. 出处:「Chapter 2. RAG Part I: Indexing Your Data」第 173 段(text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:173,搜「should always be avoided」)。

  18. 出处:「Chapter 2. RAG Part I: Indexing Your Data」第 199–211 段(text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:203,搜「average out multiple embeddings」)、第 209 段(搜「king」)。

  19. 出处:「Chapter 2. RAG Part I: Indexing Your Data」第 239–269 段(text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:260,搜「page_content」)。

  20. 出处:「Chapter 2. RAG Part I: Indexing Your Data」第 329–341 段(text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:331,搜「paragraph separator」)。

  21. 出处:「Chapter 2. RAG Part I: Indexing Your Data」第 373 段(text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:373,搜「some overlap between chunks of 200 characters to maintain some context」)。

  22. 出处:「Chapter 2. RAG Part I: Indexing Your Data」第 375 段(text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:375,搜「body of each function is kept」)。

  23. 出处:「Chapter 2. RAG Part I: Indexing Your Data」第 496 与 550 段(text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:550,搜「embedding them one at a time」)。 2

  24. 出处:「Chapter 2. RAG Part I: Indexing Your Data」第 640 段(text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:640,搜「create, read, update, delete」)。

  25. 出处:「Chapter 2. RAG Part I: Indexing Your Data」第 650–658 段(text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:658,搜「already familiar with」)。

  26. 出处:「Chapter 2. RAG Part I: Indexing Your Data」第 754–762 段(text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:756,搜「sent to the embeddings model」)。

  27. 出处:「Chapter 3. RAG Part II: Chatting with Your Data」第 120 段(text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:120,搜「Hierarchical Navigable Small World」)。仅见于 Figure 3-2 图注。 2

  28. 出处:「Chapter 2. RAG Part I: Indexing Your Data」第 823–841 段(text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:825,搜「RecordManager」);三模式在第 837 行起的三小段。

  29. 出处:「Chapter 2. RAG Part I: Indexing Your Data」第 889–915 段(text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:891,搜「will not add the documents again」)。

  30. 出处:「Chapter 2. RAG Part I: Indexing Your Data」第 1036 段(text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:1036,搜「hallucinations, especially when the data source contains images and tables」)。

  31. 出处:「Chapter 2. RAG Part I: Indexing Your Data」第 1042–1046 段(text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:1046,搜「id reference to the full raw table」)。

  32. 出处:「Chapter 2. RAG Part I: Indexing Your Data」第 1244–1247 段(text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:1246,搜「recursively」);所引论文见章末脚注 2(Sarthi 等,ICLR 2024,text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:1335,搜「RAPTOR」)。

  33. 出处:「Chapter 2. RAG Part I: Indexing Your Data」第 1252–1262 段(text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:1260,搜「maximum similarity score」)。

  34. 出处:「Chapter 2. RAG Part I: Indexing Your Data」第 650–656 段(text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:652,搜「stand the test of time」)。

  35. 对照:「Chapter 2. RAG Part I: Indexing Your Data」第 590–594 段 Python 版 chunk_overlap=20(text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:592,搜「chunk_overlap=20」)与第 623–627 段 JS 版 chunkOverlap: 200(text/05-ch02-chapter-2-rag-part-i-indexing-your-data.txt:625,搜「chunkOverlap: 200」)。

  36. 出处将在本组文档第 10 章(部署)详引;此处对应原书「Chapter 9. Deployment」建表段(text/12-fm-prerequisites.txt:87,搜「vector(1536)」)。