Skip to content

向量数据库中,常见的向量搜索方法:余弦相似度、欧几里得距离和曼哈顿距离分别是什么?有什么区别? ​

  • 标签:AI、大模型、RAG、向量数据库

🏛 业务架构师 ​

三种相似度度量我按业务含义讲:

  • 余弦相似度:看两个向量夹角,衡量"方向是否一致",与向量长度无关。文本场景的标准选择——因为 Embedding 的模长常被文本长度等无关因素影响,我们关心的是语义是否同向。取值 -1~1,越大越相似。
  • 欧几里得距离(L2):向量空间直线距离,同时受方向和模长影响。适合关心"绝对量级差异"的场景,比如图像特征、用户行为强度对比。
  • 曼哈顿距离(L1):各维度差值绝对值之和(走街区而不是穿直线)。对异常值更鲁棒,高维空间下与 L2 差异不大,在图像处理和稀疏数据场景仍有使用。

工程事实:文本 RAG 里 95% 的情况用余弦相似度,很多 Embedding 模型训练时就是按余弦对齐的,选别的度量和训练目标不匹配反而效果差。

业务提醒:距离度量不是拍脑袋选的,要和 Embedding 模型的训练方式配套——选型时看模型文档的推荐度量即可。真正影响业务效果的是检索策略和 Rerank,度量方式的差异属于"知道边界就好"的知识,不必过度纠结。

🏗 系统架构师 ​

三种都是向量相似度度量,我从数学定义、几何含义、选型三层讲:

  • 余弦相似度:cos(θ) = A·B / (|A||B|),只看方向夹角,忽略模长。文本嵌入模型通常按"方向即语义"训练(且输出常做归一化),所以是语义检索默认;
  • 欧几里得距离(L2):空间两点的直线距离,方向和模长都敏感。模长携带信息时(图像特征、某些归一化前的向量)更合适;
  • 曼哈顿距离(L1):各维度差绝对值之和(走街区距离)。对异常值比 L2 温和(L2 放大离群维度),在高维语义检索中很少用,更多出现在回归损失、稀疏特征场景。

一个关键事实:向量归一化后(模长=1),余弦相似度与欧氏距离单调等价——排序结果完全一致,选哪个只是实现问题。所以真正的选型取决于 Embedding 模型:看它的训练目标(对比学习多用余弦)和文档建议,训练度量和检索度量必须一致,不匹配会系统性劣化召回。

工程注意:量级上余弦 [-1,1];向量库建索引时必须声明 metric_type,与嵌入模型匹配(多数为 COSINE 或归一化后 IP);改度量 = 重建索引。

💻 全栈开发专家 ​

三种距离/相似度度量,数学定义不同但语义检索里要懂它们的关系:

  • 余弦相似度:看向量夹角,cos = A·B / (|A||B|),衡量方向是否一致,与向量长度无关。文本 Embedding 的标配——语义「像不像」和幅度无关。做过 L2 归一化后,余弦等价于点积,所以很多库直接用内积算。
  • 欧几里得距离(L2):空间中两点的直线距离,方向和幅度都敏感。图像 Embedding、某些聚类场景常用;文本场景下与余弦高度相关(归一化后单调等价),但不归一化时会被向量幅度带偏。
  • 曼哈顿距离(L1):各维度差值绝对值之和(网格距离),对异常值更鲁棒(欧氏平方会放大离群维度),在高维稀疏数据(用户行为向量)里偶尔优于 L2,稠密 Embedding 场景用得少。

工程要点:

  1. 建库时的度量和查询时必须一致(vector_cosine_ops vs vector_l2_ops,索引类型不通用);
  2. 大多数 Embedding 模型(bge、openai)输出默认归一化,此时三者排序结果基本一致,选余弦即可;
  3. 别混用不同度量比较分数大小——余弦 0.8 和欧氏 0.8 完全没有可比性,阈值要按度量分别校准。