向量相似度算法全解:从数学本质到 LLM 工程选型

🗂 分类骨架表

流派 代表算法 数学归属 对模长 典型战场
几何派 欧氏 L2、曼哈顿 L1、切比雪夫 L∞ 空间直线/网格/极值距离 敏感 图像 CV、坐标、聚类
角度派 余弦相似度 夹角余弦 完全脱敏 文本语义、RAG
投影派 内积(Dot / IP) 未归一化的余弦 极度敏感 推荐系统、对比学习
离散派 汉明、Jaccard 比特翻转 / 集合交并 --- 哈希码、生物序列、召回

💡 关键恒等式:向量 L2 归一化后,IP = Cosine(差一个常数偏移)。这是工业界"明明想要余弦却配 IP"的底层依据 。


1️⃣ 余弦相似度(Cosine Similarity)

概览

cos⁡(A,B)=A⋅B∥A∥∥B∥∈−1,1 \cos(A,B)=\frac{A\cdot B}{\|A\|\|B\|}\in-1,1 cos(A,B)=∥A∥∥B∥A⋅B∈−1,1

只保留方向、彻底抹掉模长。文本语义检索的"默认答案",也是 RAG 场景使用率最高的度量 。

推导直觉

两向量在单位超球面上投影的重叠程度。除以模长这一步本质是"把两条不同长度的箭头都压到半径为 1 的球面上再比方向"。几何上等价于球面距离的一种单调变换。

优缺点陷阱

  • ✅ 对向量长度完全不敏感 → 200 字和 2000 字的同一篇文章 embedding 不会因长度被误判
  • ✅ 高维稀疏文本场景最稳
  • 高维"方向陷阱":当所有向量模长趋同(Transformer 输出的常态),余弦区分度会坍缩,且完全丢掉模长里可能藏的"置信度"信息
  • ❌ 比纯 IP 多两次 sqrt + 一次除法,虽可预归一化消掉,但仍略重

工程落地细节

  • 入库前对向量做 L2 归一化,查询时直接用 IP,既保余弦语义又拿 IP 的速度------这是 Milvus / Faiss / Qdrant 工程里的标准手法
  • HNSW 索引下余弦通常要转成"1 - cosine"当距离用
  • 注意:BGE 系列官方不推余弦,推 IP------用错 L2 召回率能从 78% 砸到 40%

使用率

工业 RAG 场景约 65-70% 的默认选择(尤其 OpenAI / M3E / Moka 这类模型配套文档里写明"推荐余弦"的)。

使用场景

  • 文本语义检索 / RAG:新闻相似度、智能客服意图匹配、论文查重
  • 主题分类、文本聚类
  • 多语言语义对齐(Sentence-BERT 产出归一化向量时,余弦 = IP,随便挑)
  • ⚠️ 不适合:推荐系统里模长本身编码了"热度/置信度"的场景(这时该用 IP)

结合 ML 框架 / 大模型 / 向量库的延伸

  • PyTorchtorch.nn.functional.cosine_similarity,但生产里更多人手动 F.normalize + matmul 走 IP 路径
  • Sentence-BERT / all-MiniLM / text-embedding-ada-002:默认输出接近归一化,余弦 ≈ IP
  • OpenAI text-embedding-3 系列:Azure 官方文档明确"选余弦"
  • BGE / BGE-M3 :官方文档推 IP 而非余弦(训练目标是内积导向的对比学习)

热门向量库采用比例 & 推荐指数

向量库 支持情况 推荐指数
Milvus 原生支持 Cos/IP/L2/Hamming/Jaccard ⭐⭐⭐⭐⭐(文本场景首选 Cos)
Pinecone Cos / L2 ⭐⭐⭐⭐⭐(默认 Cos)
Weaviate Cos 为默认,Dot / L2 可选 ⭐⭐⭐⭐⭐
Qdrant Cos / Dot / L2 ⭐⭐⭐⭐⭐
Faiss 无原生 Cos,靠 normalize + IP 模拟 ⭐⭐⭐⭐(间接支持)
Chroma Cos / L2 ⭐⭐⭐⭐

2️⃣ 内积 / 点积(Dot Product / Inner Product)

概览

A⋅B=∑iaibi A\cdot B=\sum_i a_i b_i A⋅B=i∑aibi

余弦去掉分母的版本。归一化后 = Cosine × 1(常数),所以"文本场景想用余弦又想快"的工业解法就是:入库归一化 + 查 IP。

推导直觉

投影长度之积。几何解释:A 在 B 方向上的投影 × B 的模。同时吃"方向一致性"和"模长大小"两份信息。

优缺点陷阱

  • 计算最快:纯乘加,无 sqrt 无除法,SIMD / GPU 吃满
  • ✅ 保留模长 → 推荐系统里"热门物品模长更大"这种信号能进排序
  • 未归一化时会被长向量霸榜------高频词/长文档容易被误判为"更相关"
  • ❌ 对比学习训练的模型若没显式用模长编码信息,IP 反而引入噪声

工程落地细节

  • 归一化后 IP = Cosine 是 Faiss 的官方推荐路径:index = faiss.IndexFlatIP() + 入库前 faiss.normalize_L2()
  • 分布式场景下 IP 可切分到多卡多节点做 partial sum,比 Cos 的同步归一化友好
  • HNSW 支持 IP 的库(Milvus/Qdrant)在建图时会按 IP 单调性排边

使用率

RAG 文本场景约 20-25%(主要是 BGE / M3E 用户 + Faiss 用户),推荐系统 >50%。

使用场景

  • 推荐系统:双塔召回,"用户向量 × 物品向量",模长编码点击置信度
  • BGE / BGE-M3 / M3E 配套检索:官方明确推 IP,换 Cos 或 L2 都掉召回
  • Faiss 系工程(科研/离线批检索):IP + 归一化 = 事实标准
  • 对比学习训练的 embedding(ColBERT 式 late interaction 也常用 IP 变体)
  • ⚠️ 不适合:未归一化 + 文本长度方差大的场景(用 Cos)

结合 ML 框架 / 大模型 / 向量库的延伸

  • ColBERT / BGE-M3:late interaction 的 token-level 相似度就是 IP 累积
  • Faiss (Meta)IndexFlatIP / IndexIVFFlat + IP,IndexHNSWFlat 也支持 IP ------ GPU Faiss 对 IP 的 kernel 优化最成熟
  • Milvus "IP" metric:背后就是走内积,配合 HNSW / DiskANN
  • RedisVL:低延迟实时推荐常选 IP

热门向量库采用比例 & 推荐指数

向量库 支持 推荐指数
Milvus IP 原生 ⭐⭐⭐⭐⭐(BGE 用户首选)
Qdrant Dot 原生 ⭐⭐⭐⭐⭐
Pinecone 支持(称 Dot) ⭐⭐⭐⭐(主推还是 Cos)
Weaviate Dot 可选 ⭐⭐⭐⭐
Faiss IP 是一等公民 ⭐⭐⭐⭐⭐
Chroma 不支持 Dot,仅 Cos/L2 ⭐⭐(需换库)

3️⃣ 欧氏距离 L2

概览

d(A,B)=∑i(ai−bi)2 d(A,B)=\sqrt{\sum_i(a_i-b_i)^2} d(A,B)=i∑(ai−bi)2

几何"直线距离"。对绝对数值差异敏感。

推导直觉

勾股定理的高维推广。两点的"物理间隔"。

优缺点陷阱

  • ✅ 图像像素级 / 特征点匹配最直觉
  • ✅ CV 特征(ResNet 最后一层 bottleneck)常配 L2
  • 高维空间距离趋同(维度灾难)------ 1000 维以上几乎所有点两两 L2 都挤在一起
  • ❌ 含 sqrt,比 IP 慢;且"同一篇文档长短不同"会被 L2 误判为远

工程落地细节

  • HNSW 里 L2 是仅次于 IP 的第二常见距离
  • IVF-PQ 量化场景下 L2 有解析的码本优化(Faiss 的 IndexIVFPQ 默认 L2)
  • 注意:BGE 用户配 L2 是经典踩坑,召回率直接腰斩

使用率

RAG 文本场景 <5%,CV / 多模态 / CLIP 图像侧 ≈ 60%

使用场景

  • 人脸特征匹配(ArcFace 类 512-D)
  • 医学影像病灶对比、工业检测尺寸差异
  • CLIP 图像侧检索、商品图搜(颜色+形状绝对差异)
  • 地理坐标 / 物理传感器数据
  • ❌ 不建议:文本语义 RAG(除非模型明确用 L2 训的)

结合 ML 框架 / 大模型 / 向量库的延伸

  • CLIP:图文双塔,图像侧常 L2、文本侧常 Cos,跨模态检索时两塔度量可能不一致,需要桥接
  • FaissIndexFlatL2 是默认;GPU Faiss L2 kernel 极成熟
  • Milvus / Pinecone / Qdrant / Weaviate 全部把 L2 当一等公民

热门向量库采用比例 & 推荐指数

向量库 支持 推荐指数
Milvus L2 原生 ⭐⭐⭐⭐⭐(CV 场景)
Pinecone L2 原生 ⭐⭐⭐⭐⭐(图像检索默认)
Weaviate L2 可选 ⭐⭐⭐⭐
Qdrant L2 原生 ⭐⭐⭐⭐⭐
Faiss L2 是默认 ⭐⭐⭐⭐⭐
Chroma L2 原生 ⭐⭐⭐⭐

4️⃣ 曼哈顿距离 L1

概览

d(A,B)=∑i∣ai−bi∣ d(A,B)=\sum_i|a_i-b_i| d(A,B)=i∑∣ai−bi∣

网格世界"步数计",对异常值比 L2 鲁棒(平方效应没了)。

推导直觉

每个维度独立走绝对值之和。L2 把大偏差平方放大,L1 线性惩罚 → 异常点权重更低。

优缺点陷阱

  • ✅ 异常值鲁棒 → 稀疏高噪数据友好
  • ✅ 无 sqrt,比 L2 便宜
  • ❌ 高维语义场景几乎没人用(方向信息丢太多)
  • ❌ 多数向量库对 L1 的 HNSW 支持弱(单调性不满足三角不等式严格优化)

使用率

< 3%, niche。

使用场景

  • 推荐系统用户行为序列匹配(点击/曝光数稀疏、长尾噪点多)
  • 基因序列比对、交通网格路径规划
  • 异常检测前置距离

热门向量库采用比例 & 推荐指数

向量库 支持 推荐指数
Milvus 不直接暴露 L1(需自定义) ⭐⭐
Faiss 无原生 L1
Weaviate / Qdrant / Pinecone 未列为主度量 ⭐⭐

📌 L1 在主流向量检索里属于"有更好算法也不用它"的状态,除非你的特征是天然 L1 语义(如城市街区坐标)。


5️⃣ 切比雪夫距离 L∞

概览

d(A,B)=max⁡i∣ai−bi∣ d(A,B)=\max_i|a_i-b_i| d(A,B)=imax∣ai−bi∣

只看"最差的那个维度"。

推导直觉

棋盘上王的走法------各维度独立移动,总代价由最长那步决定。

使用场景

  • 基因序列物流仓储格子坐标
  • 资源调度:瓶颈维度决定整体代价
  • 向量检索主流通用库基本不把它当检索度量,属于专用场景

推荐指数

通用向量库 ⭐,专用生物/运筹系统才碰。


6️⃣ 汉明距离(Hamming)

概览

d(A,B)=∑i1(ai≠bi) d(A,B)=\sum_i \mathbb{1}(a_i\neq b_i) d(A,B)=i∑1(ai=bi)

二值 / 哈希码场景专用,数"有多少位不一样"。

推导直觉

比特级翻转计数。

使用场景

  • 二值哈希码检索(SimHash / FarmHash 类召回)
  • 生物序列比对(DNA k-mer 二值化)
  • 本地敏感哈希(LSH) 的桶路由

热门向量库

  • Milvus:原生 Hamming metric,配二进制向量类型
  • Faiss :binary index 系列(IndexBinaryFlat / IndexBinaryIVF)走汉明
  • 其余库(Pinecone/Weaviate/Chroma)基本不支持二值,需自己卷

推荐指数

二值场景 Milvus/Faiss ⭐⭐⭐⭐⭐,通用场景 ⭐。


7️⃣ Jaccard 相似度

概览

J(A,B)=∣A∩B∣∣A∪B∣ J(A,B)=\frac{|A\cap B|}{|A\cup B|} J(A,B)=∣A∪B∣∣A∩B∣

集合交并比,不是真"向量"度量,是稀疏布尔 / ID 集合的。

使用场景

  • 召回层粗排:用户点击 item set vs 候选 item set
  • 去重 / Near-duplicate detection
  • 多标签分类相似度

热门向量库

  • Milvus:原生 Jaccard metric
  • Weaviate:BM25 + 向量混合检索里 Jaccard 思想渗透
  • Elasticsearchcardinality + set 操作更常用,不是纯 Jaccard 接口

推荐指数

Milvus ⭐⭐⭐⭐,其余 ⭐⭐。


📊 全维度横向对比

算法 数学本质 模长敏感度 计算复杂度 推导直觉 优点 缺点 / 陷阱 使用率(工业RAG估) 使用场景 热门库推荐指数
余弦 夹角 cos 完全脱敏 中(可预归一化→IP) 单位球面方向重叠 文本通用、长度无关 丢模长置信度;高维方向坍缩 ~65-70% 文本语义/RAG/主题聚类(OpenAI系) Milvus⭐⭐⭐⭐⭐ Pinecone⭐⭐⭐⭐⭐ Weaviate⭐⭐⭐⭐⭐ Qdrant⭐⭐⭐⭐⭐ Faiss⭐⭐⭐⭐ Chroma⭐⭐⭐⭐
内积IP 投影积 极度敏感 最低(纯乘加) 方向×模长 最快;保留置信度;Faiss一等公民 未归一化被长向量霸榜 ~20-25%(文本)+ 推荐>50% 推荐召回/BGE系/ColBERT/Faiss Milvus⭐⭐⭐⭐⭐ Qdrant⭐⭐⭐⭐⭐ Faiss⭐⭐⭐⭐⭐ Pinecone⭐⭐⭐⭐
欧氏L2 直线距离 敏感 中(含sqrt) 勾股高维推广 CV直觉;Faiss默认 高维趋同;文本长短误判 <5%(文本)CV~60% 人脸/影像/CLIP图侧/坐标 全部⭐⭐⭐⭐⭐(CV场景)
曼哈顿L1 绝对偏差和 敏感(鲁棒) 低(无sqrt) 网格步数和 抗异常值;稀疏友好 高维语义不用;HNSW支持弱 ❤️% 基因/行为序列/运筹 主流库⭐⭐
切比雪夫L∞ 最大维偏差 敏感 棋盘王步 瓶颈维度主导 极少用于向量检索 <1% 基因/仓储格点 主流库⭐
汉明 比特翻转数 --- 极低(popcount) 位级差异 二值哈希最快 仅二值/哈希码 niche SimHash/LSH/生物序列 Milvus⭐⭐⭐⭐⭐ Faiss(binary)⭐⭐⭐⭐⭐
Jaccard 集合交并 --- 重叠占比 稀疏集合语义清 非真向量;需转bool niche 召回粗排/去重 Milvus⭐⭐⭐⭐

注:使用率为行业观感估数(RAG 文本检索口径),非精确统计;推荐指数 ⭐ 数为"该库在此算法上的成熟度 + 官方推荐力度"综合。


🔚 汇总洞察(架构师级三条)

1. 归一化后 IP = Cosine,工程选型的核心恒等式

绝大多数 Transformer embedding(Sentence-BERT / MiniLM / OpenAI ada)输出已接近单位球面,入库前 L2-normalize + 查 IP 是 Faiss / Milvus / Qdrant 的通用最优解------既拿了余弦的语义,又拿了 IP 的 SIMD 速度 。

2. 模长是否携带"置信度",决定 Cosine vs IP

  • 训练目标是对比学习且模长显式编码热度/置信 (BGE / 双塔推荐)→ IP,用 Cosine 会把模长信息洗掉,召回掉点
  • 训练目标就是方向对齐 (OpenAI text-embedding-3 官方说余弦、Sentence-BERT 默认余弦)→ Cosine / 归一化IP 都可

3. Embedding 模型训练目标 = 度量选择的唯一真理

"Embedding 模型用什么训练目标,你就用什么度量。" ------ BGE 配 L2 召回率 40%→78% 的反例是所有 RAG 工程师的第一课。

选型口诀:文本不确定 → Cosine;BGE/M3E → IP;推荐/对比学习 → IP;图像/CV → L2;二值哈希 → 汉明;集合召回 → Jaccard。向量库层面 Milvus / Qdrant 是全度量覆盖的"安全牌",Pinecone 偏 Cos 舒适区,Faiss 是 IP+L2 的性能王但无 DB 能力,Chroma 轻量 prototyping 够用。

相关推荐
阿宇的技术日志13 小时前
漏桶、令牌桶、滑动窗口 三限流算法理解
算法·滑动窗口·漏桶·令牌桶
来一碗刘肉面13 小时前
队列的链式实现
数据结构·c++·算法·链表
KaMeidebaby13 小时前
卡梅德生物技术快报|原核膜蛋白表达优化实操手册,膜蛋白的纯化梯度洗脱完整流程
前端·网络·数据库·人工智能·算法
naturerun13 小时前
逐步插入回路法构造欧拉回路的算法
c++·算法
qizayaoshuap13 小时前
# [特殊字符] 骰子模拟器 — 鸿蒙ArkTS随机算法与动画系统设计
算法·华为·harmonyos
山顶夕景13 小时前
【DWT】计算两不等序列相似度:DWT
算法·动态规划·检索·模式识别·相似度
奶人五毛拉人一块14 小时前
二分算法以及习题讲解
数据结构·算法·二分
兰令水15 小时前
hot100【acm版】【2026.7.19打卡-java版本】
java·数据结构·算法·leetcode·面试
Zachery Pole15 小时前
CCF-CSP备战NO.6【栈】
算法·深度优先
LJHclasstore_luo15 小时前
【C++题解】112354.平行时空
数据结构·c++·算法