余弦相似度
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% 场景。