Interview: 向量检索用余弦相似度和内积有什么本质区别?什么时候用哪个?


题目解析

余弦相似度和内积(dot product)是向量检索中最常用的两种度量方式。表面上看,对归一化向量两者等价,但在实际应用中它们有本质区别。理解这个区别对于选择正确的embedding模型和检索策略至关重要。

解答思路

数学本质:cos(a,b)=a·b/( a × b ),而内积=a·b= a × b ×cos(a,b)。区别在于内积包含了向量模长的信息。余弦相似度只关注方向,忽略模长;内积同时考虑方向和模长。关键洞察:embedding模型输出的向量模长不是随机的——它编码了”重要性”或”相关性强度”信息。例如,一个文档如果包含丰富的信息,其embedding的模长通常更大。使用余弦相似度会丢失这个信号。

关键要点

  1. 归一化后的向量:余弦相似度=内积,此时选择哪个无影响
  2. 未归一化的向量:内积可以利用模长信息做隐式的”质量加权”
  3. 多数embedding模型(如OpenAI text-embedding-3)默认输出归一化向量,此时两者等价
  4. MaxSim(ColBERT使用的token级别匹配)本质是多向量内积的聚合
  5. MIPS(最大内积搜索)可以通过增加一个维度转化为余弦相似度搜索

加分回答

可以讨论为什么Milvus等向量数据库支持L2距离(欧氏距离)以及何时使用:L2适合需要”绝对距离”语义的场景(如推荐系统中的用户偏好漂移检测)。还可以分析为什么负采样训练的对比学习模型倾向于产生归一化向量(因为InfoNCE loss中有温度缩放),而某些生成式embedding模型产生的向量模长更有意义。

常见踩坑

  1. 不检查embedding模型输出是否已归一化,导致检索结果偏差
  2. 在FAISS中选择了错误的Index类型——IndexFlatIP用于内积,IndexFlatL2用于欧氏距离
  3. 混淆了”相似度”和”距离”——余弦相似度越大越相似,L2距离越小越相似