向量数据库

距离度量:欧氏、内积与余弦

入门基础与全景约 20 分钟kp-003

前置知识

一句话定义

距离度量决定"两个向量有多相似"的算法——欧氏距离(L2)量直线远近,内积(IP)量方向共振,余弦相似度(cosine)量纯方向夹角;度量选择与归一化状态共同决定排序结果。

为什么重要

度量是建库时最容易被轻视、又最难事后补救的参数:库建好后再换度量,意味着索引、ground truth、业务阈值全部重做。度量选错的表现很隐蔽——"能返回结果但相关性莫名很差",且调任何索引参数都无济于事。

前置知识

kp-001;向量、内积、平方和的中学代数即可。

核心概念

原理与机制

三个度量的定义与单调性:

L2²(a,b) = Σ(a_i - b_i)²          距离, 越小越相似
IP(a,b)  = Σ a_i·b_i               分数, 越大越相似
cos(a,b) = (a·b)/(‖a‖·‖b‖)        分数, 越大越相似

关键推导——归一化后三者等价。设 a、b 均为单位向量(‖a‖=‖b‖=1):

‖a-b‖² = ‖a‖² - 2a·b + ‖b‖² = 2 - 2·cos(a,b)

即 L2 与余弦严格单调等价(一个增另一个必减),而归一化后 IP = cos。所以对归一化嵌入,用哪种都得到同一排序;工程上选 IP/cosine 是因为可跳过开方、且 SIMD 实现更高效。若不做归一化,L2 会惩罚长向量、IP 会偏爱长向量,排序不再一致。

公式或模型

分数换算(便于业务阈值跨度量迁移):

cos ∈ [-1, 1]            → 相似度
IP    ∈ 无界             → 归一化后等于 cos
L2²   = 2 - 2cos          → 归一化域内与 cos 双射

图示

三维坐标夹角直觉(HTML 原生分数排版演示):

<div class="frac"><span class="num">a·b</span><span class="den">‖a‖·‖b‖</span></div>

余弦即"方向一致性占比":分子是共振量,分母把模长归一掉。

实例或案例

同一对向量 (3,4) 与 (4,3):IP = 24 看似很高,但两者夹角余弦仅 0.96 且都与 (10,10) 的余弦 0.99 接近——不归一化时 IP 排序会被模长主导。OpenAI、BGE 等主流嵌入均建议归一化后使用 cosine/IP;而推荐系统里"用户×物品"打分场景故意不归一化,让 IP 同时表达"匹配度"与"热度"。

直观类比

评价两支球队的相似:L2 是"综合实力差多少",余弦是"打法像不像",IP 是"打法像不像 × 强度乘积"。归一化相当于约定"只看打法"。

常见误区

  1. "余弦和内积永远等价"——仅当双方都归一化时成立,否则 IP 被模长污染。
  2. "库里用 L2、业务里拿 cos 阈值判断"——两个量纲,阈值必然错位;换算用 L2² = 2 - 2cos(归一化域)。
  3. "度量随便选,反正 top-k 大差不差"——度量错了排序系统性错位,调索引参数无法纠正;且改度量需重建索引与 ground truth。

自测题

  1. 已知两单位向量余弦 0.8,求 L2 距离。
  2. 答:L2² = 2 - 2×0.8 = 0.4,L2 = √0.4 ≈ 0.632。

  3. 场景:物品向量模长编码"热度",希望热门且相关的物品靠前,选哪个度量?
  4. 答:内积 IP——它同时奖励方向匹配与模长(热度);此时不应归一化。

  5. 建库时如何确定度量?
  6. 答:以嵌入模型文档标注的度量与归一化要求为准;拿不准时对样本对做三种度量排序对比,并与人工相关性判断对齐。

与其他知识点的关系

kp-004 的 ANN 问题以本篇度量为基础;kp-012 的 PQ 压缩按"查表近似 L2"实现;kp-028 提醒选模型时必须连带确认度量。

延伸阅读

Jégou, Douze, Schmid, "Product Quantization for Nearest Neighbor Search"(IEEE TPAMI 2011)——第 3 节对各度量下量化误差与排序一致性的经典分析。

相关知识点