ScaNN インデックスの作成
詳細については、ScaNN インデックス リファレンスをご覧ください。
2 レベル ツリー インデックス
推奨事項を適用して、データセットに最適な num_leaves と num_leaves_to_search の値を見つけるには、次の推奨手順に沿って操作します。
- 次のケースに最適化された ScaNNインデックスを作成するには、num_leavesパラメータを次の値に設定します。ここで、「rows」はインデックス付きテーブルの行数です。- インデックスのビルド時間と品質のバランスを取るには、num_leavesをsqrt(rows)に設定します。
- 品質を重視するには、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 倍に設定してみてください。
- 必要に応じて scann.num_leaves_to_searchを増やし、ステップ 3 でメモしたnum_leavesとの比率を維持します。
- num_leavesは- rows/100以下の値に設定してください。
- テストクエリをもう一度実行します。テストクエリを実行しながら、scann.num_leaves_to_searchを減らしてみて、高い再現率を維持しつつ QPS を高める値を見つけます。インデックスを再ビルドせずに、scann.num_leaves_to_searchの値を変更してみてください。
 
- インデックスを再作成し、次のガイダンスに従って 
- QPS と再現率の範囲の両方が許容値に達するまで、手順 4 を繰り返します。 
インデックスのメンテナンス
テーブルの更新や挿入が頻繁に発生する場合は、再現率と精度を高めるために、既存の ScaNN インデックスを定期的に再作成することをおすすめします。インデックス指標をモニタリングすることで、インデックス作成以降のベクトル分布やベクトル変異の変化を確認し、必要に応じてインデックスを再作成できます。各指標の詳細については、ベクトル インデックス指標をご覧ください。