向量数据库原理与检索算法入门: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. 核心区别总结](#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 系统里这么重要。
下面我们就从"为什么会需要它"开始,一步步把向量数据库的核心原理讲清楚。
🎯 一、先说结论:向量数据库本质上在解决什么问题?
一句话概括:
向量数据库的核心任务,是在海量高维向量中,快速找出"最相似"的那几个向量。
这背后真正考察的是两个问题:
- 怎么表示相似性:把文本、图片、音频等对象转换成向量。
- 怎么高效查找相似对象:在上百万、上千万甚至上亿向量中快速检索。
比如:
- 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 |
也就是说,完整链路不是"存一下数组然后遍历比大小",而是:
- 用 Embedding 模型把对象编码成向量。
- 把向量和业务元数据一起写入向量数据库。
- 建立近邻索引,加速搜索。
- 查询时把问题也编码成向量。
- 在索引中找到最相近的 TopK 向量。
- 返回对应文档、图片或业务对象。
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 会把向量组织成多层图结构:
- 上层图:节点少,适合快速"粗定位"
- 下层图:节点多,适合精细查找最近邻
查询时像"从高速公路逐步下到城市道路":
- 先从高层少量节点开始
- 快速靠近目标区域
- 再逐层下沉到低层图
- 最后在底层图中找到高质量近邻
HNSW 的特点
| 特点 | 说明 |
|---|---|
| 检索速度快 | 通常是高性能 ANN 的主流方案 |
| 召回率高 | 在很多场景下效果很好 |
| 内存占用较高 | 因为要维护图结构和邻接关系 |
| 构建成本偏高 | 建图过程相对复杂 |
| 适合场景 | 高性能在线检索、RAG、推荐、语义搜索 |
一个简化理解
你可以把 HNSW 想象成"地图导航":
- 高层:先定位到哪个城区
- 中层:再定位到哪条街道
- 底层:最终定位到具体门牌号
2. LSH 是什么?
LSH 全称:
Locality-Sensitive Hashing
局部敏感哈希
它是一种基于哈希分桶的近似检索方法。
核心思想
普通哈希追求的是:
- 不同对象尽量打散
- 相同对象才落在同一个桶
但 LSH 追求的是:
- 相似对象更容易被映射到同一个桶
这样查询时,就不用全局扫描了,而是优先在"同桶或相邻桶"里找候选。
LSH 的特点
| 特点 | 说明 |
|---|---|
| 查询很快 | 因为只看部分桶 |
| 实现思想直观 | 分桶后局部搜索 |
| 精度不一定稳定 | 依赖哈希函数设计 |
| 对高精度要求场景未必最佳 | 召回可能不如图索引 |
| 适合场景 | 海量去重、近似查找、部分高维检索 |
一个简化理解
你可以把 LSH 理解为"先按相似特征把人分班":
- 查某个人的"相似同学"
- 先从同班开始找
- 不再全校逐个比对
3. PQ 是什么?
PQ 全称:
Product Quantization
乘积量化
PQ 的重点不是"怎么导航搜索",而是:
怎么把高维向量压缩存储,并支持更快的近似距离计算。
核心思想
一个高维向量很大,直接存原始浮点数会非常占内存。
PQ 的做法是:
- 把一个高维向量拆成多个子向量
- 每个子向量分别量化到一个码本编号
- 最终一个向量不再存完整浮点数,而是存一串短编码
这样好处是:
- 存储空间大幅下降
- 距离计算可以查表加速
- 更适合超大规模向量库
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. 写入流程
向量数据库的写入流程通常包括:
- 原始数据准备
- 文本、图片、音频、用户行为等原始数据进入系统。
- 数据预处理
- 比如文本清洗、切块、去噪、字段提取。
- 向量化(Embedding)
- 调用模型,把对象转换为高维向量。
- 元数据绑定
- 给向量附带文档 ID、标签、时间、来源等业务字段。
- 索引构建
- 用 HNSW、IVF、LSH、PQ 等结构建立检索索引。
- 持久化存储
- 把向量、索引、元数据写入数据库。
2. 查询流程
一次典型查询通常包括:
- 接收用户查询
- 查询向量化
- 把查询文本或图片也转成向量。
- ANN 召回
- 在索引中快速找出若干近邻候选。
- 距离计算 / 重排序
- 对候选进行更精细的相似度排序。
- 元数据过滤
- 比如只要某个时间范围、某个租户、某个标签的数据。
- 返回 TopK 结果
- 返回最相关的若干条结果。
- 下游应用消费
- 比如交给 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
更推荐的做法是:
- 看模型训练目标
- 看厂商/模型官方推荐
- 用离线评测验证实际效果
✅ 十、面试或工作中怎么把这题答清楚?
如果面试官问:"向量数据库的原理是什么?"
你可以这样回答:
向量数据库的核心原理,是把文本、图片等对象通过 Embedding 模型转换成高维向量,再通过相似度度量方法(比如余弦相似度、欧几里得距离)判断对象是否接近。由于数据规模通常很大,不能每次都全量扫描,所以会借助 ANN 索引来加速近邻搜索。常见方法有基于图的 HNSW、基于分桶的 LSH、基于压缩的 PQ。一次完整流程通常包括数据向量化、索引构建、查询向量化、ANN 召回、精排和结果返回。
如果面试官继续追问:"为什么需要 ANN?"
你可以补一句:
因为暴力精确搜索在海量高维向量场景下成本太高,ANN 通过牺牲少量精度,换来大幅延迟下降和吞吐提升,这是生产环境里必须的工程权衡。
📋 十一、速查表
1. 核心概念速查
| 名词 | 含义 |
|---|---|
| 向量数据库 | 在高维向量中做相似检索的数据库 |
| Embedding | 把对象编码成向量的模型过程 |
| ANN | 近似最近邻搜索,用近似换性能 |
| HNSW | 分层图导航索引,速度快、召回高 |
| LSH | 局部敏感哈希,靠分桶做近似检索 |
| PQ | 乘积量化,用于压缩向量和加速计算 |
2. 距离函数速查
| 方法 | 本质 | 优点 | 注意点 |
|---|---|---|---|
| 余弦相似度 | 比方向 | 适合语义检索 | 需注意归一化和模型匹配 |
| 欧几里得距离 | 比直线距离 | 几何意义直观 | 对长度敏感 |
| 曼哈顿距离 | 比逐维绝对差 | 对某些异常更稳 | 高维下解释要结合业务 |
✅ 总结
把这篇文章浓缩成几句话,其实就是:
- 向量数据库的本质:在海量高维向量中做相似搜索。
- 核心原理:对象先向量化,再通过距离函数判断相似性,最后借助索引加速检索。
- ANN 的意义:解决大规模场景下精确搜索太慢的问题。
- HNSW / LSH / PQ 的区别 :
- HNSW 是图索引
- LSH 是哈希分桶
- PQ 是压缩量化
- 常见距离方法 :
- 余弦相似度看方向
- 欧几里得距离看直线距离
- 曼哈顿距离看逐维差值总和
- 完整工作流程:写入、向量化、建索引、查询向量化、ANN 召回、精排、返回结果。
如果你是刚接触向量数据库,建议下一步再继续深入两个方向:
- 索引体系:HNSW、IVF、IVF-PQ、DiskANN
- RAG 工程实践:分块、Embedding 选型、混合检索、Rerank
这样你对"向量数据库为什么能跑得快、为什么有时又不准"就会真正建立起完整认知。