人人都会AI编程

相似度计算:余弦相似度、点积、欧氏距离的原理与差异

更新时间:2026-07-12

在 RAG 的检索环节,向量数据库需要一种方法来衡量用户问题与知识库中各个文档片段之间的“相关程度”。这种衡量的核心就是向量相似度计算。目前最常用的三种度量方式是:余弦相似度点积(内积)和欧氏距离。它们的数学原理不同,适用的场景也有差异。理解这些差异,有助于在实际系统中做出合理的选择和调优。

1. 基本原理

假设我们有两个向量 AB,分别代表用户问题和某个文档片段的嵌入表示。三种度量方式分别从不同的角度刻画它们的关系。

余弦相似度(Cosine Similarity)

衡量两个向量在方向上的接近程度,与向量的长度(模长)无关。其值范围在 [-1, 1] 之间,1 表示方向完全相同,0 表示正交(不相关),-1 表示方向完全相反。

计算方式:两个向量的点积除以它们各自模长的乘积。

直观理解:把两个向量看作从原点出发的两个箭头,余弦相似度只看这两个箭头“指向何方”,而不在乎箭头本身的长短。这在文本嵌入中很有用,因为同一主题的文本片段在不同文档中的出现频率可能不同,导致向量长度差异很大,但只要语义方向一致,就应该被判定为相关。

点积(Dot Product)

直接将两个向量对应位置相乘再求和。没有进行模长归一化,因此计算结果会受到向量长度的影响。向量越长(即文本特征越丰富),点积值往往越大。

直观理解:点积既考虑向量的方向,也考虑它们的长度。在某些经过特殊训练的嵌入模型中,向量的长度可以编码“信息丰度”或“重要性”,此时点积比余弦相似度更能体现这种设计意图。

欧氏距离(Euclidean Distance)

衡量两个向量在多维空间中的实际“直线距离”。距离越小表示越相似,距离越大表示差异越大。其值没有固定范围,受向量维度和各维数值大小的影响。

计算方式:两个向量对应位置相减,求平方和再开方。

直观理解:将两个向量看作空间中的两个点,欧氏距离就是连接这两点的线段长度。它同时考虑方向差异和长度差异。如果两个向量的方向相同但长度相差悬殊,欧氏距离就会很大。

2. 在 RAG 检索中的应用差异

在实际的语义检索任务中,这三种方式的行为有明显不同。

  • 余弦相似度 是最常用的默认选择,特别是在使用未针对向量长度做过专门优化的通用嵌入模型(如 OpenAI text-embedding-ada-002 或较早的 Sentence‑BERT 模型)时。因为它忽略了嵌入向量绝对值可能受文本长度或词频影响的噪声,更纯粹地聚焦在语义方向上。实践中,在文档片段长度不均匀的场景下,余弦相似度往往比点积更稳定。
  • 点积 在某些先进嵌入模型(例如经过 Matryoshka Representation Learning 或专门训练的检索模型,如 Cohere embed-v3 或 BGE 系列)中表现出色。这些模型在训练时会有意让向量的模长携带额外的信号(比如段落的信息量、权威度)。此时使用点积能同时利用方向和长度两方面信息,获得比余弦相似度更好的检索精度。但使用点积的前提是“嵌入模型确实被设计为通过长度传递信息”,否则长度的干扰会降低检索质量。
  • 欧氏距离 在文本检索中使用得较少,因为它直接受到向量绝对值的影响。即使两个文本在语义上几乎相同,如果它们对应的向量长度因文本长度差异而不同,欧氏距离就可能将“虽然方向相同、但长度不同”的向量判定为距离较大。这显然不符合语义相似度的需求。不过,欧氏距离在一些将向量归一化到单位球面上的方案中,会与余弦相似度产生等价的排序结果(因为单位向量模长均为 1,欧氏距离和余弦相似度单调相关),此时选择哪一种主要是计算习惯问题。

3. 优缺点对比与选择建议

| 度量方式 | 优点 | 缺点 | 适用场景 |
|----------|------|------|----------|
| 余弦相似度 | 不受向量长度影响,聚焦语义方向;在长文本与短文本混存时鲁棒 | 无法利用长度中可能含有的有效信号 | 大多数通用语义检索场景,尤其是片段长度不均匀时 |
| 点积 | 计算简单,可同时利用方向和长度信息;在部分模型上精度更高 | 对向量长度敏感;若模型未专门优化,可能把长文本误判为相关 | 使用经过点积优化的嵌入模型,且希望利用长度信号时 |
| 欧氏距离 | 几何意义直观;向量归一化后可与余弦相似度等价 | 对长度敏感,在未归一化条件下不适合直接用于语义相似度 | 向量已归一化时的备选方案,或处理非文本向量的特定场合 |

真实的实践建议:

  • 如果你的嵌入模型来自通用 API 且未特别说明,开始试余弦相似度是最稳妥的选择。
  • 如果使用的是以检索准确率为卖点的现代嵌入模型,查阅其官方文档是否推荐点积。一些模型明确提供为点积优化的版本。
  • 无论选择哪种,都可以在项目初期用少量标注数据做个小实验:对比同一查询下三种度量返回的 top‑10 结果,肉眼判断哪个更符合预期,这会比任何理论分析都来得实在。
  • 在向量数据库配置中,这三种度量通常都支持,只需在创建索引时选定即可。