调整 ScaNN 索引的最佳实践

ScaNN 索引的建议参数因您选择构建二级树索引还是三级树索引而异。本页提供了有关如何调整索引参数以在召回率和 QPS 之间取得最佳平衡的建议。

ScaNN 索引创建

如需了解详情,请参阅 ScaNN 索引参考文档

两级树索引

如需应用建议来帮助您为数据集找到 num_leavesnum_leaves_to_search 的最佳值,请按照以下建议步骤操作:

  1. 如需创建针对以下情况进行了优化的 ScaNN 索引,请将 num_leaves 参数设置为以下值,其中 rows 是编入索引的表中的行数:
    • 平衡索引构建时间和质量:将 num_leaves 设置为 sqrt(rows)
    • quality 将 num_leaves 设置为 rows/100。
  2. 运行测试查询,并增加 scann.num_of_leaves_to_search 的值,直到达到目标召回率范围(例如 95%)。如需详细了解如何分析查询,请参阅分析查询
  3. 记下 scann.num_leaves_to_searchnum_leaves 之间的比率,以备后用。此比率可提供关于数据集的大致估算值,有助于您实现目标召回率。

    如果您使用的是高维向量(500 个维度或更高),并且希望提高召回率,请尝试调整 scann.pre_reordering_num_neighbors 的值。默认值设置为 500 * K,其中 K 是您在查询中设置的限制。
  4. 如果查询达到目标召回率后 QPS 过低,请按以下步骤操作:
    1. 重新创建索引,并根据以下指南增加 num_leavesscann.num_leaves_to_search 的值:
      • num_leaves 设置为行数平方根的较大系数。例如,如果索引将 num_leaves 设置为行数的平方根,请尝试将其设置为平方根的两倍。如果该值已是双倍,请尝试将其设置为立方根的三倍。
      • 根据需要增加 scann.num_leaves_to_search,以保持其与 num_leaves(您在第 3 步中记录的值)的比率。
      • num_leaves 设置为小于或等于行数除以 100 的值。
    2. 再次运行测试查询。 在运行测试查询时,尝试降低 scann.num_leaves_to_search,找到一个值,使其能够提高 QPS 并保持较高的召回率。尝试使用不同的 scann.num_leaves_to_search 值,而无需重新构建索引。
  5. 重复第 4 步,直到 QPS 和召回率范围均达到可接受的值。

三级树索引

除了针对两级树 ScaNN 索引的建议之外,请遵循以下指南。

如需应用建议以查找 num_leavesmax_num_levels 索引参数的最佳值,请按以下步骤操作:

  1. 根据您的效果目标,使用以下 num_leavesmax_num_levels 组合创建 ScaNN 索引:

    • 平衡索引构建时间和质量:将 max_num_levels 设置为 2,将 num_leaves 设置为 power(rows, ⅔)
    • 以提高画质为目标进行优化:将 max_num_levels 设置为 2,将 num_leaves 设置为 rows/100
  2. 运行测试查询。如需详细了解如何分析查询,请参阅分析查询

  3. 记下 scann.num_leaves_to_searchnum_leaves 之间的比率,以备后续步骤使用。此比率可大致估算数据集,有助于您实现目标召回率。

如果您使用的是高维向量(500 个维度或更高),并且希望提高召回率,请尝试调整 scann.pre_reordering_num_neighbors 的值。默认值设置为值 500 * K,其中 K 是您在查询中设置的限制。

  1. 如果查询达到目标召回率后 QPS 过低,请按以下步骤操作:

    • 重新创建索引,并根据以下指南提高 num_leavesscann.num_leaves_to_search 的值:
    • num_leaves 设置为 power(rows, ⅔) 的较大因子。例如,如果索引将 num_leaves 设置为 power(rows, ⅔),请尝试将其设置为 power(rows, ⅔) 的两倍。如果该值已经是原来的两倍,请尝试将其设置为 power(rows, ⅔) 的三倍。
    • 根据需要增加 scann.num_leaves_to_search,使其与您在第 3 步中记录的 num_leaves 保持相同的比例。
    • num_leaves 设置为小于或等于 rows/100 的值。
    • 再次运行测试查询。在运行测试查询时,尝试降低 scann.num_leaves_to_search,找到一个值,使其能够提高 QPS 并保持较高的召回率。尝试使用不同的 scann.num_leaves_to_search 值,而无需重新构建索引。
  2. 重复第 4 步,直到 QPS 和召回率范围均达到可接受的值。

索引维护

如果您的表容易频繁更新或插入,我们建议您定期重新编制现有 ScaNN 索引,以提高召回准确性。 您可以监控索引指标,查看自索引构建以来向量分布或向量更改的变化,然后相应地重新编制索引。如需详细了解指标,请参阅查看矢量索引指标

后续步骤