增加倒排索引 (IVF 索引) 中的中心点(簇)数量直接影响搜索速度和召回率,但权衡取决于索引配置和数据分布。中心点越多,数据集被分割成更小、更细粒度的簇。如果搜索仅限于固定数量的附近簇(由 nprobe
参数控制),这将减少每次查询扫描的向量数量。然而,如果查询的真正最近邻分散在搜索时未检查的簇中,较小的簇也会增加遗漏相关向量的风险。平衡速度和召回率需要仔细调整中心点数量和 nprobe
。
搜索速度影响 中心点越多通常允许更快的搜索,如果 nprobe
值保持固定。例如,一个包含 10,000 个中心点且 nprobe=10
的 IVF 索引可能会搜索 10 个簇,每个簇包含 0.1% 的数据集,总共扫描 1% 的向量。相比之下,一个包含 1,000 个中心点且 nprobe=10
的索引会搜索 10 个簇,每个簇覆盖 1% 的数据,总共扫描 10% 的向量——速度慢一个数量级。然而,增加中心点数量也增加了粗量化步骤(将查询与所有中心点进行比较)花费的时间。对于少量中心点,此开销不大,但在大规模(例如 1M 中心点)情况下变得显著,尤其是在没有 SIMD 优化的 CPU 上。
召回率权衡 如果 nprobe
未调整,更高的中心点数量可能会损害召回率。例如,如果一个查询的真正最近邻分散在 15 个簇中,但索引使用 nprobe=10
,将中心点从 1,000 增加到 10,000 更有可能使这些邻居分散到不同的簇中,从而减少它们全部包含在 probed 的 10 个簇中的可能性。为了维持召回率,您可能需要提高 nprobe
值,这会抵消较小簇带来的速度提升。例如,当中心点数量翻倍时,将 nprobe
也翻倍会使扫描的总向量数量大致保持不变,但会增加 probing 更多簇的开销。最佳调整通常涉及测试:一个 10,000 个中心点且 nprobe=20
的索引可能在相似的速度下比 1,000 个中心点且 nprobe=10
的索引实现更好的召回率,但这取决于数据聚类行为。
实际上,选择取决于数据集的固有结构和延迟/召回率要求。稀疏或高维数据可能需要更多中心点以避免大型、分隔不清的簇,而较小的数据集可能使用较少中心点和较高的 nprobe
值表现更好。像 FAISS 或 Milvus 这样的工具允许对这些参数进行基准测试以找到合适的平衡点。