向量数据库原理与检索算法入门:ANN、HNSW、LSH、PQ 与相似度计算

向量数据库原理与检索算法入门:ANN、HNSW、LSH、PQ 与相似度计算 -- pd的后端笔记

文章目录

    • [向量数据库原理与检索算法入门:ANN、HNSW、LSH、PQ 与相似度计算 -- pd的后端笔记](#向量数据库原理与检索算法入门:ANN、HNSW、LSH、PQ 与相似度计算 -- pd的后端笔记)
  • 向量数据库原理与检索算法入门
    • [🎯 一、先说结论:向量数据库本质上在解决什么问题?](#🎯 一、先说结论:向量数据库本质上在解决什么问题?)
    • [🚀 二、向量数据库的原理是什么?](#🚀 二、向量数据库的原理是什么?)
      • [1. 什么是"向量"?](#1. 什么是“向量”?)
      • [2. 向量数据库如何工作?](#2. 向量数据库如何工作?)
      • [3. 为什么它和传统数据库不一样?](#3. 为什么它和传统数据库不一样?)
      • [4. 一个直观流程图](#4. 一个直观流程图)
    • [🧠 三、ANN 是什么?为什么需要它?](#🧠 三、ANN 是什么?为什么需要它?)
      • [1. ANN 是什么?](#1. ANN 是什么?)
      • [2. 为什么不能总是用精确搜索?](#2. 为什么不能总是用精确搜索?)
      • [3. ANN 的核心价值](#3. ANN 的核心价值)
      • [4. ANN 的核心思想](#4. ANN 的核心思想)
    • [🔧 四、HNSW、LSH、PQ 分别是什么意思?](#🔧 四、HNSW、LSH、PQ 分别是什么意思?)
    • [📊 五、HNSW、LSH、PQ 到底有什么区别?](#📊 五、HNSW、LSH、PQ 到底有什么区别?)
    • [📐 六、余弦相似度、欧几里得距离、曼哈顿距离分别是什么?](#📐 六、余弦相似度、欧几里得距离、曼哈顿距离分别是什么?)
      • [1. 余弦相似度(Cosine Similarity)](#1. 余弦相似度(Cosine Similarity))
      • [2. 欧几里得距离(Euclidean Distance)](#2. 欧几里得距离(Euclidean Distance))
      • [3. 曼哈顿距离(Manhattan Distance)](#3. 曼哈顿距离(Manhattan Distance))
    • [⚖️ 七、这三种相似度 / 距离方法有什么区别?](#⚖️ 七、这三种相似度 / 距离方法有什么区别?)
      • [1. 核心区别总结](#1. 核心区别总结)
      • [2. 一个更实用的理解](#2. 一个更实用的理解)
      • [3. 实战中怎么选?](#3. 实战中怎么选?)
    • [🔄 八、向量数据库的工作流程有哪些?](#🔄 八、向量数据库的工作流程有哪些?)
      • [1. 写入流程](#1. 写入流程)
      • [2. 查询流程](#2. 查询流程)
      • [3. 一个完整流程图](#3. 一个完整流程图)
      • [4. 这套流程里最关键的几个性能点](#4. 这套流程里最关键的几个性能点)
    • [⚠️ 九、向量数据库最容易踩坑的地方](#⚠️ 九、向量数据库最容易踩坑的地方)
      • [1. 只关注索引,不关注 Embedding 模型](#1. 只关注索引,不关注 Embedding 模型)
      • [2. 只追求速度,不关注召回率](#2. 只追求速度,不关注召回率)
      • [3. 忽略元数据过滤的成本](#3. 忽略元数据过滤的成本)
      • [4. 不理解不同距离函数的适用前提](#4. 不理解不同距离函数的适用前提)
    • [✅ 十、面试或工作中怎么把这题答清楚?](#✅ 十、面试或工作中怎么把这题答清楚?)
    • [📋 十一、速查表](#📋 十一、速查表)
      • [1. 核心概念速查](#1. 核心概念速查)
      • [2. 距离函数速查](#2. 距离函数速查)
    • [✅ 总结](#✅ 总结)

向量数据库原理与检索算法入门

很多同学刚接触 RAG、推荐系统、图像检索、多模态检索时,都会遇到一连串高频问题:

  • 向量数据库到底在存什么?
  • HNSW、LSH、PQ 这些缩写到底是什么意思?
  • 为什么大家都在讲 ANN,而不是直接"精确搜索"?
  • 余弦相似度、欧几里得距离、曼哈顿距离有什么区别?
  • 一次完整的向量检索请求,到底经历了哪些步骤?

如果只停留在"向量数据库就是拿来做相似搜索"的定义层面,其实很难真正理解它为什么在 AI 系统里这么重要。

下面我们就从"为什么会需要它"开始,一步步把向量数据库的核心原理讲清楚。


🎯 一、先说结论:向量数据库本质上在解决什么问题?

一句话概括:

向量数据库的核心任务,是在海量高维向量中,快速找出"最相似"的那几个向量。

这背后真正考察的是两个问题:

  1. 怎么表示相似性:把文本、图片、音频等对象转换成向量。
  2. 怎么高效查找相似对象:在上百万、上千万甚至上亿向量中快速检索。

比如:

  • RAG 场景:把文档切块后转成向量,用户问题也转成向量,然后找最相近的文档块。
  • 推荐系统:把用户兴趣和商品表示成向量,检索相似商品。
  • 图像搜索:把图片编码成向量,找"长得像"的图片。
  • 风控/去重:把行为、文本、图片转成向量,找异常相似样本。

所以你可以把向量数据库理解成:

不是按主键查数据的数据库,而是按"语义相似性"查数据的数据库。


🚀 二、向量数据库的原理是什么?

1. 什么是"向量"?

在 AI 系统里,模型会把一个对象编码成一个数字数组,比如:

text 复制代码
"如何学习 MySQL" -> [0.12, -0.83, 0.44, ..., 0.09]
"数据库调优方法" -> [0.10, -0.79, 0.41, ..., 0.11]

这个数组就叫向量(Embedding)。

它有两个关键特点:

  • 维度高:常见有 128、384、768、1024、1536 维等。
  • 语义可比较:语义越接近的内容,向量通常越接近。

也就是说,向量数据库并不是直接理解"文字本身",而是通过向量空间中的位置关系,近似表达"语义接近"。

2. 向量数据库如何工作?

向量数据库的核心原理可以拆成 3 层:

层次 作用 关键词
数据表示层 把文本/图片/音频转成向量 Embedding
相似度计算层 判断两个向量有多像 Cosine、L2、L1
索引检索层 在海量向量中快速找近邻 ANN、HNSW、LSH、PQ

也就是说,完整链路不是"存一下数组然后遍历比大小",而是:

  1. 用 Embedding 模型把对象编码成向量。
  2. 把向量和业务元数据一起写入向量数据库。
  3. 建立近邻索引,加速搜索。
  4. 查询时把问题也编码成向量。
  5. 在索引中找到最相近的 TopK 向量。
  6. 返回对应文档、图片或业务对象。

3. 为什么它和传统数据库不一样?

传统数据库擅长:

  • 精确匹配
  • 范围查询
  • 排序聚合
  • 事务处理

向量数据库擅长:

  • 相似检索
  • TopK 最近邻搜索
  • 高维空间索引
  • 向量 + 元数据联合过滤

它们并不是互相替代关系,而是能力侧重点不同

4. 一个直观流程图

原始数据: 文本/图片/音频
Embedding 模型
生成向量
写入向量数据库
建立向量索引
用户查询
转成查询向量
ANN 检索
召回 TopK 候选
相似度排序/过滤
返回结果

到这里你可以把向量数据库理解为:

Embedding 负责"翻译成机器能比较的数字",索引负责"在大量数字里快速找相似项"。


🧠 三、ANN 是什么?为什么需要它?

1. ANN 是什么?

ANN 全称是:

Approximate Nearest Neighbor,近似最近邻搜索

意思是:

  • 不一定找到"绝对最精确"的最近邻
  • 但可以在极短时间内找到"足够接近"的最近邻

这里的关键字是 Approximate(近似)

2. 为什么不能总是用精确搜索?

如果你有 1000 条向量数据,当然可以暴力遍历:

  • 查询向量和每一条向量都算一次距离
  • 再取 TopK

这叫 Brute Force(暴力检索)

但如果你的数据规模变成:

  • 100 万条
  • 1000 万条
  • 1 亿条

那每次查询都全量扫描,代价就非常高:

  • CPU 开销高
  • 延迟高
  • 吞吐低
  • 成本高

特别是在高维空间里,逐条比较的代价并不小。

3. ANN 的核心价值

ANN 的本质是:

用"少量精度损失",换取"数量级的性能提升"。

它通常能带来:

  • 更低的查询延迟
  • 更高的 QPS
  • 更低的计算成本
  • 更适合大规模在线检索

这也是为什么绝大多数生产级向量数据库,都会优先提供 ANN 索引,而不是只提供全量精确扫描。

4. ANN 的核心思想

ANN 并不是把所有向量都算一遍,而是想办法:

  • 缩小搜索范围
  • 快速定位候选集合
  • 只在候选集合中精排

所以你会看到很多 ANN 算法本质上都在做下面几件事:

  • 建图
  • 分桶
  • 聚类
  • 压缩
  • 分层导航

🔧 四、HNSW、LSH、PQ 分别是什么意思?

这三个都是向量检索中非常高频的术语,但它们解决的问题并不完全一样。

1. HNSW 是什么?

HNSW 全称:

Hierarchical Navigable Small World

分层可导航小世界图

它是一种基于图的 ANN 索引结构

核心思想

HNSW 会把向量组织成多层图结构:

  • 上层图:节点少,适合快速"粗定位"
  • 下层图:节点多,适合精细查找最近邻

查询时像"从高速公路逐步下到城市道路":

  1. 先从高层少量节点开始
  2. 快速靠近目标区域
  3. 再逐层下沉到低层图
  4. 最后在底层图中找到高质量近邻
HNSW 的特点
特点 说明
检索速度快 通常是高性能 ANN 的主流方案
召回率高 在很多场景下效果很好
内存占用较高 因为要维护图结构和邻接关系
构建成本偏高 建图过程相对复杂
适合场景 高性能在线检索、RAG、推荐、语义搜索
一个简化理解

你可以把 HNSW 想象成"地图导航":

  • 高层:先定位到哪个城区
  • 中层:再定位到哪条街道
  • 底层:最终定位到具体门牌号

2. LSH 是什么?

LSH 全称:

Locality-Sensitive Hashing

局部敏感哈希

它是一种基于哈希分桶的近似检索方法

核心思想

普通哈希追求的是:

  • 不同对象尽量打散
  • 相同对象才落在同一个桶

但 LSH 追求的是:

  • 相似对象更容易被映射到同一个桶

这样查询时,就不用全局扫描了,而是优先在"同桶或相邻桶"里找候选。

LSH 的特点
特点 说明
查询很快 因为只看部分桶
实现思想直观 分桶后局部搜索
精度不一定稳定 依赖哈希函数设计
对高精度要求场景未必最佳 召回可能不如图索引
适合场景 海量去重、近似查找、部分高维检索
一个简化理解

你可以把 LSH 理解为"先按相似特征把人分班":

  • 查某个人的"相似同学"
  • 先从同班开始找
  • 不再全校逐个比对

3. PQ 是什么?

PQ 全称:

Product Quantization

乘积量化

PQ 的重点不是"怎么导航搜索",而是:

怎么把高维向量压缩存储,并支持更快的近似距离计算。

核心思想

一个高维向量很大,直接存原始浮点数会非常占内存。

PQ 的做法是:

  1. 把一个高维向量拆成多个子向量
  2. 每个子向量分别量化到一个码本编号
  3. 最终一个向量不再存完整浮点数,而是存一串短编码

这样好处是:

  • 存储空间大幅下降
  • 距离计算可以查表加速
  • 更适合超大规模向量库
PQ 的特点
特点 说明
压缩效果好 显著降低内存占用
查询更省资源 可配合 ANN 提速
精度会有损失 因为向量被量化了
常与其他索引结合使用 比如 IVF + PQ
适合场景 超大规模向量库、内存敏感场景
一个简化理解

你可以把 PQ 想象成:

  • 原来存的是高清原图
  • 现在改成"分块编码后的压缩图"
  • 细节会损失一点
  • 但空间更省、处理更快

📊 五、HNSW、LSH、PQ 到底有什么区别?

一张表把区别讲清楚:

维度 HNSW LSH PQ
全称 Hierarchical Navigable Small World Locality-Sensitive Hashing Product Quantization
核心思路 分层图导航 相似哈希分桶 向量压缩编码
主要目标 提升检索速度与召回 快速缩小候选范围 降低存储和计算成本
是否属于 ANN 常作为 ANN 的压缩组件
精度表现 通常较高 依赖哈希设计 会有量化误差
内存表现 偏高 中等 很省
典型场景 在线语义检索、RAG 去重、粗召回 超大规模存储优化

注意一个很容易混淆的点:

  • HNSW 更像"怎么找"
  • LSH 更像"怎么先缩小候选范围"
  • PQ 更像"怎么更省空间地存和算"

所以 PQ 经常和别的索引配合使用,而不是单独拿来理解成"唯一检索算法"。


📐 六、余弦相似度、欧几里得距离、曼哈顿距离分别是什么?

向量搜索本质上要回答一个问题:

两个向量到底有多接近?

不同的距离/相似度指标,对"接近"的定义不一样。

1. 余弦相似度(Cosine Similarity)

余弦相似度比较的是:

两个向量方向是否接近

数学形式:

text 复制代码
cos(theta) = (A · B) / (||A|| * ||B||)

其中:

  • A · B 是点积
  • ||A||||B|| 是向量长度
特点
  • 更关注方向,而不是绝对长度
  • 很适合文本语义相似度
  • 在 Embedding 检索中非常常见
直观理解

如果两个句子的向量方向很接近,说明它们表达的语义通常也比较接近。

2. 欧几里得距离(Euclidean Distance)

欧几里得距离也叫 L2 距离,衡量的是:

两个点在空间中的直线距离

数学形式:

text 复制代码
d(A, B) = sqrt(sum((Ai - Bi)^2))
特点
  • 最符合"几何直觉"
  • 会受到向量长度影响
  • 在一些图像、位置、数值特征场景中常用
直观理解

就是"从点 A 直接走到点 B 的最短直线距离"。

3. 曼哈顿距离(Manhattan Distance)

曼哈顿距离也叫 L1 距离,衡量的是:

各维度差值绝对值之和

数学形式:

text 复制代码
d(A, B) = sum(|Ai - Bi|)
特点
  • 对每个维度的偏差线性累计
  • 对异常值的敏感度通常低于 L2
  • 适合某些稀疏特征或网格型路径度量
直观理解

它像在纽约曼哈顿街区走路:

  • 不能斜穿大楼
  • 只能横着走、竖着走
  • 所以距离是"横向步数 + 纵向步数"

⚖️ 七、这三种相似度 / 距离方法有什么区别?

1. 核心区别总结

指标 看重什么 是否受向量长度影响 常见场景
余弦相似度 方向是否一致 弱相关 / 通常先归一化 文本语义、Embedding 检索
欧几里得距离 空间直线距离 数值空间、几何距离、部分视觉特征
曼哈顿距离 各维差值累计 稀疏特征、网格路径、鲁棒距离

2. 一个更实用的理解

假设有两个向量:

  • A:内容主题相同,但强度更高
  • B:内容主题方向相同,但数值整体放大

那么:

  • 余弦相似度 可能仍然很高,因为方向差不多。
  • 欧几里得距离 可能会变大,因为整体长度差异也算进去了。
  • 曼哈顿距离 也会变大,因为每一维差值都被累加了。

3. 实战中怎么选?

经验上:

  • 文本 Embedding 检索:最常用余弦相似度
  • 归一化后的向量:余弦相似度和 L2 在某些情况下可相互转换理解
  • 有明显空间意义的数值特征:常考虑 L2
  • 希望对单维异常值更稳一点:可以考虑 L1

⚠️ 但一定要记住:

距离函数的选择,必须和你的 Embedding 模型训练方式保持一致。

因为模型训练时优化的目标,往往决定了"什么距离定义更合理"。


🔄 八、向量数据库的工作流程有哪些?

这是一个非常高频的面试题,也是理解系统链路最好的方式。

1. 写入流程

向量数据库的写入流程通常包括:

  1. 原始数据准备
    • 文本、图片、音频、用户行为等原始数据进入系统。
  2. 数据预处理
    • 比如文本清洗、切块、去噪、字段提取。
  3. 向量化(Embedding)
    • 调用模型,把对象转换为高维向量。
  4. 元数据绑定
    • 给向量附带文档 ID、标签、时间、来源等业务字段。
  5. 索引构建
    • 用 HNSW、IVF、LSH、PQ 等结构建立检索索引。
  6. 持久化存储
    • 把向量、索引、元数据写入数据库。

2. 查询流程

一次典型查询通常包括:

  1. 接收用户查询
  2. 查询向量化
    • 把查询文本或图片也转成向量。
  3. ANN 召回
    • 在索引中快速找出若干近邻候选。
  4. 距离计算 / 重排序
    • 对候选进行更精细的相似度排序。
  5. 元数据过滤
    • 比如只要某个时间范围、某个租户、某个标签的数据。
  6. 返回 TopK 结果
    • 返回最相关的若干条结果。
  7. 下游应用消费
    • 比如交给 RAG 大模型、推荐模块、风控模块继续处理。

3. 一个完整流程图

原始数据
预处理: 清洗/切块/去重
Embedding 向量化
写入向量 + 元数据
建立 ANN 索引
用户查询
查询向量化
ANN 候选召回
精排 / 重排序
元数据过滤
TopK 返回
RAG / 推荐 / 搜索业务

4. 这套流程里最关键的几个性能点

环节 关键问题 典型优化方向
向量化 模型延迟高 批量编码、异步化、缓存
索引构建 重建成本高 增量更新、离线构建
在线检索 延迟高 ANN 索引调参、候选集控制
内存占用 向量太大 量化压缩、PQ、分片
结果质量 召回不准 换模型、混合检索、重排序

⚠️ 九、向量数据库最容易踩坑的地方

1. 只关注索引,不关注 Embedding 模型

很多人一上来就在比 HNSW、LSH、PQ,结果忽略了一个事实:

垃圾向量,再好的索引也救不回来。

如果 Embedding 模型本身不能把语义表示好,后面的 ANN 检索再快也没有意义。

2. 只追求速度,不关注召回率

ANN 一定是速度和精度的权衡。

  • 候选集太小,可能漏掉真正相关结果
  • 图层参数太激进,可能检索更快但质量下降

所以生产环境不能只看 QPS,还要看:

  • Recall
  • Precision
  • NDCG
  • 最终业务转化率

3. 忽略元数据过滤的成本

很多业务不是"纯向量搜索",而是:

  • 某个租户下的数据
  • 某个时间范围内的数据
  • 某个标签集合里的数据

如果元数据过滤做不好,检索链路会很慢,甚至召回结果不可用。

4. 不理解不同距离函数的适用前提

不要机械地说:

  • 文本就一定只能用余弦
  • 图像就一定只能用 L2

更推荐的做法是:

  1. 看模型训练目标
  2. 看厂商/模型官方推荐
  3. 用离线评测验证实际效果

✅ 十、面试或工作中怎么把这题答清楚?

如果面试官问:"向量数据库的原理是什么?"

你可以这样回答:

向量数据库的核心原理,是把文本、图片等对象通过 Embedding 模型转换成高维向量,再通过相似度度量方法(比如余弦相似度、欧几里得距离)判断对象是否接近。由于数据规模通常很大,不能每次都全量扫描,所以会借助 ANN 索引来加速近邻搜索。常见方法有基于图的 HNSW、基于分桶的 LSH、基于压缩的 PQ。一次完整流程通常包括数据向量化、索引构建、查询向量化、ANN 召回、精排和结果返回。

如果面试官继续追问:"为什么需要 ANN?"

你可以补一句:

因为暴力精确搜索在海量高维向量场景下成本太高,ANN 通过牺牲少量精度,换来大幅延迟下降和吞吐提升,这是生产环境里必须的工程权衡。


📋 十一、速查表

1. 核心概念速查

名词 含义
向量数据库 在高维向量中做相似检索的数据库
Embedding 把对象编码成向量的模型过程
ANN 近似最近邻搜索,用近似换性能
HNSW 分层图导航索引,速度快、召回高
LSH 局部敏感哈希,靠分桶做近似检索
PQ 乘积量化,用于压缩向量和加速计算

2. 距离函数速查

方法 本质 优点 注意点
余弦相似度 比方向 适合语义检索 需注意归一化和模型匹配
欧几里得距离 比直线距离 几何意义直观 对长度敏感
曼哈顿距离 比逐维绝对差 对某些异常更稳 高维下解释要结合业务

✅ 总结

把这篇文章浓缩成几句话,其实就是:

  1. 向量数据库的本质:在海量高维向量中做相似搜索。
  2. 核心原理:对象先向量化,再通过距离函数判断相似性,最后借助索引加速检索。
  3. ANN 的意义:解决大规模场景下精确搜索太慢的问题。
  4. HNSW / LSH / PQ 的区别
    • HNSW 是图索引
    • LSH 是哈希分桶
    • PQ 是压缩量化
  5. 常见距离方法
    • 余弦相似度看方向
    • 欧几里得距离看直线距离
    • 曼哈顿距离看逐维差值总和
  6. 完整工作流程:写入、向量化、建索引、查询向量化、ANN 召回、精排、返回结果。

如果你是刚接触向量数据库,建议下一步再继续深入两个方向:

  • 索引体系:HNSW、IVF、IVF-PQ、DiskANN
  • RAG 工程实践:分块、Embedding 选型、混合检索、Rerank

这样你对"向量数据库为什么能跑得快、为什么有时又不准"就会真正建立起完整认知。

相关推荐
code_pgf2 小时前
基于transformer的clip和blip之间的关系、原理、方法实现和直观可视化
人工智能·深度学习·transformer
不爱吃大饼2 小时前
redis主从节点
数据库·redis·bootstrap
汀、人工智能2 小时前
[特殊字符] 第72课:杨辉三角
数据结构·算法·数据库架构·图论·bfs·杨辉三角
Wyawsl2 小时前
Python操作MySQL数据库
数据库·python·mysql
蕤葳-2 小时前
AI证书在面试中的价值分析
人工智能
水彩橘子2 小时前
PostgreSQL Streaming Replication 主从
数据库·postgresql
SuperEugene2 小时前
Python 异步 async/await:为什么 AI 框架大量使用?| 基础篇
开发语言·人工智能·python
QYR_112 小时前
预计2032年全球智能换电站市场销售额将突破62.88亿美元
人工智能·市场调研
洛水水2 小时前
【力扣100题】14.两数相加
c++·算法·leetcode