跳到主要内容

意思怎么变成数 —— 全书的枢纽

这一章讲三件事: 那一串数到底是什么、两串数怎么比、以及怎么挑那个换算模型。

它在全书链条上的位置是枢纽。 第 02 章那条走查里有两步是「换算成一串数」, 前面六章都在准备喂给它的东西,后面十一章都在改怎么用它的结果。 这一步塌了,别的全部无从谈起。别跳这一章。

1. 这一章讲什么

三句话:

  1. 计算机没有「意思」这个东西可算,所以必须有一步换算——而换算的规矩只有一条;
  2. 换出来的那串数怎么比,有一个反直觉的选择:量方向,不量长度;
  3. 书在这一章讲的原理是上一代的图景,和它全书实际用的模型不是一回事——这一处我们要补。

2. 顶层全景:一次换算,一次比较

┌─ 换算 ─────────────────────────────────────────────┐
│ "reset password" ──[换算模型]──> [0.019, -0.051, …共 1 536 个] │
│ 一整段说明书 ──[同一个模型]─> [0.021, -0.048, …共 1 536 个] │
└────────────────────────────────────────────────────┘

┌─ 比较 ─────────────────────────────────────────────┐
│ 不比长度(一个四个词、一个三百字,长度差很多) │
│ 比方向(两者指向同一个语义方向 → 判为很像) │
└────────────────────────────────────────────────────┘

图说:全章两件事。左边那步的规矩是"意思近 ⟹ 方向近",
右边那步是把"方向近不近"变成一个可以排序的数。

3. 从反面开始:为什么「给每个东西编个号」不行

这一节回答:为什么必须是「一串数」,不能是「一个数」。

书给的反例

书拿一种朴素的编号法当反面教材,它把三个学历编成三串数1:

学士 [0, 1, 0]
硕士 [1, 0, 0]
博士 [0, 0, 1]

── 这三串数丢掉了什么 ──
· 看不出博士通常先有过学士学位
· 看不出这三者代表的是同一个阶梯上的三个高度
· 任何两个之间的"差距"都一模一样

图说:这种"一个位置置 1、其余全 0"的编法叫独热编码。
它的每一位只是一个标签,标签之间没有任何关系。

书的原话是:这些随意指派的向量把语义信息全丢了1

所以真正要的是什么

❌ 一个数: "猫" = 3542, "狗" = 3543
3542 和 3543 挨着,但这只是编号挨着,和意思无关

❌ 独热: "猫" = [0,1,0,…], "狗" = [0,0,1,…]
两个标签,彼此没有关系

✅ 一串有刻度的数:
"猫" = [0.82, 0.11, -0.05, …]
"狗" = [0.79, 0.15, -0.02, …]
逐位都很接近 → "意思近"变成了"数值近"

图说:这三串数是为演示编的。
第三种才是这一章要讲的东西 —— 关键不在"是一串",在"这串数是有刻度的"。

4. 承重词一:向量与维度

这一章第一个承重词。一句话先给结论:向量就是一串按固定顺序排好的数; 这串数有多少个,就叫它有多少维。

书给的定义句

书自己给了一句很好的定义,可以直接借用2:

「向量就是一串数,用结构化的方式表示某个东西—— 像地图上的坐标,[5, 3] 表示往北五个街区、往东三个街区。」

「维度」就是这串数有几个位置。 [5, 3] 是二维; 第 02 章那个模型输出 1 536 个数,就是 1 536 维。

书那个三维玩具例子(这是本章另起的一处走查)

书把维度做成三个有名字的刻度,好让人看清「每一位在管什么」3:

三个维度分别是: 年龄 · 性别 · 王室地位

king [0.8, 0, 1] 年长、男性、地位高
princess [0.3, 1, 0.5] 年轻、女性、地位低

向量的加减法是逐位做的:

king - man + woman = ?
[0.8, 0, 1] - [0.7, 0, 0.6] + [0.6, 1, 0.5]
= [0.8-0.7+0.6, 0-0+1, 1-0.6+0.5]
= [0.7, 1, 0.9]
≈ queen

为什么成立:减掉 man、加上 woman,改的是"性别"那一维;
"年龄"和"地位"两维基本没动。

图说:这几个数是书为了讲解编的,不是真实的嵌入值。
另一个同类例子:France − Germany + Berlin = Paris。

但真实的那 1 536 维,每一维没有名字

这是上面那个玩具例子最容易骗人的地方,必须说破:

玩具例子 第 1 维 = 年龄 第 2 维 = 性别 第 3 维 = 王室地位
↑ 每一维都有人给它起了名字

真实的模型 第 1 维 = ? 第 2 维 = ? … 第 1 536 维 = ?
↑ 没有名字。没有人指定过任何一维该管什么。
它们是训练过程里自己形成的,而且互相纠缠。

图说:所以你不能指着真实嵌入的第 7 维说"这一维管性别"。
玩具例子解释的是"逐位运算怎么回事",不是"真实模型内部长什么样"。

书自己还提了一句约束:那个模型返回的向量已经做过归一化——也就是把整串数 按同一个比例缩放,使它的总长度变成 1;所以单个值大致落在 −1 到 1 之间4

归一化之后,所有向量都一样长,剩下的差别只有方向。这一点在下一节会变得很关键。

5. 承重词二:余弦相似度 —— 量的是方向,不是长度

这一章第二个承重词。一句话先给结论:余弦相似度量的是两串数「指的方向偏了多少」, 和它们各自多长无关;值越大,方向越接近。

先看现象:为什么不能量长度

用户的查询: "reset password" ← 两个词
候选一: 一整段三百字的密码重置流程说明 ← 很长
候选二: 一句"密码需包含大小写字母和数字" ← 很短

如果按"长度差多少"来判:
查询很短 → 判定它和候选二更像 → 但候选二根本没讲怎么重置

图说:长度和"讲的是不是同一件事"没有关系。
可如果不特意排除长度的影响,长文档会仅仅因为长就压过排名。

书把这件事说得很清楚5:

余弦相似度量的是两个向量之间的夹角,而不是绝对长度。 一个像「reset password」这样的短查询,和一段解释重置流程的长段落, 指向同一个语义方向,所以拿到高分——尽管两者的长度差很多。 不做归一化的话,长文档会仅仅因为长度就压过排名,而不是因为相关。

它是怎么算的

两串数 A 和 B:

余弦相似度 = (A 和 B 逐位相乘再求和) ÷ (A 的长度 × B 的长度)
↑ 分子只和"方向对不对得上"有关
↑ 分母把两者各自的长度除掉了

→ 结果落在 -1 到 1 之间:
1 两串数指同一个方向
0 互相垂直,毫无关系
-1 指完全相反的方向

图说:分母那一步就是"把长度的影响除干净"。
这也是为什么上一节那句"向量已经归一化过"重要 ——
如果每串数长度都已经是 1,这个分母就恒等于 1,可以省掉不算。

主走查:"reset password" 对两条候选

这是本章的主走查,本章两个承重词都在它上面占一步: 「一串数」是第 4 节讲的那一位一位的东西,这里走的是「拿这串数怎么比」。 (下面的数都是为演示编的,不是真实数值。)

三串数(为了写得下,砍到 4 维;真实是 1 536 维):

查询 "reset password" [ 0.62, 0.30, -0.10, 0.05]
候选一 三百字的重置流程说明 [ 0.58, 0.34, -0.08, 0.07]
候选二 一句密码强度要求 [ 0.11, 0.71, 0.40, -0.22]

① 如果按"逐位相减、看差多大"(也就是量长度差):
查询 vs 候选一 差 [0.04, -0.04, -0.02, -0.02]
查询 vs 候选二 差 [0.51, -0.41, -0.50, 0.27]
→ 这个例子里恰好也是候选一更近。
但只要把候选一换成一份三千字的说明书,它那串数在没归一化时会明显更"长",
差值就会被拉大 —— 长度开始干扰判断。

② 按方向比(余弦相似度):
查询 vs 候选一 0.9963 ← 方向几乎一致
查询 vs 候选二 0.4188
→ 无论候选一是三百字还是三千字,只要它讲的是同一件事,
方向就不变,分数就不变。

图说:这就是"量方向不量长度"买到的东西 ——
分数只反映"讲的是不是同一件事",不反映"写了多长"。

6. 分数低不等于不相似:书里那个 0.31

这是这一章最容易让人误判的一个地方,而书恰好给了一个真实的例子。

书拿三条史实和一个问题做了一次比较6:

三条候选(书里的原文):
A "The Great Fire of London in 1666 destroyed over 13,000 houses."
B "Julius Caesar was assassinated on the Ides of March (March 15) in 44 BCE."
C "The Black Death is estimated to have killed nearly one-third of the
European population."

问题:"Tell me something interesting about diseases in history"
(跟我讲点历史上关于疾病的有意思的事)

结果:C(黑死病)那条的余弦相似度 0.31,是三条里最高的。

图说:0.31 这个数是书里的真实结果。

0.31 听着像「不太像」,但它是这一组里最高的、而且它就是正确答案。

判断(我们的,不是书里的):这类分数只在同一次比较里有意义,不能拿去定绝对阈值。 书给了这个例子,却没有点破这件事,而这是新手最容易栽的一个坑: 看到 0.31 就以为「检索失败了」,于是去设一个「相似度必须大于 0.7 才算命中」的门槛—— 那样这个系统会一条都返回不了。 分数的绝对值受很多东西影响:用的哪个换算模型、文本多长、语言是什么。 能比的是同一次查询里各个候选之间的高低,不是跨查询、跨模型的绝对值。 如果错,会错在: 如果你固定了模型、固定了语料、并且拿真实数据标定过一次, 那么在那个特定系统里设一个绝对阈值是可行的——但那是标定出来的,不是拍出来的。

什么时候该换别的算法

书给了三条,里面有三个说法要先交代。点积——把两串数逐位相乘、再全部加起来, 也就是上面那个公式里分子那一步。

高维——一串数有几百上千个位置。

稀疏——一串数里绝大多数位置都是 0(比如照着一整本词典、每个词占一位做出来的那种)7:

换成什么时候
欧氏距离(两点之间的直线距离)向量的长度本身携带语义时——书说这在现代的嵌入里很少见
点积(只做分子那一步,不除长度)生产系统追速度时:入库时归一化一次,之后每次查询就省掉了除法
曼哈顿距离避开,除非是高维稀疏的向量

书自己下了一个带数的判断。 下面那句里的 Transformer——是 2017 年那篇论文提出的 一种网络结构,今天的语言模型和嵌入模型基本都建在它上面8:

「余弦相似度仍然是 95% 以上基于 Transformer 嵌入的 RAG 系统的默认选择。」

注意这个 95% 没有出处,是作者的经验陈述。

7. 把 1 536 维压成 2 维,亲眼看一眼

这一节讲一个开发期的验收动作,而它是全书唯一一处「怎么亲眼确认换算模型对你的语料有效」。

先看现象:你怎么知道它「懂」你的语料

前面几节讲的都是原理。可换到你自己的资料上——一堆合同条款、一堆工单—— 它到底有没有把同类的东西放到一起?你看不见,因为那是 1 536 个数。

做法:降维

降维就是把一串很长的数压成很短的一串(通常是 2 个或 3 个),好让它能画在纸上。

书用的那种压法叫 PCA(主成分分析)。它的原理书写得很清楚,不过先交代一个词: 方差——衡量一堆数散得开不开的量,散得越开、方差越大9:

它找的是数据里方差最大的那几个方向,拿它们当新的坐标轴。

「方差最大的方向」就是数据在这个方向上铺得最开、差异最明显的那个方向。 挑这样的方向当坐标轴,是为了尽量少丢信息。

结果是:在 1 536 维里靠得近的块,压到 2 维之后通常仍然靠得近。

另起一处走查:把六句话画出来(降维落不到主走查上)

为什么它必须另起: 本章的主走查只有两条候选(那段重置流程说明、那句密码强度要求), 两个点画在纸上是两个点,看不出「同类的聚成堆」这件事—— 而降维这一步的全部意义就在那个「堆」上。所以这里换一组输入:书那个六句话的例子。

书那六句话画出来之后是这样的10:


│ ● 花类 ● 花类

│ ● 食物饮料
│ ● 食物饮料
│ ● 天气
│ ● 天气
└──────────────────────────────→

书的原话:食物饮料聚在右边,天气类在左下,花类在左上。

图说:三堆,各自成团。这就是"它确实按意思把东西分开了"的直接证据 ——
而这个证据你是用眼睛看到的,不是靠某个分数推断的。

把这个动作用在你自己的语料上: 取 50 到 100 条真实的块,压到 2 维画出来。 如果本该同类的东西没有聚成团,那说明这个换算模型在你这个领域上不好使。

但它有一条明确的边界

这是书写得最坦白的一处,而且它挡住了一种很常见的误用。 下面那句里的「聚类」就是「同类的东西在图上自动挤成一团」这件事11:

别拿二维图当生产诊断工具。它把 1 536 维压成 2 维,显示不出全部关系。 开发期用它验聚类,生产期该盯的是取回来的前 k 块里有几块真有用这类检索指标。

为什么:压掉 1 534 个维度必然丢信息。 两个点在图上挨着,在原来那 1 536 维里可能离得很远。 图能证明「聚类成立」,不能证明「检索正确」。

三种压法的取舍

书给了一个对照,里面有两个说法先交代一句。确定性——同样的输入,每次跑出来的结果一样, 不带随机成分。

非线性——就是不服从「A 涨一倍、B 就跟着涨一倍」这种固定比例的那类关系12:

压法好处代价
PCA快,而且确定性(同样的输入,每次画出来一样)抓不好非线性的关系
UMAP / t-SNE更能保住局部结构(小团更清楚)算得更慢,而且参数没调好会画出误导人的图案

「误导人的图案」这半句要当心: 这两种压法的参数一变,图上的团就会跟着变形、聚散。 一张漂亮的图不等于一个好的换算模型——它可能只是参数调出来的。

8. 怎么挑那个换算模型:七步,以及两个参数

七步流程

书给了一份可以直接照做的清单。表里有两个说法先交代一句。基线——你先立起来的那个参照物, 后面所有的比较都跟它比。

端到端——从用户提问一路跑到出答案,整条链子一起测,而不是只测中间某一步13:

做什么具体的数
1查榜看那个大规模文本嵌入榜;多语言的另看一个专门的榜
2确定部署约束能用商业云接口,还是因数据敏感/离线要求必须本地
3立基线商业侧和本地侧各有一个公认的起点模型
4拿真实数据测从实际场景里取 50–100 条有代表性的查询跑端到端,看正确的文档有没有出现在最前面
5比替代基线不够就换更大的,用同一组查询量提升幅度
6量性能测平均检索延迟,交互式应用要小于 100 毫秒
7算钱预期月查询量 × 每 token 单价,和基线比

补充(不在书里):书只给了那两个榜的名字,没说是谁做的、该怎么读。 MTEB(Massive Text Embedding Benchmark,大规模文本嵌入基准)出自 2022 年 10 月的 同名论文(Niklas Muennighoff 等),覆盖 8 类嵌入任务、58 个数据集、112 种语言, 论文里评了 33 个模型。 它自己得出的结论恰好支持书的谨慎态度:「没有哪一种文本嵌入方法能在所有任务上都占优。」 所以榜单只能用来缩小候选范围,选型仍然要靠第 4 步那 50–100 条真实查询。 来源:https://arxiv.org/abs/2210.07316(查阅于 2026-08-29)。

两个必看的参数

书那张模型对照表里,每个模型只列了两个数——而这两个数正是选型的两个约束14:

模型最多能吃多少 token输出多少个数(维数)
text-embedding-3-small(OpenAI)8 1911 536
voyage-large-2 instruct16 0001 536
text-embedding-005(Google)2 048768
all-MiniLM-L6-v2(开源)512384

左边那一列就是第 07 章第 3 节那条块长度上限的出处—— 你选了哪个模型,你的块就不能超过它那个数。 右边那一列决定了存储和比较的开销:1 536 维的库,比 384 维的库大四倍、比一遍也慢。

一个真实的连锁反应:

你选了 all-MiniLM-L6-v2(本地跑、免费)
→ 块的上限从 8 191 掉到 512 个 token
→ 第 07 章那些切法的参数全要重设
→ 一份长合同要切成更多、更碎的块
→ 第 12 章那些"补上下文"的做法变得更必要

图说:选型不是一个孤立的决定,它会往回改切块、往后改检索。

最硬的一条:别把它选大了

这是这一节最该带走的一句15:

「别把嵌入模型选大了。如果你的基线用 text-embedding-3-small 测出 85% 的检索准确率, 换成 text-embedding-3-large 达到 87%,这 2% 很少值得让成本和延迟翻倍。 把优化力气花在切块策略和检索配置上。」

这句话是全书「力气该往哪儿使」这条主张在这一章的形态, 和第 11 章开篇那句「改进检索这一步最有效」是同一个意思。

书还补了两条:

  • 选型基本是一次性决定。 嵌入模型的演进,比生成模型(就是第 03 章那种 「读进材料、写出答案」的模型)平缓得多; 书说很多几年前建的系统还在用几年前的模型,准确率仍然够用16;
  • 主要风险是没在自己的真实数据上验证就定下模型。 榜单量的是跨任务的通用表现,而你的具体领域(法律合同、病历、代码文档)行为可能不同17

9. 先补后纠:今天的换算模型是怎么工作的

这一节要补一层书没讲的,再纠一处书讲岔了的。

先补:今天的做法

一句话:一整句话一次读进去,每个词都看过同一句里的其他词之后,再把整句压成一串数。

输入: "The bank raised its rates."

① 整句一次进去,不是一个词一个词地过
② 句子里每个词,都会去看同一句里的其他词
"bank" 看到了 "rates" 和 "raised"
→ 于是它这一次得到的表示,偏向"银行",而不是"河岸"
③ 把这一句里所有词各自得到的那串数,合成一串
(最常见的合法是取平均)
④ 输出:整句话的那一串数,1 536 个

图说:关键在第 ② 步 —— 同一个词在不同句子里,得到的数是不同的。
"The river bank was muddy." 里的 "bank",拿到的会是另一串数。

补充(不在书里,依据我们的 frontier 书架): 这一套结构在开源实现里写得很直白: 一个句子嵌入模型由几个模块串起来,第一个模块把输入文本处理成带上下文的词级表示, 第二个模块把这些词级表示聚合成一条句子级的向量(最常见的聚合法就是取平均)。 依据: shelf=ai-frontier-reference/sentence-transformers@src:docs/sentence_transformer/usage/custom_models.rst:9 事实=文档写着 Transformer 模块「负责处理输入文本并生成带上下文的嵌入」, Pooling 模块「通过聚合这些嵌入来降低维度,常见的聚合策略包括取平均和取首位」。

再纠:书讲的是上一代的图景

书在讲「嵌入模型是怎么训练出来的」时,给的是另一套完全不同的图景。 先交代下面这段引文里的三个词:神经网络——一大堆简单零件按层排开、 中间装着许多可以调的数的那种结构。

隐藏层——夹在输入和输出之间、外面看不见的那些层。

权重——就是那些「可以调的数」本身;训练干的事就是把它们一点点调对18:

「嵌入模型是在大文本数据集上训练的神经网络。数据集里每个不同的词 对应输入层的一个神经元;训练时网络对每个输入词预测下一个词; 训练完成后,隐藏层的权重就成了嵌入模型。」

这段描述本身没错——它准确描述的是 2013 年那一代的做法。 但它和书自己全书都在用的那个模型,不是一回事。

差别在哪,以及为什么这个差别要紧

书讲的那一代 今天实际用的
一个词的表示 固定的一串数,和上下文无关 随句子而变
"bank" 永远是同一串数 "银行"和"河岸"两串不同的数
处理单位 一个词一个词 整句话一次
一整段文字怎么办 书没讲 把整段一次读进去,直接输出一串数

图说:第二行那个差别决定了一件很实际的事 ——
按上一代的图景,你没法解释为什么"苹果公司"和"吃苹果"里的"苹果"不会互相干扰。

判断(我们的,不是书里的):这不是一处笔误,是书没有更新这一节。 它带来的实际后果是:读者会拿一套过时的心智模型,去理解一件今天已经不这么工作的事。 最直接的一个误解是「一个词一串数」—— 而这本书全书处理的单位是,一块一串数,块里的每个词并不各有一串数存在库里。 如果错,会错在: 如果作者是有意用旧图景当教学简化(它确实更好懂), 那这就是取舍不是错误——但书里没有任何一句话交代这是简化, 读者无从知道自己拿到的是哪一代的图景。

10. 还有一条岔路:让图和文直接进同一个空间

第 05 章第 6 节埋过一条岔路,这里把它走完。

第 05 章那条路是图 → 文字描述 → 换算成数,中间转了一道文字。 另一条路不转:用一种同时吃图和文的模型,让它们直接落进同一个空间19

它怎么做到的

书说得很清楚。下面那句里的「映射」就是「把 A 一一对应到 B」; 「向量空间」就是「所有这些向量所在的那个坐标系」20:

它在互联网上数百万对「图—文」上训练,学会把两种形式映射进同一个向量空间。 关键在于:语义相近的内容最后落在一起,不管它是图还是文。 一张狗的照片产生的向量,靠近文本「a photo of a dog」——因为模型训练时学到了这个关联。

于是它能做到中转文字做不到的事: 拿一段文字去搜图、拿一张图去搜图、拿一张图去搜文字。

但它有两个硬伤

第一个,书自己点破了21:

你给它三个候选类别: 猫 / 狗 / 汽车
你给它一张大象的照片

它的输出是"在这三个类别上的概率",而概率加起来永远等于 1
→ 于是它必然给猫或狗一个很高的分数
→ 它不会说"这三个都不是"

图说:这是"必须在给定候选里选一个"这种机制的通病 ——
候选之外的东西,会被硬分进某一类。

第二个更实际22:

它处理不了图片里的文字。 一张「禁止停车」路牌的照片,可能不会靠近文本 "no parking", 因为模型把它当成了一张普通的路牌图。 解法是把图里的文字单独抽出来另行处理——也就是回到第 05 章那条路。

所以书自己的建议是:多数场景别走这条

这是那条岔路的收尾,而且书说得很明确23:

对多数 RAG 应用,更简单的做法反而更好:用多模态模型给图片生成文字描述, 再用标准的文本换算模型处理这些描述。向量库里存文字描述, 那一块被检索到时只把原图交给模型。

理由是:这样能吃到文本换算模型在「文字对文字」这件事上多年的优化, 而图文直连那条路反倒增加了复杂度。

注意这正是第 05 章那条纪律的又一次出现:存的是描述,交出去的是原件。

11. 作者的判断与证据

说法它是什么
独热编码丢掉语义是事实,由那种编法本身决定
「向量是一串数、像地图坐标」是定义,书给得很好
king − man + woman ≈ queen是教学演示。 书自己说了这几个数是为讲解编的;但书没有说破「真实的维度没有名字」——这一层是我们补的
余弦量夹角、长文档不会因长占便宜是机制推导,而且正确
0.31 是最高分是书里的真实运行结果;但「这类分数不能定绝对阈值」这层是我们补的,书没点破
「95% 以上的系统默认用余弦」作者的经验陈述,没有出处
PCA 的原理与它的边界是事实描述,而且那条「别拿它当生产诊断」的边界写得很好
UMAP / t-SNE 「参数没调好会画出误导人的图案」是业界共识,书没给来源但这条站得住
七步选型流程作者的做法清单。 其中「50–100 条真实查询」「小于 100 毫秒」是经验数,没有来源
「85% 换 87% 很少值得成本和延迟翻倍」作者的经验判断。 那两个百分比是举例的数,不是测量结果
「选型基本是一次性决定」作者的观察,在这本书出版的时点上成立
书讲的训练图景它准确描述的是上一代的做法,而书没有说明这个差别(第 9 节)
图文直连的两个硬伤是事实描述,两条都由那类模型的工作方式直接推出

12. 边界与局限

  • 没有讲一块文字是怎么被压成一串数的。 书讲了「词怎么变成数」的上一代图景, 但全书用的是「一整块文字变成一串数」,而这中间那一步(把词级的表示合成块级的) 一个字没有——第 9 节那段补充就是为了填这个洞;
  • 没有讲不同语言之间怎么办。 多语言的榜提了一个名字,再没有下文;
  • 没有讲什么时候该重算全库。 换模型要重算(第 02 章讲过), 但「什么信号出现时该考虑换」书没给;
  • 没有讲维数和检索质量的关系。 表里 384 到 1 536 差四倍, 但书没说这四倍换到了什么,只说「别选大了」;
  • 那个降维验收动作没有可核对的判据。 「看它有没有聚成团」全靠肉眼, 书没有给「聚成什么样算合格」的任何标准。

13. 可带走的

  1. 编号不行,独热也不行: 前者的相邻只是编号相邻,后者的每一位只是个标签。 要的是一串有刻度的数,让「意思近」变成「数值近」;
  2. 向量 = 一串按固定顺序排好的数;有几个数就是几维。 书那个玩具例子的三维是年龄/性别/王室地位,但真实的 1 536 维每一维没有名字;
  3. 归一化 = 把整串数按同一比例缩放,使总长度变成 1;之后所有向量一样长,只剩方向的差别;
  4. 余弦相似度量的是方向偏差,不是长度。 这样「reset password」这四个字和一整段重置流程说明才能拿到高分—— 否则长文档会仅仅因为长就压过排名;
  5. 分数只在同一次比较里有意义。 书那个真实例子里,正确答案的分数只有 0.31 而它是最高的。 别拿绝对阈值去卡(除非你在自己的系统上标定过);
  6. 换别的算法的三种情形: 长度本身有意义时用直线距离、追速度时用点积(先归一化一次)、 曼哈顿距离基本别用;
  7. 降维 = 把 1 536 个数压成 2 个画出来。 它是开发期的验收手段(能亲眼看见同类聚成团),不是生产诊断—— 压掉 1 534 维必然丢信息;
  8. 选型看两个参数:能吃多长(那就是块长度的上限)、输出几个数(决定存储和比较开销)。 四个真实的数是 8 191/1 536、16 000/1 536、2 048/768、512/384;
  9. 别把它选大了:85% 换 87%,很少值得成本和延迟翻倍。力气该花在切块和检索上;
  10. 一定要拿 50–100 条自己的真实查询测过再定——榜单量的是通用表现,你的领域可能不同;
  11. 书讲的训练原理是上一代的图景(一个词一串数、与上下文无关); 今天是整句一次读进去、每个词看过其他词之后再合成一串, 所以同一个词在不同句子里得到的数不同;
  12. 图文直连那条路有两个硬伤(候选之外的东西会被硬分进某一类、图里的文字它看不见), 书自己建议多数场景别走——回到「给图写描述」那条路。

14. 原文地图

主题原书章原文位置
块长度不能超过模型上限Chapter 5. Embeddingstext/07-ch05-chapter-5-embeddings.txt:33(搜「cannot exceed the maximum token length」)
四个模型的两个参数Chapter 5. Embeddingstext/07-ch05-chapter-5-embeddings.txt:43(搜「text-embedding-3-small」)
1 536 个数Chapter 5. Embeddingstext/07-ch05-chapter-5-embeddings.txt:110(搜「1,536 values」)
独热编码的反面Chapter 5. Embeddingstext/07-ch05-chapter-5-embeddings.txt:135(搜「one-hot encoding」) · text/07-ch05-chapter-5-embeddings.txt:137(搜「randomly assigned vectors lose all semantic information」)
向量的定义句Chapter 5. Embeddingstext/07-ch05-chapter-5-embeddings.txt:143(搜「five blocks north and three blocks east」)
三维玩具例子Chapter 5. Embeddingstext/07-ch05-chapter-5-embeddings.txt:147(搜「age (kings are typically older than princes)」) · text/07-ch05-chapter-5-embeddings.txt:154(搜「king - man + woman = queen」)
归一化到 −1 与 1 之间Chapter 5. Embeddingstext/07-ch05-chapter-5-embeddings.txt:110(搜「normalized」)
降维的机制Chapter 5. Embeddingstext/07-ch05-chapter-5-embeddings.txt:268(搜「directions of maximum variance」)
六句话聚成三堆Chapter 5. Embeddingstext/07-ch05-chapter-5-embeddings.txt:260(搜「sentences about food and drinks appear grouped」)
别拿二维图当生产诊断Chapter 5. Embeddingstext/07-ch05-chapter-5-embeddings.txt:272(搜「Don’t use 2D plots in production」)
三种压法的取舍Chapter 5. Embeddingstext/07-ch05-chapter-5-embeddings.txt:274(搜「misleading patterns if parameters are poorly tuned」)
那三条史实与 0.31Chapter 5. Embeddingstext/07-ch05-chapter-5-embeddings.txt:306(搜「The Great Fire of London」) · text/07-ch05-chapter-5-embeddings.txt:359(搜「cosine similarity of 0.31」)
量夹角不量长度Chapter 5. Embeddingstext/07-ch05-chapter-5-embeddings.txt:365(搜「measures the angle between two vectors」) · text/07-ch05-chapter-5-embeddings.txt:371(搜「longer documents would dominate rankings」)
什么时候换别的算法Chapter 5. Embeddingstext/07-ch05-chapter-5-embeddings.txt:373(搜「Use Euclidean distance when vector magnitude carries semantic meaning」) · text/07-ch05-chapter-5-embeddings.txt:375(搜「over 95% of RAG systems」)
七步选型Chapter 5. Embeddingstext/07-ch05-chapter-5-embeddings.txt:395(搜「Massive Text Embedding Benchmark」) · text/07-ch05-chapter-5-embeddings.txt:402(搜「50–100 representative queries」)
别选大了Chapter 5. Embeddingstext/07-ch05-chapter-5-embeddings.txt:442(搜「Avoid oversizing your embedding model」)
没在真实数据上验证的风险Chapter 5. Embeddingstext/07-ch05-chapter-5-embeddings.txt:444(搜「committing to a model without validating on your actual data」)
选型是一次性决定Chapter 5. Embeddingstext/07-ch05-chapter-5-embeddings.txt:448(搜「a one-time decision」)
上一代的训练图景Chapter 5. Embeddingstext/07-ch05-chapter-5-embeddings.txt:165(搜「assigned to a neuron in the input layer」)
图文进同一空间的机制Chapter 5. Embeddingstext/07-ch05-chapter-5-embeddings.txt:531(搜「millions of image-text pairs」)
概率永远加到 1Chapter 5. Embeddingstext/07-ch05-chapter-5-embeddings.txt:525(搜「the probability always sums to 1」)
它看不见图里的文字Chapter 5. Embeddingstext/07-ch05-chapter-5-embeddings.txt:543(搜「can’t reliably handle text within images」)
书自己建议多数别走这条Chapter 5. Embeddingstext/07-ch05-chapter-5-embeddings.txt:539(搜「a simpler approach works better」)
那条岔路是在哪儿埋的Chapter 3. Loading Datatext/05-ch03-chapter-3-loading-data.txt:798(搜「same vector space」)

Footnotes

  1. 出处:「Chapter 5. Embeddings」第 135 段(text/07-ch05-chapter-5-embeddings.txt:135,搜「one-hot encoding」)与第 137 段(text/07-ch05-chapter-5-embeddings.txt:137,搜「randomly assigned vectors lose all semantic information」)。原文用的三个例子就是学士、硕士、博士。补充(不在书里,来自通用知识):这种「一个位置置 1、其余全 0」的编法,标准叫法是独热编码(one-hot encoding)。 2

  2. 出处:同章第 143 段(text/07-ch05-chapter-5-embeddings.txt:143,搜「five blocks north and three blocks east」)。

  3. 出处:同章第 147 段(text/07-ch05-chapter-5-embeddings.txt:147,搜「age (kings are typically older than princes)」),那两个具体向量见第 150 段(text/07-ch05-chapter-5-embeddings.txt:150,搜「[0.8, 0, 1]」),加减法的三行算式见第 154 段(text/07-ch05-chapter-5-embeddings.txt:154,搜「king - man + woman = queen」),第二个例子见第 161 段(text/07-ch05-chapter-5-embeddings.txt:161,搜「France」)。

  4. 出处:同章第 110 段(text/07-ch05-chapter-5-embeddings.txt:110,搜「1,536 values」)。同一段还说这些值是归一化过的,大致落在 −1 到 1 之间。

  5. 出处:同章第 365 段(text/07-ch05-chapter-5-embeddings.txt:365,搜「measures the angle between two vectors」)与第 371 段(text/07-ch05-chapter-5-embeddings.txt:371,搜「longer documents would dominate rankings」)。公式本身见第 344 段(text/07-ch05-chapter-5-embeddings.txt:344,搜「np.dot(A, B) / (norm(A) * norm(B))」)。

  6. 出处:三条候选见同章第 306 段(text/07-ch05-chapter-5-embeddings.txt:306,搜「The Great Fire of London」)起;问题见第 312 段(text/07-ch05-chapter-5-embeddings.txt:312,搜「Tell me something interesting about diseases in history」);0.31 那个结果见第 359 段(text/07-ch05-chapter-5-embeddings.txt:359,搜「cosine similarity of 0.31」)。

  7. 出处:同章第 373 段(text/07-ch05-chapter-5-embeddings.txt:373,搜「Use Euclidean distance when vector magnitude carries semantic meaning」)与第 375 段(text/07-ch05-chapter-5-embeddings.txt:375,搜「Avoid Manhattan distance」)。补充(不在书里,来自通用知识):欧氏距离就是两点之间的直线距离;曼哈顿距离是只能沿坐标轴走时的路程,像在方格街区里走路。

  8. 出处:同章第 375 段(text/07-ch05-chapter-5-embeddings.txt:375,搜「over 95% of RAG systems」)。这个 95% 书没有给任何出处。

  9. 出处:同章第 268 段(text/07-ch05-chapter-5-embeddings.txt:268,搜「directions of maximum variance」)。PCA 的全称是主成分分析(principal component analysis),见第 189 段(text/07-ch05-chapter-5-embeddings.txt:189,搜「principal component analysis」)。

  10. 出处:同章第 260 段(text/07-ch05-chapter-5-embeddings.txt:260,搜「sentences about food and drinks appear grouped」)。

  11. 出处:同章第 272 段(text/07-ch05-chapter-5-embeddings.txt:272,搜「Don’t use 2D plots in production」)。原文点名的生产指标是 precision@k,也就是「取回来的前 k 块里有几块真相关」——第 17 章会把它讲透。

  12. 出处:同章第 274 段(text/07-ch05-chapter-5-embeddings.txt:274,搜「misleading patterns if parameters are poorly tuned」)。

  13. 出处:同章第 395 段(text/07-ch05-chapter-5-embeddings.txt:395,搜「Massive Text Embedding Benchmark」)起的七步;50–100 条真实查询见第 402 段(text/07-ch05-chapter-5-embeddings.txt:402,搜「50–100 representative queries」);小于 100 毫秒见第 407 段(text/07-ch05-chapter-5-embeddings.txt:407,搜「< 100 ms for interactive apps」)。补充(不在书里):MTEB 出自论文《MTEB: Massive Text Embedding Benchmark》(Niklas Muennighoff、Nouamane Tazi、Loïc Magne、Nils Reimers,2022-10-13 提交),摘要写明它覆盖 8 类任务、58 个数据集、112 种语言,评了 33 个模型,并得出「没有哪一种文本嵌入方法能在所有任务上占优」的结论。来源:https://arxiv.org/abs/2210.07316(查阅于 2026-08-29)。

  14. 出处:同章第 33 段(text/07-ch05-chapter-5-embeddings.txt:33,搜「cannot exceed the maximum token length」)是那条上限;四个模型的两个参数见第 43 段(text/07-ch05-chapter-5-embeddings.txt:43,搜「text-embedding-3-small」)起的表 5-1。

  15. 出处:同章第 442 段(text/07-ch05-chapter-5-embeddings.txt:442,搜「Avoid oversizing your embedding model」)。

  16. 出处:同章第 448 段(text/07-ch05-chapter-5-embeddings.txt:448,搜「a one-time decision」)与第 173 段(text/07-ch05-chapter-5-embeddings.txt:173,搜「their evolution has not been as dramatic as LLMs」)。

  17. 出处:同章第 444 段(text/07-ch05-chapter-5-embeddings.txt:444,搜「committing to a model without validating on your actual data」)。

  18. 出处:同章第 165 段(text/07-ch05-chapter-5-embeddings.txt:165,搜「assigned to a neuron in the input layer」)。补充(不在书里,来自通用知识):这段描述对应的是 2013 年那一代的做法(以 word2vec 为代表),它给每个词学一串固定的数;而书全书使用的模型属于后来那一代,处理单位是整段文字、且同一个词的表示随上下文而变。

  19. 出处:「Chapter 3. Loading Data」第 798 段(text/05-ch03-chapter-3-loading-data.txt:798,搜「same vector space」)。这是第 05 章埋下那条岔路的地方;书点名的那个模型叫 CLIP。

  20. 出处:「Chapter 5. Embeddings」第 531 段(text/07-ch05-chapter-5-embeddings.txt:531,搜「millions of image-text pairs」)。

  21. 出处:同章第 525 段(text/07-ch05-chapter-5-embeddings.txt:525,搜「the probability always sums to 1」)。原文举的就是「图里是大象、而候选类别里没有大象」这个例子。

  22. 出处:同章第 543 段(text/07-ch05-chapter-5-embeddings.txt:543,搜「can’t reliably handle text within images」)。

  23. 出处:同章第 539 段(text/07-ch05-chapter-5-embeddings.txt:539,搜「a simpler approach works better」)。