比较向量索引的性能#
本文档简要概述了比较向量搜索索引和模型的方法。有关如何选择和配置索引类型的指导,请参阅此指南。
与传统数据库索引不同(传统索引即使未经性能调优通常也能返回正确结果),向量搜索索引与机器学习模型更密切相关,如果未经调优,它们可能会返回完全无效的结果。
因此,在比较两个训练好的索引时,考虑构建索引所基于的参数非常重要,这既关系到其潜在质量,也关系到吞吐量/延迟。虽然使用默认参数构建索引比调优更容易,但调优良好的索引可以显著提高搜索质量,并且在最大吞吐量和最小延迟等搜索性能限制内表现良好。
什么是召回率?#
召回率是衡量模型质量的一个指标。想象一下,对于一个特定的向量,我们已经计算出它的确切最近邻。查询结果的召回率可以通过计算确切最近邻和实际最近邻之间的集合交集来计算。交集列表中的邻居数量除以 k,即请求的邻居数量。为了真正公平地评估模型的召回率,我们使用多个查询向量,所有向量都已计算出真实值,然后我们将所有相交邻居列表中的总邻居数除以 n_queries * k。
参数设置决定了索引的质量。下图显示了来自相同数据的八个索引,但使用了不同的调优参数。一般来说,平均召回率较高的索引构建时间更长。报告哪个索引更公平?

如何比较模型或索引算法?#
为了公平地比较一个索引算法或模型与另一个算法或模型的性能(例如延迟和吞吐量),我们总是需要根据其潜在的召回率进行比较。这很重要,并且源于向量搜索的机器学习根源,但对于可能更熟悉数据库世界的新手来说常常令人困惑。
最佳实践:延迟和吞吐量只能在相似的召回率水平下进行比较。如果在不同的召回率水平下测量两个索引的性能,则是在进行不公平的比较。
由于不同参数设置下的召回率水平可能差异很大,我们倾向于在少量潜在桶内比较召回率,以便可以公平地比较每个桶内表现的参数设置。
我们建议在一定召回率范围内平均性能。一般而言,我们倾向于使用以下桶:
85% - 89%
90% - 94%
95% - 99%
>99%

这使我们能够得出诸如“在 95% 召回率水平下,模型 A 的构建速度是模型 B 的 3 倍,但模型 B 的延迟比模型 A 低 2 倍”之类的结论。

另一个重要的细节是,我们在每个召回率窗口内比较这些模型在其最佳搜索性能下的表现。这意味着我们旨在找到不仅具有出色召回质量,而且在目标窗口内具有最高吞吐量或最低延迟的模型。这些最佳情况通常通过在网格搜索(或其他类型的搜索优化器)中进行参数扫描并查看每个召回率水平下的最佳情况来计算。
结果数据点将构建一条称为帕累托最优的曲线。请注意,此过程专门用于展示召回率和吞吐量/延迟方面的最佳情况,但当我们关心找到能够产生最佳召回率和搜索性能的参数时,我们实际上是在执行超参数优化,这在机器学习中很常见。
如何在大型向量数据库上执行此操作?#
事实证明,大多数向量数据库,例如 Milvus,会为单个“索引”创建许多较小的向量搜索索引模型,并且假定向量在这些较小索引模型中的分布是完全均匀的。这意味着我们可以利用子采样,并在整体数据集的较小子样本上进行调优。
但是请注意,这些较小的索引的大小通常有限制,在选择用于调优的子样本大小时需要考虑这一点。
有关执行此子采样和调优过程的步骤的更多信息,请参阅本指南。