跳到主要内容

把一句话变成一串数 — 意思近的挨得近,而三家给的长度都不一样

这一章讲三件事: 为什么按关键词找不够;把一句话变成一串数之后能干什么; 以及挑向量模型该看什么。

它在全书链条里的位置: 第 03 章末尾说出路是「外部知识」。 这一章是那条路的第一步:先让文字变成可以互相比较的东西。 第 05 章切碎资料,第 06 章把这些数存起来。

本章主走查的输入:书拿来做测试的那一句话。 (先说清一个词:字符串就是一串连在一起的文字——下面这句话里正好出现了它。) 原句是「要生成 embedding 的输入文本,字符串形式。」,会被分别送给三家,拿回三串长度不同的数。 下面出现的每一个长度、每一个小数,都是原书里真实打印出来的。

1. 按关键词找,会漏掉说法不同、意思相同的那些

这一节先说清「为什么不能直接用普通数据库搜」。

关键词搜索就是拿你输入的那几个词去资料里逐字比对,谁包含的词多、谁匹配得全,谁就排前面。 原书对它的判词很准:匹配的程度取决于关键词的数量或者是否完全匹配查询句1

问题就出在「完全匹配」这四个字上。 用户问「南瓜书怎么用」, 而资料里写的是「南瓜书的最佳使用方法是以西瓜书为主线」—— 「怎么用」和「使用方法」一个字都不重合。

书给的替代方案是:把文字变成一串数,直接比较两串数的接近程度语义就是「这句话说的是什么意思」,与之相对的是「字面上写了哪几个字」; 书的原话是,这样可以直接拿到问题与资料在语义层面上的相似度1

2. 一句话真的会变成一串数

这一节是主走查的第 1 步。请注意它不是比喻。

原书给的定义是:词向量(Embeddings)是一种把单词、句子甚至整个文档 这类没有固定格子的数据,转成一串实数的技术2

向量在这里的意思很朴素:就是一串按固定顺序排好的数,像 [0.038, 0.013, -0.002, …]。 一串数之所以有用,是因为两串同样长度的数可以做算术,而两段文字不能。

原书这个词还有另一个中文译法:嵌入(embedding)——说的是同一件事。 你在别人的文档、接口说明里看到的多半是「嵌入模型」「Embedding API」这类写法。

现在看真实输出。 原书把那句「要生成 embedding 的输入文本,字符串形式。」 送给 OpenAI 的 text-embedding-3-small,打印出来是这样3:

embedding 长度为:1536
embedding(前 10 个)为:
[0.03884002938866615, 0.013516489416360855, -0.0024250170681625605,
-0.01655769906938076, 0.024130908772349358, -0.017382…]
本次 token 使用情况为:Usage(prompt_tokens=12, total_tokens=12)

图说:一句 20 来个字的中文,进去算作 12 个词元,出来是 1536 个小数。
这 1536 个数就是这句话在这个模型眼里的全部内容。

3. 这串数被安排成「意思近的挨得近」

这一节回答「凭什么这串数能代表意思」。

书给的直觉解释是一句话:相似或相关的对象,在这个空间里的距离应该很近4。 它举的例子很好记:kingqueen 会挨得很近(含义相似), appleorange 也挨得近(都是水果),而 kingapple 离得远4

那「挨得近」拿什么量? 这门课后面全程用一种量法,叫余弦距离—— 它量的是两串数的方向像不像,而不是它们各自有多大。 书给的公式是把两串数对应位置相乘再求和,然后除以这两串数各自的「大小」—— 把一串里每个数平方、加起来、再开方,量的是这一串数整体有多大5:

similarity = cos(A, B) = (A · B) / (‖A‖ · ‖B‖)

图说:分子是「对应位置相乘,再全部加起来」;
分母那两道竖线画的就是「这一串数整体有多大」,一串一个数。
注意它跟本章别处说的「长度」不是一回事:那个数的是有几个数(1536 个),
这里量的是这些数本身有多大。除掉它,比的就只剩方向。
结果越接近 1,两句话的意思越像。第 06 章取资料时用的就是它。

书还提到另外两种量法,本课一次都没用到,所以本组拆解只讲余弦这一种1

4. 三家给的长度不一样,这带来一条硬约束

这一节是主走查的第 2、3 步,也是本章最要紧的一条实操结论。

同一句话,原书分别送给三家,拿回来的东西长这样367:

谁家型号拿回多少个数
OpenAItext-embedding-3-small1536
百度文心Embedding-V1384
智谱embedding-21024

一串数里有多少个数,这个数量叫维度。 上表三行的维度分别是 1536、384、1024—— 最长的那个是最短的四倍。

于是有一条约束是硬的:建库时用哪个模型算的数,提问时就必须用同一个。 理由不用记,自己看就明白:1536 个数和 384 个数根本没法一一对应着做上面那道除法; 就算长度碰巧一样,两家安排数值的方式也不同,算出来的「像不像」毫无意义。

这条约束会在第 06 章变成一行具体的代码:打开一个已经建好的库时, 你必须把当初建库用的那个模型再传进去一次。传错了不会报错,只会检索出一堆不相干的东西。

5. 存这些数的地方:向量数据库

这一节讲这些数存哪儿,以及它凭什么比一条条比对快。

向量数据库就是专门用来存这种「一串数」并按接近程度快速找出相似项的数据库8。 它和你熟悉的那种按行按列存表格的数据库不是一回事:它关心的不是「等于」,是「像」。

它凭什么快? 索引就是为了快速找到东西而预先建好的一张查找表——就像书末那几页,不用从第一页翻起。 书对这件事只给了一句:它使用高效的索引和查询算法来加速存储和检索过程9

补充(不在书里,来自通用知识): 书这句话没有展开。实际做法通常是 预先把相近的向量归拢在一起、并搭出一张「从这一堆跳到那一堆」的跳表, 查询时只在几堆里比,而不是和库里每一条都比一遍。 代价是它给的答案是「很可能最像的几个」,不保证是「一定最像的几个」。

书列了三家,各有一句评价10:

书怎么说
Chroma轻量、简单、易用,数据存在内存里,适合初学者;功能相对简单,不支持显卡加速
Weaviate除了按意思找,还能把按词找和按意思找两路合起来用,提高结果的相关性和准确性
Qdrant用 Rust 写的,每秒能扛的请求数很高;可以放在本机、放在自己机房、放在云上

这门课全程用 Chroma,理由就是表里那句「数据存在内存里,非常容易启动」。 Weaviate 那一行里「两路合起来用」的做法有个正式名字,第 06 章挂牌。

6. 挑哪个向量模型:两个分,和一行印反了的数

这一节是本章唯一的另起走查:一张跑分表,以及它里面的一处排版事故。

原书为 OpenAI 的三个型号列了一张表,四列依次是型号、每美元能算多少页、 MTEB 得分、MIRACL 得分11:

模型 每美元页数 MTEB得分 MIRACL得分
text-embedding-3-large 9,615 54.9 64.6
text-embedding-3-small 62,500 62.3 44.0
text-embedding-ada-002 12,500 61.0 31.4

这两个分是两套不同的考卷,书自己解释了11: MTEB 是八类任务的平均分(分类、把相似的归成一堆、判断两句配不配对等等),MIRACL 是多语言检索任务上的平均分这类「一批固定题目、大家都来考一遍」的考卷,行话叫基准测试。

现在看表里那处事故。 书自己紧接着写: text-embedding-3-large 有最好的性能和最贵的价格12—— 可表里它的 MTEB 得分 54.9 是三行里最低的。 说它性能最好,又给它最低分,这里对不上。

对照 OpenAI 当时的公告:text-embedding-3-large 的 MIRACL 是 54.9、MTEB 是 64.6; text-embedding-3-small 是 MIRACL 44.0、MTEB 62.3;ada-002 是 MIRACL 31.4、MTEB 61.013

所以事实是:只有第一行那两个分对调了,另外两行和官方公告完全一致。 这更像一次排版事故,而不是数据来源不同——如果是来源不同,三行都会对不上。

书给的选型建议本身没问题,可以照用12:效果要最好、预算充足选 large; 预算有限选 small;ada-002 是上一代,性价比都不如前两个,不推荐。

7. 边界:这一章有三处不能照抄

这一节列出会让你踩空的地方。

第一,书里四家只讲了三家。 讯飞星火那一节的正文只有四个字:尚未开放14书没有隐瞒,但你按目录去找会扑空。

第二,那张跑分表里没有维度。 书里另外还有一张表提到过维度 (text-embedding-3-small 是 512/1536、text-embedding-3-large 是 256/1024·3072、 ada v2 是 1536)——但那张表在第一章讲各家价目的地方,不是这一章这张跑分表15两张表别混着看。

第三,价格和分数都会变。 这一章真正长效的只有三样: 词向量是什么、余弦怎么量、建库和提问必须同一个模型。 其余都要重查。

判断(我们的,不是书里的): 这一章对初学者最危险的地方不是那张印错的表, 而是它把「按意思找」讲得太顺了——听上去只要变成数就一定能找对。 实际上按意思找有它自己的失手方式,而书把这件事推迟到了第五章才讲。 本组拆解第 06 章会把那个坑提前挑明。 如果错,会错在: 如果你的资料是术语高度统一的规范文档(比如接口手册), 那么按关键词找的效果可能反而更好、更可控——那种场景下这一章的前提本身就要打折。

8. 可带走的

  1. 按关键词找会漏:「怎么用」和「使用方法」一个字都不重合;
  2. 办法是把文字变成一串数,因为两串数能做算术,两段文字不能;
  3. 这串数叫词向量,也叫嵌入——同一件事两个名字,外面文档里两种都见得到;
  4. 一句 20 来个字的中文进去算 12 个词元,出来是 1536 个小数;
  5. 这些数被安排成「意思近的挨得近」:king 与 queen 近,king 与 apple 远;
  6. 量「近不近」用余弦:对应位置相乘求和,再除以两串数各自的「大小」(每个数平方加起来再开方);结果越接近 1 越像;注意这个「大小」和本章说的「长度」不是一回事——长度数的是有几个数;
  7. 三家给的长度不一样:OpenAI 1536、文心 384、智谱 1024,最长的是最短的四倍;
  8. 于是有一条硬约束:建库用哪个模型,提问就必须用同一个;传错不报错,只是找回来一堆无关的东西;
  9. 存这些数的地方叫向量数据库,它关心「像」不关心「等于」;这门课用 Chroma,因为它数据放内存、开箱即用;
  10. 挑模型看两个分:MTEB(八类任务的平均)和 MIRACL(多语言检索);
  11. 书里那张跑分表,第一行的两个分对调了,另外两行是对的——按官方公告,large 的 MTEB 是 64.6、MIRACL 是 54.9;
  12. 星火那一节是空的,书里写着「尚未开放」。

9. 原文地图

主题原书章原文位置
关键词搜索的局限、按意思找词向量及向量知识库text/04-p61-80.txt:507(搜「主要通过检索关键词」) · text/04-p61-80.txt:508(搜「语义层⾯上的相似度」)
词向量的定义词向量及向量知识库text/04-p61-80.txt:495(搜「转化为实数向量的技术」)
意思近的挨得近、king 与 queen词向量及向量知识库text/04-p61-80.txt:498(搜「的距离应该很近」) · text/04-p61-80.txt:501(搜「king」)
余弦距离的公式搭建并使用向量数据库text/05-p81-100.txt:286(搜「similarity = cos(A, B)」)
三家的长度:1536 / 384 / 1024使用 Embedding APItext/04-p61-80.txt:595(搜「为:1536」) · text/04-p61-80.txt:659(搜「为:384」) · text/04-p61-80.txt:695(搜「为:1024」)
那一句话的前 10 个数与词元数使用 Embedding APItext/04-p61-80.txt:596(搜「0.03884002938866615」) · text/04-p61-80.txt:604(搜「Usage(prompt_tokens=12, total_tokens=12)」)
向量数据库是什么、索引词向量及向量知识库text/04-p61-80.txt:521(搜「于存储和检索向量数据」) · text/04-p61-80.txt:524(搜「效的索引和查询算法」)
三家向量数据库词向量及向量知识库text/04-p61-80.txt:533(搜「轻量级向量数据库」) · text/04-p61-80.txt:534(搜「结合多种搜索算法」) · text/04-p61-80.txt:536(搜「的检索效率和RPS」)
跑分表与两个分的口径使用 Embedding APItext/04-p61-80.txt:544(搜「MTEB得分为embedding model分」)
书自己的选型建议使用 Embedding APItext/04-p61-80.txt:547(搜「有最好的性能和最贵的价格」) · text/04-p61-80.txt:549(搜「推荐使」)
星火尚未开放使用 Embedding APItext/04-p61-80.txt:664(搜「尚未开放」)
另一张带维度的表大型语言模型(LLM)理论简介text/01-p1-20.txt:265(搜「512/1536」) · text/01-p1-20.txt:267(搜「256/1024.3072」)

Footnotes

  1. 出处:「词向量及向量知识库」第 506 至 508 段(text/04-p61-80.txt:507,搜「主要通过检索关键词」;后半句见 text/04-p61-80.txt:508,搜「语义层⾯上的相似度」)。原文管按关键词找叫「词法搜索」。它还提到另一条好处:文字、声音、图像、视频这些不同媒介很难互相关联,而变成一串数之后就统一了。原文列的量法一共三种:点积、余弦距离、欧几里得距离——本组拆解只讲余弦,因为这门课后面只用到它。 2 3

  2. 出处:「词向量及向量知识库」第 495 段(text/04-p61-80.txt:495,搜「转化为实数向量的技术」)。原文的措辞是「将非结构化数据,如单词、句子或者整个文档,转化为实数向量」,本章把「非结构化」换成了大白话。

  3. 出处:「使用 Embedding API」第 592 至 604 段(text/04-p61-80.txt:595,搜「为:1536」;前 10 个数见 text/04-p61-80.txt:596,搜「0.03884002938866615」;词元数见 text/04-p61-80.txt:604,搜「Usage(prompt_tokens=12, total_tokens=12)」)。方框里那六个小数是原文前 10 个里的前 6 个,原文一行印满了 10 个。 2

  4. 出处:「词向量及向量知识库」第 498 至 502 段(text/04-p61-80.txt:498,搜「的距离应该很近」;例子见 text/04-p61-80.txt:501,搜「king」)。 2

  5. 出处:「搭建并使用向量数据库」第 286 至 287 段(text/05-p81-100.txt:286,搜「similarity = cos(A, B)」)。原文是一行数学公式,本章把它翻成了大白话。原文这句话出现在讲 Chroma 检索的地方,不在讲词向量那一节——是我们把它挪过来的,因为不先讲量法,后面的检索就是黑箱。

  6. 出处:「使用 Embedding API」第 656 至 659 段(text/04-p61-80.txt:659,搜「为:384」)。文心这一家的调法要先拿 API Key 和 Secret Key 换一张凭证,再用凭证调,比另外两家多一步。

  7. 出处:「使用 Embedding API」第 689 至 695 段(text/04-p61-80.txt:695,搜「为:1024」)。

  8. 出处:「词向量及向量知识库」第 521 段(text/04-p61-80.txt:521,搜「于存储和检索向量数据」)。原文的对照是:它与传统的基于关系模型的数据库不同,主要关注的是向量数据的特性和相似性

  9. 出处:「词向量及向量知识库」第 524 至 529 段(text/04-p61-80.txt:524,搜「效的索引和查询算法」)。原文对「高效」没有展开一个字,所以本章那段补充明确标成了我们的通用知识。

  10. 出处:「词向量及向量知识库」第 533 至 537 段(text/04-p61-80.txt:533,搜「轻量级向量数据库」;另两家见 text/04-p61-80.txt:534,搜「结合多种搜索算法」与 text/04-p61-80.txt:536,搜「的检索效率和RPS」)。Weaviate 那一行原文还提到它支持一种叫「最大边际相关性」的搜法——那个名字第 06 章会正式挂出来,因为这门课真的用到了它。

  11. 出处:「使用 Embedding API」第 543 至 545 段(text/04-p61-80.txt:544,搜「MTEB得分为embedding model分」)。原文这张表是用 Markdown 的竖线格式挤在一行里的,本章把它排开了,数字一个没改 2

  12. 出处:「使用 Embedding API」第 547 至 549 段(text/04-p61-80.txt:547,搜「有最好的性能和最贵的价格」;结论见 text/04-p61-80.txt:549,搜「推荐使」)。 2

  13. 补充(不在书里):OpenAI 2024-01-25 的公告写明:与 text-embedding-ada-002 相比,text-embedding-3-large 在 MIRACL 上从 31.4% 升到 54.9%、在 MTEB 上从 61.0% 升到 64.6%;text-embedding-3-small 在 MIRACL 上升到 44.0%、在 MTEB 上升到 62.3%。同一篇公告还说 text-embedding-3-large 最多给到 3072 个数。来源:OpenAI「New embedding models and API updates」https://openai.com/index/new-embedding-models-and-api-updates/(查阅于 2026-08-25)。

  14. 出处:「使用 Embedding API」第 662 至 664 段(text/04-p61-80.txt:664,搜「尚未开放」)。原文这一节标题是「三、使用讯飞星火API」,正文只有这四个字。

  15. 出处:「大型语言模型(LLM)理论简介」第 264 至 269 段(text/01-p1-20.txt:265,搜「512/1536」;large 那一行见 text/01-p1-20.txt:267,搜「256/1024.3072」)。那一行的写法本身也有排版问题:256/1024.3072 里那个点大概率该是逗号或顿号。