ScaNN 索引参考文档

本页面提供了 ScaNN 索引的参考资料。

调参参数

以下索引参数和数据库标志可搭配使用,以便找到检索率和 QPS 之间的适当平衡点。

调优参数 说明 选项类型
max_num_levels K-means 聚类树的中心点层级数上限。
  • 两级树索引:默认情况下,对于两级树(1 个重心级别 + 底部叶级别),设置为 1
  • 三层树索引:默认设置为 2,适用于三层树(2 个重心层级 + 底部叶级)
  • 如果矢量行数超过 1 亿行,请将此值设置为 2
  • 如果矢量行数少于 1,000 万行,请将此值设为 1
  • 如果向量行数介于 1,000 万到 1 亿行之间,请将其设置为 12,以针对索引构建时间(设置为 2)或搜索召回率(设置为 1)进行优化。
索引创建
(可选)
num_leaves 要应用于此索引的分区数。创建索引时应用到的分区数量会影响索引性能。通过为固定数量的向量增加分区,您可以创建更精细的索引,从而提高召回率和查询性能。不过,代价是索引创建时间会延长。

由于三级树的构建速度比二级树快,因此您可以在创建三级树索引时增加 num_leaves_value,以便获得更好的性能。
  • 两级索引:将此值设置为介于 11048576 之间的任意值。

    如需构建一个可平衡快速索引构建和良好搜索性能的索引,请使用 sqrt(ROWS) 作为起点,其中 ROWS 是向量行数。每个分区包含的矢量数量由
    ROWS/sqrt(ROWS) = sqrt(ROWS) 计算得出。

    由于可以在矢量行数少于 1,000 万的数据集上创建两级树索引,因此每个分区将包含的矢量数量少于 (sqrt(10M)),即 3200 个矢量。为了获得最佳的矢量搜索质量,建议尽可能减少每个分区中的矢量数量。建议的分区大小为每个分区约 100 个矢量,因此请将 num_leaves 设置为 ROWS/100。如果您有 1,000 万个向量,则将 num_leaves 设置为 10 万。
  • 三级索引:将此值设置为介于 11048576 之间的任意值。

    如果您不确定如何选择确切值,请使用 power(ROWS, 2/3) 作为起点,其中 ROWS 是矢量行数。每个分区包含的矢量数量由
    ROWS/power(ROWS, 2/3) = power(ROWS, 1/3) 计算得出。

    由于三级树索引可在矢量行数超过 1 亿的数据集上创建,因此每个分区将包含超过
    (power(100M, 1/3)) 个矢量,即 465 个矢量。为了获得最佳的矢量搜索质量,建议尽可能减少每个分区中的矢量数量。建议的分区大小为每个分区约 100 个矢量,因此请将 num_leaves 设置为 ROWS/100。如果您有 1 亿个向量,则应将 num_leaves 设置为 100 万。
索引创建
(必需)
quantizer 您要为 K 均值树使用的量化器类型。默认值设为 SQ8,可在最大限度地减少召回率损失(通常低于 1-2%)的情况下提供更好的查询性能。

如果需要召回率达到 99% 或更高,请将其设为 FLAT
索引创建
(可选)
scann.enable_pca 启用主成分分析 (PCA),这是一种降维技术,用于尽可能自动缩减嵌入的大小。此选项默认处于启用状态。

如果您发现回想能力下降,请将其设为 false
索引创建
(可选)
scann.num_leaves_to_search 此数据库标志用于控制要搜索的叶或分区的绝对数量,以便您在召回率和 QPS 之间进行权衡。默认值为 num_leaves 中设置的值的 1%。

值越高,召回率越高,但 QPS 越低。同样,值越低,召回率越低,但 QPS 越高。
查询运行时
(可选)
scann.pre_reordering_num_neighbors 设置数据库标志后,该标志会指定在初始搜索确定一组候选项后,重新排序阶段要考虑的候选邻居数量。将此参数设置为高于您希望查询返回的邻居数量的值。

值越高,召回率越高,但 QPS 越低。将此值设置为 0 可停用重新排序。如果在创建索引期间未启用 PCA,则默认值为 0。否则,默认值为 50 x K,其中 K 是查询中指定的 LIMIT。
查询运行时
(可选)
scann.num_search_threads 多线程搜索的搜索器线程数。这有助于在对延迟敏感的应用中为 ScaNN ANN 搜索使用多个线程,从而缩短单个查询的延迟时间。如果数据库已达到 CPU 限制,此设置不会缩短单个查询的延迟时间。默认值为 2 查询运行时
(可选)

后续步骤