首页/AI/AI 应用速查/相似度度量:cosine / 内积 / L2

相似度度量:cosine / 内积 / L2

向量检索的度量方式必须与模型用法一致:归一化向量上内积等价于余弦;未归一化时三种度量排序会不同。索引算子(如 vector_cosine_ops)选错,检索质量会明显变差。

AI 应用速查AI更新于 2026-10-13

相似度度量是什么

向量检索的相似度度量必须与模型用法配套。余弦相似度看方向不看模长,是文本检索最常用的度量;内积在向量已归一化时与余弦等价,未归一化时会偏向模长大的向量;L2 欧氏距离越小越相似,对模长同样敏感。索引算子(如 cosine 与 L2 两类算子)选错,或在换库迁移时默认值不同,检索质量会静默变化——排序变了却不报错,属于最难发现的一类事故,只能靠固定查询集回归对比。

基本信息

cosine看方向不看长度,文本检索常用
dot内积;向量归一化后等价于余弦
L2欧氏距离,越小越相似,对模长敏感
一致性要求嵌入模型用法、索引算子、查询归一化三者必须配套
迁移风险换库或换索引类型时默认度量不同
验证方式用已知相似对与固定查询集回归对比

典型使用场景

  • 选向量库:决定建索引时用哪种度量与算子
  • 排查质量回退:换了库或升级版本后召回变差
  • 决定是否归一化:与嵌入模型的训练方式对齐
  • 混合检索融合:向量分与关键词分如何归一到同一尺度
  • 评测召回:改动切分或模型后判断是否真的变好

归一化与余弦计算

归一化与余弦计算
import numpy as np
# 两个未归一化的向量
vec_a = np.array([0.2, 0.9, 0.1])
vec_b = np.array([0.1, 0.8, 0.3])
# 余弦相似度:点积除以两个模长
cos = vec_a @ vec_b / (np.linalg.norm(vec_a) * np.linalg.norm(vec_b))
# 归一化之后,内积就等于余弦
a_norm = vec_a / np.linalg.norm(vec_a)
b_norm = vec_b / np.linalg.norm(vec_b)
print(cos, a_norm @ b_norm)   # 两个值应当一致
# 入库与查询两侧都做归一化,才能安全地使用内积算子

三种度量对照

度量排序依据易错点
cosine向量夹角方向换到 L2 后排序改变,需要重新验证
dot方向加模长文本向量通常应先归一化再使用
L2距离远近未归一化时偏向短向量,长文本易被误判
近似索引参数衡量精度与延迟的折中参数调得过激会静默丢召回
切换向量库或重建索引时,逐项核对度量与算子设置,并用固定查询集对比前后排序;只看「服务能返回结果」不足以说明质量未退化。
混合检索融合时,向量分与关键词分不在同一量纲,直接相加会让某一路主导;常用做法是先各自归一化或改用排名融合。

易错点

  • 查询向量未归一化却按内积检索:模长大的向量霸榜,语义相近的短文本排不进来
  • 换库迁移时忽略度量默认值:结果静默变化,质量回退难以归因
  • 余弦与 L2 混用:索引与查询两侧度量不一致时召回显著下降
  • 把相似度分数当绝对相关度:不同模型与语料下分布不同,硬编码阈值容易失效
  • 近似索引参数调得过激:召回被静默截断,表面上只是延迟变低了

数据来源与参考

  • Qdrant 文档(距离度量);余弦相似度定义

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌