你在公司的知识库里搜「钱付错了能拿回来吗」,系统找出来的第一篇文章叫《退款申请流程》。仔细看,两句话几乎没有一个字相同,可它偏偏找对了。
老式的关键词搜索做不到这一点,它只会比对字面。能做到的,是一种把「意思」变成一串数字的技术:Embedding,中文常译作「嵌入」或「向量表示」。语义搜索、内容推荐、企业知识库问答,背后都离不开它。
把「意思」变成坐标
先想想地图。每座城市都有一个经纬度坐标,坐标接近的城市,在地图上也挨得近。Embedding 做的事情类似:给每一段文字分配一个坐标,让它落在一个「意思空间」里——意思相近的文字,坐标也相近。
为了直观,我们先编一个只有 3 个维度的玩具版本,每个维度代表一种人能看懂的特征:
| 词语 | 和食物有关 | 和科技有关 | 和动物有关 |
|---|---|---|---|
| 香蕉 | 0.9 | 0.0 | 0.1 |
| 橙子 | 0.9 | 0.1 | 0.0 |
| 手机 | 0.0 | 0.9 | 0.1 |
| 小猫 | 0.1 | 0.0 | 0.9 |
一眼就能看出,「香蕉」和「橙子」的坐标几乎一样,而它们离「手机」「小猫」都很远。
真实的 Embedding 有两点不同:
- 维度多得多。 常见的有几百到几千维。维度越多,能区分的意思越细腻。
- 每个维度没有名字。 「和食物有关」是我们为了讲解编的。真实向量里的每一维都是训练出来的,单独拿出一维,通常说不清它代表什么;意思是分散在所有维度的组合里的。
现代的 Embedding 模型大多基于前面讲过的 Transformer,会结合整句话的上下文来计算。所以「苹果发布了新手机」和「这个苹果很甜」里的「苹果」,会落在意思空间里相距很远的位置。早期的词向量做不到这一点,每个词只有一个固定坐标。
说到早期词向量,有一个著名的例子:在 2013 年前后提出的 word2vec 等研究中,人们发现「国王 − 男人 + 女人」算出来的坐标,离「女王」很近。也就是说,「男→女」这种关系,在空间里大致对应一个固定的方向。不过这种规律只是近似成立,并不是每次都灵。
怎么判断「近」:余弦相似度
有了坐标,还需要一把「尺子」来量两段文字有多像。最常用的是余弦相似度。
把每个向量想象成从原点出发的一支箭头。余弦相似度只看两支箭头的方向是否一致,不看箭头有多长:
- 方向完全相同:相似度为 1;
- 互相垂直、毫不相干:相似度为 0;
- 方向完全相反:相似度为 −1。
就像两个人站在同一个路口给你指路:两人都指向北方,意见完全一致;一个指北一个指东,说的根本不是一回事;一个指北一个指南,意见完全相反。至于胳膊伸得长还是短,无所谓。
用二维的小例子算一下:
A = (3, 4)
B = (6, 8) 方向和 A 完全相同,只是长了一倍 → 相似度 1
C = (4, -3) 和 A 互相垂直 → 相似度 0
D = (-3, -4) 和 A 方向完全相反 → 相似度 -1它的计算方法可以写成一句话:
相似度 = (A 和 B 对应位置相乘再相加) ÷ (A 的长度 × B 的长度)
前半部分衡量两个箭头「有多同向」,除以长度是为了把长短的影响去掉,只留下方向。
为什么只看方向?因为一篇 3000 字的报告和一句话的摘要,说的可能是同一件事。长度不同,但方向应该接近。用余弦相似度,长文和短句也能公平比较。
Embedding 是怎么学出来的
语言学里有个古老的观察:一个词的意思,可以从它常和哪些词一起出现看出来。「咖啡」常和「杯」「喝」「提神」一起出现,「茶」也是,所以它们的意思接近。早期的词向量,正是靠大量文本里的这种「同伴关系」学出来的。
现在给句子和段落做 Embedding 的模型,常用一种叫「对比学习」的训练方法:
拉近:「钱付错了能拿回来吗」 ←→ 「退款申请流程」 (意思相关)
推远:「钱付错了能拿回来吗」 ←→ 「如何修改收货地址」 (意思无关)模型看了海量这样的成对例子,不断调整,就学会了把意思相关的文字放在一起、把无关的推开。
同样的思路还能跨越语言和形式。用多种语言训练的 Embedding 模型,可以让「我饿了」和「I'm hungry」落在相近的位置,于是用中文也能搜到英文资料;还有一些模型把图片和文字放进同一个空间,输入「海边的日落」,就能找出相应的照片。说到底,只要能把两样东西变成同一个坐标系里的点,就能比较它们像不像。
它撑起了哪些应用
| 应用 | Embedding 在其中做什么 |
|---|---|
| 语义搜索 | 用「意思」而不是「字面」找内容,换个说法也能搜到 |
| 推荐 | 找和你看过、买过的东西「方向相近」的内容 |
| 聚类与去重 | 把意思相近的工单、评论、反馈自动归成一类 |
| 分类 | 看一段文字离哪个类别的「中心」最近 |
| 知识库问答(RAG) | 先找到相关资料,再交给大模型回答 |
其中和普通用户关系最密切的是知识库问答,它的流程大致如下:
准备阶段:
公司文档 → 切成小块 → 每块算出 Embedding → 存进向量数据库
提问阶段:
用户问题 → 算出 Embedding → 在数据库里找最相近的几块
→ 把这几块资料 + 问题一起交给大模型 → 生成回答这样,大模型就能根据你自己的资料回答问题,而不是全凭训练时的记忆,出现幻觉的机会也会少一些。
局限与注意事项
Embedding 很好用,但「意思相近」不等于「正确答案」。用的时候要注意几点:
- 相近 ≠ 相关。 「怎么开通会员」和「怎么取消会员」用词和话题几乎一样,向量可能离得很近,但用户要的是完全相反的东西。否定、反义、细微条件,是向量检索的常见盲区。
- 数字、型号、专有名词不是强项。 搜「订单号 20240815」或某个具体型号时,关键词检索往往更准。所以很多系统采用「关键词 + 向量」的混合检索。
- 不同模型的向量不能混用。 每个 Embedding 模型都有自己的「坐标系」,A 模型算出的坐标和 B 模型的放在一起比较没有意义。换模型就要重新计算全部向量。
- 切块大小有讲究。 块切得太大,一块里混着好几个主题,方向就「模糊」了;切得太小,又会丢掉上下文。
| 对比项 | 关键词检索 | 向量检索 |
|---|---|---|
| 比对的是 | 字面是否相同 | 意思是否相近 |
| 换个说法 | 容易搜不到 | 通常能搜到 |
| 精确的编号、型号 | 很准 | 容易出偏差 |
| 否定和反义 | 字面不同就能区分 | 可能混淆 |
所以,实际系统里两者常常搭配使用,取长补短。
本节要点
- Embedding 把文字变成一串数字坐标,意思相近的文字坐标也相近;真实向量有几百到几千维,每一维没有现成的名字。
- 现代 Embedding 会结合上下文,同一个词在不同句子里可以有不同的坐标。
- 余弦相似度只看两个向量的方向是否一致(1 最像,0 无关,−1 相反),不受文字长短影响。
- 语义搜索、推荐、聚类和知识库问答都建立在 Embedding 之上。
- 向量检索不擅长否定、反义和精确编号,实际系统常与关键词检索混合使用。
