余弦相似度

Cosine Similarity

余弦相似度(Cosine Similarity)是通过计算两个向量夹角的余弦值来衡量它们相似程度的指标,取值范围 [-1, 1],是 Embedding 检索的核心度量。

详细解释

余弦相似度(Cosine Similarity)是 NLP、信息检索、推荐系统里最常用的相似度度量。给定两个 n 维向量 A 和 B:

CosineSimilarity(A, B) = (A · B) / (||A|| × ||B||)
                       = Σ(Aᵢ × Bᵢ) / [√Σ(Aᵢ²) × √Σ(Bᵢ²)]

它衡量的是「方向上的相似」,而非「绝对距离上的相似」。因此对于 Embedding 这种高维语义向量,Cosine Similarity 比欧氏距离更鲁棒。

数值解读

取值含义
1.0完全相同方向,语义一致
0.7 - 0.9高度相关(同主题不同表述)
0.3 - 0.6中等相关
0.0完全无关
-1.0完全相反

RAG 中的应用

在 RAG 检索流程中:

import numpy as np
from openai import OpenAI

client = OpenAI(api_key="KEY", base_url="https://api.weimeta.cn/v1")

def embed(text):
    return client.embeddings.create(
        model="text-embedding-3-large",
        input=text
    ).data[0].embedding

q = embed("如何接入唯元智创")
d = embed("唯元智创 OpenAI 兼容 API 接入文档")

similarity = np.dot(q, d) / (np.linalg.norm(q) * np.linalg.norm(d))
print(f"余弦相似度:{similarity:.3f}")

阈值经验值:

  • ≥ 0.75:高度相关,召回
  • 0.5 - 0.75:参考相关
  • < 0.5:剔除

常见问题

为什么用余弦相似度而不是欧氏距离?
Embedding 向量长度通常与文本长度正相关。欧氏距离会被「文本长度」干扰,而余弦相似度只关心方向,更适合语义匹配。
有比 Cosine 更先进的相似度吗?
可以试试 Dot Product(更快)、Euclidean + L2 归一化,或用 ColBERT 那种 Late Interaction 模型做 token 级匹配。唯元智创的向量检索默认 Cosine 即可覆盖 95% 场景。