AI 语义空间探索(三):AI 如何判断两个向量是否相似?
文章摘要
在语义向量比较中,AI通过分析向量方向而非绝对位置或长度来判断语义相似性,这一方法广泛应用于推荐系统、语义搜索等场景。归一化处理消除了向量长度差异,使方向比较成为可能,而余弦相似度通过计算向量夹角余弦值,将方向接近程度转化为可量化指标。该方法基于Embedding模型将文本映射到统一语义空间的特性,将复杂语义关系转化为几何计算问题,为AI理解语义提供了可计算的数学框架。
Qwen3-14B · 2026-07-24

1 AI 如何进行向量之间的比较?

在上一篇文章中(参见:AI 语义空间探索(二):从一个词到一篇文章——语义向量是如何生成的),我们已经知道,无论是一个词、一句话,还是一整篇文章,都可以通过 Embedding 模型转换成语义向量,并进入同一个语义空间。

但向量生成并不是终点,当不同内容都被转换为统一形式的向量之后,一个新的问题随之出现:AI 应该如何判断这些内容在语义上是否接近?

对于人来说,我们可以凭借经验和直觉判断两段内容是否相似;而对于 AI 来说,它需要通过数学方法分析向量之间的特征差异,从而判断它们在语义空间中的接近程度。

这个问题看似只是一个向量比较问题,但实际上,它几乎存在于所有依赖语义理解的 AI 应用中。例如,在我的博客中点击文章界面的“相关文章”推荐时,系统为什么能够根据文章内容推荐相关主题,而不是简单推荐同分类下的文章?为什么语义搜索能够找到与问题含义相关的内容?又为什么 RAG(检索增强生成)能够从大量资料中找到最适合作为参考的文本?

这些能力虽然应用场景不同,但背后都依赖同一个基础过程:将内容转换成向量之后,再通过比较这些向量之间的差异,判断它们是否具有相近的语义表达。那么,应该使用什么方式来比较向量之间的差异呢?

2 比较向量,到底在比较什么?

为了比较向量,我们需要先想清楚一个基础的问题:当我们说“比较两个向量”时,我们到底在比较什么? 为了理解这一点,我们不妨先重新认识一下“向量”本身。

在上一篇文章中,我们已经知道 Embedding 会把一段文字转换成一个语义向量,不过在很多人脑海中的向量仍然只是一个点——仿佛它只是语义空间中的一个坐标。然而,从数学上来说,向量通常会表示为一支从坐标原点出发的箭。它不仅记录了箭尖所在的位置(Position),同时也包含了长度(Length)和方向(Direction)等信息:

image.png

如上图所示:位置表示这支箭在空间中的终点坐标,也就是它落在哪里;长度表示这支箭有多长,也就是它自身的规模;方向则表示这支箭指向哪里。

既然一个向量本身包含这么多信息,那么所谓的“比较两个向量”,自然也就不可能只有一种方法。

例如,如果我们关心的是位置,最直接的方法就是计算它们之间的距离。不过,这里的距离并不是两支箭整体之间的距离,而是两个箭尖(也就是向量终点)在空间中的距离。箭尖越接近,说明两个向量在空间中的位置越接近;箭尖越远,则说明它们相隔越远。这也正是我们在现实世界中最熟悉的一种比较方式。

如果我们关心的是长度,那么比较的就是两个向量自身的规模是否相近。有些向量虽然朝着相同的方向,但长度却可能相差很大;也有些向量长度十分接近,却指向完全不同的方向。

而如果我们关心的是方向,那么关注点又发生了变化。这时,我们更在意的是两支箭是否朝着相近的方向,而不再只是它们的长度或箭尖之间的距离。因此,不同的比较方式,本质上是在选择向量中不同的信息作为判断依据。

回到第一章提出的问题,我们真正想解决的并不是“两个向量在几何空间中是否接近”,而是“两个内容在语义上是否相似”。既然语义已经被映射到了向量空间,那么关键就在于:在这些可以被观察的几何特征中,哪一种关系最能够反映语义上的接近程度?

3 为什么判断语义相似时,AI 往往关注向量方向?

在上一章中,我们已经知道,一个向量并不仅仅代表语义空间中的一个位置点。它同时包含多个可以被观察的信息:箭尖所在的位置、向量自身的长度,以及它所指向的方向。这些信息并没有绝对意义上的高低之分,不同的信息实际上对应着不同的问题。

那么,当我们的目标是判断两个内容是否语义相似时,应该如何理解这些信息各自代表的含义?要回答这个问题,需要先分别观察位置、长度和方向在向量比较中分别能够提供什么信息。


首先来看位置关系。

如果我们的目标是分析大量内容在语义空间中的整体分布,那么向量的位置就具有重要价值。例如,在我的博客中,介绍 Cloudflare Tunnel、Cloudflare Access 和 Cloudflare Zero Trust 的文章,由于它们都围绕 Cloudflare 相关技术展开,因此对应的向量在语义空间中可能形成一个相对集中的区域。而家庭网络架构、数据库优化等主题,则可能分布在不同的位置。

在这种情况下,AI 关注的是“哪些内容在语义空间中聚集在一起”,因此位置关系能够帮助完成主题分类、自动聚类等任务。

不过,当任务变成判断两个内容是否语义相似时,就不能只凭“原始距离更近”这一点就下结论。因为向量空间中的距离是否能准确反映语义关系,还取决于 Embedding 模型在训练时采用了怎样的目标,以及这个任务希望保留哪些信息。

所以,至少在本文讨论的语义相似度场景中,向量之间的原始距离通常并不适合作为主要判断依据。


接下来再看长度。

向量长度有时也会携带模型计算出的某些附加特征。为了便于理解,可以暂时把它看作内容的“整体规模”:两段内容即使讨论同一个主题,也可能因为表达方式、信息范围等差异而具有不同长度。

举例说明,两篇关于 Cloudflare Tunnel 的文章,一篇只简单介绍它是什么、解决什么问题;另一篇不仅介绍基础概念,还进一步解释工作原理、网络流程、配置方法以及实际部署经验。由于表达范围和信息规模存在差异,它们对应向量的长度表示也可能存在一定的差异。

但是,对于语义相似判断来说,内容多少并不是最核心的问题。一篇文章写得更详细,也不代表它与另一篇文章讨论的方向完全不同。因此,长度虽然可能反映某些表达特征,却并不能直接代表语义上的接近程度。


那么,剩下的问题就是:如果我们希望判断两个内容表达的核心含义是否接近,向量中的哪一种信息更符合这个目标?最终的答案是方向。相比位置和长度,方向更接近语义相似判断所关注的问题。因为在 Embedding 形成的语义空间中,向量方向反映的是内容经过模型转换后所呈现出的语义表达趋势。

例如,一篇简短介绍家庭服务器的文章,和一篇详细讨论家庭数据中心架构的文章,虽然包含的信息规模不同,表达范围也不同,但如果它们围绕相近的问题展开,那么它们在语义空间中的方向仍然可能保持接近。

不过,这里又产生了一个新的问题:虽然方向是我们希望比较的信息,但长度依然存在于每一个向量之中。那么,当两个向量长度不同时,这种差异是否会影响方向比较?如果会,AI 又应该如何消除这种影响?

4 为什么需要归一化?归一化如何统一长度?

在上一章中,我们已经知道,对于语义相似判断来说,我们更希望比较的是向量之间的方向关系。但问题在于,方向并不是孤立存在的,每一个向量同时还包含长度信息。因此,在比较方向之前,需要先解决一个问题:如何消除长度差异带来的影响?

要理解这个问题,可以先从一个更直观的比例关系开始。假设我们比较两个人的身体结构:

A 的身高是 180cm,体重是 72kg
B 的身高是 150cm,体重是 60kg

如果只看绝对数值,很容易认为 A 在各个维度上都更大。但如果关注的是“结构是否相似”,那么真正重要的就不再是总量,而是不同维度之间的比例关系。

计算可以发现:

A:72 / 180 = 0.4
B:60 / 150 = 0.4

两者比例完全一致。这说明虽然它们的整体规模不同,但内部结构关系并没有改变,只是处于不同的缩放状态中。

当这个逻辑迁移到向量空间时,也是类似的。例如两个二维向量:

A = (2, 1)
B = (4, 2)

可以看出,B 只是 A 的放大版本。两个向量的分量比例保持一致:

A:2 / 1 = 2
B:4 / 2 = 2

因此,它们虽然长度不同,但表达的方向关系并没有改变。

问题也因此变得明确:如果不同向量只是整体缩放状态不同,那么在比较它们时,就需要先消除这种尺度差异,否则长度因素可能会影响比较结果。

这正是向量归一化(Vector Normalization)所解决的问题。归一化的核心思想很简单:对于任意一个向量,先计算它自身的长度,然后使用这个长度作为缩放基准,对整个向量进行等比例调整,使所有向量最终具有相同的长度(通常统一为 1):

image.png

形式上可以表示为:

v’ = v / |v|

对于二维向量:

(x’, y’) = (x / √(x² + y²), y / √(x² + y²))

这里需要注意,归一化并不是分别调整每一个维度,而是对整个向量进行统一比例缩放。因此,虽然每个维度的具体数值发生了变化,但它们之间的比例关系保持不变。

换句话说,归一化把原本同时包含“方向”和“长度”的向量表示,转换成了一个更加适合方向比较的形式。当所有向量都处于相同长度标准之后,后续就可以进一步通过衡量方向接近程度的方法,判断它们之间的语义相似关系。

5 如何衡量两个向量方向是否接近?

经过归一化处理之后,向量之间的长度差异已经被消除,因此,后续需要解决的问题就只剩下一个:如何衡量两个向量方向是否接近?

如果回到前面的箭头比喻,现在所有箭头的长度都已经相同。因此,在比较两个向量时,真正需要观察的就不再是谁更长,而是它们之间形成的夹角关系。夹角越小,说明两个向量指向越接近;夹角越大,则说明它们表达的方向差异越明显:

image.png

而在数学上,衡量两个向量方向接近程度的一种经典方法,就是计算它们之间夹角的余弦值。这也是余弦相似度(Cosine Similarity)出现的原因。

余弦相似度并不是直接计算两个向量之间相隔多远,而是通过夹角的余弦值,将“方向接近程度”转换成一个可以比较的数值。当两个向量方向完全一致时,它们之间的夹角为 0°,余弦值为 1,表示方向高度一致;当两个向量方向完全相反时,夹角为 180°,余弦值为 -1;而当两个向量彼此垂直时,夹角为 90°,余弦值为 0:

image.png

因此,余弦相似度实际上完成了一次转换:它把原本难以直接衡量的“方向接近程度”,转化成了一个明确的数学指标。

也就是说,当语义被映射到向量空间之后,“两个内容是否相似”这个问题,本质上已经被重新定义成了一个几何问题:两个向量在空间中指向的方向是否接近。而余弦相似度,就是用来回答这个问题的数学工具。

这里有些朋友可能还会产生一个新的疑问:既然我们已经知道要比较的是两个向量之间的夹角,为什么实际计算时使用的是“余弦值”,而不是直接计算角度本身?

原因在于,对于计算机来说,直接处理角度并不是最方便的方式,而余弦值既能够反映两个向量之间的方向关系,又具有计算简单、数值稳定等特点。因此,在向量检索、语义搜索以及大多数 Embedding 应用中,余弦相似度成为了衡量向量相似性的常用方法。


需要注意的是,余弦相似度本身并不是 AI 专有的算法,它只是线性代数中用于描述向量方向关系的一种数学工具。真正让它能够应用于语义理解的关键,在于 Embedding 将文本转换成了向量,而归一化又消除了长度差异,使这个原本属于几何空间的计算方法,可以自然地用于衡量语义之间的接近程度。


6 后话:向量相似性只是语义理解的一种投影

在前面的内容中,我们从“语义如何被表示”一路推导到“向量如何被比较”,最终落到了余弦相似度这种看似简单的计算方式上。到这里,一个完整的链条已经建立起来:文本被转换为向量,向量在空间中拥有位置、长度与方向,而语义相似性,则被转化为对方向接近程度的判断。

但如果只停留在这里,很容易产生一种误解:似乎语义理解本身,就是向量空间中的几何运算。事实上,向量空间只是我们观察和处理语义的一种方式,它更像是对复杂语义关系进行了一次“投影”。

所谓“投影”,可以这样理解:原本复杂的语义现象,被压缩到一个数学空间中,然后通过位置、距离、角度、方向等几何概念,对其中的关系进行近似描述。这个过程在工程上非常有效,但它并不等同于语义本身,而是一种可计算的表达方式。

因此,向量之间的“相似”,本质上只是语义关系在向量空间中的一种数学映射。余弦相似度之所以成为语义比较中最常见的方法,是因为它对应了前面建立起来的一个核心假设:在许多语义相似任务中,我们更关心两个内容表达方向是否接近,而不是它们在空间中的绝对位置或规模差异。

不过,需要注意的是,余弦相似度并不是唯一合理的比较方式。不同任务关注的信息不同:有些场景更关注向量之间的距离,有些场景则希望保留长度携带的信息。因此,具体采用哪种比较方式,仍然取决于模型和任务目标。

回到最初的问题:AI 如何判断两个向量是否相似?现在可以换一个更准确的说法:AI 并不是直接理解了“相似”这个概念,而是在一个经过设计的语义空间中,选择一种合适的数学方式,对内容之间的关系进行近似计算。

因此,向量空间并不是语义本身,而是语义在数学世界中的一种可计算表达。它将原本复杂、难以直接描述的语义关系,映射到一个可以被机器处理的空间中,让 AI 能够通过几何关系去探索和利用这些隐藏的信息。

而这也正是向量语义空间的意义所在:它并没有让机器真正“看见”语义,而是建立了一座连接人类语言与数学计算之间的桥梁。

📚 系列文章:AI 语义空间探索(3 / 3)

📌 内容结构提示:
这篇内容属于「AI 学习地图」的一部分,你可以从这里查看完整内容路径: AI 学习地图
查看相关分类·3个匹配
📎 相关文章
分享这篇文章
博客内容均系原创,转载请注明出处!博客的RSS地址为:https://blog.tangwudi.com/feed,欢迎订阅;如有需要,可以加入Telegram群一起讨论问题。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
       

👋 欢迎来到“无敌的个人博客”

这里主要围绕以下方向展开长期探索:

🧱 个人数字基础设施与博客系统构建
☁️ Cloudflare 与网络架构实践
🧠 AI 与知识系统探索
🛡️ 网络安全与访问优化
🎵 音乐与声音认知
👁️ 认知视角与世界观