

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon DocumentDB のベクトル検索
<a name="vector-search"></a>

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

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

**Topics**
+ [ベクトルの挿入](#w2aac23c11b9)
+ [ベクトルインデックスの作成](#w2aac23c11c11)
+ [インデックス定義の取得](#w2aac23c11c13)
+ [ベクトルのクエリ](#w2aac23c11c15)
+ [特徴量と制限事項](#vector-limitations)
+ [ベストプラクティス](#w2aac23c11c19)

## ベクトルの挿入
<a name="w2aac23c11b9"></a>

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]}
]);
```

## ベクトルインデックスの作成
<a name="w2aac23c11c11"></a>

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  |  類似性の計算に使用される距離メトリクスを指定します。  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/vector-search.html)  | 
|  **lists**  |  IVFFlat に必要です  |  integer  |  IVFFlat インデックスがベクトルデータをグループ化するために使用するクラスターの数を指定します。推奨される設定方式は、ドキュメント数最大 100 万件までについてはドキュメント 1,000 件当りのドキュメント数、ドキュメント数が最大 100 万件を超える場合には `sqrt(# of documents)` となります。  |  最小: 1 最大: 以下の [特徴量と制限事項](#vector-limitations) のインスタンスタイプごとのリストを参照してください。  | 
|  **m**  |  オプション  |  integer  |  特定の HNSW インデックス向けの最大接続数を指定します。  |  デフォルト: 16 範囲: [2, 100]  | 
|  **efConstruction**  |  オプション  |  integer  |  HNSW インデックスのグラフを作成するためのダイナミック候補リストのサイズを指定します。 `efConstruction` の値は、 (2 × m) 以上にする必要があります。  |  デフォルト: 64 範囲 [4, 1000]  | 

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

**例**

------
#### [ 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
    }
  }
)
```

------

## インデックス定義の取得
<a name="w2aac23c11c13"></a>

`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"
 }
]
```

## ベクトルのクエリ
<a name="w2aac23c11c15"></a>

Amazon DocumentDB は、ベクトルをクエリするための 2 つのベクトル検索演算子をサポートしています。

### クラシックベクトル検索演算子
<a name="w2aac23c11c15b5"></a>

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

```
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**  |  必須  |  オペレーター  |  \$1search コマンド内でベクトルをクエリする際に使用します。  |    | 
|  **vector**  |  必須  |  array  |  類似ベクトルの検索に使用するクエリベクトルを示します。  |    | 
|  **path**  |  必須  |  string  |  ベクトルフィールドの名前を定義します。  |    | 
|  **k**  |  必須  |  integer  |  検索から返される結果の最大数を指定します。  |    | 
|  **similarity**  |  必須  |  string  |  類似性の計算に使用される距離メトリクスを指定します。  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/vector-search.html)  | 
|  **probes**  |  オプション  |  integer  |  ベクトル検索において検査対象とするクラスターの数。値を大きくすると、速度が低下する代わりに再現性が向上します。これは、最近傍検索のリスト数に設定できます (この時点では、プランナーはインデックスを使用しません)。微調整の開始点とするための推奨設定は `sqrt(# of lists)` です。  |  デフォルト: 1  | 
|  **efSearch**  |  オプション  |  integer  |  HNSW インデックスが検索時に使用するダイナミック候補リストのサイズを指定します。`efSearch` の値が高いほど、速度は低下しますが再現性が向上します。  |  デフォルト: 40 範囲: [1, 1000]  | 

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

------
#### [ 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 ] }
```

### `$vectorSearch` 演算子 (Amazon DocumentDB 8.0 以降で利用可能)
<a name="w2aac23c11c15b7"></a>

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

```
db.collection.aggregate([
{
  "$vectorSearch": {
    "exact": true | false,
    "index": "<index-name>" [supports only HNSW index],
    "limit": <number-of-results> [same as k],
    "path": "<vector field-to-search>",
    "queryVector": <array-of-numbers>,
    "numCandidates": <number-of-candidates> [same as efSearch], 
  }
}])
```

## 特徴量と制限事項
<a name="vector-limitations"></a>

**バージョン互換性**
+ 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 の場合のベクトルのリストパラメータの最大値を示します。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/vector-search.html)
+ `compound`、`sparse`、`partial` などの他のインデックスオプションは、ベクトルインデックスではサポートされていません。
+ Amazon DocumentDB 5.0 の HNSW インデックスでは、並列インデックスビルドはサポートされていません。

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

## ベストプラクティス
<a name="w2aac23c11c19"></a>

Amazon DocumentDB でベクトル検索を使用するためのベストプラクティスについて説明します。新しいベストプラクティスが確認されると、このセクションは更新されます。
+ フラット圧縮付き転置ファイル方式 (IVFFlat ) によるインデックス作成には、類似点に基づいてデータポイントをクラスター化および整理することが含まれます。したがって、インデックスをより効果的に運用するには、インデックスを作成する前に少なくとも一部のデータをロードしてみることをお勧めします。
+ ベクトル検索クエリでは、最適な結果を得るために、`probes` や `efSearch` などのパラメータをファインチューニングすることが重要です。`probes` または `efSearch` パラメータの値が高いほど、再現性は高くなりますが、速度が低下します。`probes` パラメータの微調整の開始点としての推奨設定は `sqrt(lists)` です。

**リソース**
+ [ベクトル検索に関する新しいブログ記事](https://aws.amazon.com/blogs/aws/vector-search-for-amazon-documentdb-with-mongodb-compatibility-is-now-generally-available)
+ [セマンティック検索コードのサンプル](https://github.com/aws-samples/amazon-documentdb-samples/tree/master/blogs/semanticsearch-docdb)
+ [Amazon DocumentDB ベクトル検索コードのサンプル](https://github.com/aws-samples/amazon-documentdb-samples/tree/master/samples/vector-search)