更新于 2026年8月10日

余弦距离#


术语解释#

余弦距离(Cosine Distance) 是一种衡量两个向量在方向上差异的度量方式,广泛应用于自然语言处理(如词向量相似度计算)和检索增强生成(RAG)等领域。

余弦距离是基于余弦相似度(Cosine Similarity)人为构建出来的一种距离,如图所示。

余弦相似度示意图
余弦相似度示意图

余弦相似度计算的是两个向量夹角的余弦值,取值范围在 $-1$ 到 $1$ 之间。

$$ \cos(\theta)=\frac{a\cdot b}{\|a\|\|b\|} $$

从直观上看,两个向量越相似,距离应该越近。因此,余弦距离通常表示为 $1$ 减去余弦相似度,即

$$ \text{loss}(a, b) = 1 - \cos(a, b) $$

$\text{loss}(a, b)$ 取值含义:

  • $0$:表示两个向量方向完全一致(夹角为 $0$ 度),距离最近。

  • $1$:表示两个向量正交(夹角为 $90$ 度),没有方向上的相似性。

  • $2$:表示两个向量方向完全相反(夹角为 $180$ 度),距离最远。


出现动机#

  • 语义相似度匹配需求:在 文本聚类、Word2Vec 或 RAG 场景中,我们需要衡量文本之间的语义相关性。余弦距离提供了一种衡量向量空间中方向对齐程度的标准,能够有效解决“表达不同但含义相近”的检索问题。

  • 捕捉向量方向的相似性:在诸如模型蒸馏(如 DistilBERT)的场景中,即使学生模型和教师模型输出的向量数值不完全一致,如果能约束它们在方向上保持一致,也能使学生模型更好地模仿教师模型的表示能力。相关内容可参见「DistilBERT 蒸馏原理与 PyTorch 实现:从 BERT-base 到轻量模型」


优点缺点#

  • 优点:

    • 不受向量长度影响:两个向量即使大小相差很大,只要方向一致,就认为完全相似。这对于文本长度不同、词频不同等场景非常有用。

    • 关注语义对齐:它促使模型学习向量的表示能力,而不仅仅是输出结果的数值。通过最小化余弦嵌入损失(Cosine Embedding Loss),可以使不同模型生成的隐含状态向量在方向上尽可能相似。

    • 适合高维数据:在高维空间中,欧氏距离容易出现"距离趋同"问题,而余弦距离通常仍能较好地区分向量方向,因此广泛应用于高维 Embedding。

    • 易于归一化:许多 Embedding 模型(如Qwen3)都会先进行 L2 归一化,此时余弦相似度就等价于点积,计算更快。相关文章可参见「Qwen3 Embedding 模型介绍」

    • RAG 场景的首选:它是 RAG 场景中最常见的相似度度量选择,能有效处理向量数据库(如 Milvus 或带有 pgvector 插件的 Postgres)中的语义召回任务。

  • 缺点:

    • 忽略模长信息:余弦距离只考量向量间的角度差异,而不考虑向量的绝对大小(模长)。如果向量的长度本身具有业务意义(例如销量、访问量、购买金额等),余弦距离会丢失这部分信息。

    • 不能反映真实空间距离:两个位置相距很远但方向相同的点,余弦距离仍然为 0,因此不适用于需要衡量物理距离或数值误差的场景。


相关术语#

  • 欧式距离
阅读 --

5.2 K近邻原理

在本节内容中,我们首先介绍了K近邻算法的核心原理;然后介绍了K值选取对于K近邻算法的影响;最后介绍了在K近邻中计算各样本间距离时的不同度量方式,即$L_P$距离。

3.5 语义搜索引擎构建

本节围绕语义搜索引擎构建展开,重点介绍读取文档并切块、混合策略切块和向量库及 Embedding 模型初始化等内容。