相似度度量是什么
向量检索的相似度度量必须与模型用法配套。余弦相似度看方向不看模长,是文本检索最常用的度量;内积在向量已归一化时与余弦等价,未归一化时会偏向模长大的向量;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 | 距离远近 | 未归一化时偏向短向量,长文本易被误判 |
| 近似索引参数 | 衡量精度与延迟的折中 | 参数调得过激会静默丢召回 |
切换向量库或重建索引时,逐项核对度量与算子设置,并用固定查询集对比前后排序;只看「服务能返回结果」不足以说明质量未退化。
混合检索融合时,向量分与关键词分不在同一量纲,直接相加会让某一路主导;常用做法是先各自归一化或改用排名融合。