Azure Cosmos DB for MongoDB 仮想コアの埋め込みでベクター検索を使用する

適用対象: MongoDB 仮想コア

Azure Cosmos DB for MongoDB 仮想コアでベクター検索を使用して、AI ベースのアプリケーションと Azure Cosmos DB に格納されているデータをシームレスに統合します。 この統合には、 Azure OpenAI 埋め込みを 使用して構築したアプリを含めることができます。 ベクター検索を使用すると、Azure Cosmos DB for MongoDB 仮想コアに直接格納される高次元ベクター データを効率的に格納、インデックス付けし、クエリを実行できます。 ベクター検索機能のためのより高価な代替手段にデータを転送する必要がなくなります。

ベクター検索は、プロパティ フィールドの完全一致ではなく、データ特性に基づいて類似項目を検索するのに便利な方法です。 この手法は、類似したテキストの検索、関連する画像の検索、おすすめ候補の作成、異常の検出などのアプリケーションで役立ちます。 これは、機械学習モデルまたは埋め込み API を使って作成したデータのベクトル表現 (数値のリスト) を取得することによって機能します。 埋め込み API の例としては、Azure OpenAI 埋め込みHugging Face on Azure があります。 次に、データ ベクトルとクエリ ベクトル間の距離を測定します。 クエリ ベクトルに最も近いデータ ベクトルは、意味的に最も似ていると判明したものです。

ベクトル検索機能をネイティブに統合することで、OpenAI API 上に構築されたアプリケーションでデータの可能性を最大限に引き出すことができます。 ベクター埋め込みを使用するカスタム構築ソリューションを作成することもできます。

createIndexes テンプレートを使用してベクター インデックスを作成する

ベクター インデックスを作成するには、次の createIndexes テンプレートを使用します。

{
  "createIndexes": "<collection_name>",
  "indexes": [
    {
      "name": "<index_name>",
      "key": {
        "<path_to_property>": "cosmosSearch"
      },
      "cosmosSearchOptions": {
        "kind": "vector-ivf",
        "numLists": <integer_value>,
        "similarity": "<string_value>",
        "dimensions": <integer_value>
      }
    }
  ]
}
フィールド Type 説明
index_name string インデックスの一意の名前。
path_to_property string ベクターを含むプロパティへのパス。 このパスには、最上位のプロパティまたはそのプロパティへのドット表記パスを指定できます。 ドット表記パスを使用する場合、すべての非リーフ要素を配列にすることはできません。 ベクトルは、インデックスを作成し、ベクター検索結果で返す number[] である必要があります。
kind string 作成するベクター インデックスの種類。 現在サポートされているインデックス オプションは vector-ivf のみです。
numLists 整数 (integer) この整数は、ベクター データをグループ化するために転置ファイル (IVF) インデックスによって使用されるクラスターの数です。 ドキュメント数が 100 万までの場合は numListsdocumentCount/1000 を、100 万を超える場合は sqrt(documentCount) を設定することをお勧めします。 numLists の値に 1 を使用することは、パフォーマンスが制限されるブルート フォース検索を実行することと同様です。
similarity string IVF インデックスで使用する類似性メトリック。 可能なオプションは COS (コサイン距離)、L2 (ユークリッド距離)、または IP (内積)です。
dimensions 整数 (integer) ベクトルの類似性の次元の数。 サポートされている次元の最大数は 2000 です。

重要

numLists パラメーターを正しく設定することは、適切な精度とパフォーマンスを実現するために重要です。 ドキュメント数が 100 万までの場合は numListsdocumentCount/1000 を、100 万を超える場合は sqrt(documentCount) を設定することをお勧めします。

データベース内の項目の数が増えるにつれて、ベクター検索の待機時間パフォーマンスの向上を実現するために、 numList を大きくするように調整する必要があります。

新しいシナリオを試したり、小さなデモを作成したりする場合は、numLists1 に設定して、すべてのベクトルでブルート フォース検索を実行できます。 これにより、ベクトル検索から最も正確な結果を得られますが、検索速度と待機時間が遅くなる点にご注意ください。 初期設定後は、上記のガイダンスを使用して numLists パラメーターを調整する必要があります。

重要

ベクトルは、インデックスを作成するために number[] である必要があります。 double[] などの別の型を使用すると、ドキュメントのインデックスが作成されなくなります。 インデックスのないドキュメントは、ベクター検索の結果では返されません。

次の例では、ベクターのインデックス作成、ベクター プロパティを持つドキュメントの追加、ベクター検索の実行、インデックス構成の取得を行う方法について説明します。

ベクター インデックスを作成する

use test;

db.createCollection("exampleCollection");

db.runCommand({
  createIndexes: 'exampleCollection',
  indexes: [
    {
      name: 'vectorSearchIndex',
      key: {
        "vectorContent": "cosmosSearch"
      },
      cosmosSearchOptions: {
        kind: 'vector-ivf',
        numLists: 3,
        similarity: 'COS',
        dimensions: 3
      }
    }
  ]
});

このコマンドを使用すると、指定したコレクション exampleCollection に格納されているドキュメントの vectorContent プロパティに対して vector-ivf インデックスが作成されます。 cosmosSearchOptions プロパティは、IVF ベクター インデックスのパラメーターを指定します。 入れ子になったプロパティに格納されているベクターがドキュメントに含まれている場合は、ドット表記パスを使用してこのプロパティを設定できます。 たとえば、vectorContenttext のサブプロパティである場合、text.vectorContent を使用できます。

データベースにベクターを追加する

データベースのコレクションにベクトルを追加するには、最初に、独自のモデル、Azure OpenAI 埋め込み、または別の API (Hugging Face on Azure など) を使って埋め込みを作成する必要があります。 この例では、サンプル埋め込みを使用して新しいドキュメントが追加されます。

db.exampleCollection.insertMany([
  {name: "Eugenia Lopez", bio: "Eugenia is the CEO of AdvenureWorks.", vectorContent: [0.51, 0.12, 0.23]},
  {name: "Cameron Baker", bio: "Cameron Baker CFO of AdvenureWorks.", vectorContent: [0.55, 0.89, 0.44]},
  {name: "Jessie Irwin", bio: "Jessie Irwin is the former CEO of AdventureWorks and now the director of the Our Planet initiative.", vectorContent: [0.13, 0.92, 0.85]},
  {name: "Rory Nguyen", bio: "Rory Nguyen is the founder of AdventureWorks and the president of the Our Planet initiative.", vectorContent: [0.91, 0.76, 0.83]},
]);

ベクター検索を実行するには、MongoDB クエリで $search 集計パイプライン ステージを使用します。 cosmosSearch インデックスを使用するには、新しい cosmosSearch 演算子を使用します。

{
  "$search": {
    "cosmosSearch": {
        "vector": <vector_to_search>,
        "path": "<path_to_property>",
        "k": <num_results_to_return>
      }
    ...
  }
}

最後の例を続けて、別のベクター queryVector を作成します。 ベクター検索では、queryVector とドキュメントの vectorContent パス内のベクトル間の距離が測定されます。 パラメーター k (ここでは 2 に設定されています) を設定することで、検索から返される結果の数を設定できます。

const queryVector = [0.52, 0.28, 0.12];
db.exampleCollection.aggregate([
  {
    $search: {
      "cosmosSearch": {
        "vector": queryVector,
        "path": "vectorContent",
        "k": 2
      },
    "returnStoredSource": true
    }
  }
]);

この例では、Mongo シェルを介した入力として queryVector を使用して、ベクター検索が実行されます。 検索結果は、クエリ ベクターと最も類似している 2 つの項目の一覧で、類似性スコアによって並べ替えられています。

[
  {
    _id: ObjectId("645acb54413be5502badff94"),
    name: 'Eugenia Lopez',
    bio: 'Eugenia is the CEO of AdvenureWorks.',
    vectorContent: [ 0.51, 0.12, 0.23 ]
  },
  {
    _id: ObjectId("645acb54413be5502badff97"),
    name: 'Rory Nguyen',
    bio: 'Rory Nguyen is the founder of AdventureWorks and the president of the Our Planet initiative.',
    vectorContent: [ 0.91, 0.76, 0.83 ]
  }
]

ベクター インデックス定義を取得する

コレクションからベクター インデックス定義を取得するには、listIndexes コマンドを使用します。

db.exampleCollection.getIndexes();

この例では、インデックスの作成に使用されたすべての cosmosSearch パラメーターと共に vectorIndex が返されます。

[
  { v: 2, key: { _id: 1 }, name: '_id_', ns: 'test.exampleCollection' },
  {
    v: 2,
    key: { vectorContent: 'cosmosSearch' },
    name: 'vectorSearchIndex',
    cosmosSearch: {
      kind: 'vector-ivf',
      numLists: 3,
      similarity: 'COS',
      dimensions: 3
    },
    ns: 'test.exampleCollection'
  }
]

機能および制限事項

  • サポートされている距離メトリック: L2 (ユークリッド)、内積、コサイン。
  • サポートされているインデックス作成方法: IVFFLAT。
  • 最大 2,000 次元のサイズのインデックス作成ベクター。
  • インデックス作成は、ドキュメントごとに 1 つのベクターにのみ適用されます。

次の手順

このガイドでは、ベクター インデックスの作成、ベクター データを含むドキュメントの追加、類似性検索の実行、インデックス定義の取得を行う方法について説明しました。 ベクター検索を使用すると、高次元ベクター データを Azure Cosmos DB for MongoDB 仮想コアに直接、効率的に格納、インデックス付けし、クエリを実行できます。 ベクトル検索を使うと、ベクトル埋め込みを使ってデータの可能性を最大限に引き出し、より正確、効率的で強力なアプリケーションを構築できます。