What are the typical distance metrics used for similarity search in vector databases, and why are they chosen
1️⃣ 考察意图
面试官想考察你对向量数据库底层原理的理解深度,而不仅仅是背诵几个距离公式。这题看似基础,但刁钻点在于:为什么选这个度量,而不是那个? 答好了能展示你从“会用”到“懂为什么这么用”的硬实力——包括对 embedding 模型输出特性、数据分布、索引结构(如 HNSW)与度量兼容性的理解。考察类型是“工程取舍 + 系统设计”,需要你给出具体场景下的选择逻辑,而非罗列定义。
2️⃣ 标准答
向量数据库(如 Milvus、Pinecone、Qdrant)中,相似性搜索的核心是计算向量间的距离或相似度。典型度量有四种,选择取决于 embedding 模型、数据特性和任务需求。
- 余弦相似度(Cosine Similarity)
- 定义:
cos(θ) = (A·B) / (||A|| * ||B||),范围 [-1, 1],越大越相似。 - 为什么常用:对向量长度不敏感,只关注方向。大部分文本 embedding 模型(如 Sentence-BERT、OpenAI
text-embedding-3-small)默认输出未归一化向量,但语义相似度本质是方向匹配(“猫”和“狗”的向量长度可能不同,但方向接近)。 - 工程取舍:余弦距离 = 1 - 余弦相似度,范围 [0, 2]。在 HNSW 索引中,余弦距离与欧氏距离在归一化后等价(见下文),但直接使用余弦距离需要索引支持非欧氏度量,部分库(如 FAISS)内部会先归一化再算欧氏距离。
- 实际坑:如果 embedding 模型已经做了 L2 归一化(如
text-embedding-ada-002),余弦相似度等价于内积,此时直接用内积性能更优(避免多余计算)。 - 欧氏距离(Euclidean Distance / L2)
- 定义:
d = sqrt(Σ(ai - bi)^2),范围 [0, +∞),越小越相似。 - 为什么选:对向量绝对位置敏感,适合特征尺度一致、长度本身有意义的场景。例如图像 embedding(如 ResNet 输出)中,物体大小或亮度差异会体现在向量长度上,用欧氏距离能捕捉这种差异。
- 工程取舍:当向量已 L2 归一化时,欧氏距离与余弦距离单调等价(
d_euclidean^2 = 2 - 2*cos(θ)),此时用欧氏距离计算更快(FAISS 默认优化 L2)。但未归一化时,欧氏距离会被向量长度主导,导致语义相近但长度不同的向量被误判为不相似。 - 实际坑:在 RAG 中,如果文档长度差异大(如短标题 vs 长段落),未归一化的欧氏距离会偏向短向量,导致检索偏差。解法:先对 embedding 做 L2 归一化,再使用欧氏距离。
- 内积(Dot Product / IP)
- 定义:
A·B = Σ(ai * bi),范围 (-∞, +∞),越大越相似。 - 为什么选:常用于未归一化向量,且向量长度携带信息。例如协同过滤中的矩阵分解(如 SVD),用户和物品的 embedding 长度反映偏好强度;或某些推荐模型(如 YouTube DNN)中,内积直接对应点击率预估的 logit。
- 工程取舍:内积对向量长度敏感,长度大的向量天然得分高。如果 embedding 模型输出未归一化且长度分布不均,内积会导致“长向量霸权”。解法:在训练时约束 embedding 长度(如 L2 正则化),或在检索后做长度归一化再排序。
- 实际坑:在 FAISS 中,内积索引(IndexFlatIP)与余弦相似度索引(IndexFlatIP + 归一化)容易混淆。如果模型已归一化,用内积就是余弦相似度;否则需要手动归一化。
- 曼哈顿距离(Manhattan / L1)
- 定义:
d = Σ|ai - bi|,范围 [0, +∞),越小越相似。 - 为什么选:对稀疏向量(如 TF-IDF、词袋)效果好,因为 L1 范数对异常值更鲁棒。在高维稀疏场景中,欧氏距离会因平方项放大噪声,而曼哈顿距离更稳定。
- 工程取舍:在稠密向量(如 DPR)中几乎不用,因为 L1 无法捕捉方向信息,且计算效率低于 L2(无平方根优化)。但在某些生物信息学或基因序列 embedding 中仍有应用。
选择总结:
- 文本语义搜索(RAG):首选余弦相似度(或归一化后的内积/欧氏距离)。
- 图像/多模态:欧氏距离(未归一化时)或余弦(归一化后)。
- 推荐系统:内积(长度有意义时)。
- 稀疏向量:曼哈顿距离。
- 索引兼容性:HNSW 支持所有度量,但 FAISS 对 L2 和 IP 有原生优化;余弦距离通常通过归一化 + L2 实现。
3️⃣ 答题模板(30 秒电梯版)
“这个问题我从三个层面回答:第一,典型度量包括余弦相似度、欧氏距离、内积和曼哈顿距离,各有适用场景。第二,选择关键看 embedding 模型是否归一化、数据分布和任务需求——文本语义搜索首选余弦,图像用欧氏,推荐用内积。第三,工程上要注意索引兼容性和归一化陷阱,比如 FAISS 中余弦距离通常用归一化 + L2 实现。总结一句:没有万能度量,必须根据 embedding 特性和业务目标做实验验证。”
4️⃣ 高频追问 & 应对
追问 1:如果我的 embedding 模型输出已经是 L2 归一化的,用余弦相似度和欧氏距离有区别吗?
没有本质区别。L2 归一化后,余弦相似度 = 内积,欧氏距离平方 = 2 - 2*余弦相似度,三者单调等价。但性能上有差异:FAISS 对 L2 距离有原生优化(如 IndexFlatL2),计算比余弦距离(需额外归一化步骤)快 10-20%。所以实际中,如果模型已归一化,我会直接用欧氏距离或内积,避免冗余计算。注意:如果模型未归一化但你想用余弦,必须在检索前手动做 L2 归一化,否则结果错误。
追问 2:在 RAG 中,为什么余弦相似度比欧氏距离更常用?能举个反例吗?
因为文本 embedding 的向量长度通常与文档长度正相关(长文档的向量范数更大)。用欧氏距离时,一个长文档和一个短文档即使语义相似,也会因长度差异被判定为不相似。例如,查询“苹果公司”与文档“Apple Inc. 是一家科技公司”(长)的欧氏距离可能大于与“苹果”(短)的距离,尽管前者语义更相关。余弦相似度只关注方向,能消除长度干扰。但注意:如果 embedding 模型已经做了长度归一化(如某些 Sentence-BERT 变体),欧氏距离也适用,此时需要实验验证。
追问 3:你提到了 HNSW 索引,它对不同度量有什么影响?
HNSW 本身是图结构,不依赖具体度量,但构建时需指定距离函数。不同度量会影响图的邻居选择策略:余弦距离下,HNSW 倾向于连接方向相近的节点;欧氏距离下,连接绝对位置相近的节点。性能上,HNSW 对 L2 和 IP 有优化(如 FAISS 实现),对余弦距离需要额外归一化步骤,导致构建和搜索速度略慢(约 5-10%)。实际中,如果数据量超过 100 万,建议用归一化 + L2 替代余弦,以利用 FAISS 的底层优化。
5️⃣ 避坑 · 常见错误答法
- ❌ 说“余弦相似度范围是 [0, 1],所以比欧氏距离好” → ✅ 余弦范围是 [-1, 1],且好坏取决于场景,不是范围大小。正确切入:解释余弦对长度不敏感,适合文本语义;欧氏对长度敏感,适合图像。
- ❌ 说“内积和余弦相似度一样,只是没归一化” → ✅ 内积在未归一化时与余弦不等价,且长度影响大。正确切入:内积适合长度有意义的场景(如推荐),余弦适合方向匹配(如文本)。
- ❌ 说“曼哈顿距离在向量数据库中几乎不用” → ✅ 在稠密向量中确实少用,但在稀疏向量(如 TF-IDF)或某些生物信息学场景中有效。正确切入:提及 L1 对异常值鲁棒,但计算效率低于 L2。
6️⃣ 简历呼应
- 如果你有 RAG 项目:从“embedding 模型选择与度量匹配”切入,举例你如何用余弦相似度解决文档长度偏差问题,并对比过欧氏距离的 Recall@10 差异(如余弦高 5%)。强调你做过归一化实验。
- 如果你只做过传统 NLP:用“词向量(Word2Vec)与余弦相似度”类比迁移,说明语义相似度本质是方向匹配。再对比 TF-IDF 稀疏向量场景下曼哈顿距离的适用性,展示跨领域理解。
- 如果你是校招无项目:聚焦论文复现,如“在 Sentence-BERT 论文中,作者用余弦相似度做语义搜索,我复现时发现未归一化向量用欧氏距离会导致 Recall 下降 15%”。展示你对细节的敏感度。
- “Distance Metrics in Vector Search: A Practical Guide” (Weaviate Blog)
- “FAISS: A Library for Efficient Similarity Search” (Facebook AI Research)
- “Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks” (Reimers & Gurevych, 2019)
- “HNSW: Hierarchical Navigable Small World Graphs” (Malkov & Yashunin, 2016)
- “Efficient Estimation of Word Representations in Vector Space” (Mikolov et al., 2013)