趋近智
选择和调优近似最近邻(ANN)算法存在一系列复杂的权衡。ANN 方法牺牲精确度(找到绝对最近邻)来获得显著的速度和效率,与精确最近邻搜索相比,尤其是在高维数据中。如何量化这种固有的权衡?你如何知道所选算法及其参数是否适合你的特定应用?需要一种系统化的评估方法来回答这些问题。
评估 ANN 性能不仅仅是衡量速度;它是关于理解搜索质量、查询速度、资源占用和索引构建时间之间的平衡。让我们看看评估这些方面的标准衡量指标。
评估 ANN 索引时,有几个定量指标可提供关于其表现的看法:
召回率(搜索准确度): 这可能是评估近似算法“质量”最重要的指标。Recall@K 衡量通过 ANN 搜索返回的前 K 个结果中,包含实际 K 个最近邻(通过精确搜索确定)的比例。
召回率@K=∣{真实邻居}∣∣{真实邻居}∩{ANN 结果}∣此处,{真实邻居} 是通过详尽搜索找到的实际前 K 个邻居的集合,而 {ANN 结果} 是 ANN 算法针对相同查询返回的前 K 个邻居的集合。召回率为 1.0 表示 ANN 搜索在前 K 个结果中找到了所有真实的最近邻。召回率为 0.8 表示它找到了 80%。较高的召回率表明搜索准确度更高,但这通常会以增加搜索时间为代价。
延迟(查询速度): 这衡量执行单个搜索查询所需的时间。它通常以毫秒 (ms) 为单位衡量,对于用户期望快速响应的交互式应用来说,这是一个重要的衡量指标。较低的延迟通常更好。它受 ANN 算法、索引参数(例如 HNSW 中的 ef_search 或 IVF 中的 nprobe)、数据集大小、向量维度以及所用硬件的影响。
吞吐量(每秒查询数 - QPS): 这衡量系统在给定时间段内(通常是一秒)可以并发处理多少个查询。延迟衡量单个查询的速度,而吞吐量则衡量系统的整体处理能力。高吞吐量对于服务大量并发用户的应用来说非常重要。通常,优化单个查询的低延迟可能与负载下优化最大 QPS 略有不同。
索引构建时间: 这是从初始向量数据集构建 ANN 索引所需的时间。尽管搜索性能通常是主要关注点,但构建时间是一个重要的因素,尤其是在需要因数据更新而频繁重建索引的情况下。一些算法(如 HNSW)的构建时间可能比其他算法(如更简单的 IVF)相对较长。
内存占用: 这指的是存储 ANN 索引结构所需的 RAM 量。索引通常需要驻留在内存中以实现快速查询。内存占用很大程度上取决于算法、其参数(例如 HNSW 中的 M 会影响连接性以及因此的大小)以及被索引的向量数量。较低的内存占用意味着更低的硬件成本和潜在的更好可伸缩性。
配置 ANN 索引的核心挑战在于平衡召回率与延迟或吞吐量等性能指标。你几乎总是面临权衡:提高召回率通常要求算法在搜索过程中检查更多潜在的候选项,这会增加延迟并降低吞吐量。反之,使搜索更快(更低延迟,更高 QPS)通常会检查更少的候选项,这可能会降低召回率。
索引参数直接控制这种平衡。例如:
ef_search(在搜索过程中检查的入口点动态列表的大小)通常会提高召回率但增加搜索时间。增加 M(在构建过程中每个节点连接的邻居数量)可以提高召回率潜力但增加索引大小和构建时间。nprobe(在搜索过程中需要访问的倒排列表单元格数量)通过检查更多潜在候选项来提高召回率,但直接增加延迟。将这种权衡可视化很有帮助。你可以将 Recall@K 对平均查询延迟(或 QPS)进行绘图,以显示特定 ANN 算法在你的数据集上不同参数设置的效果。
此图展示了增加搜索工作量(沿着 x 轴向右移动,表示更高的延迟)通常会带来更好的召回率(沿着 y 轴向上移动)。不同的算法或参数系列可能会提供不同的权衡曲线。
为了准确计算召回率,你需要一个“真实参考”——测试查询的真实最近邻集合。这通常通过执行精确的 k-最近邻(k-NN)搜索来获得,例如使用查询向量与数据集中所有向量之间的暴力距离计算方法。
生成真实参考可能计算密集,对于大型数据集有时需要数小时甚至数天。因此,评估通常在数据的代表性子集和一小部分测试查询上进行。Faiss 等库为精确 k-NN(对在 GPU 上生成真实参考很有用)和各种 ANN 算法提供了高效的实现。
一致且实际的基准测试对于有效比较不同 ANN 算法或参数设置非常重要。
每个指标的相对重要性很大程度上取决于你的应用需求:
通过理解这些评估指标及其固有的权衡,你可以系统地测试不同的 ANN 算法和参数。这使你能够选择最符合你的向量搜索应用在准确性、速度和资源限制方面需求的配置。接下来实际操作部分将为你提供直接体验这些内容的练习机会。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造