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
テンプレートを使用して、ベクトルフィールドにベクトルインデックスを構築できます。
パラメータ | 要件 | データ型 | 説明 | 値 (複数可) |
---|---|---|---|---|
|
オプション |
string |
インデックスの名前を指定します。 |
英数字 |
|
オプション |
エラーのタイプを指定します。 |
サポートされている: hnsw または ivfflat デフォルト: HNSW (エンジンパッチ 3.0.4574 以降) |
|
|
必須 |
integer |
ベクトルデータ内のディメンション数を指定します。 |
最大ディメンション数 2,000 個。 |
|
必須 |
string |
類似性の計算に使用される距離メトリクスを指定します。 |
|
|
IVFFlat に必要です |
integer |
IVFFlat インデックスがベクトルデータをグループ化するために使用するクラスターの数を指定します。推奨される設定方式は、ドキュメント数最大 100 万件までについてはドキュメント 1,000 件当りのドキュメント数、ドキュメント数が最大 100 万件を超える場合には |
最小: 1 最大: 以下の 特徴量と制限事項 のインスタンスタイプごとのリストを参照してください。 |
|
オプション |
integer |
特定の HNSW インデックス向けの最大接続数を指定します。 |
デフォルト: 16 範囲: [2, 100] |
|
オプション |
integer |
HNSW インデックスのグラフを作成するためのダイナミック候補リストのサイズを指定します。
|
デフォルト: 64 範囲 [4, 1000] |
IVFFlat および m
向け lists
や、HNSW 向け efConstruction
などのサブパラメータの値を適切に設定することが重要です。検索の精度/再現性、ビルド時間、パフォーマンスに影響するためです。リスト値を大きくすると、リスト 1 件当りのベクトル数が減るため、クエリの速度が上がり、リージョンが小さくなります。一方、リージョンサイズが小さくなるほど再現性エラーが多くなり、精度が低下する恐れがあります。HNSW の場合、m
や efConstruction
の値を上げると検索精度が高まりますが、インデックスのビルド時間とサイズも増加します。以下の例を参照してください。
例
インデックス定義の取得
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] } } } ]);
パラメータ | 要件 | 型 | 説明 | 値 (複数可) |
---|---|---|---|---|
|
必須 |
operator |
$search コマンド内でベクトルをクエリする際に使用します。 |
|
|
必須 |
array |
類似ベクトルの検索に使用するクエリベクトルを示します。 |
|
|
必須 |
string |
ベクトルフィールドの名前を定義します。 |
|
|
必須 |
integer |
検索から返される結果の最大数を指定します。 |
|
|
必須 |
string |
類似性の計算に使用される距離メトリクスを指定します。 |
|
|
オプション |
integer |
ベクトル検索において検査対象とするクラスターの数。値を大きくすると、速度が低下する代わりに再現性が向上します。これは、最近傍検索のリスト数に設定できます (この時点では、プランナーはインデックスを使用しません)。微調整の開始点とするための推奨設定は |
デフォルト: 1 |
|
オプション |
integer |
HNSW インデックスが検索時に使用するダイナミック候補リストのサイズを指定します。 |
デフォルト: 40 範囲: [1, 1000] |
efSearch
(HNSW) または probes
(IVFlat ) の値をファインチューニングして、もっとも望ましいパフォーマンスと精度を達成することが重要です。次のオペレーションの例を参照してください。
出力例
このオペレーションによる出力は、次のようになります。
{ "_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
compound
、sparse
、partial
などの他のインデックスオプションは、ベクトルインデックスではサポートされていません。HNSW インデックスでは、並列インデックスビルドはサポートされていません。IVFFlat インデックスでのみサポートされています。
ベクトルクエリ
ベクトル検索クエリでは、最適な結果を得るために、
probes
やefSearch
などのパラメータを微調整することが重要です。probes
またはefSearch
パラメータの値が高いほど、再現性は高くなりますが、速度が低下します。検索パラメータの微調整の開始点としての推奨設定はsqrt(# of lists)
です。
ベストプラクティス
Amazon DocumentDB でベクトル検索を使用するためのベストプラクティスについて説明します。新しいベストプラクティスが確認されると、このセクションは更新されます。
-
フラット圧縮付き転置ファイル方式 (IVFFlat ) によるインデックス作成には、類似点に基づいてデータポイントをクラスター化および整理することが含まれます。したがって、インデックスをより効果的に運用するには、インデックスを作成する前に少なくとも一部のデータをロードしてみることをお勧めします。
-
ベクトル検索クエリでは、最適な結果を得るために、
probes
やefSearch
などのパラメータをファインチューニングすることが重要です。probes
またはefSearch
パラメータの値が高いほど、再現性は高くなりますが、速度が低下します。probes
パラメータの微調整の開始点としての推奨設定はsqrt(lists)
です。
リソース