このページでは、ベクトル インデックスを最適化し、近似最近傍(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
ステートメントの詳細を確認する。