深色模式
向量索引 HNSW / IVF / PQ
摘要:本文面向需要为向量库选索引、调参数的工程师。系统讲清三类主流索引——HNSW(分层可导航小世界图)、IVF(倒排文件)、PQ(乘积量化)——的原理、关键参数与权衡,并解释「量化 + 重排(oversample & rescore)」如何在压缩内存的同时保住精度。引用 HNSW 原始论文(Malkov & Yashunin, arXiv:1603.09320)与 Faiss/Pinecone 公开资料。索引行为随向量库版本变化,标注 [版本相关]。
核心概念
近似最近邻(ANN)检索要在「召回率 / 延迟 / 内存」三者间权衡。三类索引定位不同:
| 索引 | 本质 | 内存 | 是否需训练 | 增量写 | 典型场景 |
|---|---|---|---|---|---|
| HNSW | 多层图 | 高(向量+图) | 否 | 是 | 百万~十亿,低延迟 |
| IVF | 聚类倒排 | 中(需存质心) | 是 | 需重训/加簇 | 超大规模、磁盘友好 |
| PQ | 向量压缩 | 极低 | 是 | 配合其他索引 | 压缩存储、重排初筛 |
没有「万能索引」
2025-2026 生产 RAG 多数默认 HNSW:无需训练、支持实时写、召回稳定。仅当数据达数亿且内存吃紧,或 GPU FAISS 批处理高吞吐时再考虑 IVF-PQ / DiskANN(来源:ai-tldr HNSW 详解、aicassindra 向量架构,访问 2026-10-09)。
架构与原理一:HNSW
HNSW(Hierarchical Navigable Small World)由 Malkov & Yashunin 于 2016 年预印、2018 年 IEEE TPAMI 正式发表(arXiv:1603.09320)。它把 NSW 图叠成多层 skip-list 式结构:
- 插入:每个向量落 Layer 0,以指数衰减概率上提至更高层;高层节点少、边长,像「高速公路」。
- 查询:从顶层贪心走向更近的邻居,逐层下降,Layer 0 用宽度
ef_search的 beam 收集候选。 - 三个参数(来源:pinecone HNSW 系列、ai-tldr,访问 2026-10-09):
| 参数 | 阶段 | 作用 | 典型范围 |
|---|---|---|---|
M | 构建(固定) | 每节点最大连接数,决定图结构与内存 | 12–48(默认 16) |
efConstruction | 构建 | 建图候选列表宽度,越大图越好越慢 | 100–500(默认 200) |
efSearch / ef | 查询 | 查询候选宽度,唯一可不重建调的旋钮 | ≥ top_k,常 100–几百 |
百万级默认(M=16, efConstruction=200, efSearch=100)通常 recall@10 约 0.95–0.98,但强烈依赖你的数据内蕴维度与分布,必须实测(来源:ai-tldr,访问 2026-10-09)。
架构与原理二:IVF 与 PQ
IVF(Inverted File)先对向量聚类(如 k-means),把数据分到若干桶(inverted list),查询时只访问最近的 nprobe 个桶,跳过其余。它需要训练且桶数/ nprobe 影响召回。
PQ(Product Quantization,Jégou, Douze, Schmid, CVPR 2011 / IEEE TPAMI 2013)把高维向量切成 m 段,每段用一个小码本量化为 1 字节,从而把 768 维 float32(3072 字节)压到 m 字节。常组合为 IVF-PQ:聚类缩小搜索范围、PQ 压缩向量省内存。
量化与重排:压缩内存不丢精度
关键经验(来源:aicassindra 向量架构、qdrant DeepWiki 量化,访问 2026-10-09):
| 方案 | 每 768 维向量字节 | 压缩比 |
|---|---|---|
| float32 | 3072 | 1x |
| float16 | 1536 | 2x |
| int8 标量量化 | 768 | 4x |
| PQ(96 子向量) | 96 | 32x |
| 二进制 | 96 | 32x(1 bit/维) |
安全做法:oversample & rescore——用压缩索引(PQ/二进制)多取候选(如 10×k),再用全精度向量重算精确距离取 top-k。压缩码仅做初筛,精度损失被全精度回算抵消。二进制码单独排序质量较差,作为初筛阶段才稳,且效果依赖 embedding 模型,需以你数据验证。
python
# 量化+重排示意(二进制初筛,全精度回算)[伪代码,未实测]
import numpy as np
def search_binary_rescore(q, codes, full_vectors, k=10, oversample=10):
qbits = np.packbits(q > 0)
hamming = np.unpackbits(codes ^ qbits, axis=1).sum(axis=1) # 廉价初筛
cand = np.argpartition(hamming, k * oversample)[: k * oversample]
exact = full_vectors[cand] @ q # 全精度回算
order = np.argsort(-exact)[:k]
return cand[order], exact[order]1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
删除会让 HNSW 图「长洞」
HNSW 删除只留空洞,连通性会逐渐退化,直到图被修复或段重建。高删除率场景(如 TTL 数据)要规划定期段合并/重建,否则召回随时间下滑(来源:aicassindra,访问 2026-10-09)。
生产实践:在向量库里选索引
Milvus(index_type):
HNSW:显式 M/efConstruction;AUTOINDEX自动选。IVF_PQ/IVF_FLAT:超大规模、内存受限。DISKANN:磁盘驻留图,内存小、延迟略高(版本相关)。
Qdrant / Weaviate:HNSW 为主;Qdrant 在集合级配 hnsw_config,quantization 在向量配置里声明(见 qdrant-weaviate.md)。
Faiss(库级,便于理解参数):
python
import faiss
index = faiss.IndexHNSWFlat(d, m=16) # d=维度, m=M
index.hnsw.efConstruction = 200
index.add(vectors) # 需先归一化(COSINE 前)
index.hnsw.efSearch = 128 # 查询期
D, I = index.search(q, k=10)1
2
3
4
5
6
2
3
4
5
6
验证
python
# 用带标签的 query 集算 recall@k(不要只信厂商 synthetic benchmark)
def recall_at_k(gt, pred, k=10):
hits = sum(1 for g, p in zip(gt, pred) if g in p[:k])
return hits / len(gt)
# 调 ef / nprobe / M 直到 recall@10 达标且 p99 延迟可接受(见 perf.md)1
2
3
4
5
2
3
4
5
回滚与清理
改索引类型要重建
IVF/PQ 需训练;HNSW 改 M/efConstruction 须重建索引;改维度必须重建集合。变更前备份(见 ops.md),用新集合双写灰度。
故障排查
- 召回低:
ef/nprobe太小或efConstruction太低、M太小 → 调大并复测。 - 内存爆:
M过大(图边 × 维度 × 4 字节/边)或 float32 全量驻内存 → 量化(PQ/标量/二进制)。 - 构建慢:
efConstruction高 + 大数据量 → 降低或上 GPU 建索引(Milvus)。 - IVF 训练数据偏差:训练集不代表生产分布 → 查询落错桶、召回崩 → 用代表性样本训练。
- PQ 维度不被 m 整除:
m必须整除向量维度 → 选可被d整除的m。
安全与合规
- 索引不解决鉴权:ANN 召回只是相似度,跨租户检索仍需在查询层带过滤表达式(Milvus
filter、Qdrantquery_filter、Weaviatefilters),否则越权(见 hybrid-search.md)。 - 备份含索引:索引是数据派生产物,备份须覆盖原向量(重建索引耗时),优先用向量库原生备份而非只拷索引文件。
成本与性能
量级参考,非实测;以你数据与版本为准。
- HNSW 内存:除向量外图结构约 +50–100%(M=16 时底层约 32 邻居 × 4 字节 = 128 字节/向量,来源:aicassindra/pinecone,访问 2026-10-09)。
- 量化收益:int8 ~4x、PQ/二进制 ~32x 内存;代价是精度,靠 rescore 回补。
- 延迟:HNSW 查询近对数复杂;PQ/IVF 因粗排+rescore 引入额外步骤,纯延迟未必更低,但换来了内存可行性与高吞吐。
- 构建:HNSW 构建 CPU 重、比 IVF 训练慢;IVF-PQ 训练快但需代表性数据。
参考资料
- Malkov, Y., Yashunin, D. — Efficient and robust ANN search using HNSW graphs (arXiv:1603.09320)
- Pinecone — HNSW 学习系列
- What Is HNSW? (ai-tldr)
- Vector database architecture in depth (aicassindra)
- IVFPQ + HNSW for Billion-scale Similarity Search (Towards Data Science)
- Jégou, Douze, Schmid — Product Quantization for Nearest Neighbor Search (IEEE TPAMI 2013)