要为目标召回率调整 IVF 索引参数(例如 nlist 和 nprobe),以获得最优查询速度,首先要了解它们的作用。nlist 决定了在索引创建期间将数据集分为多少个聚类,而 nprobe 控制在查询期间搜索多少个聚类。更高的 nprobe 通过搜索更多聚类来提高召回率,但会降低查询速度。更大的 nlist 将数据分散到更精细的聚类中,这可以减少每个探测点搜索的数据量,但需要与 nprobe 进行平衡,以避免遗漏相关聚类。目标是找到最小的 nprobe 和最优的 nlist,使它们共同达到所需的召回率,同时最大程度地减少查询时间。
首先将 nlist 固定在一个合理的默认值(例如,根据数据集大小设定为 1,000–10,000 个聚类),然后逐步调整 nprobe。在每一步测量召回率和查询速度。例如,如果 nlist=4096 和 nprobe=16 的召回率为 85%,但您的目标是 90%,则将 nprobe 增加到 32 并重新测试。如果这样达到了 90%,但查询时间太慢,则尝试增加 nlist(例如,增加到 8192)并减少 nprobe(例如,减少到 24)。更大的 nlist 会减小聚类的大小,因此每个探测扫描的点数更少,这可能在较低的 nprobe 下保持召回率。但是,避免极端的 nlist 值,因为过多的聚类会使数据碎片化,需要更高的 nprobe 来弥补,从而抵消速度提升。
使用网格搜索或贝叶斯优化来自动化测试,以便高效地探索参数组合。例如,FAISS 的 autotune 功能等工具可以针对验证集测试 nlist/nprobe 对。数据集特征很重要:高维数据可能需要更大的 nlist 来保持聚类可管理,而较小的数据集可能在较低的 nlist 和适度的 nprobe 下表现最佳。始终在保留集上进行验证,以确保泛化能力。例如,一个 100 万向量的数据集使用 nlist=4096 和 nprobe=32 可能达到 90% 的召回率,但切换到 nlist=8192 和 nprobe=24 可能会在保持召回率的同时将查询时间缩短 20%,因为聚类大小更小。平衡索引构建时间(随 nlist 增加而增加)与查询速度提升。