🗂 分类骨架表
| 流派 | 代表算法 | 数学归属 | 对模长 | 典型战场 |
|---|---|---|---|---|
| 几何派 | 欧氏 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 框架 / 大模型 / 向量库的延伸
- PyTorch :
torch.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,跨模态检索时两塔度量可能不一致,需要桥接
- Faiss :
IndexFlatL2是默认;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)=maxi∣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 思想渗透
- Elasticsearch :
cardinality+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 够用。