このページでは、ベクトル インデックスを最適化し、近似最近傍(ANN)クエリ結果を改善するベクトル インデックスのベスト プラクティスについて説明します。
ベクトル検索オプションを調整する
ベクトル インデックス オプションに最適な値は、ユースケース、ベクトル データセット、クエリベクトルによって異なります。これらの値を設定して調整するには、新しいベクトル インデックスを作成し、CREATE VECTOR INDEX ステートメントで index_option_list を設定します。特定のワークロードに最適な値を見つけるには、反復的なチューニング作業が必要になる場合があります。
適切な値を選択する際のガイドラインは次のとおりです。
tree_depth(ツリーレベル): インデックスに登録するテーブルの行数が 1,000 万行未満の場合は、tree_depthに2を使用します。それ以外の場合、3のtree_depthは最大 100 億行のテーブルをサポートします。num_leaves: データセット内の行数の平方根を使用します。値が大きいと、ベクトル インデックスのビルド時間が長くなる可能性があります。num_leavesをtable_row_countを 1,000 で割った値より大きく設定しないでください。リーフが小さくなりすぎてパフォーマンスが低下します。num_leaves_to_search: このオプションは、インデックスのリーフノードを検索する数を指定します。num_leaves_to_searchを増やすと再現率は向上しますが、レイテンシとコストも増加します。num_leaves_to_searchの値には、CREATE VECTOR INDEXステートメントで定義されたリーフの合計数の 1% の値を使用することをおすすめします。フィルタ句を使用している場合は、この値を増やすと検索範囲が広がります。
許容できる再現率が達成されたものの、クエリのコストが高すぎて最大 QPS が低い場合は、次の手順で num_leaves を増やしてみてください。
num_leavesを元の値の k 倍に設定します(例:2 * sqrt(table_row_count))。num_leaves_to_searchを、元の値の k 倍と同じ値に設定します。num_leaves_to_searchを減らして、再現率を維持しながらコストと QPS を改善します。
再現率を改善する
再現率を改善するには、num_leaves_to_search 値のチューニングまたはベクトル インデックスの再構築を検討してください。
num_leaves_to_search 値を大きくする
num_leaves_to_search の値が小さすぎると、一部のクエリベクトルの最近傍を見つけることが難しくなる場合があります。num_leaves_to_search の値を大きくして新しいベクトル インデックスを作成すると、より多くのリーフを検索して再現率を向上させることが可能です。最近のクエリには、このような難しいベクトルがより多く含まれている可能性があります。
ベクトル インデックスを再構築する
ベクトル インデックスのツリー構造は、作成時にデータセット用に最適化され、その後は静的になります。したがって、最初のベクトル インデックスの作成後に大幅に異なるベクトルが追加された場合、ツリー構造が最適でなくなり、再現率が低下する可能性があります。
ダウンタイムなしでベクトル インデックスを再構築するには:
- 現在のベクトル インデックスと同じエンベディング列に新しいベクトル インデックスを作成し、必要に応じてパラメータ(
OPTIONSなど)を更新します。 - インデックスの作成が完了したら、
FORCE_INDEXヒントを使用して新しいインデックスを参照し、ベクトル検索クエリを更新します。これにより、クエリで新しいベクトル インデックスが使用されます。新しいクエリでnum_leaves_to_searchの再調整が必要になる場合もあります。 - 古いベクトル インデックスを削除します。
次のステップ
Spanner のベクトル インデックスの詳細を確認する。
Spanner の近似最近傍の詳細を確認する。
GoogleSQL の
VECTOR INDEXステートメントの詳細を確認する。