← 返回

向量相似度度量:L2 、余弦及内积

拖动查询点并切换度量标准,以观察最近邻如何变化。

Top-5 最近邻(数值越低,越接近)

#1P1842.1
#2P1074.0
#3P17111.6
#4P14122.8
#5P13126.9
相似度度量
L2
显示值
欧几里得距离

L2 (欧几里得距离)

测量两点之间的直线距离。同心圆显示等距区域——同一圆上的所有点到查询向量的“距离”均相等。

什么是度量?

度量(metric)仅仅是一个函数,它接受两个向量作为输入,并返回一个数值,该数值表示这两个向量有多相似(或多不同)。向量搜索的核心在于“找出与我的查询匹配度量分数最高的 K 个向量”。 其他一切——索引、聚类、图——都只是为了避免对数据库中的每个向量都计算该分数而进行的辅助管理。

您选择的度量标准决定了“相似”在您的数据中的含义。两个嵌入向量在某种度量标准下可能“接近”,而在另一种度量标准下却可能“遥远”——数据相同,结果却不同。这就是为什么必须在构建索引之前就做出这一选择。

三种常用的相似度度量

  • L2 (欧几里得):直线距离。数值越低越好。当方向和大小都重要时使用——例如图像嵌入、地理坐标、原始传感器读数。这是大多数计算机视觉模型的默认设置。
  • 余弦值:向量之间的夹角,不考虑长度。数值越高越好。仅当方向重要时使用——例如文本嵌入(BERT 、OpenAI 等),以及向量“流行度”不应占据主导地位的推荐系统。
  • 内积(IP ):点积,同时考虑向量对齐度和模长。数值越高越好。应与明确针对IP (DPR ,许多检索模型)进行归一化的模型配合使用。当向量长度为单位长度时,其数学意义与余弦值完全相同。

两条实用规则

  • 将度量标准与模型相匹配。嵌入模型是在特定度量标准下训练的。在搜索时使用不同的度量标准会悄无声息地破坏你的召回率。选择前请检查模型卡片。
  • 保持一致性。集合中的所有向量必须使用相同的度量标准。不得在单个索引中混合使用不同度量标准,且无法对不同度量标准下的评分进行有意义的比较。

试一试:将查询点拖到原点附近,在余弦相似度和 L2 之间切换。观察余弦相似度如何只关注查询向量的方向——位于原点另一侧的点,在 L2 下可能很近,在余弦相似度下却可能很远。这就是这个概念的直观体现。

在Milvus

在Milvus 中,度量标准是通过metric_type 为每个索引单独设置的—— L2, IP,或 COSINE (针对稠密向量)——在创建索引时进行设置。此后针对该集合的每次搜索都会使用您刚才在上面调试过的同一函数。最可靠的规则只有一条:使用您嵌入模型训练时所用的度量,该度量几乎在每个模型卡片上都有列出。

两个有用的快捷方式。大多数现代文本嵌入 API(OpenAI 、Cohere 、Voyage 以及大多数句子转换器)生成的向量旨在用于余弦相似度计算。如果您的向量已归一化为单位长度,则余弦值和内积返回的排名完全相同——因此 IP 对归一化向量的计算是 COSINE的常见替代方案,且计算成本略低。

常见问题

对于OpenAI 或其他文本嵌入,我应该使用哪种相似度度量?

使用余弦相似度(度量类型COSINE ,详见Milvus )。几乎所有现代文本嵌入模型——包括OpenAI 的 text-embedding-3 系列——都是针对余弦相似度进行训练的。由于OpenAI 中的嵌入向量已被归一化为单位长度,内积(IP )能给出完全相同的排序结果,因此是一个很好的替代方案。

余弦相似度与内积有什么区别?

余弦相似度仅衡量两个向量之间的夹角,忽略其长度。内积(点积)既考虑方向对齐又考虑大小,因此指向同一方向且较长的向量得分更高。对于单位归一化向量,这两者在数学上等价。

在Milvus 中构建索引后,我可以更改度量单位类型吗?

不。度量标准在构建时已嵌入索引中。若要切换度量标准,需删除索引并使用新的 metric_type 重新构建。不同度量标准下的得分彼此不可比,因此在结果后处理时请勿混用。

度量标准的选择会影响召回率或搜索速度吗?

速度方面基本相同——L2 、IP 和cosine都只需遍历向量一次。召回率才是关键所在:使用与嵌入模型训练时不同的度量标准进行搜索,会悄无声息地降低结果质量,且降幅往往十分显著。

深入了解:请阅读《相似度度量》文档,了解Milvus 支持的完整度量列表,包括二进制向量的汉明(Hamming)和雅卡德(Jaccard)度量,以及全文搜索的 BM25 度量。

继续探索