View a markdown version of this page

ベクトルインデックスのベストプラクティス - Amazon DynamoDB

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

以下の推奨事項は、正確でパフォーマンスが高く、費用対効果の高いベクトルインデックスの設計に役立ちます。

最初に埋め込みモデルとディメンションを選択する

使用する埋め込みモデルによってベクトルのディメンション数が決まり、インデックスの作成時に Dimensions 設定します。作成後にディメンション数を変更することはできません。インデックスを作成する前に埋め込みモデルを決定し、同じモデルを使用して保存されるベクトルとクエリベクトルの両方を生成します。ディメンションが少ないほど検索、書き込み、ストレージのコストを削減できますが、ディメンションが多いモデルのほうが、意味的な詳細をキャプチャできます。関連性の要件を満たす最小限のディメンション数を選択します。「ベクトル埋め込みの生成」を参照してください。

距離関数を埋め込みに一致させる

埋め込みモデルが類似度をどのように表現するかに合った距離関数を選択します。COSINE は方向を比較し、大きさを無視するため、ほとんどのテキスト埋め込みモデルに適しています。EUCLIDEAN は絶対距離を測定し、大きさの影響を受けます。DOT_PRODUCT も大きさの影響を受けます。これを使用する場合は、埋め込みを単位長に正規化して、スコアがベクトルの長さではなく方向を反映するようにします。インデックスの作成後に距離関数を変更することはできないため、まず代表的なデータセットを使って選択を検証してください。「距離関数による結果のランク付け」を参照してください。

クエリパターンに合ったパーティションキーを選択する

パーティションキーは、各 SearchVectors 呼び出しを単一のパーティションキー値に属するベクトルインデックスの範囲に制限します。その呼び出しは、インデックス全体を検索しません。検索するデータを減らすと、コストを削減し、レイテンシーと再現率を向上させ、パーティションキー値全体でスループットを水平方向にスケーリングできます。

検索のたびに、SearchConditionExpression にパーティションキーの値を指定する必要があります。各検索の範囲は、単一のパーティションキー値のみです。アプリケーションがサポートするクエリパターンに一致するパーティションキーを選択します。

例えば、ロケーションベースのデータを米国の州別に保存する場合、パーティションキーの値は約 50 個になります。各州は、再現率を高めるために意味のある数のベクトルを保持します。50 個のパーティションによって、水平方向のスループットを最大で約 50 倍にスケールできます。これは、各検索が単一の州をターゲットとする場合に機能します。

どちらの方向でも極端なカーディナリティは避けてください。

  • 高すぎる (一意の項目 ID など) – 各パーティションに項目が 1 つしか含まれず、比較対象となるネイバーが存在しないため、再現率が低くなります。

  • 低すぎる (ブール値など) – ほとんどの項目が 1 つのパーティションに配置されるため、スループットのスケーリングが制限され、レイテンシーやコスト面での利点が減ります。

パーティション内でさらにフィルタリングするには、インラインフィルター属性を使用します。

スループットの例。768 次元の埋め込みモデル (Cohere Embed v3 など) と 1 KB の非ベクトル項目データを使用する場合を想定すると、項目の合計サイズは約 4 KB (768 次元 × 4 バイト + 1 KB) となります。この項目サイズでは、パーティションキーごとの制限は次のようになります。

  • 検索: 1 GBps ÷ 4 KB ≈ パーティションキー値ごとに 1 秒あたり 250,000 個のベクトルが検査されます。パーティション内のベクトルの数が増えると、各検索はより多くのデータを調べ、この制限に達するまでの時間が早まります。

  • 書き込み: 10 MBps ÷ 4 KB ≈ パーティションキー値あたり 1 秒あたり 2,500 個のベクトル書き込み

より多くのパーティションキー値にデータを分散すると、これらの制限が倍増します。例えば、50 個のパーティションキー値を使用すると、検索と書き込みの合計スループットが最大 50 倍になります。ワークロードがこれらのパーティションキーごとの制限を超える場合は、AWS サポートにお問い合わせください。

埋め込みをソースコンテンツと同期させる

DynamoDB は、埋め込みを自動的に再計算することはありません。埋め込みが表すソースコンテンツを変更するたびに、同じ埋め込みモデルを使用してベクトルを再生成し、項目に書き戻します。そうしないと、インデックスは古いベクトルに基づいて結果を返し続けます。DynamoDB Streams でコンテンツの変更をキャプチャし、ダウンストリームプロセスで影響を受ける埋め込みを再生成および書き換えることを検討してください。

必要な属性のみを射影する

SearchVectors は、ベクトルインデックスに射影されていない属性を返すことはできません。より多くの属性を射影すると、インデックスストレージと書き込みコストが増加します。アプリケーションが検索結果から直接読み取る属性を射影し、それ以外の属性は必要に応じてベーステーブルへのフォローアップ GetItem または BatchGetItem で取得するようにします。

複数のインデックスを使用して埋め込みモデルを比較する

1 つのテーブルに最大 5 つのベクトルインデックスを作成できます。個別のインデックスを使用して、さまざまな埋め込みモデルまたはモデルバージョンを並べて評価します。各モデルの埋め込みを異なるベクトル属性に保存し、それぞれにベクトルインデックスを作成します。これにより、本番稼働用インデックスを移行することなく、同一の基盤データを用いてモデル間の検索品質を比較できます。

例えば、あるモデルバージョンから別のモデルバージョンにアップグレードする場合は、新しいモデルのディメンションと距離関数を使用した 2 つ目のインデックスを作成します。新しいモデルからの埋め込みでバックフィルし、両方のインデックスに対してテストクエリを実行し、関連性を比較します。問題がなければ、アプリケーションを新しいインデックスに移行し、古いインデックスを削除します。