跳到主要内容

答案在库里,却取不到 — 混合检索、重新排一遍、再筛一道

这一章讲三件事: 「东西在库里就是取不到」的三条不同原因; 每条原因对应的那一种修法(补一路、加一道、加过滤); 以及一个反直觉的结论——取回来的东西不是越多越好,多了反而更差。

它在全书链条里的位置: 第 05 章搭好了流水线,第 06 章讲清了「取」靠的那串数。 这一章讲这一步的所有失效模式和修法——它是这条检索线上最实用的一章。

1. 顶层全景:一个查询,一路修下来

这一章的主走查是一个真实的查询,书里跑出了真实的分数。

五条员工政策文档,问:「在加州辞职要提前多久通知?」

只用向量检索(第 06 章那一套)
│ 取最接近的 5 条

正确答案「加州员工须提前 30 天通知」——**一条都没取到**

├── 原因 ①:它抓的是「大概是一类话题」,不是「能不能回答这个问题」
├── 原因 ②:它其实排在第 6 位,刚好掉在截断线外一点点
└── 原因 ③:通用模型抓不住这一行的细微差别


修法 A:补一路死抠原词的检索(「California」「notice」「resigning」)

两路结果合并,再让一个「把问题和文档拼在一起读」的模型重新排一次

命中那条得 **0.987**,第二名 **0.223** ← 书里的真实分数
│ 换一个查询试试:「残障员工的远程办公政策」

东西取到了,可它**排第 3**,上面压着假期政策和福利登记截止日

重排把它提到第 1
│ 那干脆多取一点、全塞进去?

**不行**:放在长上下文正中间的信息,模型用得最不可靠

所以取回来之后还要再筛一道,并按时效、地域、权威性过滤

图说:五道修法,各治一条不同的病。**它们不能互相替代。**

2. 三条不同的原因:先分清楚,才谈修法

这一节是全章的地基:「取不到」不是一种病。

先看现象

用户问:「在加州辞职要提前多久通知?」 系统把这句话算成向量,只按第 06 章那串数的接近程度来找——这种做法叫向量检索, 取回最接近的 5 条。

而正确答案就在那批文档里,一条都没被取到1。 (喂给系统的那一整批文字,行话叫语料——后面几章还会用到这个词。)

书给的三条原因

#原因具体是什么该用什么修
1语义漂移嵌入模型看重的是「大体上是不是一类话题」,而不是「这一段能不能回答这个问题」加一路死抠原词的检索(第 3 节)
2召回不够正确答案的排名恰好掉在你取前几条的那条线外一点点先广撒网再逐级过滤(第 4 节)
3领域鸿沟通用模型抓不住专业领域里的细微区别换领域模型(第 06 章),或者靠原词那一路补

这三条要分清楚,因为它们的修法完全不同——而且你没法从「取不到」这个现象本身 看出是哪一条。要看出来,得把排名列出来看:

如果正确答案排第 6、第 7(而你只取前 5) → 是原因 ②,加大取回量或者分阶段就能修
如果正确答案排第 40 开外 → 是原因 ① 或 ③,加大取回量没用
如果它连「这两句在说同一件事」都判不出来 → 大概率是 ③,换模型

图说:**先把排名打出来看一眼**,再决定修哪一条。这一步花五分钟,能省下几天。

取不到之后会发生什么:两个坏选项

这一步失败之后,模型只剩两条路,而且两条都不好2:

  • 编一个——就是第 02 章那个幻觉,而且这一次它连材料都没有;
  • 认输说「我不知道」——不会出错,但用户什么也没得到。

这句话把这一章的分量说清楚了:检索失败不是「效果差一点」,它是幻觉的一条直接来源。 第 05 章那条流水线只要有一环取不到,前面所有的功夫都白费。

3. 修法 A:再补一路,死抠原词

这一节讲第一种修法,以及一个几十年的老办法为什么至今不可替代。 (这一节要用到一个词:一套固定的、可以照着走的计算步骤,就叫算法—— 同样的输入永远走同样的步骤、得到同样的结果。)

先看现象:它连 California 这个词都没匹配上

用户问的那句话里明明白白写着「California」「resigning」「notice period」, 而正确的那条政策文档里也写着这几个词——可纯按向量找,它就是没排进前 5。

为什么:向量比的是「整段话的意思像不像」,不是「有没有这几个词」。 一份讲「离职流程总览」的文档,整体意思和这个问题很像,于是它可能压在正确答案前面

做法:补一路专门抠原词的

于是把两种做法并起来用3。这两路各有一个名字,先说清名字从哪来。

第一路就是第 06 章那一套:给每段文字算出几百个数, 每一个数都非零、挤得很满——这样的表示方式叫稠密。

于是这一路就叫稠密检索。

第二路是「数原词在文档里出现了几次」。它的表示方式是一张大表: 这套系统认得的全部词排成一列,这张清单叫词表,常有几十万个词。

每个词占一格,记它在这篇文档里出现了几次。 绝大多数格子是零,零零星星才有几个非零——这样的表示方式叫稀疏。

于是这一路就叫稀疏检索。

这一路靠什么找强在哪
稠密检索比意思认得出「辞职」和「通知期」在概念上相关,哪怕用词完全不同
稀疏检索数原词出现了几次死死抓住「California」这几个字

两路并用,这套做法叫混合检索。

稀疏那一路的老将:BM25

最常用的稀疏检索算法叫 BM25(名字来自 Best Matching 25,是那一系列尝试里的第 25 个版本)。 书说它给搜索引擎供能已经几十年了4

它的做法朴素得可以口述:数查询里的词在文档里出现了几次,同时把「到处都出现的常见词」算得轻一些。 (「算得多重」在这一行有个名字叫权重——一个乘数,乘上去越大就越占分量。) 你搜「iPhone 14 Pro 排障」,它就去找同时含这几个词的文档。

而它有三个性质,是任何模型都给不了的:

它确定、快、可复现——同一个查询永远返回同一批结果。 没有模型要跑,也不会有向量漂移。5

所以书给的实践顺序是:很多生产系统先拿 BM25 当基线,再对「光靠原词不够用」的那些查询加语义检索。 注意这个顺序和大多数人的直觉相反——不是「先上先进的,不够再补老的」。

书还点了另外两个稀疏检索的名字:TF-IDF(更老的一种), 以及一种叫 SPLADE 的新做法(它用模型来决定该给哪些词多大权重)。 这两个书只给了名字,没有任何展开,我们也没有补到一手来源——如实说明。

走查第 ① 步:两路各自会怎么错

书自己拆了这笔账6:

只有 BM25:
查询里的词是「quitting」,而文档里写的是「resignation」
→ **一个字都对不上,漏掉正确答案**

只有稠密检索:
捞回来一堆「概念上相关但没用」的文档(离职流程总览、离职面谈指南…)

两路合并:
BM25 抓住「California」「notice」;稠密那一路把「quitting」连到「resignation」
→ 正确答案进了候选池

图说:**它们的失败方式正好互补**,这就是为什么要并用而不是二选一。

4. 修法 B:「找得到」和「排得前」是两件事

这一节区分两个最容易混的概念,而这个区分决定了系统该怎么分层。

先看现象:东西取到了,可它排第 3

换一个查询:「残障员工的远程办公政策」。

混合检索确实找到了那一条——「员工可依据美国残障人法申请远程办公便利」。 但它排在第 3 位,上面压着两条7:

1. [还算相关] 「2023 年公司假期与休假政策」
2. [不相关] 「福利登记截止日」
3. [高度相关] 「员工可依据残障人法申请远程办公便利」 ← 正确答案在这儿

图说:如果你只取前 2 条,这次仍然是失败。**东西在,排序不对。**

两个词,分清楚

第一个词管的是「该找到的东西,有没有出现在结果里」——不管它排第几。 这个口径叫召回。 上面那个例子里,召回是的:正确答案在第 3 位,找到了。

第二个词管的是「结果里排在前面的那几条,有多少是真相关的」。 这个口径叫精度——注意它在这里不是「算得准不准」的意思。 上面那个例子里,精度是的:前两条一个还算相关、一个完全不相关。

口径它问的是上面这个例子
召回该找到的有没有在结果里(不管第几)
精度排在前面的有多少是真相关的

上一节的混合检索提高的是召回;这一节要修的是精度。 这是两件事,用一个办法修不了两件

做法:分成三段,每段只干一件事

书给的三阶段8:

① 广撒网(冲召回) ── 用混合检索取回几十上百条,宁滥勿缺

② 逐级过滤(收窄) ── 按属性、按阈值,把明显不该在里面的剔掉

③ 精排(排序) ── 用一个更贵但更准的模型,把剩下的重新排一遍

图说:书给的类比很好——在图书馆找一本书:
先走到对的区(①),再扫书架找相关主题(②),最后翻开具体几本细看(③)。
**每一步都比上一步贵,所以每一步处理的东西都比上一步少。**

5. 修法 C:重新排一遍,不是「再算一次相似度」

这一节是全章机制最深的一处,也是最容易被想当然的一处。 (先给这个动作一个名字:把已经取回来的候选重新排一次顺序,这件事叫重排。)

先看现象:两个模型对同一对文本给出完全不同的判断

查询里写的是「work accommodation」(工作便利),文档里写的是「ADA」(美国残障人法)。 这两个词在任何一份文本里都很少同时出现。

第 06 章那种模型判不出它们高度相关;而重排用的那种模型判得出。9 差别不在于哪个模型「更聪明」,在于它们的工作方式根本不同。

两种工作方式

第 06 章那种,书叫它双编码器(第 06 章讲民宿平台时已经见过这个结构):

查询 ──→ [编码器] ──→ 一串 768 个数

├─ 比这两串数的余弦相似度 → 一个分

文档 ──→ [编码器] ──→ 一串 768 个数

关键性质:**查询和文档从头到尾没有见过面。** 它们各自被压成一串数,然后才比。

另一种,叫交叉编码器:

「查询 + 文档」拼成一对,一起送进同一个模型
│ 在模型内部,查询里的每个词都能「看到」文档里的每个词

直接输出一个相关性分数(不产出任何向量,也不产出任何文字)

图说:「交叉」说的就是这件事——两段文字在模型内部交叉着互相看。

各自的命门

双编码器交叉编码器
好处文档那一侧可以预先算好,查询时只算一个能看出词与词之间的复杂关系,哪怕它们从不同时出现
命门查询和文档从不直接互相作用慢得多——每一对都要完整跑一遍模型
因此只能扫全库只用在前面几阶段选出来的少量候选上,绝不能扫全库

这张表解释了为什么必须分阶段: 便宜的那个负责把范围从几百万缩到几十,贵的那个负责在这几十个里排出顺序。 反过来做,任何一边都行不通。

走查第 ②③ 步:真实的分数

书里这套流水线(五条政策文档 + BM25 + 一个开源嵌入模型 + 一个开源交叉编码器) 跑出了真实结果10:

问:「在加州辞职要提前多久通知?」(原文用的词是 quitting)
1. [0.987] 「加州员工须在辞职前提前 30 天通知。」 ← 正确
2. [0.223] 「因过失被解雇可能导致失去遣散福利。」

问:「有带薪领养假吗?」
1. [0.965] 「产假和领养假全额带薪 12 周。」 ← 正确
2. [0.156] 「新员工入职满 90 天可享医疗保险。」

问:「因行为不端被解雇会怎样?」
1. [0.912] 「因过失被解雇可能导致失去遣散福利。」 ← 正确
2. [0.186] 「加州员工须在辞职前提前 30 天通知。」

图说:三道题各两条结果,这六个分数是书里的真实输出。**看第一题:查询里的词是「quitting」,
文档里写的是「resignation」——两个词一个字都不重合,分数却是 0.987。**
而第一名和第二名之间的差距(0.987 对 0.223)大得一眼可辨,
**这正是重排的价值:它不只是排对了,它还把差距拉开了。**

顺带看第三题的第二名(0.186)和第一题的第二名(0.223): 同一条文档,在不同查询下拿到完全不同的分。 这说明这个分数不是文档的固有属性, 而是「这一对」的属性——这正是交叉编码器和双编码器的根本差别。

6. 一个反直觉的结论:多取一点反而更差

这一节推翻一个几乎所有人的第一反应。

先看现象

模型一次能读进去多长的文字,是有上限的,这个上限叫上下文窗口。 既然它越来越大,那干脆多取一点、全塞进去,不就不会漏了吗?

为什么不行

书引了一篇论文,它的名字就叫「中间会丢」(Lost in the Middle)11:

模型对上下文里信息的使用可靠度:

高 │ ● ●
│ ● ●
│ ● ●
│ ● ●
低 │ ● ● ● ● ● ● ● ● ● ● ● ●
└────────────────────────────────────────────────
开头 中间 结尾

图说:一条 U 形曲线。**开头和结尾用得最好,正中间用得最不可靠。**
这张图的形状取自书里对那篇论文的描述,**具体数值书没有给,我们也没有画。**

所以「取一大堆长文档拼起来」反而会伤害表现:关键事实正好被埋在它最不看的那一段里。

这条把上一节那个直觉整个掀翻了: 增加取回量能修「召回不足」那条病, 但它会同时制造一条新病。两者要权衡,不是单调地越多越好。

7. 所以取回来之后,还要再筛一道

这一节回答上一节留下的那个问题:你说不能多塞,那到底该塞什么?

第一道筛:按相似度划一条线

做法:给取回来的每一段算一个和问题的相似度,划一条最低线,够不着的直接剔掉。 这条线有个名字叫阈值——超过它才算数,够不着就不算。12

书给的例子非常具体:顾客问**「我的套餐怎么开通国际漫游?」**,检索取回四份文档:

① 「怎么开通国际漫游」FAQ ← **只有这一份里有分步操作**
② 国际通话与流量资费表 沾边,但答不了「怎么开通」
③ 各地覆盖情况对比的博客文章 沾边,更远
④ 国际服务条款 沾边,更远

这四份都提到了「国际漫游」,所以四份都会被取回来。
按相似度设一条线(比如 0.75)之后:
① 0.91 ✓ 留
② 0.72 ✗ 剔
③ 0.68 ✗ 剔
④ 0.61 ✗ 剔

图说:**这四个分数是为演示编的**,书只说了「只有 FAQ 有分步操作,其余筛掉」。
但这一步的道理是硬的:**塞进去的每一段,都在稀释真正有用的那一段。**

第二道筛:长文档先压成要点

如果留下的那一段本身就很长,还有一步:先把它蒸成要点,再塞进去。13

做法叫抽取式摘要——从原文里挑出最关键的那几句,原样拿出来, 而不是让模型重新写一遍。

为什么用「抽取」而不是「重写」: 重写会引入新的表述, 而新的表述就是新的编造机会——你为了防幻觉做的这一步,自己成了幻觉的来源。

走查第 ④ 步:两道筛加起来的效果

不筛: 取回 10 段,拼起来 6000 个词元 → 正确的那一段落在第 5 段,正中间 → **被忽略**

筛过: 取回 10 段
→ 按 0.75 的线剔掉 6 段,剩 4 段
→ 其中一段是 3000 词元的长文档,压成 400 词元的要点
→ 拼起来 1200 个词元,正确的那一段排在第 1 位 → **被用上了**

图说:**这些数字是为演示编的**;但两道筛的顺序是书里的:先按相关度筛,再压长度。

8. 最后一道:语义只有一个维度,它看不见五件事

这一节讲这一章最实用的一种修法,而它经常被完全忽略。

先看现象:排第 1 的是一份 2019 年已归档的政策

问:「加州的陪产假政策是什么?」 纯按语义检索14:

1. [0.85] 「员工可享 8 周带薪家庭假。」 ← 2019 年的全球政策,**已归档**
2. [0.82] 「纽约员工可享最多 10 周育儿假。」 ← **地区不对**,但语义上很像
3. [0.78] 「加州员工可享 12 周带薪陪产假。」 ← **正确答案,排第 3**

图说:三条的语义相似度差得很小(0.85 / 0.82 / 0.78),
**而它们在「能不能回答这个问题」上的差别是天壤之别。** 这三个分数是书里的原样。

问题出在哪:相似度只有一个维度——意思像不像。它看不见「这是哪一年的」「这是哪个地区的」。

语义看不见的五件事

书列了五条15:

属性例子
时效2023 年的政策 vs 2018 年的
权威性正式的人事政策 vs 群聊里的闲话
面向谁给经理看的 vs 给全体员工的
地域加州办公室 vs 纽约办公室
部门工程团队的规矩 vs 财务流程

这些信息叫元数据——「关于这份文档本身的信息」,而不是文档的内容: 它是哪一年的、谁发的、适用于哪个地区、归在哪个类目下。

做法:从问题里抽出条件,当成过滤器

用户问: 「加州的陪产假政策是什么?」
│ 用一个模型(或者规则)从这句话里抽出结构化的条件

自动识别出的过滤条件:{地区: 加州, 状态: 生效中}
│ 先按这两个条件把候选缩窄,再排序

1. [0.78] 「加州员工可享 12 周带薪陪产假。」 ← **升到第 1**
2. [0.65] 「所有员工须提前 30 天提交休假申请。」

图说:注意第 1 名的分数**没有变**,还是 0.78。
**变的不是它有多像,是它的两个竞争者被排除了。** 这段前后对照是书里的原样。

一条重要的细节:不是所有属性都该硬过滤

书特意点了这一条,而它很容易被忽略:归档的文档不是直接删掉,而是把分数乘 0.5(软降权)。16

理由:一份旧的但高度相关的文档,仍然应该有机会浮上来。 硬过滤会让「这份文档虽然旧,但它是唯一提到这件事的」这种情况彻底没戏。

抽条件这一步本身的成本,书也如实说了

用一个完整的大模型去给每一篇文档抽属性,在大语料上太贵。 书给的建议是用更小的专门模型17

判断(我们的,不是书里的): 这一章五种修法里,元数据过滤的性价比最高,却最常被跳过。 理由:另外四种都要动检索的机制(换模型、加一路、加一层重排), 而这一种只要求你在建索引的时候多存几个字段——它是唯一一个「事先多花五分钟、 事后省掉一整轮调优」的做法。 如果错,会错在: 如果你的文档本身没有可靠的属性(没有日期、没有部门、来源混乱), 那抽属性这一步本身就不可靠,过滤会把对的东西滤掉。 判据是:你的文档里,那几个属性能不能被机械地、无歧义地读出来。

9. 作者的判断与证据

书里给了证据的:

说法证据是什么
混合检索 + 重排能把正确答案顶到第 1一整套可跑的实现 + 三个查询的真实分数(0.987 / 0.965 / 0.912)
三个部件各自的贡献书自己做的消去分析:只有 BM25 会漏掉第一题,只有稠密检索会捞回没用的
元数据过滤的效果一组真实的前后对照(陪产假那三条)
中间的信息用得最不可靠引了一篇论文(书没有给出曲线的具体数值)
BM25 确定、快、可复现一条性质陈述,来自算法本身,不需要实验

作者的推测或没给证据的:

说法它是什么
三条失败原因一个分类。 好用,但书没有给「哪一条最常见」的数据
「很多生产系统先拿 BM25 当基线」一句行业观察,没有来源
归档文档乘 0.5一个示例参数。 为什么是 0.5 而不是 0.3,书没说
TF-IDF 与 SPLADE只有名字。 一个字的展开都没有

10. 边界与局限

  • 没有讲两路结果怎么合并。 稠密那一路的分在 0 到 1 之间,稀疏那一路的分可以是几十, 要把两个尺度完全不同的分拉到同一个尺度上再相加,这个动作叫归一化—— 怎么拉、各占多大分量,书一个字没提,而这是实现时第一个卡住的地方;

  • 没有讲取回量该设多少。 广撒网撒多大、重排前留几条,书没有给任何经验值;

  • 相似度那条线该设多少没有说。 第 7 节那条阈值设 0.75 还是 0.6,书只说「设一个最低门槛」;

  • SPLADE 和 TF-IDF 只有名字(见上);

  • 「中间会丢」那条曲线没有数值。 书只描述了形状,没有给出「多长的上下文开始出现这个效应」;

  • 中文场景一个字没提。 英文的词之间有空格,数词频很直接; 中文没有空格,得先把句子切成一个个词——这一步叫分词。怎么切会直接改变 BM25 的结果,这是英文场景根本不存在的问题。

11. 可带走的

全章那条走查,一行写完: 五条政策文档,问「在加州辞职要提前多久通知?」→ 纯向量检索一条都没取到 → 三条原因(语义漂移 / 排名掉在线外 / 领域鸿沟)→ 补一路 BM25 抓住「California」「notice」→ 两路合并 → 交叉编码器重排 → 命中那条 0.987、第二名 0.223(书里的真实分数)→ 换个查询发现「东西在但排第 3」→ 重排提到第 1 → 干脆多塞?不行,中间会丢 → 按相似度筛掉沾边的、长文压成要点 → 最后按地域和状态过滤,正确答案从第 3 升到第 1(书里的原样)。

  1. 「取不到」有三条不同的原因,修法完全不同:语义漂移 / 召回不够 / 领域鸿沟。 先把排名打出来看一眼,再决定修哪条;
  2. 检索失败不是「差一点」,它是幻觉的直接来源——模型只剩「编一个」和「说不知道」;
  3. 稠密比意思、稀疏抠原词,两路并用叫混合检索; 它们的失败方式正好互补;
  4. BM25 确定、快、可复现,几十年不倒;很多生产系统拿它当基线,不够再加语义那一路;
  5. 召回和精度是两件事: 东西在不在结果里 vs 排在前面的对不对。一个办法修不了两件;
  6. 分三段:广撒网 → 逐级过滤 → 精排。每一步都更贵,所以每一步处理的更少;
  7. 双编码器各编各的、可以预先算好,但查询和文档从不见面; 交叉编码器把两者拼起来一起读,能看出隐蔽的关联,代价是慢到只能用在少量候选上;
  8. 重排的价值不只是排对,还把第一名和第二名的差距拉开了(0.987 对 0.223);
  9. 多取一点反而更差: 放在长上下文正中间的信息用得最不可靠;
  10. 所以取回之后还要再筛: 按相似度划一条线剔掉沾边的,长文档先抽成要点再塞;
  11. 压要点要用「从原文里挑句子」而不是「重写」——重写就是新的编造机会;
  12. 语义只有一个维度,它看不见时效、权威性、面向谁、地域、部门;
  13. 从问题里抽出条件当过滤器,是这一章性价比最高的一招; 但归档这类属性用软降权(乘 0.5)而不是硬删,免得唯一相关的旧文档彻底没戏。

12. 原文地图

主题原书章原文位置
加州辞职那个取不到的查询Chapter 4: Embeddings and Vector Searchtext/07-ch04-chapter-4-embeddings-and-vector-search.txt:458(搜「notice period for resigning」)
三条失败原因Chapter 4: Embeddings and Vector Searchtext/07-ch04-chapter-4-embeddings-and-vector-search.txt:468(搜「Semantic drift」) · text/07-ch04-chapter-4-embeddings-and-vector-search.txt:470(搜「Recall limitations」) · text/07-ch04-chapter-4-embeddings-and-vector-search.txt:472(搜「Domain gaps」)
两个坏选项Chapter 4: Embeddings and Vector Searchtext/07-ch04-chapter-4-embeddings-and-vector-search.txt:475(搜「two bad options」)
稠密 + 稀疏 = 混合检索Chapter 4: Embeddings and Vector Searchtext/07-ch04-chapter-4-embeddings-and-vector-search.txt:485(搜「Dense retrieval」) · text/07-ch04-chapter-4-embeddings-and-vector-search.txt:492(搜「SPLADE」)
两路各自的贡献Chapter 4: Embeddings and Vector Searchtext/07-ch04-chapter-4-embeddings-and-vector-search.txt:802(搜「might miss the first result」)
BM25 是什么、三条性质Chapter 3: Grounding Outputs with RAGtext/06-ch03-chapter-3-grounding-outputs-with-rag.txt:913(搜「Best Matching 25」) · text/06-ch03-chapter-3-grounding-outputs-with-rag.txt:918(搜「deterministic, fast, and reproducible」)
东西在但排第 3Chapter 4: Embeddings and Vector Searchtext/07-ch04-chapter-4-embeddings-and-vector-search.txt:529(搜「remote work accommodations under ADA」)
三阶段与图书馆类比Chapter 4: Embeddings and Vector Searchtext/07-ch04-chapter-4-embeddings-and-vector-search.txt:540(搜「Broad Retrieval」) · text/07-ch04-chapter-4-embeddings-and-vector-search.txt:546(搜「looking for a」)
双编码器与交叉编码器Chapter 4: Embeddings and Vector Searchtext/07-ch04-chapter-4-embeddings-and-vector-search.txt:558(搜「bi-encoders」) · text/07-ch04-chapter-4-embeddings-and-vector-search.txt:564(搜「never directly」) · text/07-ch04-chapter-4-embeddings-and-vector-search.txt:566(搜「Cross-encoders take a completely different」)
ADA 那个跨词关联Chapter 4: Embeddings and Vector Searchtext/07-ch04-chapter-4-embeddings-and-vector-search.txt:573(搜「work accommodation」)
三个查询的真实分数Chapter 4: Embeddings and Vector Searchtext/07-ch04-chapter-4-embeddings-and-vector-search.txt:746(搜「0.987」) · text/07-ch04-chapter-4-embeddings-and-vector-search.txt:753(搜「0.965」) · text/07-ch04-chapter-4-embeddings-and-vector-search.txt:760(搜「0.912」)
中间会丢Chapter 3: Grounding Outputs with RAGtext/06-ch03-chapter-3-grounding-outputs-with-rag.txt:851(搜「Lost in the Middle」) · text/06-ch03-chapter-3-grounding-outputs-with-rag.txt:854(搜「U-shaped」)
按相似度筛与国际漫游那四份文档Chapter 3: Grounding Outputs with RAGtext/06-ch03-chapter-3-grounding-outputs-with-rag.txt:867(搜「semantic relevance filtering」) · text/06-ch03-chapter-3-grounding-outputs-with-rag.txt:879(搜「only the FAQ contains step-by-step」)
抽取式摘要Chapter 3: Grounding Outputs with RAGtext/06-ch03-chapter-3-grounding-outputs-with-rag.txt:899(搜「extractive」)
语义看不见的五件事Chapter 4: Embeddings and Vector Searchtext/07-ch04-chapter-4-embeddings-and-vector-search.txt:827(搜「single dimension: meaning」) · text/07-ch04-chapter-4-embeddings-and-vector-search.txt:830(搜「Temporal relevance」)
陪产假的前后对照Chapter 4: Embeddings and Vector Searchtext/07-ch04-chapter-4-embeddings-and-vector-search.txt:997(搜「8 weeks of paid family leave」) · text/07-ch04-chapter-4-embeddings-and-vector-search.txt:1009(搜「Auto-detected filters」)
软降权而不是硬过滤Chapter 4: Embeddings and Vector Searchtext/07-ch04-chapter-4-embeddings-and-vector-search.txt:986(搜「rather than using hard filters」)

Footnotes

  1. 出处:「Chapter 4: Embeddings and Vector Search」第 458 段(text/07-ch04-chapter-4-embeddings-and-vector-search.txt:458,搜「notice period for resigning」)。原文说系统把这个问题嵌入之后取最近的 5 个向量,而正确答案「提前 30 天」明明在语料里,一条都没被取到

  2. 出处:「Chapter 4: Embeddings and Vector Search」第 475 段(text/07-ch04-chapter-4-embeddings-and-vector-search.txt:475,搜「two bad options」)。三条原因在第 468–472 段(同文件 :468,搜「Semantic drift」)。

  3. 出处:「Chapter 4: Embeddings and Vector Search」第 485 段(text/07-ch04-chapter-4-embeddings-and-vector-search.txt:485,搜「Dense retrieval」)与第 487 段(同文件 :487,搜「Sparse retrieval」)。「稠密 / 稀疏这两个名字来自它们内部长什么样」这一段解释是我们补的,书只用了这两个词没有解释。

  4. 出处:「Chapter 3: Grounding Outputs with RAG」第 913 段(text/06-ch03-chapter-3-grounding-outputs-with-rag.txt:913,搜「Best Matching 25」)。补充(不在书里,来自通用知识):BM25 里的「25」是它那一系列公式尝试的编号,不是什么参数。

  5. 出处:「Chapter 3: Grounding Outputs with RAG」第 918 段(text/06-ch03-chapter-3-grounding-outputs-with-rag.txt:918,搜「deterministic, fast, and reproducible」)与第 919 段(同文件 :919,搜「BM25 as their baseline」)。

  6. 出处:「Chapter 4: Embeddings and Vector Search」第 802 段(text/07-ch04-chapter-4-embeddings-and-vector-search.txt:802,搜「might miss the first result」)与第 804 段(同文件 :804,搜「conceptually related but less helpful」)。

  7. 出处:「Chapter 4: Embeddings and Vector Search」第 527 段(text/07-ch04-chapter-4-embeddings-and-vector-search.txt:527,搜「holiday and leave policies」)起的三条排名。

  8. 出处:「Chapter 4: Embeddings and Vector Search」第 540 段(text/07-ch04-chapter-4-embeddings-and-vector-search.txt:540,搜「Broad Retrieval」)起的三阶段,图书馆的类比在第 546 段(同文件 :546,搜「looking for a」)。

  9. 出处:「Chapter 4: Embeddings and Vector Search」第 573 段(text/07-ch04-chapter-4-embeddings-and-vector-search.txt:573,搜「work accommodation」)。原文的说法是:交叉编码器能理解查询里的「work accommodation」和文档里的「ADA」高度相关,即便这两个词根本没有共同出现过

  10. 出处:「Chapter 4: Embeddings and Vector Search」第 746 段(text/07-ch04-chapter-4-embeddings-and-vector-search.txt:746,搜「0.987」)、第 753 段(同文件 :753,搜「0.965」)与第 760 段(同文件 :760,搜「0.912」)。这九个分数是书里跑出来的真实输出;中文是我们译的,数字一个没动。

  11. 出处:「Chapter 3: Grounding Outputs with RAG」第 851 段(text/06-ch03-chapter-3-grounding-outputs-with-rag.txt:851,搜「Lost in the Middle」)与第 854 段(同文件 :854,搜「U-shaped」)。书引的论文编号是 arXiv:2307.03172(见同文件 :1639,搜「2307.03172」)。我们没有打开这篇论文核对曲线的具体形状,如实说明;书本身也只描述了形状。

  12. 出处:「Chapter 3: Grounding Outputs with RAG」第 867 段(text/06-ch03-chapter-3-grounding-outputs-with-rag.txt:867,搜「semantic relevance filtering」)与第 879 段(同文件 :879,搜「only the FAQ contains step-by-step」)。

  13. 出处:「Chapter 3: Grounding Outputs with RAG」第 899 段(text/06-ch03-chapter-3-grounding-outputs-with-rag.txt:899,搜「extractive」)。「为什么用抽取而不是重写」这条理由是我们补的,书只给了做法。

  14. 出处:「Chapter 4: Embeddings and Vector Search」第 997 段(text/07-ch04-chapter-4-embeddings-and-vector-search.txt:997,搜「8 weeks of paid family leave」)起的三条,以及加过滤之后的结果在第 1009 段(同文件 :1009,搜「Auto-detected filters」)。

  15. 出处:「Chapter 4: Embeddings and Vector Search」第 827 段(text/07-ch04-chapter-4-embeddings-and-vector-search.txt:827,搜「single dimension: meaning」)与第 830 段(同文件 :830,搜「Temporal relevance」)起的五条。

  16. 出处:「Chapter 4: Embeddings and Vector Search」第 986 段(text/07-ch04-chapter-4-embeddings-and-vector-search.txt:986,搜「rather than using hard filters」)。

  17. 出处:「Chapter 4: Embeddings and Vector Search」第 252 段(text/07-ch04-chapter-4-embeddings-and-vector-search.txt:252,搜「consider」)。书建议在大语料上改用更小的模型来抽属性,因为每篇都调完整的大模型太贵。