ベクトル インデックス登録のベスト プラクティス

このページでは、ベクトル インデックスを最適化し、近似最近傍(ANN)クエリ結果を改善するベクトル インデックスのベスト プラクティスについて説明します。

ベクトル検索オプションを調整する

ベクトル インデックス オプションに最適な値は、ユースケース、ベクトル データセット、クエリベクトルによって異なります。これらの値を設定して調整するには、新しいベクトル インデックスを作成し、CREATE VECTOR INDEX ステートメントで index_option_list を設定します。特定のワークロードに最適な値を見つけるには、反復的な調整作業が必要になる場合があります。

適切な値を選択する際のガイドラインは次のとおりです。

  • tree_depth(ツリーレベル): インデックスに登録するテーブルの行数が 1, 000 万行未満の場合は、tree_depth2 を使用します。それ以外の場合、3tree_depth は最大 100 億行のテーブルをサポートします。

  • num_leaves: データセット内の行数の平方根を使用します。値が大きいと、ベクトル インデックスのビルド時間が長くなる可能性があります。num_leavestable_row_count を 1,000 で割った値より大きく設定しないでください。リーフが小さくなりすぎ、パフォーマンスが低下します。

  • num_leaves_to_search: このオプションは、インデックスのリーフノードを検索する数を指定します。num_leaves_to_search を増やすと再現率は向上しますが、レイテンシとコストも増加します。num_leaves_to_search の値には、CREATE VECTOR INDEX ステートメントで定義されたリーフの合計数の 1% の値を使用することをおすすめします。フィルタ句を使用している場合は、この値を増やすと検索範囲が広がります。

許容できる再現率が達成されたものの、クエリのコストが高すぎて最大 QPS が低い場合は、次の手順で num_leaves を増やしてみてください。

  1. num_leaves を元の値の k 倍に設定します(例: 2 * sqrt(table_row_count))。
  2. num_leaves_to_search を、元の値の k 倍と同じ値に設定します。
  3. num_leaves_to_search を減らして、再現率を維持しながらコストと QPS を改善します。

再現率を改善する

再現率を改善するには、num_leaves_to_search 値の調整またはベクトル インデックスの再構築を検討してください。

num_leaves_to_search の値が小さすぎると、一部のクエリベクトルの最近傍を見つけるのが難しくなることがあります。num_leaves_to_search の値を大きくして新しいベクトル インデックスを作成すると、より多くのリーフを検索して再現率を向上させることができます。最近のクエリには、このような難しいベクトルがより多く含まれている可能性があります。

ベクトル インデックスを再構築する

ベクトル インデックスのツリー構造は、作成時にデータセット用に最適化され、その後は静的になります。したがって、最初のベクトル インデックスの作成後に大幅に異なるベクトルが追加された場合、ツリー構造が最適でなくなり、再現率が低下する可能性があります。

ダウンタイムなしでベクトル インデックスを再構築するには:

  1. 現在のベクトル インデックスと同じエンベディング列に新しいベクトル インデックスを作成し、必要に応じてパラメータ(OPTIONS など)を更新します。
  2. インデックスの作成が完了したら、FORCE_INDEX ヒントを使用して新しいインデックスを参照し、ベクトル検索クエリを更新します。これにより、クエリで新しいベクトル インデックスが使用されます。新しいクエリで num_leaves_to_search の再調整が必要になる場合もあります。
  3. 古いベクトル インデックスを削除します。

次のステップ