拖动查询点并切换度量标准,以观察最近邻如何变化。
测量两点之间的直线距离。同心圆显示等距区域——同一圆上的所有点到查询向量的“距离”均相等。
度量(metric)仅仅是一个函数,它接受两个向量作为输入,并返回一个数值,该数值表示这两个向量有多相似(或多不同)。向量搜索的核心在于“找出与我的查询匹配度量分数最高的 K 个向量”。 其他一切——索引、聚类、图——都只是为了避免对数据库中的每个向量都计算该分数而进行的辅助管理。
您选择的度量标准决定了“相似”在您的数据中的含义。两个嵌入向量在某种度量标准下可能“接近”,而在另一种度量标准下却可能“遥远”——数据相同,结果却不同。这就是为什么必须在构建索引之前就做出这一选择。
试一试:将查询点拖到原点附近,在余弦相似度和 L2 之间切换。观察余弦相似度如何只关注查询向量的方向——位于原点另一侧的点,在 L2 下可能很近,在余弦相似度下却可能很远。这就是这个概念的直观体现。
在Milvus 中,度量标准是通过metric_type 为每个索引单独设置的—— L2, IP,或 COSINE (针对稠密向量)——在创建索引时进行设置。此后针对该集合的每次搜索都会使用您刚才在上面调试过的同一函数。最可靠的规则只有一条:使用您嵌入模型训练时所用的度量,该度量几乎在每个模型卡片上都有列出。
两个有用的快捷方式。大多数现代文本嵌入 API(OpenAI 、Cohere 、Voyage 以及大多数句子转换器)生成的向量旨在用于余弦相似度计算。如果您的向量已归一化为单位长度,则余弦值和内积返回的排名完全相同——因此 IP 对归一化向量的计算是 COSINE的常见替代方案,且计算成本略低。
使用余弦相似度(度量类型COSINE ,详见Milvus )。几乎所有现代文本嵌入模型——包括OpenAI 的 text-embedding-3 系列——都是针对余弦相似度进行训练的。由于OpenAI 中的嵌入向量已被归一化为单位长度,内积(IP )能给出完全相同的排序结果,因此是一个很好的替代方案。
余弦相似度仅衡量两个向量之间的夹角,忽略其长度。内积(点积)既考虑方向对齐又考虑大小,因此指向同一方向且较长的向量得分更高。对于单位归一化向量,这两者在数学上等价。
不。度量标准在构建时已嵌入索引中。若要切换度量标准,需删除索引并使用新的 metric_type 重新构建。不同度量标准下的得分彼此不可比,因此在结果后处理时请勿混用。
速度方面基本相同——L2 、IP 和cosine都只需遍历向量一次。召回率才是关键所在:使用与嵌入模型训练时不同的度量标准进行搜索,会悄无声息地降低结果质量,且降幅往往十分显著。
深入了解:请阅读《相似度度量》文档,了解Milvus 支持的完整度量列表,包括二进制向量的汉明(Hamming)和雅卡德(Jaccard)度量,以及全文搜索的 BM25 度量。