跳到主要内容

嵌入 — 把意思变成距离

这一章讲三件事: 为什么「按字面搜」注定要失败; 嵌入(embedding)这串数字凭什么能代表「意思」; 以及选一个嵌入模型时,除了排行榜(公开 benchmark 的名次表)还要看什么。 读完你能解释清:RAG 凭什么搜「退款」能找到写着「退订返还」的段落。 这一章是全书的枢纽——后面所有检索、评测、多模态的章,都建立在这串数字上。

1. 顶层全景:一个字面匹配修不好的 bug

先看三个注定失败的搜索1:

  • 文档里写着「United States」,用户搜「USA」——字面一个字母都对不上;
  • 文档写着「Silicon Valley」,用户搜「硅谷」——连语言都不同;
  • 文档写着数字「2」,用户搜单词「two」——同一件事,两副面孔。

反过来,字面上很像的词,意思可能毫不相干:「hat」和「mat」只差一个字母, 意思却一个是帽子一个是垫子2

结论一句话:表层的(不)相似,和语义的(不)相似,是两条不相干的轴。 修这个 bug 的办法,是把文字从「字符的世界」搬进「数字的世界」:

「United States」 ──┐
├─→ 嵌入模型 → 一串浮点数(向量)──→ 两串数字距离很近 ✓
「USA」 ──┘

「hat」 ──→ 嵌入模型 → 另一串数字 ──→ 与「mat」的数字距离很远 ✓

图说:嵌入模型是一台「文字→数字」的变换机。进去的是文字,
出来的是固定长度的一串数;它的训练目标只有一个:意思越近,数字越近。

这串数字就是嵌入(embedding,也叫词向量——早期只给单个词编码时留下的叫法)。

(后来范围放大到句子、段落,也有人叫文本嵌入——把范围从词放大到任意文本;本书三种叫法当一个意思用。) 本章的主走查,是拿四个真实句子过一遍嵌入模型,看它们的数字距离长什么样。

2. 核心原理(一):嵌入凭什么代表意思

「意思相近的数字就相近」不是被设计出来的规则,是学出来的。 训练嵌入模型的思路朴素得像废话:经常出现在同类上下文里的词,意思就相近 ——书里给了个例子,「Uncle Sam」(山姆大叔,美国的拟人称呼)和「US Government」 字面上毫无共同点,但出现它们的句子高度相似,于是它们的数字距离很近3

学成之后的效果不止同义词。书里这个例子值得记住:搜「Find all cases that happened in the US」,能检回写着 California 的文档、同时排除写着 Alberta (加拿大的省)的——模型学到的不是词的对等,而是概念之间的从属与区分4

因为每段文字都被转成同样长度的一串数(比如 384 个浮点数),这类表示法叫 稠密表示(dense representation——每个位置都是有值的数)。

另一种表示法叫 稀疏表示(sparse representation——几万个位置里绝大多数是零;词法搜索用的就是这种表示)。

用稠密表示做检索,相应的就叫稠密检索5

3. 核心原理(二):这串数字的来历

嵌入不是大模型时代的发明,书里给了一条谱系,每个节点一句话6:

年代节点一句话
1990sElman 网络最早用神经网络(一层层简单计算单元——每个只做一次加权求和的小零件——堆起来、靠数据调参数的计算结构)学词的表示
2013Word2Vec(Google,Mikolov)用一个简单任务学词向量:给「pizza」,预测它周围的词(「I had __ for lunch」)
2018BERT(Google 的模型,首次让同一个词在不同句子里得到不同向量)从「静态嵌入」进入「动态嵌入」:同一个词,在不同句子里得到不同的向量

这条谱系上有两个值得记住的路标:

queen − woman ≈ king − man。 Word2Vec 的著名演示:两个向量之差(queen 减 woman) 几乎平行于另一对之差(king 减 man)——「性别」这个方向,被编码进了数字空间的一个 具体方向里。这是「意思变成几何」最直观的一张照片7

静态 vs 动态。 Word2Vec 那代,每个词的向量训练完就固定了,叫静态嵌入; BERT 之后,向量取决于它所在的句子(「苹果」在水果句和手机句里是两串不同的数), 叫上下文化嵌入。今天 RAG 用的嵌入模型全是后一代;这类模型里负责「把输入变成向量」的那一半, 有个正式名字:编码器(§1 那台「文字→数字」变换机,指的就是它)8

补充(不在书里,来自通用知识):今天主流的嵌入模型怎么训练?主流架构叫双编码器:两个相同的编码器,一个编码查询、一个编码文档。

训练目标用对比学习:配对的拉近、不配的推远——两个文本各自编码成向量,该配对的拉近、不相干的推远。书里只给了一个短课程链接,没展开;我们在 frontier 书架上有 sentence-transformers 的拆解可继续读 (shelf=ai-frontier-reference/sentence-transformers,事实:该库就是按这个套路训练与使用句子嵌入的)。

4. 主走查:四个句子变成数字

拿书里 sentence-transformers 的例子(Python 的嵌入库,一行调用换一个向量), 模型用 all-MiniLM-L6-v2,喂给它四句话9:

① "I am happy" ② "I am joyful"
③ "I am pessimistic" ④ "I am not optimistic"

输出:4 个向量,每个 384 个浮点数(embeddings.shape = (4, 384))

然后算两两之间的距离,用的是所谓「余弦相似度」(cosine similarity——两向量夹角的余弦值:越接近 1 越像,越接近 0 越不相干;第 05 章细讲)10:

配对相似度
happy ↔ joyful(同义)0.8151
pessimistic ↔ not optimistic(同义)0.7047
跨组(happy ↔ pessimistic 等)0.33 - 0.52

注意第二行:「pessimistic」和「not optimistic」字面上没有一个词相同, 相似度依然有 0.70——嵌入穿过了字面,抓到了意思

书里还做了一个更狠的实验:把 384 维的向量随机切掉一大半(只留 67 到 158 维), 再算一遍相似度矩阵(把所有两两配对的分数排成的一张表)——模式几乎不变(同义对还是高分,跨组还是低分)11

这说明语义不是存在某几个关键维度(向量的分量位置)里,而是弥散在整串数字的每一处。 这个性质在第 05 章「截短向量省钱」时会直接变成工程手段。

5. 核心原理(三):选嵌入模型看哪四个轴

第一个轴:榜单。 MTEB(Massive Text Embedding Benchmark)是嵌入模型的 公开排行榜,按检索、分类等任务打分。但作者紧接着泼了冷水: 首要取舍是模型大小 vs 性能,榜单只是平衡这两者的工具——不是越大越好, 是「在你的任务上够好」的最小那个12

第二个轴:维度。 向量更长(比如 1024 维 vs 384 维)能捕捉更细腻的语义, 但存起来、算起来都更贵13

第三个轴:MRL。 Matryoshka Representation Learning(套娃表示学习) 是一种训练技巧:把最有区分度的信息优先压进向量的前几个维度, 于是一根 1024 维的向量可以像套娃一样截短——只留前 128 维也够用, 惯例按 2 的幂截(1/8、1/4、1/2)。想省钱时不用换模型,把向量截短就行14

第四个轴:上下文窗口。 第 03 章已经见过:OpenAI 和 Google 的嵌入模型 窗口只有 8,000 词元。书里给的对比名单里,Qwen3-Embedding 系列到 32,000, BGE-M3 只有 1,000——窗口大小直接决定你的块最大能切多大15

三个只有上手才会撞见的坑

书里「Practical Tips」一节收了三个,都是生产事故的种子16:

  1. 静默截断:块超过嵌入模型窗口,主流库不报错,直接丢掉超出的部分—— 你的文档后半截悄悄消失了;

  2. 维度上限:向量库对维度有硬上限,比如给 SQL(数据库的结构化查询语言)数据库 PostgreSQL 加了向量检索能力的 pgvector 扩展, 32 位全精度向量最多 2,000 维——选了一个 3,072 维的嵌入模型, 库里存不下;

  3. 别用JSON(一种形如「键: 值」的纯文本数据格式,也是行业标准的数据交换格式,以后查文档会经常遇到)传向量。

    数字「123」用二进制存是 1 个字节(存储的最小单位,一个英文字母占一个),写成 JSON 文本则变成 3 个字符(3 字节),浮点数经 JSON 还会丢精度。

    要省空间又保精度,用 Base64 编码(把二进制编成纯文本的通用编码),代价是客户端(发起请求那一端的程序)要解码17

6. 作者的判断与证据

  • 「嵌入解决表层/语义错位」是全书反复使用的前提性主张,书里的证据是 四个句子那一组实测数字——量级合理、可复现,可信。
  • 「任意切维度模式不变」这个实验,作者用它论证嵌入空间的均匀性; 样本只有四句话,作为「直观演示」成立,作为「所有模型都如此」的证据不够。
  • 选型一节把 MTEB 当起点而非终点,这是作者的工程判断,我们认同: 榜单测的是通用任务,你的语料分布(你的文本在主题与体裁上的构成)未必在里面。

7. 边界与局限

  • 嵌入模型也会过时。 书里点名的型号(text-embedding-3、Qwen3、BGE-M3) 是 2026 年的快照;四个选型轴(榜单/维度/MRL/窗口)不会过时。
  • 换了嵌入模型 = 全库重算。 向量之间只有在「同一台变换机」产出时才可比, 换模型要把整个库重新嵌入一遍——第 10 章讲平台时会看到这件事多贵。
  • 多语言、代码、表格各有专用嵌入模型,书里没展开;跨模态(图与文同一个 数字空间)留到第 14 章。
  • 「意思相近数字就近」在大数定律上成立,对任何具体一对文本都可能失灵—— 第 11 章的检索指标就是用来抓这种失灵的。

8. 可带走的

  1. 表层相似 ≠ 语义相似:USA/United States 字面无关、意思相同;hat/mat 字面相邻、意思无关;
  2. 嵌入 = 文字 → 固定长度的一串浮点数,训练目标是「意思近则数字近」;
  3. 谱系:Elman(1990s)→ Word2Vec(2013,queen−woman≈king−man)→ BERT(2018,动态嵌入);
  4. 嵌入空间处处有语义:随机砍掉一大半维度,相似度模式几乎不变;
  5. 选型四轴:MTEB 榜单、维度、MRL 可截断性、上下文窗口;
  6. 三个实战坑:静默截断、向量库维度上限(pgvector 2,000)、别用 JSON 传向量;
  7. 换嵌入模型 = 全库重嵌入——选型是长期承诺。

9. 原文地图

主题原书章原文位置
字面匹配的失败Code Example: Chunking in Pythontext/15-fm-code-example-chunking-in-python.txt:57(搜「United States」)
Uncle Sam、嵌入定义What Is (an) Embedding?text/16-fm-what-is-an-embedding.txt:4(搜「Uncle Sam」)
California/Alberta 例What Is (an) Embedding?text/16-fm-what-is-an-embedding.txt:16(搜「California」)
谱系:Elman/Word2Vec/BERTWhat Is (an) Embedding?text/16-fm-what-is-an-embedding.txt:21(搜「Elman」) · :24(搜「Word2Vec」) · :27(搜「contextualized」)
queen−woman≈king−manWhat Is (an) Embedding?text/16-fm-what-is-an-embedding.txt:27(搜「queen」)
MTEB、模型大小取舍Selection Criteria for Embedding Modelstext/17-fm-selection-criteria-for-embedding-models.txt:7(搜「MTEB」)
MRLSelection Criteria for Embedding Modelstext/17-fm-selection-criteria-for-embedding-models.txt:13(搜「Matryoshka」)
嵌入模型窗口名单Selection Criteria for Embedding Modelstext/17-fm-selection-criteria-for-embedding-models.txt:21(搜「Qwen3」)
静默截断、pgvector 2,000 维Practical Tips and Considerationstext/18-fm-practical-tips-and-considerations.txt:4(搜「silently」) · :7(搜「2,000」)
JSON vs Base64Practical Tips and Considerationstext/18-fm-practical-tips-and-considerations.txt:13(搜「Base64」)
四句子走查Code Example: Generating Embeddings…text/19-fm-code-example-generating-embeddings-with-sentence.txt:34(搜「384」) · :49(搜「0.8151」)
随机切维实验Code Example: Generating Embeddings…text/19-fm-code-example-generating-embeddings-with-sentence.txt:85(搜「random」)

Footnotes

  1. 出处:「Code Example: Chunking in Python」第 57 段(text/15-fm-code-example-chunking-in-python.txt:57,搜「United States」)与第 60 段(同文件,搜「two」)。「Silicon Valley vs 硅谷/矽谷」的例子见「The Ingestion Flow」第 26 段(text/09-fm-the-ingestion-flow.txt:26,搜「Silicon Valley」)。

  2. 出处:「What Is (an) Embedding?」第 7 段(text/16-fm-what-is-an-embedding.txt:7,搜「hat」)。

  3. 出处:「What Is (an) Embedding?」第 4 段(text/16-fm-what-is-an-embedding.txt:4,搜「Uncle Sam」)。补充(不在书里,来自通用知识):「出现在同类上下文里的词意思相近」在语言学里叫分布假说(distributional hypothesis),是整条谱系的理论起点。

  4. 出处:「What Is (an) Embedding?」第 16 段(text/16-fm-what-is-an-embedding.txt:16,搜「California」)。

  5. 出处:「What Is (an) Embedding?」第 10 段(text/16-fm-what-is-an-embedding.txt:10,搜「dense」)。dense retriever(稠密检索器)得名于这种神经网络学出的稠密表示。

  6. 出处:「What Is (an) Embedding?」第 21 段(text/16-fm-what-is-an-embedding.txt:21,搜「Elman」)、第 24 段(同文件,搜「Word2Vec」)、第 27 段(同文件,搜「contextualized」)。one-hot encoding(独热编码:词表多长向量就多长、只有一个位置是 1 其余全 0 的表示法)是同文件更早的对照物。

  7. 出处:「What Is (an) Embedding?」第 27 段(text/16-fm-what-is-an-embedding.txt:27,搜「queen」)。

  8. 出处:「What Is (an) Embedding?」第 27 段(text/16-fm-what-is-an-embedding.txt:27,搜「static embeddings」)。

  9. 出处:「Code Example: Generating Embeddings with Sentence Transformers」第 15 段(text/19-fm-code-example-generating-embeddings-with-sentence.txt:15,搜「MiniLM」)与第 34 段(同文件,搜「384」)。

  10. 出处:「Code Example: Generating Embeddings with Sentence Transformers」第 49 段(text/19-fm-code-example-generating-embeddings-with-sentence.txt:49,搜「0.8151」)。

  11. 出处:「Code Example: Generating Embeddings with Sentence Transformers」第 85-112 段(text/19-fm-code-example-generating-embeddings-with-sentence.txt:85,搜「random」)。

  12. 出处:「Selection Criteria for Embedding Models」第 4-7 段(text/17-fm-selection-criteria-for-embedding-models.txt:7,搜「MTEB」)。

  13. 出处:「Selection Criteria for Embedding Models」第 10 段(text/17-fm-selection-criteria-for-embedding-models.txt:10,搜「dimensions」)。

  14. 出处:「Selection Criteria for Embedding Models」第 13 段(text/17-fm-selection-criteria-for-embedding-models.txt:13,搜「Matryoshka」)。MRL 的训练损失是各截断维度上损失之和,所以截到任何一档都够用。

  15. 出处:「Selection Criteria for Embedding Models」第 16-39 段(text/17-fm-selection-criteria-for-embedding-models.txt:21,搜「Qwen3」)。

  16. 出处:「Practical Tips and Considerations」第 4 段(text/18-fm-practical-tips-and-considerations.txt:4,搜「silently」)与第 7 段(同文件,搜「2,000」)。

  17. 出处:「Practical Tips and Considerations」第 13 段(text/18-fm-practical-tips-and-considerations.txt:13,搜「Base64」)。「字节」是计算机存储的最小单位,一个英文字母占一个字节。