DynamoDB でのベクトルインデックスの使用
ベクトルインデックスは Amazon DynamoDB のインデックスの一種で、テーブルの項目に保存されているベクトル埋め込みの類似度検索を有効にします。Query および Scan オペレーションを使用した完全一致クエリや範囲クエリをサポートするグローバルセカンダリインデックスやローカルセカンダリインデックスとは異なり、ベクトルインデックスは近似最近傍 (ANN) 検索を使用して、指定したクエリベクトルに最も近いベクトルを持つ項目を検索します。これらの類似度検索は、類似度スコアでランク付けされた最も類似した項目を返す SearchVectors API を呼び出して実行します。
ベクトルインデックスを使用すると、ベクトル埋め込みを運用データと一緒に DynamoDB に保存し、別のベクトルデータベースを必要とせずに類似度検索を実行できます。これにより、DynamoDB と外部ベクトルストア間の複雑なデータレプリケーションパイプラインが不要になります。
ベクトルインデックスは、VectorIndexes パラメータ (CreateTable の場合) と VectorIndexUpdates パラメータ (UpdateTable の場合) を使用して、既に使用しているのと同じ CreateTable および UpdateTable API を通じて管理されます。
トピック
ベクトルインデックスのユースケース
ベクトルインデックスは、ベクトル表現に基づいて類似した項目を検索するさまざまなユースケースをサポートします。
-
セマンティック検索 – キーワードの一致ではなく、クエリの意味を理解する検索エンジンを構築します。機械学習モデルによって生成されたテキスト埋め込みを保存し、意味的に類似したコンテンツを見つけます。
-
検索拡張生成 (RAG) – 大規模言語モデル (LLM) を関連するナレッジベースに接続します。ドキュメントの埋め込みを DynamoDB に保存し、LLM プロンプトに最も関連性の高いコンテキストを取得します。
-
レコメンデーションシステム – 特徴や行動のベクトル表現に基づいて、類似した製品、コンテンツ、またはユーザーを検索します。
-
AI エージェントメモリ – 会話の埋め込みを保存してセッション間のコンテキストを維持し、AI エージェントのパフォーマンスを向上させます。
-
異常検出および不正検出 – 新しいイベントを既知の通常の動作の埋め込みと比較して、異常なトランザクションや不正行為などの外れ値にフラグを付けます。
ベクトルインデックスとセカンダリインデックスの比較
次の表は、ベクトルインデックスとグローバルセカンダリインデックスおよびローカルセカンダリインデックスを比較したものです。
| 機能 | ベクトルインデックス | グローバルセカンダリインデックス | ローカルセカンダリインデックス |
|---|---|---|---|
| クエリタイプ | 類似度検索 | 完全一致と範囲 | 完全一致と範囲 |
| API の読み取り | SearchVectors |
Query, Scan |
Query, Scan |
| スキーマ | ベクトル属性とオプションの SearchSchema (パーティションキー、インラインフィルター) | パーティションキー (複数可) とオプションのソートキー (複数可) | 同じパーティションキー、異なるソートキー |
| テーブルあたりの最大数 | 5 | 20 | 5 |
| キャパシティモード | オンデマンドのみ | オンデマンドまたはプロビジョニング済み | オンデマンドまたはプロビジョニング済み |
距離関数
ベクトルインデックスを作成するときは、距離関数を選択します。距離関数は、DynamoDB がベクトル間の類似性を測定する方法を決定します。選択した距離関数は、ランキングの品質と検索の精度に影響します。Amazon DynamoDB は 3 つの距離関数をサポートしています。
| 距離関数 | スコア解釈 | ベストマッチ |
|---|---|---|
COSINE |
スコアが低いほど類似度が高いことを示します。2 つのベクトル間のコサイン距離 (1 からコサイン類似度を引いた値) を測定します。値の範囲は 0 (同一方向) から 2 (反対方向) です。 | 最小スコア |
DOT_PRODUCT |
スコアが高いほど類似度が高いことを示します。2つのベクトル間のドット積を測定します。 | 最高スコア |
EUCLIDEAN |
スコアが低いほど類似度が高いことを示します。2つのベクトル間の直線距離を測定します。 | 最小スコア |
距離関数が同じクエリベクトルをどのようにランク付けするかを比較するには、「距離関数による結果のランク付け」を参照してください。
次のガイダンスは、ワークロードに適した距離関数を選択するのに役立ちます。
COSINE-
方向を比較し、大きさを無視します。テキスト埋め込みモデルを用いたセマンティック類似性には
COSINEを使用します。これらのモデルは意味を方向によってエンコードし、ベクトルの長さは異なる場合があります。例としては、Amazon Titan Text Embeddings や Cohere Embed などがあります。COSINEは、以下のユースケースに最適です。-
製品の説明またはドキュメントに対するセマンティック検索
-
検索拡張生成 (RAG)
-
よくある質問のマッチング
COSINEは、使用する関数が不明な場合の安全なデフォルトです。 -
DOT_PRODUCT-
DOT_PRODUCTは、方向と大きさ (ベクトルの長さ) の両方に影響を受けます。埋め込みモデルのドキュメントで類似度指標としてドット積を推奨している場合、またはベクトルの長さをランキングに影響させたい場合は、DOT_PRODUCTを選択します。DOT_PRODUCTは、以下のユースケースに最適です。-
人気スコアまたは信頼スコアを使用して埋め込みをスケールし、ランキングに影響を与えるレコメンデーションシステム
-
ドキュメントにおいて、類似度指標としてドット積が特に推奨されているモデル
-
ベクトル長が意味のあるシグナルを伝達する、大きさの影響を受けるランキング
埋め込みを単位長さに正規化することをお勧めします。正規化すると、
DOT_PRODUCTはCOSINEと同じ方法で結果をランク付けします。大きさがランキングに影響する場合にのみ正規化をスキップします。ユースケースの例: 各製品の埋め込みを、人気度スコアでスケールする製品レコメンデーションシステム。人気のある製品では、ベクトルが長くなり、検索結果のランクが高くなります。
-
EUCLIDEAN-
2 つのベクトル間の直線距離を測定します。
EUCLIDEANは大きさに影響を受けます。埋め込みスペースの絶対位置が重要な場合に使用します。EUCLIDEANは、以下のユースケースに最適です。-
空間距離が重要な画像または音声の埋め込み
-
ほぼ重複しているデータの検出
-
クラスタリングと異常検出
ユースケースの例: 画像の埋め込みからほぼ重複する画像を見つける。
-
埋め込みモデルに合った距離関数を選択する
使用する関数が不明な場合は、埋め込みモデルのドキュメントを確認してください。代表的なデータセットを用いて、その選択を検証します。インデックスの作成後に距離関数を変更することはできません。詳細については、「距離関数を埋め込みに一致させる」を参照してください。
距離関数による結果のランク付け
インデックスの作成時に選択する距離関数によって、Score 値と結果のソート順序の両方が決まります。同じクエリでも、異なる距離関数を使用すると、同じ項目のランク付けが異なる場合があります。次の例では、4 つの保存されたベクトルに対してクエリベクトル [1, 0, 0, 0] を使用します。
| 保存されたベクトル | COSINE (値が低いほど類似度が高い) |
EUCLIDEAN (値が低いほど類似度が高い) |
DOT_PRODUCT (値が高いほど類似度が高い) |
|---|---|---|---|
[1, 0, 0, 0] |
0.0 | 0.0 | 1.0 |
[10, 0, 0, 0] |
0.0 | 9.0 | 10.0 |
[0.7071, 0.7071, 0, 0] |
0.29 | 0.77 | 0.71 |
[-1, 0, 0, 0] |
2.0 | 2.0 | -1.0 |
次の 2 つの動作に注意してください。
-
COSINEは大きさを無視します。同じ方向を指すため、[1, 0, 0, 0]と[10, 0, 0, 0]を同じようにスコアリングします (両方とも0.0)。EUCLIDEANは、ベクトルの大きさに応じて増加する絶対距離を測定するため、同じクエリに対して[10, 0, 0, 0]を最下位にランク付けします。 -
DOT_PRODUCTのスコアは負の値になる場合があります。反対方向を指すベクトル ([-1, 0, 0, 0]) のスコアは-1.0です。結果をソートしたり、しきい値を適用したりするときに、スコアが常に負でないと想定しないでください。
SearchSchema
ベクトルインデックスを作成するときに、オプションでベクトルインデックスのパーティションキーとインラインフィルター属性を指定する SearchSchema を定義できます。
HASH(ベクトルインデックスのパーティションキー)-
ベクトルインデックスのパーティションキーは、独立したスケーリングのために、インデックスデータをパーティション分割します。ベクトルインデックスのパーティションキーを指定すると、同じパーティションキー値を持つ項目が一緒に保存されるため、システムは関連するデータのみを検索できます。大規模な場合、検索はインデックス全体ではなくベクトルスペースのサブセットのみを調べるため、検索レイテンシーが短縮されます。
CategoryやCountryなど、低〜中程度のカーディナリティの属性を使用します。最大 1 つのベクトルインデックスのパーティションキーを指定できます。SearchSchema でベクトルインデックスのパーティションキーを定義する場合は、
SearchVectorsを呼び出すときにSearchConditionExpressionでその値を指定する必要があります。パーティションキーを使用して検索スループットをスケールする
大規模なインデックスまたは検索ボリュームが多いことが予想される場合は、ベクトルインデックスのパーティションキーを定義します。各
SearchVectors呼び出しは単一のパーティションキー値にスコープされているため、多くのパーティションキー値にデータを分散することで、1 秒あたりにより多くの検索オペレーションを実行し、各検索が調べるデータの量を減らすことができます。「クエリパターンに合ったパーティションキーを選択する」を参照してください。 INLINE_FILTER-
インラインフィルター属性はベクトルインデックスに射影されるため、DynamoDB はストレージレイヤーでの検索中にフィルタリングできます。
インラインフィルターは、
SearchConditionExpressionにおいて等価演算子 (=) をサポートしています。比較、範囲、および集合メンバー演算子 (<>、<、<=、>、>=、IN) はまだ利用できません。ベクトルインデックスのパーティションキーとは異なり、インラインフィルターは検索時にオプションです。
SearchSchema でパーティションキーを定義せずにベクトルインデックスを作成できます。この場合、SearchVectors 呼び出しごとにインデックス全体を検索します。これは SearchConditionExpression が必要ないためシンプルですが、水平方向にスケールしません。インデックスが大きくなるにつれて、各検索で調べるデータが多くなり、レイテンシーとコストが増加します。ワークロードで高スループットが必要な場合、またはインデックスに多数のベクトルが含まれている場合は、パーティションキーを定義してパーティション間でデータを分散し、個別にスケーリングします。「クエリパターンに合ったパーティションキーを選択する」を参照してください。
計画
グローバルセカンダリインデックスと同様に、ベクトルインデックスは、ベーステーブルのどの属性をインデックスにコピーするかを制御する射影をサポートします。ベクトルインデックスを作成するときに射影を指定します。
-
KEYS_ONLY– ベーステーブルのプライマリキー属性、ベクトル属性、および SearchSchema で定義されたインラインフィルター属性のみがインデックスに射影されます。 -
INCLUDE–KEYS_ONLY属性に加えて、射影する追加の非キー属性を指定します。ベクトルインデックスの作成後に、含まれる属性のセットを変更することはできません。別の属性セットを射影するには、インデックスを削除し、必要な射影を指定して再作成します。 -
ALL– ベーステーブルのすべての属性がインデックスに射影されます。
射影によって SearchVectors が返せる属性が制限される
ベクトルインデックスに射影されていない属性は、SearchVectors レスポンスで返されません。検索結果に特定の属性が必要な場合は、それらを射影に含めるか、ALL を使用します。
ベクトルインデックスを他の DynamoDB 機能と併用する
- DynamoDB Streams
-
ベクトルインデックスを持つテーブルで DynamoDB Streams を有効にするには、テーブルの作成時に
StreamSpecificationパラメータを使用するか、UpdateTableを使用します。ストリームは、ベーステーブルに対する項目レベルの変更をキャプチャし、ベクトルインデックスとは独立して動作します。 - グローバルテーブル
-
ベクトルインデックスをグローバルテーブルに追加できます。また、
UpdateTableを使用してレプリカを追加することで、ベクトルインデックスを持つテーブルをグローバルテーブルに変換することもできます。ディメンション、距離関数、SearchSchema、射影を含むベクトルインデックス定義は、新しいレプリカリージョンごとに自動的にレプリケートされます。レプリカリージョンではベクトルインデックスを個別に作成しません。レプリカリージョンで書き込んだ項目は、他のリージョンにレプリケートされ、そこにインデックスが作成されます。レプリケーションが完了すると、各リージョンの
SearchVectorsは同一のベクトルセットを検索します。ベクトル検索では近似最近傍 (ANN) が使用されるため、同一のデータであっても、異なるリージョンで同じクエリに対して個別に検索を行うと、結果や順序がわずかに異なる場合があります。マルチリージョン強整合性 (MRSC) グローバルテーブルであっても、他のリージョンのベクトルのレプリケーションとインデックス作成は非同期で行われます。あるリージョンで書き込んだばかりのベクトルは、変更が反映されるまで、別のリージョンのSearchVectorsの結果に表示されない場合があります。オンデマンドキャパシティが必要
ベクトルインデックスにはオンデマンドキャパシティモードが必要で、グローバルテーブルもこれをサポートしています。オンデマンドキャパシティを既に使用しているテーブルで、ベクトルインデックスとレプリカを作成します。
- ポイントインタイムリカバリ (PITR) とバックアップ
-
ポイントインタイムリカバリまたはオンデマンドバックアップからテーブルを復元すると、DynamoDB はベーステーブルのデータとベクトルインデックス定義を復元します。グローバルセカンダリインデックスと同様に、DynamoDB はベクトルインデックスをバイト単位でコピーするのではなく、復元されたベーステーブルのデータから再構築するため、検索の準備が整う前にインデックスのバックフィルが行われます。
SearchVectorsを実行する前に、復元されたインデックスのIndexStatusがACTIVEになり、Backfillingがfalseになるまで待機します。 - 有効期限 (TTL)
-
ベクトルインデックスを持つテーブルで DynamoDB TTL を使用できます。TTL がベーステーブルから期限切れの項目を削除すると、DynamoDB は手動での削除と同様に、ベクトルインデックスから対応するエントリを削除します。したがって、期限切れの項目は、削除がインデックスに伝達されると
SearchVectorsの結果に表示されなくなります。 - テーブルデータのインポートとエクスポート
-
ベクトルインデックスを持つテーブルを Amazon S3 にエクスポートできます。エクスポートには、格納されているベクトル属性を含むベーステーブルの項目が含まれます。Amazon S3 から新しいテーブルにデータをインポートするときは、
CreateTableの場合と同様に、インポートリクエストでベクトルインデックスを定義します。DynamoDB は、インポートされた項目が書き込まれるとインデックスを作成し、インポートの完了後にベクトルインデックスが利用可能になります。 - DAX
-
DynamoDB Accelerator (DAX) は、
SearchVectorsオペレーションをサポートしていません。アプリケーションが他の読み取りオペレーションに DAX を使用している場合でも、DynamoDB に直接SearchVectorsリクエストを送信します。ベーステーブル読み取りの DAX キャッシュは、ベクトルインデックスの存在の影響を受けません。