什么是向量嵌入?互动式指南

Reddit r/ArtificialInteligence 新闻

摘要

互动式指南讲解向量嵌入的历史、原理与实践应用,通过可视化展示语义空间、向量运算与语义相似性,并演示语义搜索、聚类、零样本分类等真实场景。文中使用 Kanon 2 Embedder 的真实嵌入构建了一个交互式词语地图游戏。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/10/15 05:47

# 什么是向量嵌入?一份交互式指南 来源:https://isaacus.com/blog/what-are-vector-embeddings ## 速读要点 本指南带你了解向量嵌入的历史、设计、理论与实际应用。我们首次通过交互式可视化,将这一抽象主题变得生动可感,让你能看到并操控支撑 Google 搜索、Twitter 信息流乃至 ChatGPT 的"意义几何"。 我们从嵌入技术要解决的核心问题开始:如何用数值表示含义,让计算机能够处理它。由此,我们逐步建立对语义空间、向量运算和语义相似度的直观理解。 随后,我们将这些原理付诸实践,展示嵌入如何通过语义搜索、层次化检索、零样本分类、聚类和去重等技术驱动真实的业务系统。 无需编程基础。对于希望复现这些技术的读者,我们附上了简短的 Python 代码片段,演示每种方法的工作原理。 先来预览一下接下来的内容:试试下面这个 GeoGuessr/Wordle 风格的词语知识问答游戏。它使用来自 **Kanon 2 Embedder** (https://isaacus.com/blog/introducing-kanon-2-embedder) 的真实嵌入将 43,339 个英文单词投影到一张 2D 地图上,然后随机选取一个作为目标词。输入单词或向量表达式来放置标记,然后用这些标记围出尽可能小的圈来框住目标词。我们将在后文中解释嵌入如何驱动这张地图及其机制;现在,让探索精神指引你,开始你对语言隐秘几何的第一次探索。 ## 引言 向量嵌入是现代自然语言处理中最常见、最通用的工具之一。从 Google 搜索和 Netflix 推荐,到 AI 聊天机器人的记忆与检索能力,背后都有嵌入的支撑。其核心在于:嵌入让计算机不仅能处理文本中的字符,还能处理这些字符所累积传达的含义。 问题本身很简单。人类凭直觉就能理解词语和句子,而计算机最终处理的是以 `0` 和 `1` 表示的二进制数字。 要让计算机处理文本,其字符首先必须转换为这种二进制形式。以 UTF-8 为例,大写字母 `C` 用字节 `01000011` 表示。编码后,它就可以被存储、复制和处理。这种转换为机器可读形式的过程称为**编码**。 字符编码告诉计算机出现了哪些符号,但不告诉它这些符号的含义。如果我们能以类似的方式对词语和句子的含义进行编码呢? 嵌入模型试图在更高层次上实现这种转换。它不编码单个字符,而是将一个词、句子或文档的含义编码为一个**向量**——也就是一串数字列表。例如,句子 `a warm summer evening` 可能变成 `[0.18, -0.42, 0.73, ...]`。一旦含义有了数值形式,计算机就可以比较文本、按含义搜索,并发现仅凭字面措辞无法揭示的关系。 尽管嵌入的重要性不言而喻,它们却仍然鲜为人理解。生成模型通过其输出的文字来展示行为,而嵌入模型返回的是一长串数字,远非普通人能直接解读。因此,大多数人只是间接地接触到嵌入——它们隐藏在搜索引擎、推荐系统和 AI 聊天服务之下。 这种不可见性同样影响着工程师。由于生成模型易于提示和使用,它们常常被选中,尽管存在更快、更便宜且更准确的替代模型。近期围绕 **Jev** (https://typesafe.ai/blog/introducing-system-one-models-and-jev) 的关注——这是一种专为软件内部快速结构化决策而设计的非生成模型——反映出人们对"不再用聊天模型处理所有 AI 任务"的替代方案日益感兴趣。嵌入模型正是这一更广泛的非生成工具箱中的重要组成部分。 在我们能够使用嵌入自动化复杂的决策任务之前,需要先打好基础:嵌入是什么、它们如何工作、以及它们如何发展而来。 ## 向量嵌入简史 自从人类开始书写以来,就在不断探索符号与含义之间的关系。 早在公元前 3000 年,楔形文字和埃及象形文字 (https://www.unicode.org/Public/18.0.0/charts/nameslist/13000/) 等书写系统就使用视觉形式来表示物体、声音和思想。*太阳*可以用一个圆盘 𓇳 表示,*水*用一串波纹 𓈗 表示,*房屋*用其平面图 𓉐 表示。其他符号描绘了*人* 𓀀 或*牛头* 𓃾。 表示太阳或牛相对容易。表示过去、恐惧、意图或悲伤则困难得多。这些概念没有可以简化为一幅简单图画的物理形态。那么,我们如何在不把每个符号变成罗夏墨水测验的前提下表示抽象含义? 一种方法是将词语排列在能够捕捉部分含义的量表上。例如,温度相关的词语有一个天然的顺序,我们可以用数值来编码它。 最后一列显示了每个值如何以有符号 4 位二进制存储。这些数字仅为示例,但为每个词分配一个数值位置,使计算机能够执行反映我们直觉的算术运算: cold(−2) + hot(+2) = lukewarm(0) 这是一个粗糙的一维嵌入。它捕捉了温度,但仅此而已。例如,*warm* 和 *muggy* 虽然含义不同,却占据了相同的位置。增加湿度作为第二个维度可以将它们区分开来,而第三个维度可以捕捉语域,将 *hot* 这样的日常用语与 *torrid* 这样更具文学色彩的词区分开来。 增加更多维度会产生更丰富的表示,但决定每个维度的含义并手动为每个词语分配位置,很快就会变得不切实际。现代嵌入技术正是源于尝试从语言的实际使用中自动学习这种结构。 1990 年,**潜在语义分析** (https://asistdl.onlinelibrary.wiley.com/doi/abs/10.1002/%28SICI%291097-4571%28199009%2941%3A6%3C391%3A%3AAID-ASI1%3E3.0.CO%3B2-9) 提出了一种实现方式。它不手动定义温度或湿度等属性,而是根据词语在文档集合中的出现频率来表示它们。每篇文档最初充当一个维度,产生一张虽大但粗糙的词语使用地图。 然后,这张地图被压缩成一组更小的**潜在维度**。出现在相似文档中的词语会获得相似的位置,使关系从文本模式中自发涌现,而非由人工定义。 后来,神经语言模型通过自监督学习直接从未标注的文本中学习这些表示。**Word2vec** (https://arxiv.org/abs/1301.3781) 于 2013 年通过从上下文语境中学习词语间的关系,推动了这种方法的普及。现代嵌入模型将同样的原理扩展到了短语、句子和整个文档。 与我们的温度示例不同,这些模型学到的维度很少对应于某个我们能命名的单一属性。含义分布在整个向量之中。综合来看,几百个维度可以捕捉到极其细微的区分——比如不同司法管辖区法律措辞之间的差异,或伴侣中午发来的消息中暗藏的怨气。 ## 向量化 将纯文本转换为向量嵌入的过程称为**向量化**。现代嵌入模型(如 Isaacus 的 **Kanon 2 Embedder** (https://isaacus.com/blog/introducing-kanon-2-embedder))可以在毫秒级内将从单个词到整篇文档的任何内容向量化。 Kanon 2 将每个输入表示为固定长度的 1,792 个数字的列表。每个数字都是模型某个学习到的维度上的坐标,使每个嵌入的**维度数**为 1,792。这些坐标共同决定了文本在高维向量空间中的位置,含义相近的段落往往出现在更近的地方。 为了直观展示这种结构,下面的可视化将一小部分词嵌入投影到三个维度中。每个点代表一个词,点与点之间的距离和方向反映了模型如何关联它们。 将 1,792 个维度缩减为三个维度不可避免地会丢失信息,并扭曲点之间的精确距离。即便如此,原始结构中仍有足够的信息保留下来,使得若干关系清晰可见。 从 *king* 到 *queen* 的水平位移方向与从 *male* 到 *female* 的位移方向大致相同。这表明模型对这些性别化概念之间的区分保持着一致的表示。 将可视化切换为 2D,第二个关系变得更易察觉。去掉深度维度后,从 *English* 到 *French* 的水平和垂直位移与从 *London* 到 *Paris* 的位移相似。在这个投影中,一个方向编码了城市类别与国籍之间的区分,而另一个方向保留了英语关联概念与法语关联概念之间的差异。 ## 向量运算 嵌入将每个词表示为**语义空间**中的一个点,或者等价地表示为从原点到该点的一个向量。两个词向量相减得到另一个向量:即它们之间的位移。词向量告诉我们某个概念位于何处,位移向量则描述了当我们从一个概念移动到另一个概念时含义如何变化。 由于词向量和位移向量共享同一坐标空间,我们可以将一对概念之间的关系迁移到另一对概念上。例如,用 *king* 减去 *man*,捕捉的是从一个男人到性别中性的君主概念的转变。再在该位移向量上加上 *woman*,重新引入性别,就得到了一个接近 *queen* 的向量。 `king − man + woman ≈ queen` 为了更好地建立对向量运算的直观理解,试试下面交互式可视化中的几个表达式: - `london − english + french` - `puppy − dog + cat` - `running − land + water` - `avg(breakfast, lunch, dinner)` - `0.4 × noodles + 0.6 × pasta` 对于大多数算术运算,结果不会总是像 `king − man + woman` 那样规整。嵌入运算反映的是从语言中学到的统计模式,而非一套固定的符号规则体系。 尽管如此,通过这样的练习来运用向量运算,有助于理解嵌入模型可能在编码哪些知识。 ## 语义相似度 到目前为止,我们已经看到嵌入如何将词语和短语映射到高维语义空间,以及向量运算如何揭示其中的关系。然而,嵌入本身仍然是 1,792 个数字的列表。计算机可以轻松处理这些列表,但对人类来说几乎无法解读。要基于它们做出实际决策,我们需要将两个向量之间的关系归约为一个单一的分数。 线性代数提供了多种比较方法。每种方法考察向量几何的不同方面,并返回一个**标量**——即单个数字。我们可以用这个值来估计**语义相似度**,即两段文本在含义上的关联紧密程度。语义相似度的估计方法包括: - **欧氏距离**测量两点之间的直线距离。距离越小,相似度越高。 - **点积**同时衡量两个向量的方向一致性和大小。方向越一致,分数越高,但较长的向量可能主导结果。 - **余弦相似度**测量两个向量之间的角度,忽略它们的长度。方向相同的向量得分接近 `1`,垂直向量得分为 `0`,方向相反的向量接近 `-1`。 余弦相似度常用于文本检索,因为它比较语义方向,同时归一化掉可能与相关性无关的向量长度差异。数学上表示为: cos(A,B) = A·B / (‖A‖ · ‖B‖) 下面的可视化展示了余弦相似度如何将这种几何关系转化为分数。选择一个参考句子,将其向量与其他示例进行比较。两个句子在含义上越相关,其向量方向越一致,产生的夹角越小,相似度分数越高。 以 *'A bat is flying out of a cave'* 作为参考,*'A flying fox slipped out of the grotto'* 在其余句子中获得了最高的相似度分数 `0.55`。狐蝠是一种蝙蝠,而岩洞与山洞相似。尽管措辞不同,模型仍然识别出了这种关联。 *'His bat went flying from his hands'* 与参考句共享了 *bat* 和 *flying* 两个词,但得分较低,为 `0.48`,因为此时 *bat* 指的是体育器材。当这句话成为参考句时,*'His racket slipped from his grasp'* 得分为 `0.60`。两者都描述了一件体育器材从某人手中滑落,尽管它们使用了不同的名词和动词。 这正是语义相似度的价值所在。它能够连接表达相似想法的不同短语,同时区分同一个词的不同含义。 ## 意义的地图 语义相似度让我们可以一次比较两个向量。当我们对整个词汇表应用同样的比较时,一个更大的结构便浮现出来。含义相关的词语聚集成邻里区域,而不相关的词语则渐行渐远。 下面的地图包含使用 Kanon 2 Embedder 生成的 43,339 个英文单词的嵌入。以模型原始的 1,792 维、全浮点精度存储,仅向量就占用约 **311 MB** 内存。通过将维度缩减至 512 并将每个值量化为 4 位,我们将整张地图集压缩为一个 **12.3 MB** 的文件,可以直接在浏览器中加载。 为了让地图可导航,我们将其 512 维向量投影到 2D。原始的 512 维表示保留在浏览器中,用于更精确的向量运算,而投影仅用于绘制地图。它无法保留所有关系,但更宏观的模式仍然清晰可见:名称、地点、动作、情感和其他相关概念在整个空间中形成了可辨识的区域。 为了测试你对嵌入的理解,我们将这张地图变成了一个受 Wordle 和 GeoGuessr 启发的游戏。每轮随机选取一个词作为目标词。输入单词或向量表达式来放置标记,然后用这些标记围住目标词。步数越少、包围面积越小,得分越高。 要自由探索地图,点击右上角的烧瓶图标以启用**沙盒模式**。 即使在这种压缩形式下,地图仍保留了惊人的细微差别。在投影到 2D 之前,这些词语是基于其高维向量进行聚类的——我们将在后文介绍这一过程。因此,结合一个词的聚类标签来解读其位置,可以揭示仅凭投影无法完全保留的关系。 例如,*butler*(管家)一词属于**姓氏**聚类,但紧邻**人物与社会角色**区域。这两个信号都有道理:*Butler* 是一个姓氏,而管家也是一种职业。 乐队名称中也出现了类似的模式。*Beatles*、*Nirvana* 和 *Interpol* 与各自的乐队关联如此之强,以至于它们的…

相似文章

介绍文本和代码嵌入

OpenAI Blog

OpenAI 推出了新的嵌入 API 端点,可以将文本和代码转换为数值向量表示,用于语义搜索、聚类和分类任务。这些模型在标准基准测试上取得了最先进的效果,包括代码搜索性能相比之下提升了 20%。