Skip to content

目的:搞清三者的“速度/精度/内存/可更新性”的差别,选对索引结构。

🎯 文章目标

  • 理解 HNSW/IVF/Flat 的核心机制
  • 按数据规模/变更频率/内存/延迟做取舍
  • 提供最小配置示例

📚 背景/前置

  • HNSW:近似最近邻,查询快、内存大、适合读多写少
  • IVF:倒排分簇,先找簇再精排,参数(nlist/nprobe)影响大
  • Flat:精确检索,慢,但实现简单/内存低

🔧 核心内容

1) 适用场景

  • 小规模/高准确:Flat
  • 中大规模/读多写少:HNSW
  • 大规模/可控延迟:IVF(配合 PQ/OPQ 降内存)

2) Chroma/FAISS 示例

python
# 以 FAISS 为例:HNSW & IVF
import faiss

# HNSW
index = faiss.IndexHNSWFlat(d, 32)  # d=向量维度, 32=m 参数
index.hnsw.efSearch = 64

# IVF-Flat
nlist = 1024
quantizer = faiss.IndexFlatL2(d)
ivf = faiss.IndexIVFFlat(quantizer, d, nlist)
ivf.nprobe = 16

3) 观测指标

  • Recall@K、查询 P95、构建时间、内存占用、更新频率
  • 线上对比:小流量灰度,监控慢查询与失败

📊 对比/取舍(速查)

  • 准确 vs 速度:Flat 准确但慢;HNSW/IVF 更快但近似
  • 内存 vs 成本:HNSW 内存高;IVF+PQ 更省

🧪 踩坑与经验

  • 参数敏感:HNSW(m/ef)、IVF(nlist/nprobe) 需压测调参
  • 更新策略:批量重建/离线构建 + 原子切换

📎 参考与延伸

  • FAISS 文档、Chroma/Weaviate/Qdrant 索引配置
  • IVF-PQ/OPQ、HNSW 理论与实践

💭 总结

  • 先按规模/更新频率选结构,再通过压测把参数调稳