HNSW(分层可导航小世界)和 IVF(倒排文件)等索引通过存储额外的结构来加速相似性搜索,从而引入内存开销。 对于 HNSW,开销主要来自维护分层图,其中每个向量都有多个到邻居的连接(边)。 例如,如果 100 万条条目的数据集中的每个向量都有 32 个连接(一个常见的默认值),并且每个连接都存储为 4 字节的整数,则仅图结构就增加约 128 MB 的内存。 结合向量本身(例如,1M 个 768 维向量作为 32 位浮点数 = 3 GB),索引会增加约 4-5% 的开销。 另一方面,IVF 将向量聚类成组并存储质心和倒排列表。 对于 1,024 个簇,IVF 可能需要约 3 MB 用于质心(1,024 个簇 × 768 维度 × 4 字节),外加约 4 MB 用于倒排列表(1M 个向量 ID 作为 4 字节整数),总计约 7 MB,或者对于相同的数据集,开销 <1%。 但是,将 IVF 扩展到 65,536 个簇会将质心存储增加到约 195 MB,从而将开销推高到约 7%。
HNSW 的开销可以通过调整其参数来管理。 例如,将每个节点的连接数 (M
) 从 32 减少到 16 会将边缘存储减少一半(64 MB 而不是 128 MB),但这可能会降低搜索准确性。 类似地,使用较小的数据类型来存储边缘(例如,2 字节整数而不是 4 字节)会减少内存,但会限制最大向量计数。 对于 IVF,减少簇的数量会降低质心存储,但可能需要在搜索期间扫描更多簇,从而增加延迟。 或者,使用乘积量化 (PQ) 来压缩 IVF 簇中的向量可以大大减少内存。 例如,使用 8 位代码的 PQ 将向量存储从 3 GB 减少到 0.75 GB,同时为码本增加最小的开销(约 1-2 MB)。 两种索引都受益于量化原始向量(例如,8 位整数而不是 32 位浮点数),以在索引之前减少基线内存。
FAISS 等库提供了用于平衡内存和性能的配置选项。 对于 HNSW,efConstruction
和 M
直接控制图密度和内存使用。 对于 IVF,nlist
(簇的数量)和 PQ 参数(m
和 nbits
)允许调整。 将索引的某些部分存储在磁盘上并进行缓存(例如,仅加载经常访问的簇)也可以提供帮助,但这会增加复杂性。 开发人员应该分析他们的数据集:较小的数据集可能优先考虑 HNSW 的准确性,同时开销可控,而较大的数据集可以使用带有 PQ 的 IVF 来提高内存效率。 例如,一个带有 IVF-4096 和 PQ 的 10M 向量数据集可能使用约 3.5 GB(向量 + 索引),而不是原始向量的约 38 GB,而精度损失最小。