跳到主要内容

让每一块脱离原文也站得住

这一章讲三件事: 一块合格的文字该长什么样、不合格的三种坏法、 以及三种把它补合格的做法各花多少钱

它在全书链条上的位置:第 02 章那条走查第 1 步和第 2 步之间。 块已经切出来了,还没换算成数——这一章是在这中间插进去的一道工序。

1. 这一章讲什么

三句话:

  1. 书给块定的判据比多数人想的狠:不是「别切坏句子」,是「脱离周围也站得住」;
  2. 三种补法各补一种坏法:块不知道自己属于谁(挂标注)、 块里的词信息量太小(展开缩写)、块的写法和用户的问法对不上(反过来存问题);
  3. 三种都在入库时做,所以只付一次钱——这是它们和第 11 章那些做法最大的区别。

2. 顶层全景:一块坏掉的文字,三种坏法

一块真实的文字:
"The NLP model improved it by 40% since the release."

坏法一:它不知道自己属于谁
这句话出自哪份文档?哪个团队写的?什么时候写的?"the release"是哪次发布?
→ 补法:给它挂上标注(第 4 节)

坏法二:它里面的词信息量太小
"NLP"三个字母,对换算模型来说几乎没有语义;而 "natural language processing" 有
→ 补法:把缩写展开、并且两种写法都留着(第 6 节)

坏法三:它的写法和用户的问法对不上
用户会问"我们的检索为什么变快了";这句话里一个"检索"、一个"快"都没有
→ 补法:反过来,给这块生成"它能回答的问题",拿问句去比问句(第 8 节)

图说:三种坏法是并列的,不是递进的。你可以只补一种,也可以三种都补。

3. 判据:每块恰好装一条信息,而且能被独立看懂

书把这一章的判据写在第 4 章开篇,而且它比多数人预期的狠1:

「这套做法最有效的前提是:每一块恰好装一条信息,而且能被独立看懂。 关键难点就是把块做成不依赖周围上下文也站得住。」

为什么判据这么狠

回到第 02 章那条走查的第 5、6 步:

库里 42 万块 → 比出最像的 3 块 → 只把这 3 块交给模型

模型收到的是什么?
只有这 3 块里的字。
没有第 4 块,没有这份文档的标题,没有目录,没有作者,没有日期。

图说:所以一块文字对模型来说,就是它的全世界。
块里没有的信息,对这一次回答来说等于不存在。

这条判据同时管两头2:

哪一头块不独立会怎样
被搜到那一头换算模型只看得见块里那些词。词一含糊、一缩写,能拿去比对的信号就少
被读懂那一头模型只看得见块里那些词。「它」指什么、「那次发布」是哪次,它没处可查

4. 承重词一:元数据 —— 在算相近程度之前把范围缩小的那道闸

这一章第一个承重词。一句话先给结论:元数据就是「关于这块文字本身的说明」—— 它出自哪份文件、第几页、谁写的、什么时候写的、属于哪个部门。 它不参与「意思像不像」的比较,它管的是「哪些块有资格参加比较」。

它发生在哪一步(这是最容易读错的地方)

很多人以为它是「先搜出来,再筛一遍」。不是。

❌ 以为的顺序
42 万块 → 全部比一遍相近程度 → 取前 20 → 按部门筛掉一些 → 剩 6 块

✅ 实际的顺序
42 万块 → 先按部门筛 → 剩 3 万块 → 只在这 3 万块里比相近程度 → 取前 3

图说:书的原话是"在算语义相似度之前先把搜索空间缩小"。
两种顺序结果完全不同 —— 见下一节那个例子。

书的原话是:向量库先套上标注的约束(比如「作者 == Smith」「日期 >= 2023」), 再只在过滤出来的那个子集上做语义搜索3

它挡住的是哪一类失败(这一节的重心)

书给的例子极好,而且它是这一章另起的一处走查4:

库里有两类资料,都讲"抗氧化剂":
[医学] "抗氧化剂能清除自由基,降低细胞氧化损伤……"
[环境工程] "抗氧化剂添加剂可延缓润滑油在高温下的氧化变质……"

一位医生问:"抗氧化剂的作用机理是什么?"

── 不挂标注 ──
两类的相近程度都很高(它们用的词几乎一样)
取回 3 块:医学 2 块 + 环境工程 1 块
模型读完,答案里混进了润滑油
↑ 这不是"搜错了",两边确实都在讲抗氧化剂 —— 这就叫假阳性

── 挂了标注、并且先按 domain = "medicine" 过滤 ──
环境工程那一类根本没进入比较
取回 3 块:全是医学的

图说:这个例子是书给的,块里的措辞是我们为演示编的。
要看清的是:两边"意思很近"是真的,而"这次不该出现"也是真的 ——
这个矛盾,靠比意思永远解决不了。

「假阳性」在这里的意思是:它被判成了相关,而它其实不该出现。 而这一类假阳性的特点是:语义上无可指摘。 所以它挡不住,除非在比意思之前就挡。

什么场景该挂标注

书列了四种,它们的共同形状是**「你的文档来自明显不同的几个筐,而用户一次通常只关心一个筐」**5:

场景过滤条件长什么样
人事、工程、财务的文档混在同一个库里部门 = "工程"
按年份或季度分的内容年份 = 2025
手册、工单、邮件混在一起来源 = "手册"
同一个词在不同语境下指不同的东西「release」在产品文档里是「发布版本」,在新闻稿里是「发布消息」

三层来源,以及最后那层的价钱

标注不是只有一种来路6:

从哪来花什么代价
① 文件自己带的作者、标题、创建日期 —— 直接读出来几乎不花什么
② 算出来的文件路径、大小、页数、这一块有多长几乎不花什么
让模型从正文里读出来文件的作者字段是空的,但作者名一定写在正文第一页里 —— 让模型去读出来要钱(见下)

第三层的价钱,书给了一个可以直接照抄的数7:

一千份文档的语料(语料就是你手上这一整堆待处理的文字), 让模型生成标注要花几分钟、1 到 5 美元的接口费。

这个数值得记住,因为它给「贵不贵」提供了一个参照物: 第 07 章那个最贵的切法,500 块的一份文档就要 15 到 40 美元。 同样是让模型多干一遍活,两者差了三个数量级——因为一个是每份文档调一次, 另一个是每块调两三次。

5. 主走查:一句真实的块文字,补成能用的

这是本章的主走查,三种补法都在它上面占一步。

输入是书自己在第 4 章表 4-1 里用的那类句子8,我们把它拼成一块。 里面那三个字母 NLP 就是一个缩写,它的全称叫自然语言处理 (natural language processing),指的是「让程序去处理人写的文字」这一整个方向—— 它待会儿正是要被展开的那个东西:

"The NLP model improved it by 40% since the release."

(「NLP → Natural Language Processing (NLP)」这个替换写法、 以及表 4-1 那四条清晰度动作,是书里的;下面的文件名、部门、日期、分数都是为演示编的。)

第 0 步:先问它三个问题,看它答不答得上

① "it" 指什么? 块里没有。指代丢在上一块了。
② "NLP" 是什么? 块里没有。而这三个字母的语义信号极弱。
③ "the release" 是哪一次? 块里没有。而且没有日期,无从推断。

→ 三个都答不上。按第 3 节那条判据,这一块不合格。

第 1 步:挂上标注(补坏法一)

这一块现在长这样:

文字 = "The NLP model improved it by 40% since the release."
标注 = { 来源: "search-team-2025Q3-retro.md",
部门: "engineering",
作者: "L. Chen",
日期: "2025-10-14",
章节: "检索质量改进" }

换到了什么:
· 用户问"工程团队去年三季度的检索改进",可以先按 部门 + 日期 过滤
· 答案可以标出来源,用户点得回去
· "the release" 有了推断依据(2025 年 10 月之前的那一次)

注意标注没有改动块里的一个字。 它是挂在外面的。 所以它解决不了「NLP 是什么」——那是块内的问题。

第 2 步:展开缩写(补坏法二)

书那条替换规则很朴素:把缩写换成「全称(缩写)」的形式9:

"The NLP model improved it by 40% since the release."
↓ 把 NLP 换成 Natural Language Processing (NLP)
"The Natural Language Processing (NLP) model improved it by 40% since the release."

为什么要两种写法都留着——这是这一步的机制核心10:

只留缩写 "NLP" → 用户搜 "language models" 命不中
只留全称 "natural language processing" → 用户搜 "NLP" 命不中
两个都留 → "NLP models" / "language models" /
"text understanding" 三种查法都还能命中

图说:这是一次纯赚的交易 —— 多存了两个词,多接住了两种问法。

书自己给的原理一句话: 检索是把块孤立地取出来的,换算模型只看得见块里面的词; 词一含糊或者缩写,可用的语义信号就少11

第 3 步:把含糊的地方补实(补坏法一的另一半)

书在表 4-1 里给了四条可以直接照做的动作。 表里会出现一个词:算法—— 就是「一件事该按哪几步做」的那套固定步骤8

表里还会出现一个名字:BERT——2018 年谷歌发布的一个语言模型, 在这里它只是「一个该被写全名的实体」的例子,不必深究它是什么。

动作别写要写
补上下文句它把效率提高了 40%新的索引算法把搜索效率提高了 40%
避开代词和隐含指代它是去年上线的客户反馈系统是去年上线的
保留实体全名Google 在 2019 年发布了它Google 在 2019 年发布了 BERT 语言模型
避开含糊的词系统现在更好用了系统的响应时间在优化后从 500 毫秒降到 200 毫秒

把这四条用在我们这一块上:

原句: "The NLP model improved it by 40% since the release."

① 消解代词 it → search latency
② 补上下文 the release → the v3.2 release
③ 保留全名 NLP → Natural Language Processing (NLP)

结果:
"The Natural Language Processing (NLP) model improved search latency
by 40% since the v3.2 release."

现在回头问第 0 步那三个问题,三个都答得上了。

第 4 步:反过来,给它生成「它能回答的问题」(补坏法三)

前三步都在修这块文字本身。第四步换了个方向。

让模型读这一块,生成它能回答的问题(书那个例子生成 5 个):

Q1 "新的语言处理模型让搜索延迟改善了多少?"
Q2 "v3.2 之后检索为什么变快了?"
Q3 "工程团队在检索性能上做了什么改进?"
Q4 "40% 的提升是从哪个版本开始算的?"
Q5 "搜索变快和语言处理模型有关系吗?"

这 5 个问题各自换算成一串数,存进库,
每一个都指回原来那一块。

第 5 步:提问,看它命不命得中

用户问:"我们的检索为什么变快了?"

── 只有块文字的库 ──
和那句陈述比:相近程度 0.41
库里另有一块讲"缓存命中率"的:0.58 ← 排在前面

── 有假设性问题的库 ──
和 Q2「v3.2 之后检索为什么变快了?」比:相近程度 0.79 ← 明显更高
命中 Q2 → 顺着链接取回原来那一块 → 把那一块交给模型

图说:这些分数是为演示编的。要看清的是形状——
用户的问句和一个问句比,天然比和一句陈述比更接近。

注意最后半句:命中的是问题,交给模型的是原块。 问题只是索引用的把手,它本身不进最终那段话12

6. 展开缩写:什么时候别做

书给了三条反面判据13:

别做为什么
缩写本身就是标准形式网页开发里的「HTTP」—— 展开成「超文本传输协议」反而没人这么搜
语料太大,预处理太贵这是成本问题,不是效果问题
必须实时低延迟入库多一道工序就多一道延迟

第一条是这三条里最值得记的: 判据不是「这是不是缩写」, 是「用户会用哪种写法去搜」。 HTTP、CPU、PDF、CEO 这类,用户搜的就是缩写。

7. 承重词二:假设性问题 —— 把对齐这件事挪到入库时

这一章第二个承重词。一句话先给结论:假设性问题就是入库时让模型给每一块生成 「这一块能回答哪些问题」,把这些问题存进库、拿它们去和用户的问题比, 命中之后再把原来那一块交给模型。

它解决的到底是什么

书说得很准:它缩小的是「用户提问的写法」和「文档的写法」之间的落差14

文档是这么写的: "The system's p95 latency decreased from 500ms to 200ms
following the index rebuild."
用户是这么问的: "为什么现在搜索变快了?"

这两句在意思上确实相关,但它们在"长相"上差很远:
一句是技术陈述,带指标名、带具体数;
一句是口语疑问句。

图说:换算模型比的是整句话的方向,而"陈述句 vs 疑问句"这件事
本身就会拉开距离 —— 哪怕主题一致。

书给了三条为什么有效15:

  1. 用户查询的那串数,天然更接近「问句形式的文本」,而不是原始的技术内容;
  2. 生成的问题用自然语言表达了这一块的意图;
  3. 它把代码、表格这类难以换算的东西,拉进了和用户查询同一个空间。

第三条最实用: 一段配置文件、一段代码、一张数据库表结构—— 它们换算出来的那串数几乎没法和任何自然语言问句对上。 但「这段配置怎么开启 TLS?」这个问题可以。

什么时候用、什么时候别用

用它别用它
文档里有代码、配置文件、数据库表结构文档本身就是问答形式(常见问题集) —— 它已经是问句了
内容是日志、转写稿、聊天记录付不起入库时那些额外的模型调用
表格这类结构化的东西文本本来就是清楚的叙述性散文
用户习惯问「怎么做……」「什么是……」必须实时入库

出处见16

8. 这一招和第 11 章那一招方向相反

书自己在这里埋了一个明说的伏笔,而且它是全书写得最清楚的一处前后呼应17:

这一章的做法(索引时对齐)
入库时: 文档 ──模型──> 假设性问题 ──> 存起来
查询时: 用户的问题 ──> 直接和那些问题比
付钱: 每一块付一次,而且只付一次

第 11 章的做法(查询时对齐)
入库时: 什么也不做
查询时: 用户的问题 ──模型──> 一段"假的答案" ──> 拿它去和文档比
付钱: 每一次提问都要付一次

图说:两者方向相反 —— 一个把文档往问题的样子拉,
一个把问题往文档的样子拉。可以只用一个,也可以都用。

书还补了一句判断:第 11 章那一招更流行,因为它不需要预处理所有文档18

判断(我们的,不是书里的):这条「更流行」不等于「更好」,而书没有点破这个区别。 两者的成本结构是反的:这一章的做法是一次性投入、之后每次查询免费; 第 11 章的做法是零投入、但每次查询都要多付一次模型调用。 所以真正的判据应该是查询量:一个每天被问几万次的系统, 「每次都付」会远远贵过「入库时付一次」。 如果错,会错在: 如果你的文档更新非常频繁(每天重建一遍库), 那「一次性投入」就变成了「每天都要投入一次」,这笔账会反过来。 判据是:比一比「文档更新频率」和「查询频率」哪个高。

9. 作者的判断与证据

说法它是什么
「每块恰好装一条信息、能被独立看懂」作者的判据主张。 它在原理上成立(模型只看得见块里的词),但书没有做过对照实验证明它带来多少提升
「标注过滤发生在算相似度之前」是事实,由向量库的执行顺序决定
抗氧化剂那个假阳性是机制演示。 书用它说明原理,没有跑过检索实验
「1 000 份文档几分钟、1–5 美元」作者给的经验数,没有说明用的是哪一档模型、文档多长
「两种写法都留着,三种查法都能命中」是机制推导,而且成立;但书没有量过命中率提升多少
表 4-1 那四条清晰度动作作者的做法清单。 四条都合理,是这一章最能直接照抄的东西
假设性问题为什么有效的三条是机制推导。 第三条(把代码表格拉进同一个空间)尤其站得住
「第 11 章那一招更流行」作者的观察,没有来源。 而且「更流行」和「更适合你」是两件事(见上一节判断块)
「生成 5 个问题」是那个例子的参数,不是通用建议。书没有说该生成几个

10. 边界与局限

  • 没有说标注该挂哪些字段。 三层来源讲了,但「该挂部门吗?该挂日期吗?」 书没给判据,只给了四个场景例子;
  • 没有说假设性问题该生成几个。 例子里是 5 个,但 5 个和 1 个、20 个的差别没讲;
  • 没有讲这些问题会不会把库撑大。 每块 5 个问题,库里的条数就是原来的 6 倍—— 存储和检索成本都会涨,书一个字没提;
  • 没有讲生成的问题质量怎么保证。 模型可能生成「这一块讲了什么?」这种毫无区分度的问题, 那等于白花钱;
  • 没有讲标注和第 09 章那个库怎么配合。 「先按部门过滤」在不同的库里写法差别很大, 这一章只给了原理,写法在第 09、10 两章。

11. 可带走的

  1. 判据不是「别切坏句子」,是「每块恰好装一条信息,而且脱离周围也站得住」。 因为模型收到的只有那几块里的字——块里没有的,这一次回答就等于不存在;
  2. 三种坏法是并列的: 块不知道自己属于谁 / 块里的词信息量太小 / 块的写法和用户的问法对不上;
  3. 元数据 = 关于这块文字本身的说明(出自哪、第几页、谁写的、什么时候、哪个部门)。 它不参与「意思像不像」,它管「哪些块有资格参加比较」;
  4. 它发生在算相近程度之前,不是之后。 先筛剩三万块,再在这三万块里比—— 顺序反了,结果完全不同;
  5. 它挡住的是「语义上无可指摘、但这次不该出现」的假阳性(医学 vs 环境工程的抗氧化剂)。 这一类靠比意思永远解决不了;
  6. 标注有三层来源,前两层几乎免费,第三层(让模型从正文里读出来)要钱: 一千份文档几分钟、1 到 5 美元;
  7. 展开缩写要两种写法都留着,这样三种查法都还能命中; 但缩写本身就是标准形式时(HTTP)别展开——判据是「用户会用哪种写法去搜」;
  8. 四条清晰度动作可以直接照抄: 补上下文句 / 消解代词 / 保留实体全名 / 把含糊词换成具体数;
  9. 假设性问题是反过来做: 入库时给每块生成「它能回答的问题」,拿问句比问句, 命中之后交给模型的仍然是原块;
  10. 它最实用的地方是把代码、配置、表结构拉进了和用户提问同一个空间;
  11. 它和第 11 章那一招方向相反:这一章在入库时对齐、只付一次; 第 11 章在查询时对齐、每次都付。判据是查询频率和文档更新频率哪个高。

12. 原文地图

主题原书章原文位置
那条独立性判据Chapter 4. Data Preparationtext/06-ch04-chapter-4-data-preparation.txt:6(搜「stand alone without relying on surrounding context」)
三类预处理Chapter 4. Data Preparationtext/06-ch04-chapter-4-data-preparation.txt:8(搜「common preprocessing techniques」)
标注的三层来源Chapter 4. Data Preparationtext/06-ch04-chapter-4-data-preparation.txt:41(搜「Extract metadata already stored in the document」)
过滤发生在算相似度之前Chapter 4. Data Preparationtext/06-ch04-chapter-4-data-preparation.txt:135(搜「before semantic similarity calculations」)
四种该挂标注的场景Chapter 4. Data Preparationtext/06-ch04-chapter-4-data-preparation.txt:138(搜「clearly different buckets」)
抗氧化剂那个假阳性Chapter 4. Data Preparationtext/06-ch04-chapter-4-data-preparation.txt:148(搜「antioxidants」)
让模型生成标注的价钱Chapter 4. Data Preparationtext/06-ch04-chapter-4-data-preparation.txt:154(搜「several minutes and $1–$5」)
缩写替换的写法Chapter 4. Data Preparationtext/06-ch04-chapter-4-data-preparation.txt:178(搜「followed by the abbreviation in parentheses」)
为什么展开有用Chapter 4. Data Preparationtext/06-ch04-chapter-4-data-preparation.txt:249(搜「The embedding model only sees the words inside the chunk」) · text/06-ch04-chapter-4-data-preparation.txt:251(搜「much less informative」)
什么时候别展开Chapter 4. Data Preparationtext/06-ch04-chapter-4-data-preparation.txt:273(搜「Abbreviations are the standard form」)
清晰度四条Chapter 4. Data Preparationtext/06-ch04-chapter-4-data-preparation.txt:291(搜「Techniques to enhance data quality」) · text/06-ch04-chapter-4-data-preparation.txt:319(搜「from 500 ms to 200 ms」)
假设性问题四步Chapter 4. Data Preparationtext/06-ch04-chapter-4-data-preparation.txt:340(搜「generate at least one hypothetical question」)
命中问题、交回原块Chapter 4. Data Preparationtext/06-ch04-chapter-4-data-preparation.txt:348(搜「links back to its original text chunk」)
为什么有效的三条Chapter 4. Data Preparationtext/06-ch04-chapter-4-data-preparation.txt:399(搜「reduce the gap between the way users phrase queries」) · text/06-ch04-chapter-4-data-preparation.txt:408(搜「hard-to-embed content like code and tables」)
什么时候别用Chapter 4. Data Preparationtext/06-ch04-chapter-4-data-preparation.txt:412(搜「code, configuration files, or database schemas」)
索引时对齐 vs 查询时对齐Chapter 4. Data Preparationtext/06-ch04-chapter-4-data-preparation.txt:438(搜「addresses alignment at query time」) · text/06-ch04-chapter-4-data-preparation.txt:442(搜「more popular approach」)

Footnotes

  1. 出处:「Chapter 4. Data Preparation」第 6 段(text/06-ch04-chapter-4-data-preparation.txt:6,搜「stand alone without relying on surrounding context」)。同章第 8 段(text/06-ch04-chapter-4-data-preparation.txt:8,搜「common preprocessing techniques」)把预处理分成三类:文本准备、标注收集、文本切分——前两类是这一章,第三类是第 07 章。

  2. 出处:同章第 249 段(text/06-ch04-chapter-4-data-preparation.txt:249,搜「The embedding model only sees the words inside the chunk」)。这一句同时支撑了「被搜到」和「被读懂」两头。

  3. 出处:同章第 135 段(text/06-ch04-chapter-4-data-preparation.txt:135,搜「before semantic similarity calculations」)。原文举的两个过滤条件例子就是 author == "Smith"date >= 2023

  4. 出处:同章第 148 段(text/06-ch04-chapter-4-data-preparation.txt:148,搜「antioxidants」)。原文说抗氧化剂的资料在医学和环境工程里都成立,两边语义相似但语境无关,标注过滤在语义搜索之前把它们分开、避免了因术语重叠产生的假阳性。

  5. 出处:同章第 138 段(text/06-ch04-chapter-4-data-preparation.txt:138,搜「clearly different buckets」),四个场景分列在第 140 到 146 段;「release」那个例子见第 146 段(text/06-ch04-chapter-4-data-preparation.txt:146,搜「press releases」)。

  6. 出处:同章第 41 段(text/06-ch04-chapter-4-data-preparation.txt:41,搜「Extract metadata already stored in the document」)起的三层。书那个跑例是拿一篇论文的 PDF 做的:PDF 的作者字段是空的,但作者名写在正文里,于是用第 03 章那种字段清单把它捞出来。

  7. 出处:同章第 154 段(text/06-ch04-chapter-4-data-preparation.txt:154,搜「several minutes and $1–$5」)。

  8. 出处:同章第 291 段(text/06-ch04-chapter-4-data-preparation.txt:291,搜「Techniques to enhance data quality」)是表 4-1 的表题;四条的「别写 / 要写」对照分列在第 299 到 319 段(text/06-ch04-chapter-4-data-preparation.txt:319,搜「from 500 ms to 200 ms」)。我们主走查里那句 "The NLP model improved it by 40% since the release." 是照表 4-1 第一行那个句型拼的,不是书里的原句。 2

  9. 出处:同章第 178 段(text/06-ch04-chapter-4-data-preparation.txt:178,搜「followed by the abbreviation in parentheses」)。书那张缩写对照表里就有 NLP → Natural Language Processing

  10. 出处:同章第 251 段(text/06-ch04-chapter-4-data-preparation.txt:251,搜「much less informative」)。原文明写:保留缩写和展开式两者并存,能让用户用短查询或混合写法搜索时仍然命中。

  11. 出处:同章第 249 段(text/06-ch04-chapter-4-data-preparation.txt:249,搜「The embedding model only sees the words inside the chunk」)。

  12. 出处:同章第 348 段(text/06-ch04-chapter-4-data-preparation.txt:348,搜「links back to its original text chunk」)。原文:运行时检索器搜的是那些假设性问题,但你通常把它底下那一块原文交给模型。生成 5 个问题那个例子见第 354 段(text/06-ch04-chapter-4-data-preparation.txt:354,搜「generates five hypothetical questions」)。

  13. 出处:同章第 273 段(text/06-ch04-chapter-4-data-preparation.txt:273,搜「Abbreviations are the standard form」)起的三条。

  14. 出处:同章第 399 段(text/06-ch04-chapter-4-data-preparation.txt:399,搜「reduce the gap between the way users phrase queries」)。

  15. 出处:同章第 404 段(text/06-ch04-chapter-4-data-preparation.txt:404,搜「closer to question-style text」)起的三条;第三条见第 408 段(text/06-ch04-chapter-4-data-preparation.txt:408,搜「hard-to-embed content like code and tables」)。

  16. 出处:同章第 412 段(text/06-ch04-chapter-4-data-preparation.txt:412,搜「code, configuration files, or database schemas」)起的适用场景,与其后的反面清单。

  17. 出处:同章第 438 段(text/06-ch04-chapter-4-data-preparation.txt:438,搜「addresses alignment at query time」)。这是书自己明写的伏笔:这一节在索引时解决语义对齐,第 7 章那一节在查询时解决,方向正好相反,两者可以只用一个也可以都用。

  18. 出处:同章第 442 段(text/06-ch04-chapter-4-data-preparation.txt:442,搜「more popular approach」)。原文给的理由是它不需要预处理所有文档。