Skip to content

向量数据库中的 HNSW、LSH、PQ 分别是什么意思? ​

  • 标签:AI、大模型、RAG、向量数据库

🏛 业务架构师 ​

这三个都是向量检索的核心技术,我按"干什么用"来讲:

  • HNSW(分层可导航小世界图):把向量组织成多层图——顶层稀疏(高速路)、底层稠密(街道),查询时从顶层入口快速定位再逐层下沉逼近目标。特点是查询极快、召回率高,代价是内存占用大(要把图结构全部放内存)和建索引慢。它是当前生产环境默认索引,对延迟敏感的业务(在线客服、搜索)基本都用它。
  • LSH(局部敏感哈希):用特殊哈希函数让"相近向量以高概率落进同一桶",查询只比对同桶候选。原理直观、可增量插入,但召回率不如 HNSW,现在多用于去重、粗筛这类"允许漏一点"的场景。
  • PQ(乘积量化):把高维向量切成若干段,每段用码本聚类压缩成 1 字节编码,1024 维浮点可压到几十字节。内存省 10 倍以上,代价是精度损失。海量数据(十亿级)或成本敏感场景,常用 IVF+PQ 组合。

业务翻译:这三种技术对应三种经营决策——要速度选 HNSW(费内存)、要省钱选 PQ(损精度)、要简单选 LSH(召回妥协)。生产上常见的组合是 HNSW 为主、PQ 压缩做大规模降本,最终按评测集上的召回率/延迟/成本三角拍板。

🏗 系统架构师 ​

这三个都是 ANN(近似最近邻)技术,我按"解决什么问题、代价是什么"讲:

  • HNSW(分层可导航小世界图):把向量组织成多层图——顶层稀疏(长边快速跳跃)、底层稠密(短边精确逼近)。查询从顶层入口贪心下降,复杂度约 O(logN)。特点:召回率最高(可达 99%+)、查询快(亚毫秒~毫秒);代价是内存大(要存图结构)和构建慢、删除代价高。是当前默认首选索引;
  • LSH(局部敏感哈希):用特殊哈希函数让"相近向量大概率落同桶",查询只比对同桶候选。特点:思想优雅、可流式插入;但召回/精度曲线在现代基准上明显落后 HNSW 与 IVF,生产已少见,多用于去重、候选粗筛;
  • PQ(乘积量化):把高维向量切段,每段用码本聚类成少量质心,向量压缩成"段号串"——1024 维 float32(4KB)可压到几十字节,距离用码字查表近似计算。特点:10~50 倍内存压缩;代价是有量化精度损失,通常不单独用,而是 IVF-PQ 组合(分桶 + 桶内量化)扛十亿级规模,或作为 HNSW 前的粗筛。

选型口径:内存充裕追召回 → HNSW;十亿级成本敏感 → IVF-PQ/DiskANN;LSH 基本只在教科书和去重场景见到。

💻 全栈开发专家 ​

这三个都是 ANN(近似最近邻)技术,但思路完全不同:

  • HNSW(分层可导航小世界图):把向量组织成多层图,上层稀疏(高速公路)、下层稠密(小路)。查询从顶层入口贪心地向目标游走,逐层下沉,底层精确化。高召回、低延迟,但全图驻内存、构建慢——内存贵是它最大的痛,亿级向量要规划好几倍原始向量的 RAM。
  • LSH(局部敏感哈希):设计哈希函数让「相近的向量以高概率落同一个桶」,查询只比对同桶候选。实现简单、可分桶并行,但召回率相对低,现在工业级向量库已少用,更多在去重/近似查重场景。
  • PQ(乘积量化):把向量切成 m 段,每段用聚类中心编码(每段一个 byte),1024 维 float 压到几十字节。是压缩手段而非索引,常与 IVF 组合成 IVF-PQ:先聚类分桶再桶内量化,十亿级向量的内存救星,代价是有量化精度损失(召回打折)。

选型速记:内存充足追求效果 → HNSW;超大规模预算有限 → IVF-PQ;快速原型/去重 → LSH。生产上 Milvus/Qdrant 都支持 HNSW 与 IVF 系列按 collection 配置,拿真实数据各跑一组召回-延迟曲线再定。