Amazon DocumentDB のベクトル検索 - Amazon DocumentDB

Amazon DocumentDB のベクトル検索

ベクトル検索は、距離または類似度メトリクスを使用して複数のベクトル表現を比較することで、特定のデータポイントに類似したデータポイントを見つけるための機械学習手法です。2 つのベクトルがベクトル空間内で互いに近い距離にあるほど、基盤となる項目が類似していると見なされます。この手法は、データのセマンティックな意味を把握するのに役立ちます。こうしたアプローチは、お勧め提案システム、自然言語処理、画像認識など、さまざまなアプリケーションで役立ちます。

Amazon DocumentDB のベクトル検索機能は、JSON ベースのドキュメントデータベースの柔軟性と豊富なクエリ機能にベクトル検索ならではのメリットを組み合わせています。既存の Amazon DocumentDB データや柔軟なドキュメントデータ構造を使用して、セマンティック検索エクスペリエンス、お勧め製品の提案、パーソナライゼーション、チャットボット、不正検出、異常検出などの機械学習や生成 AI のユースケースを構築するには、Amazon DocumentDB のベクトル検索が最適です。ベクトル検索は、Amazon DocumentDB 5.0 のインスタンスベースのクラスターで使用できます。

ベクトルの挿入

Amazon DocumentDB データベースへのベクトル挿入には、既存の挿入方法を使用できます。

次の例では、テストデータベース内に 5 つのドキュメントのコレクションが作成されています。各ドキュメントには、製品名とそれに対応するベクトル埋め込みの 2 つのフィールドが含まれています。

db.collection.insertMany([ {"product_name": "Product A", "vectorEmbedding": [0.2, 0.5, 0.8]}, {"product_name": "Product B", "vectorEmbedding": [0.7, 0.3, 0.9]}, {"product_name": "Product C", "vectorEmbedding": [0.1, 0.2, 0.5]}, {"product_name": "Product D", "vectorEmbedding": [0.9, 0.6, 0.4]}, {"product_name": "Product E", "vectorEmbedding": [0.4, 0.7, 0.2]} ]);

ベクトルインデックスの作成

Amazon DocumentDB は、階層ナビゲーションスモールワールド方式 (HNSW) によるインデックス作成と、フラット圧縮付き転置ファイル方式 (IVFFlat) によるインデックス作成の両方をサポートしています。IVFFlat インデックスは、ベクトルを複数のリストに分離したうえで、クエリベクトルに最も近いリストの選択されたサブセットを検索します。一方、HNSW インデックスはベクトルデータを多層グラフに整理します。HNSW は IVFFlat に比べてビルド時間が多くかかりますが、クエリのパフォーマンスと再現性が向上します。IVFFlat とは異なり、HNSW にはトレーニングステップがないため、初期データロードなしでインデックスを生成できます。ほとんどのユースケースでは、ベクトル検索に HNSW インデックスタイプを使用することをお勧めします。

ベクトルインデックスを作成しない場合、Amazon DocumentDB は高精度な最近傍探索を実行し、完全な再現性を保証します。ただし、本番稼働シナリオでは、速度も重要となります。そのためベクトルインデックスを使用することをお勧めします。ベクトルインデックスは、再現性を若干犠牲にしても速度を向上させる効果があります。なお、ベクトルインデックスの追加によりクエリ結果が異なる可能性があることに留意してください。

テンプレート

次の createIndex または runCommand テンプレートを使用して、ベクトルフィールドにベクトルインデックスを構築できます。

Using createIndex

mongosh や Java などの特定のドライバーでは、vectorOptions のパラメータを createIndex に使用するとエラーが発生する可能性があります。このような場合は、runCommand を使用することをお勧めします。

db.collection.createIndex( { "<vectorField>": "vector" }, { "name": "<indexName>", "vectorOptions": { "type": " <hnsw> | <ivfflat> ", "dimensions": <number_of_dimensions>, "similarity": " <euclidean> | <cosine> | <dotProduct> ", "lists": <number_of_lists> [applicable for IVFFlat], "m": <max number of connections> [applicable for HNSW], "efConstruction": <size of the dynamic list for index build> [applicable for HNSW] } } );
Using runCommand

mongosh や Java などの特定のドライバーでは、vectorOptions のパラメータを createIndex に使用するとエラーが発生する可能性があります。このような場合は、runCommand を使用することをお勧めします。

db.runCommand( { "createIndexes": "<collection>", "indexes": [{ key: { "<vectorField>": "vector" }, vectorOptions: { type: " <hnsw> | <ivfflat> ", dimensions: <number of dimensions>, similarity: " <euclidean> | <cosine> | <dotProduct> ", lists: <number_of_lists> [applicable for IVFFlat], m: <max number of connections> [applicable for HNSW], efConstruction: <size of the dynamic list for index build> [applicable for HNSW] }, name: "myIndex" }] } );
パラメータ 要件 データ型 説明 値 (複数可)

name

オプション

string

インデックスの名前を指定します。

英数字

type

オプション

エラーのタイプを指定します。

サポートされている: hnsw または ivfflat

デフォルト: HNSW (エンジンパッチ 3.0.4574 以降)

dimensions

必須

integer

ベクトルデータ内のディメンション数を指定します。

最大ディメンション数 2,000 個。

similarity

必須

string

類似性の計算に使用される距離メトリクスを指定します。

  • euclidean

  • cosine

  • dotProduct

lists

IVFFlat に必要です

integer

IVFFlat インデックスがベクトルデータをグループ化するために使用するクラスターの数を指定します。推奨される設定方式は、ドキュメント数最大 100 万件までについてはドキュメント 1,000 件当りのドキュメント数、ドキュメント数が最大 100 万件を超える場合には sqrt(# of documents) となります。

最小: 1

最大: 以下の 特徴量と制限事項 のインスタンスタイプごとのリストを参照してください。

m

オプション

integer

特定の HNSW インデックス向けの最大接続数を指定します。

デフォルト: 16

範囲: [2, 100]

efConstruction

オプション

integer

HNSW インデックスのグラフを作成するためのダイナミック候補リストのサイズを指定します。

efConstruction の値は、 (2 × m) 以上にする必要があります。

デフォルト: 64

範囲 [4, 1000]

IVFFlat および m 向け lists や、HNSW 向け efConstruction などのサブパラメータの値を適切に設定することが重要です。検索の精度/再現性、ビルド時間、パフォーマンスに影響するためです。リスト値を大きくすると、リスト 1 件当りのベクトル数が減るため、クエリの速度が上がり、リージョンが小さくなります。一方、リージョンサイズが小さくなるほど再現性エラーが多くなり、精度が低下する恐れがあります。HNSW の場合、mefConstruction の値を上げると検索精度が高まりますが、インデックスのビルド時間とサイズも増加します。以下の例を参照してください。

HNSW
db.collection.createIndex( { "vectorEmbedding": "vector" }, { "name": "myIndex", "vectorOptions": { "type": "hnsw", "dimensions": 3, "similarity": "euclidean", "m": 16, "efConstruction": 64 } } );
IVFFlat
db.collection.createIndex( { "vectorEmbedding": "vector" }, { "name": "myIndex", "vectorOptions": { "type": "ivfflat", "dimensions": 3, "similarity": "euclidean", "lists":1 } } )

インデックス定義の取得

getIndexes コマンドを使用して、ベクトルインデックスを含むインデックスの詳細を表示できます。

db.collection.getIndexes()

出力例

[ { "v" : 4, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.collection" }, { "v" : 4, "key" : { "vectorEmbedding" : "vector" }, "name" : "myIndex", "vectorOptions" : { "type" : "ivfflat", "dimensions" : 3, "similarity" : "euclidean", "lists" : 1 }, "ns" : "test.collection" } ]

ベクトルのクエリ

ベクトルクエリテンプレート

次のテンプレートを使用して、ベクトルをクエリします。

db.collection.aggregate([ { $search: { "vectorSearch": { "vector": <query vector>, "path": "<vectorField>", "similarity": "<distance metric>", "k": <number of results>, "probes":<number of probes> [applicable for IVFFlat], "efSearch":<size of the dynamic list during search> [applicable for HNSW] } } } ]);
パラメータ 要件 説明 値 (複数可)

vectorSearch

必須

operator

$search コマンド内でベクトルをクエリする際に使用します。

vector

必須

array

類似ベクトルの検索に使用するクエリベクトルを示します。

path

必須

string

ベクトルフィールドの名前を定義します。

k

必須

integer

検索から返される結果の最大数を指定します。

similarity

必須

string

類似性の計算に使用される距離メトリクスを指定します。

  • euclidean

  • cosine

  • dotProduct

probes

オプション

integer

ベクトル検索において検査対象とするクラスターの数。値を大きくすると、速度が低下する代わりに再現性が向上します。これは、最近傍検索のリスト数に設定できます (この時点では、プランナーはインデックスを使用しません)。微調整の開始点とするための推奨設定は sqrt(# of lists) です。

デフォルト: 1

efSearch

オプション

integer

HNSW インデックスが検索時に使用するダイナミック候補リストのサイズを指定します。efSearch の値が高いほど、速度は低下しますが再現性が向上します。

デフォルト: 40

範囲: [1, 1000]

efSearch (HNSW) または probes (IVFlat ) の値をファインチューニングして、もっとも望ましいパフォーマンスと精度を達成することが重要です。次のオペレーションの例を参照してください。

HNSW
db.collection.aggregate([ { $search: { "vectorSearch": { "vector": [0.2, 0.5, 0.8], "path": "vectorEmbedding", "similarity": "euclidean", "k": 2, "efSearch": 40 } } } ]);
IVFFlat
db.collection.aggregate([ { $search: { "vectorSearch": { "vector": [0.2, 0.5, 0.8], "path": "vectorEmbedding", "similarity": "euclidean", "k": 2, "probes": 1 } } } ]);

出力例

このオペレーションによる出力は、次のようになります。

{ "_id" : ObjectId("653d835ff96bee02cad7323c"), "product_name" : "Product A", "vectorEmbedding" : [ 0.2, 0.5, 0.8 ] } { "_id" : ObjectId("653d835ff96bee02cad7323e"), "product_name" : "Product C", "vectorEmbedding" : [ 0.1, 0.2, 0.5 ] }

特徴量と制限事項

バージョン互換性

  • Amazon DocumentDB のベクトル検索は、Amazon DocumentDB 5.0 インスタンスベースのクラスターでのみ使用できます。

ベクトル

  • Amazon DocumentDB は、最大 2,000 個のディメンションのベクトルをインデックス化できます。ただし、インデックスなしであれば最大 16,000 個のディメンションを保存できます。

インデックス

  • IVFFlat インデックス作成の場合、lists パラメータの推奨設定方法は、ドキュメント数最大 100 万件までについては 1000 件あたりのドキュメント数、ドキュネント数が最大 100 万を超える場合には sqrt(# of documents) となります。作業メモリの制限により、Amazon DocumentDB はディメンション数に応じて、lists パラメータの特定の最大値をサポートします。参考までに、次の表は、ディメンション数が 500、1000、2,000 の場合のベクトルのリストパラメータの最大値を示します。

    インスタンスタイプ ディメンション数 500 の場合のリスト ディメンション数 1000 の場合のリスト ディメンション数 2000 の場合のリスト

    t3.med

    372

    257

    150

    r5.l

    915

    741

    511

    r5.xl

    1,393

    1,196

    901

    r5.2xl

    5,460

    5,230

    4,788

    r5.4xl

    7,842

    7,599

    7,138

    r5.8xl

    11,220

    10,974

    10,498

    r5.12xl

    13,774

    13,526

    13,044

    r5.16xl

    15,943

    15,694

    15,208

    r5.24xl

    19,585

    19,335

    18,845

  • compoundsparsepartial などの他のインデックスオプションは、ベクトルインデックスではサポートされていません。

  • HNSW インデックスでは、並列インデックスビルドはサポートされていません。IVFFlat インデックスでのみサポートされています。

ベクトルクエリ

  • ベクトル検索クエリでは、最適な結果を得るために、probesefSearch などのパラメータを微調整することが重要です。probes または efSearch パラメータの値が高いほど、再現性は高くなりますが、速度が低下します。検索パラメータの微調整の開始点としての推奨設定は sqrt(# of lists) です。

ベストプラクティス

Amazon DocumentDB でベクトル検索を使用するためのベストプラクティスについて説明します。新しいベストプラクティスが確認されると、このセクションは更新されます。

  • フラット圧縮付き転置ファイル方式 (IVFFlat ) によるインデックス作成には、類似点に基づいてデータポイントをクラスター化および整理することが含まれます。したがって、インデックスをより効果的に運用するには、インデックスを作成する前に少なくとも一部のデータをロードしてみることをお勧めします。

  • ベクトル検索クエリでは、最適な結果を得るために、probesefSearch などのパラメータをファインチューニングすることが重要です。probes または efSearch パラメータの値が高いほど、再現性は高くなりますが、速度が低下します。probes パラメータの微調整の開始点としての推奨設定は sqrt(lists) です。

リソース