~3m10:03
Скрытый слой

Эмбеддинги на пальцах: рисуем 3D-карту смыслов

2026年11月1日

Read: ~2m · You save: 8 min

嵌入向量入门:绘制三维语义地图

搜索如何理解“修水龙头”和“解决混合器漏水”是同一件事?用通俗的方式讲解嵌入向量、语义地图和余弦相似度。

搜索查询"水龙头怎么修?"可能会把一篇关于修理混合水龙头漏水的文章排在第一位。查询和文章之间没有任何相同的词。原因在于,语言模型处理的不是字母,而是编码含义的向量。这类向量被称为嵌入向量(embeddings)。它们是搜索、推荐以及文档聊天机器人的基础。

从文本到数字

计算机只能处理数字,因此文本首先要被切分为词元(token)。词元是一个词或一个词的一部分。每个词元都会在词表中分配一个编号。例如,“кошка”(母猫)可能对应编号 18342,“кот”(公猫)可能对应编号 51907。

编号并不反映语义。按数字顺序排列时,“кошка”和“кот”相距甚远,而“кошки”的邻居可能是“кошелёк”(钱包)。对这样的编号进行加减和比较毫无意义。

另一种方案是独热(one-hot)表示。每个词对应一个与词表等长的全零向量,只在该词所在的位置上为 1。其缺点显而易见:任意两个词之间的距离都一样远。“кошка”与“кот”的差异,和“кошка”与“холодильник”(冰箱)的差异一样大。

我们需要一种表示方法:它既要简短、稠密,又能让语义相近的词彼此靠近。这种表示正是嵌入(embedding)。该术语源自英语 embedding,字面意思是“嵌入”“嵌套”。词语仿佛被嵌入到一个空间之中。

语义空间

设想一张地图,其中每个词都有坐标。一条坐标轴表示对象有多“生命化”,另一条表示它有多大。老鼠、猫、狗和大象位于右侧,按体型从小到大排列。茶壶和卡车位于左侧。

在这一系统中,“猫”由两个数字描述:0.9 和 0.2。可以将它们画成一个点,或从坐标原点出发的一个箭头。这种箭头被称为向量,因此嵌入也被称为向量。

两条坐标轴是不够的。在这样的地图上,“老虎”和“猫”几乎重合。加入第三条轴(“家养”或“野生”)便能将它们分开。每增加一条新轴,就增加一个数字,也增加一种模型能够考虑的差异。

真实的模型使用数百乃至数千条坐标轴。嵌入的维度为 768、1024,甚至超过 3000 个数字。这样的空间无法画出来,但其中的数学与平面地图上的数学是一致的。

需要注意的是,在真实的模型中,坐标轴并没有“生命”或“大小”这样的名称。模型自行决定如何将语义分布到各个数字上。一种属性通常同时分散在多条坐标轴上。重要的是点在整体中的位置,而不是某一个单独的数字。

如何衡量相似度

两点之间的距离往往无法反映语义上的接近程度。向量的长度取决于与词义无关的因素,例如该词在训练数据中的出现频率。一个向量可能变得更长,而其方向却保持不变。

因此,相似度通常用向量之间的夹角来衡量,更准确地说,是用夹角的余弦值:

  • 向量方向相同:余弦值为 1;
  • 向量相互垂直:余弦值为 0,没有共同的语义;
  • 向量方向相反:余弦值为 −1。

余弦相似度的计算方法是:将向量对应的坐标两两相乘,把结果相加,再除以两个向量长度的乘积。

对于“猫”和“小猫”,该值会较高;对于“猫”和“狗”,该值较低;对于“猫”和“冰箱”,该值很低。

一个不太明显的细节是:在实际模型中,即使彼此无关的文本,得到的值也常常不是 0,而可能是例如 0.3。因此,应评估的不是绝对数值,而是相对数值:哪一对更接近,哪一对更远。

核心要点: 嵌入向量是语义空间中的一个点。相似度就是从原点出发观察时,两个点之间的夹角。

模型如何确定词语的位置

没有人手动设定词语的坐标。该方法基于语言学家约翰·鲁珀特·弗斯于1957年提出的观点:词语的含义可以通过其所处的语境来理解。

试看一些带空缺的句子。空缺处可以填入“茶”“咖啡”和“可可”。语境相似的词通常含义相近,因此它们的位置也应彼此靠近。

2013年,谷歌公司开发了Word2Vec模型,使词嵌入(embedding)广为人知。其训练过程如下:

  1. 为每个词分配一个随机位置。
  2. 模型遍历大规模文本,并学习预测哪些词会相邻出现。
  3. 每一次错误都会使位置轻微移动:相邻的词彼此靠近,无关的词彼此远离。
  4. 经过数十亿次这样的调整,随机的点云逐渐变成一张结构化的地图。

最终,饮品与饮品聚在一起,动物与动物聚在一起,城市与城市聚在一起。模型从未获得“饮品”这一概念的定义,它是从人们书写文本的方式中自行归纳出这一类别的。

随后出现了一个连方法的作者们都感到惊讶的特性:空间中的方向开始对应词与词之间的关系。若取“国王”的向量,减去“男人”,再加上“女人”,那么除原始词之外最接近的词就是“女王”。“国家”与“首都”之间的关系也以同样方式体现。在现代模型中,这种运算的准确度有所降低,但其原理依然成立。

Embedding Table

The first step of any language model is the embedding table. It has a row for every token in the vocabulary. The model receives a token's number and retrieves the corresponding row. This is how a word becomes a vector.

For example, Llama 3 with 8 billion parameters has a vocabulary of 128 thousand tokens, and each embedding consists of 4,096 numbers. A single table contains more than half a billion numbers, and all of them are determined during training.

The table has a limitation. The word "key" has one row, that is, one point, for all of its meanings: "door key," "treble clef," "spring key."

The model's layers help resolve the ambiguity. Each layer adds information from neighboring words to the word's vector. "Key" next to "door" shifts toward locks, next to "violin" toward musical notes, and next to "water" toward springs. Such vectors are called contextual embeddings.

At the final stage, the model computes the probabilities of the next word based on the last vector. Thus, any response from a neural network begins with vectors and ends with them.

从词语到文本

搜索不能只依靠单个词语:需要比较短语和文档。模型会为每个词元(token)输出一个向量,因此必须得到整段文本的单个向量。主要有两种方法:

  • 均值池化(mean pooling): 计算所有词元向量的平均值。
  • 特殊词元: 在文本开头添加一个特殊词元,模型学习将整个短语的语义汇集到该词元中。

这一过程被称为池化。

普通的语言模型并不是为生成搜索向量而训练的。为此需要使用专门的嵌入模型(embedding models),它们会在数百万对数据上进行微调。问题及其正确答案相互吸引,随机配对的则相互排斥。这种方法被称为对比学习。

经过这样的训练后,“如何修理水龙头”与“混合水龙头漏水的排除”会处于相近的位置。这就解释了文章开头的搜索结果。

应用场景

语义搜索。 文档预先转换为向量并存储在数据库中。查询同样被转换为向量,随后系统找出最近的向量。这类存储称为向量数据库。

基于文档的聊天机器人(RAG)。 文档被切分为片段,并转换为向量。提出问题时,系统找出最相近的片段并将其交给语言模型。模型基于检索到的文本生成回答,而不仅仅依赖训练时获得的数据。

推荐与聚类。 系统可以识别相似的商品和电影,并在无需人工标注的情况下,按主题对成千上万条评论进行分组。所有这些场景都执行同一种操作:查找最近的向量。

多语言模型。 在这类模型中,“кошка”、cat 和 Katze 几乎落在空间中的同一点上。含义相同,只是语言不同。

多模态模型。 CLIP 等模型将文本和图像置于同一空间中。一张猫的照片会与文字“猫的照片”彼此靠近。基于这一原理,可以通过文字描述来搜索图像。

实际检验

检验在 BGE-M3 模型上进行,该模型对俄语的处理效果良好,并通过 Ollama 在本地运行。脚本执行三项操作:将短语发送给模型,获取向量,并计算每对短语的余弦相似度。

测试的短语集包括两个关于水龙头的短语、两个关于猫的短语,以及一个关于天气的短语。每个短语都由 1024 个数字表示。

结果:

  • “水龙头”和“混合器”这一对显示出较高的相似度,尽管它们没有任何共同的词。
  • “窗台上的猫”和“窗边的小猫”同样显示出较高的相似度。
  • 关于天气的短语与其他所有短语的相似度都较低。

根据查询“怎样修水龙头?”进行搜索,返回的第一条结果是关于混合器漏水的文本,最后一条是关于天气的文本。由此可见,语义搜索只需不到三十行代码即可实现。

嵌入的局限性

逻辑推理能力较差。 嵌入擅长识别主题,却难以区分语义上的对立。"我喜欢猫"和"我不喜欢猫"两句话的向量距离非常接近,因为两者用词几乎相同,主题也一致。这种行为用于检索尚可接受,但用于理解语义则不行。

模型会继承刻板印象。 嵌入是在人类文本上训练的,而这些文本包含了人们的刻板印象。在2016年的一项研究中,针对类比"男人之于程序员,相当于女人之于……",Word2Vec给出的答案是"家庭主妇"。

不同模型的向量互不兼容。 每个模型都有自己的空间映射。更换模型时,整个向量数据库都需要重新计算。

总结

嵌入(embedding)是多维空间中的语义地址。两个对象的相似度由它们地址之间的夹角决定。所有语言模型都始于一张嵌入表,该表将词元(token)映射为向量,之后的各层再结合上下文对这些向量进行细化。

引言:为什么需要嵌入

搜索能够理解查询的含义,即使没有共同的词语。对于神经网络来说,词语不是字母,而是编码了含义的数字向量。

  • 查询“怎么修水龙头?”能找到关于修理混合龙头漏水的文章,即使两者没有共同的词语
  • 对神经网络来说,“猫”这个词表示为一个由一千个数字组成的列表
  • 相近的词获得相近的数字,而它们之间的关系则转化为方向
  • 从“男人”到“女人”的方向大致与从“国王”到“王后”的方向相同
  • 嵌入是语言模型、搜索、推荐系统和文档聊天机器人的基础

Токены, номера и почему нужен эмбеддинг

Текст сначала разбивается на токены, которым присваиваются номера в словаре. Номер сам по себе ничего не говорит о смысле, а one-hot кодирование делает все слова одинаково далекими друг от друга.

  • Текст разрезают на токены, которые являются словами или частями слов
  • Каждому токену назначается номер в словаре, например кошка 18342, кот 51907
  • Номер не отражает смысл: кошка и кот далеко друг от друга, а соседом кошки может быть кошелек
  • One-hot: строка из нулей длиной во весь словарь с единицей на месте слова
  • При one-hot любые два слова одинаково далеки друг от друга, кошка не ближе к коту, чем к холодильнику
  • Эмбеддинг (от англ. embedding, вложение) это короткое плотное представление, где похожие по смыслу слова стоят рядом

语义地图与向量

把词语的含义想象成带坐标轴的地图上的点会很方便。每增加一个新轴,就会多出一种区别,而真实的模型会使用数百甚至数千个轴。

  • 二维地图示例:一个轴是“有多生动”,另一个轴是“有多大”
  • 老鼠、猫、狗和大象在“体型”方向上依次靠右,茶壶和卡车靠左
  • 猫用两个数字描述,即0.9和0.2,可以表示为一个点或一个箭头(向量)
  • 两个轴不够用:老虎和猫几乎重合,加入“家养还是野生”这个轴后它们就被区分开了
  • 真实嵌入的维度为768、1024,或超过3000个数字
  • 在真实模型中,轴没有清晰的名称,一种属性通常分散在许多轴上
  • 重要的不是单个坐标,而是整个点的位置

余弦相似度

相似度不是用距离衡量,而是通过余弦相似度计算向量之间的夹角,因为向量的长度取决于单词在训练中出现的频率。

  • 在训练中,点之间的距离往往取决于单词的出现频率,因此它并不能反映语义
  • 夹角余弦在方向相同时为1,成直角时为0,方向相反时为负1
  • 余弦相似度的计算方法是:对坐标逐对相乘,求和,再除以向量的长度
  • 猫和小猫之间的值较高,猫和狗之间较低,猫和冰箱之间很低
  • 在实际模型中,无关文本的值往往不是0,例如可能是0.3,因此重要的是比较而不是绝对数值

模型如何学习:Word2Vec 与词的语境

模型依据语境自行学会词的位置,遵循语言学家约翰·弗斯的思想。Word2Vec 即是如此工作的,它由谷歌于2013年创建。

  • 语言学家约翰·弗斯的观点:可以通过词的语境认识这个词
  • 出现在相同语境中的词通常意义相近,并获得相近的位置
  • Word2Vec 于2013年在谷歌完成训练
  • 起初,每个词被分配一个随机位置,然后模型在海量文本中猜测相邻的词
  • 每次错误都会略微移动这些位置:邻近的词相互吸引,随机配对的词相互远离
  • 随着时间推移,随机的点云变成一张地图:饮料聚在一起,动物聚在一起,城市聚在一起
  • 方向开始编码关系:国王减去男人再加上女人,得到女王
  • 在现代模型中,这种算术运算不那么纯粹,但这一思想仍然保留

嵌入表与上下文

第一步是嵌入表,但静态向量无法区分同一个词在不同语境中的含义。模型的各层会加入上下文,从而生成上下文嵌入。

  • 嵌入表为词表中的每个词元保存一行
  • Llama 3(80亿参数)的嵌入表有12.8万行,每行4096个数字
  • 单个表包含超过五亿个数字,它们都在训练中学习得到
  • 静态表的问题:“ключ”(钥匙)这个词只有一行、一个位置,却要表示所有含义(门钥匙、小提琴谱号、泉水)
  • 每一层都会把邻近词的信息混入向量,于是“钥匙”的向量会向锁、音符或泉水方向移动
  • 这类向量被称为上下文嵌入
  • 最后,模型根据最后一个向量计算下一个词的概率

整句向量与对比学习

为了比较整句和文档,需要通过池化(pooling)为整个文本获得一个向量。用于搜索的是单独训练的嵌入模型,它们采用对比学习进行训练。

  • 模型为每个词元输出一个向量,而搜索需要整个文本的一个向量
  • 对所有词元的向量取平均是最简单的方法
  • 另一种做法是在开头添加一个特殊词元,并训练模型将句子的含义汇聚到该词元中;这称为池化
  • 普通语言模型并不学习生成适合搜索的良好向量,因此需要单独的嵌入模型
  • 这些模型使用数百万对数据进行微调:问题与正确答案相互靠近,随机配对则相互远离
  • 这种训练称为对比学习,它能让“如何修水龙头”与“混合器漏水的排除”在向量空间中彼此靠近

嵌入的应用场景

嵌入(Embeddings)用于语义搜索、基于文档的RAG聊天机器人、推荐和文本聚类,以及多语言和多模态模型。

  • 语义搜索:文档预先转换为向量并存储在向量数据库中,查询同样转换为向量,然后查找最近邻
  • RAG:文档被切分成片段,转换为向量,根据问题找到最相近的片段,并传递给语言模型
  • 推荐和聚类:相似的商品、电影和评论按主题分组,无需人工标注
  • 多语言模型:猫、cat和Katze几乎落在同一个点上
  • 多模态模型(例如CLIP)将文本和图片放入同一空间,因此猫的照片会与短语“猫的照片”位置相近

Практика: семантический поиск на BGE3

Демонстрация семантического поиска на модели BGE3 которая хорошо понимает русский язык и запускается локально через Ollama. Скрипт занимает около тридцати строк кода.

  • Модель: BGE3, понимающая русский язык, запускается локально через Ollama
  • Скрипт отправляет фразы в модель, получает векторы и считает косинусное сходство каждой пары
  • Тестовые фразы: две про кран, две про кошек и одна про погоду
  • Каждая фраза превращается в 1024 числа
  • На тепловой таблице сходства кран и смеситель выделяются, хотя общих слов нет; кошка на подоконнике и котенок у окна тоже близки; погода со всеми тусклая
  • Запрос «как починить кран?» выдает первым текст про протечку смесителя, а последним текст про погоду

嵌入的局限性

嵌入向量能很好地捕捉主题,但难以理解逻辑,会继承刻板印象,并且不同模型之间互不兼容,因此更换模型时必须重新计算整个数据库。

  • “我喜欢猫”和“我不喜欢猫”两个短语的向量非常接近,因为词语和主题几乎相同
  • 对于搜索来说这可以接受,但对于理解语义则不行
  • 在2016年的一项研究中,Word2Vec对“男人之于程序员,如同女人之于……”这一类比给出的答案是“家庭主妇”
  • 嵌入向量是在人类文本上学习的,因此也学会了人们的刻板印象
  • 不同模型的向量互不兼容:每个模型都有自己的“地图”,更换模型时必须完全重新计算数据库