首页/AI/RAG 与向量库速查/余弦相似度(Cosine Similarity)
Embedding 与检索50 条

余弦相似度(Cosine Similarity)

余弦相似度衡量两个向量的方向夹角,取值区间约 [-1, 1],对向量长度不敏感;文本检索常用它,很多向量库以 1 减余弦作为距离或直接返回相似度。

RAG 与向量库速查AI更新于 2026-10-13

余弦相似度是什么

余弦相似度衡量两个向量的方向夹角,取值大致落在负一到一之间,对向量长度不敏感。文本检索普遍用它:向量经过归一化后,余弦相似度等于内积,计算更省。需要注意它只看方向不看内容,话题接近但并不回答问题的片段同样可能拿到高分。

基本信息

取值范围约 -1 到 1,越接近 1 方向越一致
对长度敏感性不敏感,只看向量夹角
与内积的关系向量归一化后两者等价
与距离的关系常见向量库用 一减余弦 作为余弦距离
适用文本语义相似度与向量检索排序

手写余弦相似度

手写余弦相似度
import numpy as np

def cosine(a, b):
    a, b = np.asarray(a), np.asarray(b)
    return float(a @ b / (np.linalg.norm(a) * np.linalg.norm(b)))

print(round(cosine([0.3, 0.4, 0.5], [0.1, 0.9, 0.2]), 4))

使用要点

  • 阈值要在自有数据上校准:文本向量的余弦值常集中在较窄区间,凭直觉定阈值会大面积误判
  • 批量计算用矩阵运算:先把向量归一化再整体做矩阵乘法,比逐对计算快得多
  • 防零向量:分母为零会得到无效值,入参校验不能省
  • 与索引度量保持一致:评测脚本使用的相似度函数必须与线上库的度量相同
  • 分数只反映语义接近,是否真正回答问题上要交给重排与生成约束

与其它度量的关系

度量关注点注意
余弦方向夹角长度不参与,适合文本向量
内积方向与长度归一化后等价于余弦
欧氏距离绝对距离与长度相关,多用于图像等特征
余弦距离一减余弦非负,便于当作损失或排序依据
向量已归一化时,余弦相似度等于内积,可直接用点积实现,省一次除法;这也是不少向量库把内积作为默认度量的原因。
余弦相似度的高分不等于答案正确:同一话题下的相邻段落往往也有高相似度,需要用重排与忠实度约束兜底。

易错点

  • 文本向量的余弦值常集中在较窄区间(如 0.6 至 0.95),拍脑袋把 0.9 当作相关阈值,会导致大量正确答案被判为不相关
  • 余弦只看方向,话题接近但不回答问题的片段同样高分,缺少重排时会污染上下文
  • 评测用余弦、线上库配内积却未做归一化,评测结论与线上行为不一致
  • 没有做零向量与维度校验,脏数据在相似度计算阶段才暴露出来

数据来源与参考

  • scikit-learn 文档(cosine_similarity)
  • Qdrant 官方文档(Distance 度量)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌