向量索引选型指南

用 6 个决策维度 + 决策树给出 FLAT/HNSW/IVF-PQ/DiskANN 的选用边界,并对比 Faiss/Milvus/Qdrant/Weaviate/pgvector/Chroma 与上线清单。

决策看这 6 个维度

维度影响什么
数据量 N小→FLAT;中→HNSW;大/亿级→IVF-PQ/DiskANN
向量维度 d越高越慢越占内存;能 768 别 1536
内存预算紧→必须量化(PQ/BQ);松→HNSW
召回要求极高→FLAT/HNSW;可容忍≈95%→IVF-PQ
更新频率频繁增删→LSH/支持增删的库;批量→均可
元数据过滤需"带过滤的检索"→选支持 pre-filter 的库

选型决策树

开始:数据量 N? N < 100万 100万 ~ 千万 N ≥ 亿级 要100%准确?→ FLAT 内存够?→ HNSW 内存紧?→ IVF-PQ/DiskANN 内存不够→ IVF-PQ 压缩 内存够→ HNSW 分片
图 1:按数据量 × 内存的索引选型决策树。

主流向量库 / 引擎定位

引擎形态定位与擅长
FaissPython/C++ 库底层引擎,算法最全(HNSW/IVF-PQ/...),需自己搭服务
Milvus分布式服务十亿~千亿级,云原生,水平扩展强
QdrantRust 服务易用、过滤(带条件的检索)强、性能好
Weaviate图式服务模块化、原生混合检索、GraphQL 接口
pgvectorPostgres 扩展已在 PG 里,运维省,中小规模够用
Chroma嵌入式轻量、原型/本地最快上手
选库不只为"快",还要看:是否支持带元数据过滤、能否水平扩展、团队是否熟 Postgres。很多"检索不准"的锅其实是过滤没做好。

参数速查

索引先调哪个建议起步
FLAT无小数据直接上
HNSWefSearchM=16, efConstruction=200, efSearch=64→256
IVF-PQnprobenlist≈√N, nprobe=16/32, m=16/32
混合RRF 的 kk=60,权重各 0.5 起

上线前检查清单

  1. 维度定了吗?能用 768 就别 1536。
  2. 向量归一化了吗?→ 用内积检索,速度更快。
  3. 建索引与查询用同一种度量(cosine / IP / L2 一致)。
  4. 召回率测过吗?拿一批真实 query 对暴力结果算 Recall@k。
  5. 内存算过吗?N×d×4 是否放得下,放不下就量化/分片。
  6. 需要过滤吗?选支持 pre-filter 的库,避免"先召回再过滤"导致召回不足。
  7. 有重排(Cross-Encoder)兜底吗?召回 95% + 重排,效果更稳。
本系列 10 篇从"是什么"到"怎么选"形成闭环:基础 → 度量 → 耗时 → ANN 全景 → HNSW / IVF-PQ / LSH → 量化 → 混合检索 → 选型。按这个顺序读,向量检索就通了。