为大规模数据集构建索引通常涉及三个核心步骤:预处理数据、训练量化模型(如果适用)和构建索引结构(例如,基于图或基于树)。首先,预处理包括规范化或降低数据的维度,以确保与索引方法兼容。例如,当使用向量相似性搜索时,数据通常被规范化为单位长度,以实现高效的余弦距离计算。接下来,量化(例如训练Product Quantizer (PQ))将高维向量压缩为紧凑代码。这包括将向量分成子向量,使用k-means聚类每个子集,并将原始向量映射到最近的聚类中心。最后,构建索引结构(例如,分层可导航小世界(HNSW)图)涉及迭代地将数据点连接到跨层级层的邻居,以平衡搜索速度和准确性。
这些步骤的扩展取决于索引方法和数据集大小。训练像PQ这样的量化器需要对子向量进行聚类,这与数据集大小呈线性关系 (O(n)),但对于非常大的 n 来说,由于重复的距离计算,计算量会变得很大。例如,在 100 万个向量上训练 PQ 可能需要几分钟,但扩展到 10 亿个可能需要分布式计算或近似。构建基于图的索引(例如 HNSW)涉及插入节点和创建连接,由于分层的原因,通常呈近线性关系 (O(n log n))。但是,内存使用量会随着每个节点的连接数而增长,这使得处理超过可用 RAM 的数据集具有挑战性。混合方法,例如将 IVF(倒排文件索引)与 PQ 结合使用,首先将数据划分为簇,从而减少量化和图构建步骤的范围,这有助于管理可伸缩性。
实际实现通常涉及权衡。例如,FAISS(一个用于高效相似性搜索的库)使用 IVF-PQ 将数据分割成簇并压缩向量,从而减少内存和搜索时间。构建 IVF 结构会随着簇的数量而扩展(例如,对于 10 亿个向量,使用 10,000 个簇),而 PQ 训练在每个子向量上仍然是可管理的。HNSW,用于像 hnswlib 这样的库中,优先考虑搜索速度而不是构建时间,使其适合于可以放入内存中的数据集,但不太适合于基于磁盘的系统。开发人员必须平衡构建时间、内存和查询准确性等因素:量化会牺牲一些准确性来换取速度和压缩,而图方法会以更高的内存成本来优先考虑准确性。像 Annoy(基于树)或 ScaNN(学习量化)这样的工具提供了替代的扩展策略,但跨方法,分割、压缩和构建数据等核心原则保持一致。