ScaNN
インデックスに推奨されるパラメータは、2 レベルのツリー インデックスと 3 レベルのツリー インデックスのどちらを構築するかによって異なります。このページでは、レジュールと QPS のバランスを最適にするためにインデックス パラメータを調整する方法について説明します。
ScaNN インデックスの作成
詳細については、ScaNN インデックス リファレンスをご覧ください。
2 レベル ツリー インデックス
推奨事項を適用して、データセットに最適な num_leaves
と num_leaves_to_search
の値を見つけるには、次の推奨手順に沿って操作します。
- 次のケースに最適化された
ScaNN
インデックスを作成するには、num_leaves
パラメータを次の値に設定します。ここで、行はインデックスに登録されたテーブルの行数です。- インデックスのビルド時間と品質のバランスを取るには、
num_leaves
をsqrt(rows)
に設定します。 - quality で num_leaves を rows/100 に設定します。
- インデックスのビルド時間と品質のバランスを取るには、
- 目標の再現率範囲(95% など)に達するまで、テストクエリを実行し、
scann.num_of_leaves_to_search
の値を増やします。クエリの分析の詳細については、クエリを分析するをご覧ください。 - 以降のステップで使用する
scann.num_leaves_to_search
とnum_leaves
の比率をメモします。この比率は、目標の再現率を達成するために役立つデータセットの近似値を提供します。
高次元ベクトル(500 次元以上)を扱っていて、再現率を改善したい場合は、scann.pre_reordering_num_neighbors
の値を調整してみてください。デフォルト値は500 * K
に設定されています。ここで、K
はクエリで設定した上限です。 - クエリが目標レジュール達成後に QPS が低すぎる場合は、次の手順を行います。
- インデックスを再作成し、次のガイダンスに従って
num_leaves
とscann.num_leaves_to_search
の値を増やします。num_leaves
を行数の平方根の大きい係数に設定します。たとえば、インデックスでnum_leaves
が行数の平方根に設定されている場合は、平方根の 2 倍に設定してみてください。値がすでに 2 倍になっている場合は、平方根の 3 倍に設定してみてください。- 必要に応じて
scann.num_leaves_to_search
を増やし、ステップ 3 でメモしたnum_leaves
との比率を維持します。 num_leaves
は、行数を 100 で除算した値以下の値に設定します。
- テストクエリをもう一度実行します。テストクエリを実行しながら、
scann.num_leaves_to_search
を減らして、再現率を高く保ちながら QPS を増やす値を見つけます。インデックスを再ビルドせずに、scann.num_leaves_to_search
の値を変更してみます。
- インデックスを再作成し、次のガイダンスに従って
- QPS と再現率の範囲の両方が許容値に達するまで、手順 4 を繰り返します。
3 レベルのツリー インデックス
2 レベルのツリー ScaNN
インデックスの推奨事項に加えて、次のガイダンスを使用します。
推奨事項を適用して、num_leaves
インデックス パラメータと max_num_levels
インデックス パラメータの最適な値を確認する手順は次のとおりです。
パフォーマンス目標に基づいて、次の
num_leaves
とmax_num_levels
の組み合わせでScaNN
インデックスを作成します。- インデックスのビルド時間と品質のバランスを取る:
max_num_levels
を2
、num_leaves
をpower(rows, ⅔)
に設定します。 - 品質重視で最適化:
max_num_levels
を2
、num_leaves
をrows/100
に設定します。
- インデックスのビルド時間と品質のバランスを取る:
テストクエリを実行します。クエリの分析の詳細については、クエリを分析するをご覧ください。
以降のステップで使用する
scann.num_leaves_to_search
とnum_leaves
の比率をメモします。この比率は、目標の再現率を達成するのに役立つデータセットの近似値を提供します。
高次元ベクトル(500 次元以上)を扱っていて、再現率を改善したい場合は、scann.pre_reordering_num_neighbors
の値を調整してみてください。デフォルト値は 500 * K
に設定されています。ここで、K
はクエリで設定した上限です。
クエリがターゲット レジュール達成後に QPS が低すぎる場合は、次の手順を行います。
- インデックスを再作成し、次のガイダンスに従って
num_leaves
とscann.num_leaves_to_search
の値を増やします。 num_leaves
をpower(rows, ⅔)
の大きな係数に設定します。たとえば、インデックスでnum_leaves
がpower(rows, ⅔)
に設定されている場合は、power(rows, ⅔)
の 2 倍に設定してみてください。値がすでに 2 倍になっている場合は、power(rows, ⅔)
の 3 倍に設定してみてください。- ステップ 3 でメモした
num_leaves
との比率を維持するように、必要に応じてscann.num_leaves_to_search
を増やします。 num_leaves
はrows/100
以下の値に設定してください。- テストクエリをもう一度実行します。テストクエリを実行しながら、
scann.num_leaves_to_search
を減らして、再現率を高く保ちながら QPS を増やす値を見つけます。インデックスを再ビルドせずに、scann.num_leaves_to_search
の値を変更してみます。
- インデックスを再作成し、次のガイダンスに従って
QPS と再現率の範囲の両方が許容値に達するまで、手順 4 を繰り返します。
インデックスのメンテナンス
テーブルが頻繁に更新または挿入される場合は、再検索の精度を高めるために、既存の ScaNN
インデックスを定期的に再作成することをおすすめします。インデックス指標をモニタリングして、インデックスの作成以降のベクトル分布やベクトル変異の変化を確認し、必要に応じてインデックスを再作成できます。指標の詳細については、ベクトル インデックスの指標を表示するをご覧ください。