直接回答:余弦相似度度量两个向量的方向夹角,cos(a,b) = a·b / (|a||b|),取值 [-1,1],对向量模长完全不敏感;欧氏距离度量空间中两点的绝对距离,模长越大距离通常越大。两者并非互斥:当向量都做了 L2 归一化之后,有恒等式 cos = 1 - d²/2,此时按余弦相似度排序与按欧氏距离排序结果完全等价,只是数值表示不同,工程上可以互相换算。
展开解析:选择的依据是"模长是否携带语义"。文本、图像 embedding 的语义主要编码在方向上,模长更多是置信度或词频带来的噪声,因此句向量检索几乎一律用余弦相似度;如果模长本身有业务含义(例如特征代表频次、强度),则应考虑欧氏距离或直接用点积。工程实践中,Faiss、Milvus 等 ANN 库的习惯做法是入库前统一 L2 归一化,然后用内积(Inner Product)索引——归一化后内积就等于余弦,还能与 IVF、HNSW 等量化索引无缝组合,这是向量检索的标准配置。
import numpy as np
def cosine(a, b):
return a @ b / (np.linalg.norm(a) * np.linalg.norm(b))
# 归一化后:内积 == 余弦相似度,可直接进 MIPS 索引
a_n = a / np.linalg.norm(a)
追问方向:为什么 embedding 入库前通常先 L2 归一化?训练对比学习时点积与余弦对温度系数的影响有何不同?HNSW 索引对度量方式有什么要求?(约 510 字)