次の方法で共有


Azure Cosmos DB for MongoDB 仮想コアのベクトル ストア

Azure Cosmos DB for MongoDB (仮想コア) の統合されたベクトル データベースを使用して、AI ベースのアプリケーションと Azure Cosmos DB に格納されているデータをシームレスに接続します。 この統合には、 Azure OpenAI 埋め込みを 使用して構築したアプリを含めることができます。 ネイティブに統合されたベクトル データベースを使用すると、Azure Cosmos DB for MongoDB (仮想コア) に直接格納される高次元ベクトル データを、ベクトル データの作成元であるオリジナル データと共に効率的に格納し、インデックス作成やクエリを実行できます。 代替のベクター ストアにデータを転送する必要はなく、追加コストもかかりません。

ベクター ストアとは

ベクトル ストアまたはベクトル データベースは、高ディメンション空間におけるデータの数学的表現であるベクトル埋め込みを格納および管理するように設計されたデータベースです。 この空間では、各ディメンションがデータの特徴に対応しており、高度なデータを表現するために数万ディメンションが使われる場合があります。 この空間内のベクトルの位置は、その特性を表します。 単語、フレーズ、ドキュメント全体、画像、オーディオ、その他の種類のデータはすべてベクトル化できます。

ベクター ストアのしくみ

ベクター ストアでは、ベクトル検索アルゴリズムを使用して、埋め込みのインデックス作成やクエリを実行します。 既知のベクトル検索アルゴリズムには、階層ナビゲーション可能な小さい世界 (HNSW)、反転ファイル (IVF)、DiskANN などがあります。ベクトル検索は、プロパティ フィールドの完全一致ではなく、データ特性に基づいて類似項目を検索するのに役立つ方法です。 この手法は、類似したテキストの検索、関連する画像の検索、おすすめ候補の作成、異常の検出などのアプリケーションで役立ちます。 これは、埋め込み API を使用して、機械学習モデルを使用して作成したデータのベクトル埋め込み (数値の一覧) のクエリを実行するために使用されます。 埋め込み API の例としては、Azure OpenAI 埋め込みHugging Face on Azure があります。 ベクトル検索は、データ ベクトルとクエリ ベクトル間の距離を測定します。 クエリ ベクトルに最も近いデータ ベクトルは、意味的に最も似ていると判明したものです。

Azure Cosmos DB for MongoDB (仮想コア) の統合されたベクトル データベースでは、埋め込みを元のデータと共に格納し、インデックス作成やクエリを実行できます。 この方法により、データを別の純粋なベクトル データベースに複製する余分なコストがかかりません。 さらに、このアーキテクチャではベクトル埋め込みと元のデータが一緒に保持されるため、マルチモーダル データの操作が簡略化され、データの整合性、スケーラビリティ、パフォーマンスを向上させることができます。

Azure Cosmos DB for MongoDB (仮想コア) には堅牢なベクトル検索機能が用意されているので、複雑なデータセット間で高速の類似性検索を実行できます。 Azure Cosmos DB for MongoDB でベクトル検索を実行するには、まずベクトル インデックスを作成する必要があります。 現在、Cosmos DB では 3 種類のベクトル インデックスがサポートされています。

  • DiskANN (推奨): 大規模なデータセットに最適であり、SSD を利用して効率的なメモリ使用を実現しながら、近似ニアレスト ネイバー (ANN) 検索で高い再現率を維持します。
  • HNSW: 精度とリソース効率のバランスを取るグラフベースの構造で、高い再現率を必要とする中規模のデータセットに適しています。
  • IVF: クラスタリングを使用して広範なデータセットで検索速度を最適化し、対象となるクラスター内の検索に焦点を当ててパフォーマンスを向上させます。

DiskANN インデックスは、M40 レベル以上で使用できます。 DiskANN インデックスを作成するには、次のテンプレートに従って "kind" パラメーターを "vector-diskann" に設定します。

{ 
    "createIndexes": "<collection_name>",
    "indexes": [
        {
            "name": "<index_name>",
            "key": {
                "<path_to_property>": "cosmosSearch"
            },
            "cosmosSearchOptions": { 
                "kind": "vector-diskann", 
                "dimensions": <integer_value>,
                "similarity": <string_value>,
                "maxDegree" : <integer_value>, 
                "lBuild" : <integer_value>, 
            } 
        } 
    ] 
}
フィールド タイプ 説明
index_name string インデックスの一意の名前。
path_to_property string ベクターを含むプロパティへのパス。 このパスには、最上位のプロパティまたはそのプロパティへのドット表記パスを指定できます。 ベクトルは、インデックスを作成し、ベクトル検索結果で使用するために number[] である必要があります。 double[] などの別の型を使用すると、ドキュメントのインデックスが作成されなくなります。 インデックスのないドキュメントは、ベクトル検索の結果では返されません。
kind string 作成するベクター インデックスの種類。 オプションには vector-ivfvector-hnswvector-diskann があります。
dimensions integer ベクトルの類似性の次元の数。 DiskANN は最大 2,000 個のディメンションをサポートし、将来は 40,000 個以上のサポートが予定されています。
similarity string インデックスで使用する類似性メトリック。 可能なオプションは COS (コサイン距離)、L2 (ユークリッド距離)、または IP (内積)です。
maxDegree integer グラフ内のノードあたりのエッジの最大数。 このパラメーターの範囲は 20 から 2048 です (既定値は 32)。 maxDegree が高いほど、高次元や高精度の要件を持つデータセットに適しています。
lBuild integer DiskANN インデックスの構築中に評価される候補ネイバーの数を設定します。 このパラメーターは範囲が 10 から 500 (既定値は 50) であり、精度と計算オーバーヘッドのバランスを取ります。値が大きいほど、インデックスの品質と精度が向上しますが、ビルド時間が長くなります

DiskANN を使用してベクトル検索を実行する

ベクトル検索を実行するには、$search 集計パイプライン ステージを使用し、cosmosSearch 演算子を使用してクエリを実行します。 DiskANN を使用すると、地理空間フィルターやテキスト ベースのフィルターなどのオプションのフィルター処理を使用して、大規模なデータセット間で高パフォーマンスの検索を実行できます。

{
  "$search": {
    "cosmosSearch": {
      "path": "<path_to_property>",
      "query": "<query_vector>",  
      "k": <num_results_to_return>,  
      "filter": {"$and": [
        { "<attribute_1>": { "$eq": <value> } },
        {"<location_attribute>": {"$geoWithin": {"$centerSphere":[[<longitude_integer_value>, <latitude_integer_value>], <radius>]}}}
      ]}
    }
  }
},
フィールド タイプ Description
lSearch integer 検索対象の動的候補リストのサイズを指定します。 既定値は 40 で、10 から 1000 までの範囲で構成できます。 値を大きくすると、再現率は向上しますが、検索速度が低下する可能性があります。
k integer 返される検索結果の数を定義します。 k 値は lSearch 以下である必要があります。

新しいクラスターでの DiskANN の有効化

新しくプロビジョニングされた Azure Cosmos DB for MongoDB (仮想コア) クラスターで DiskANN ベクトル インデックスを有効にするには、次の手順に従って、Azure CLI を使用してクラスター レベルの登録を実行します。

  1. Azure CLI にログイン
az login
  1. クラスターの機能フラグの現在の設定を取得します。 これにより、新しい機能を追加するときに既存のフラグを保持できます。
az resource show --ids "/subscriptions/<sub id>/resourceGroups/<resource group name>/providers/Microsoft.DocumentDB/mongoClusters/<resource name of your Cosmos DB for MongoDB cluster>" --api-version <cluster's api version>
  1. 既存のものを削除せずにDiskANNIndex フラグをプレビュー機能のリストに追加します。
az resource patch --ids "/subscriptions/<sub id>/resourceGroups/<resource group name>/providers/Microsoft.DocumentDB/mongoClusters/<resource name of your Cosmos DB for MongoDB cluster>" --api-version <cluster's api version> --properties "{\"previewFeatures\": [\"GeoReplicas\", \"DiskANNIndex\"]}" 

フィルター処理で DiskANN インデックスを使用する例

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

地理空間フィルターでベクトル検索を使用するには、ベクトル埋め込みと位置座標の両方を含むドキュメントを追加します。 独自のモデル、Azure OpenAI 埋め込み、または別の API (Hugging Face on Azure など) を使って埋め込みを作成できます。

from pymongo import MongoClient

client = MongoClient("<your_connection_string>")
db = client["test"]
collection = db["testCollection"]

documents = [
    {"name": "Eugenia Lopez", "bio": "CEO of AdventureWorks", "is_open": 1, "location": [-118.9865, 34.0145], "contentVector": [0.52, 0.20, 0.23]},
    {"name": "Cameron Baker", "bio": "CFO of AdventureWorks", "is_open": 1, "location": [-0.1278, 51.5074], "contentVector": [0.55, 0.89, 0.44]},
    {"name": "Jessie Irwin", "bio": "Director of Our Planet initiative", "is_open": 0, "location": [-118.9865, 33.9855], "contentVector": [0.13, 0.92, 0.85]},
    {"name": "Rory Nguyen", "bio": "President of Our Planet initiative", "is_open": 1, "location": [-119.0000, 33.9855], "contentVector": [0.91, 0.76, 0.83]}
]

collection.insert_many(documents)

DiskANN ベクトル インデックスを作成する

次の例では、フィルター処理機能を使用して DiskANN ベクトル インデックスを設定する方法を示します。 これには、類似性検索用のベクトル インデックスの作成、ベクトル プロパティと地理空間プロパティを含むドキュメントの追加、追加のフィルター処理のためのフィールドのインデックス作成が含まれます。

db.command({
    "createIndexes": "testCollection",
    "indexes": [
        {
            "name": "DiskANNVectorIndex",
            "key": {
                "contentVector": "cosmosSearch"
            },
            "cosmosSearchOptions": {
                "kind": "vector-diskann",
                "dimensions": 3,
                "similarity": "COS",
                "maxDegree": 32,
                "lBuild": 64
            }
        },
        { 
            "name": "is_open",
            "key": { 
                "is_open": 1 
            }      
        },
        {
            "name": "locationIndex",
            "key": {
                "location": 1
            }
        }
    ]
})

このコマンドは、exampleCollectioncontentVector フィールドに DiskANN ベクトル インデックスを作成して、類似性検索を有効にします。 また、次のものも追加されます。

  • is_open フィールドのインデックス。企業がオープンしているかどうかに基づいて結果をフィルター処理できるようにします。
  • 地理的な距離でフィルター処理するための location フィールドの地理空間インデックス。

特定の地理的半径内で類似したベクトルを持つドキュメントを見つけるには、類似性検索に queryVector を指定し、地理空間フィルターを含めます。

query_vector = [0.52, 0.28, 0.12]
pipeline = [
    {
        "$search": {
            "cosmosSearch": {
                "path": "contentVector",
                "vector": query_vector,
                "k": 5,
                "filter": {
                    "$and": [
                        {"is_open": {"$eq": 1}},
                        {"location": {"$geoWithin": {"$centerSphere": [[-119.7192861804, 34.4102485028], 100 / 3963.2]}}}
                    ]
                }
            }
        }
    }
]

results = list(collection.aggregate(pipeline))
for result in results:
    print(result)

この例では、ベクトル類似性検索は、指定された COS 類似性メトリックに基づいて上位 k 件の最も近いベクトルを返します。一方、結果をフィルター処理して、半径 100 マイル以内のオープンしている企業のみを含めます。

[
  {
    similarityScore: 0.9745354109084544,
    document: {
      _id: ObjectId("645acb54413be5502badff94"),
      name: 'Eugenia Lopez',
      bio: 'CEO of AdventureWorks',
      is_open: 1,
      location: [-118.9865, 34.0145],
      contentVector: [0.52, 0.20, 0.23]
    }
  },
  {
    similarityScore: 0.9006955671333992,
    document: {
      _id: ObjectId("645acb54413be5502badff97"),
      name: 'Rory Nguyen',
      bio: 'President of Our Planet initiative',
      is_open: 1,
      location: [-119.7302, 34.4005],
      contentVector: [0.91, 0.76, 0.83]
    }
  }
]

この結果は、半径 100 マイルとオープンしている企業に制限された、queryVector に似た上位のドキュメントを示します。 各結果には類似性スコアとメタデータが含まれており、Cosmos DB for MongoDB の DiskANN が、地域依存の検索エクスペリエンスを強化するためにベクトルと地理空間のクエリの組み合わせをどのようにサポートしているかを示します。

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

コレクションからベクター インデックス定義を取得するには、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: <index_type>, // options are `vector-ivf`, `vector-hnsw`, and `vector-diskann`
      numLists: 3,
      similarity: 'COS',
      dimensions: 3
    },
    ns: 'test.exampleCollection'
  }
]

フィルター選択されたベクトル検索 (プレビュー)

$lt$lte$eq$neq$gte$gt$in$nin$regex など、サポートされているクエリ フィルターを使用して、ベクトル検索を実行できるようになりました。 Azure サブスクリプションの [プレビュー機能] タブで、[ベクトル検索のフィルター選択] 機能を有効にします。 プレビュー機能の詳細については、こちらを参照してください。

まず、ベクトルのインデックスとフィルターのインデックスを定義する必要があります。 たとえば、プロパティでフィルター インデックスを定義できます

db.runCommand({ 
     "createIndexes": "<collection_name",
    "indexes": [ {
        "key": { 
            "<property_to_filter>": 1 
               }, 
        "name": "<name_of_filter_index>" 
    }
    ] 
});

次に、以下に示すように "filter" の用語をベクトル検索に追加します。 この例では、フィルターは、"title" プロパティが ["not in this text", "or this text"] の一覧にないドキュメントを検索しています。


db.exampleCollection.aggregate([
  {
      '$search': {
          "cosmosSearch": {
              "vector": "<query_vector>",
              "path": <path_to_vector>,
              "k": num_results,
              "filter": {<property_to_filter>: {"$nin": ["not in this text", "or this text"]}}
          },
          "returnStoredSource": True }},
      {'$project': { 'similarityScore': { '$meta': 'searchScore' }, 'document' : '$$ROOT' }
}
]);

重要

プレビュー段階では、フィルター選択されたベクトル検索では、精度を高めるためにベクトル インデックス パラメーターを調整する必要がある場合があります。 たとえば、HNSW を使用する場合は mefConstructionefSearch を増やし、IVF を使用する場合は numLists または nProbes を増やすことで、より良い結果が得られる可能性があります。 使用前に構成をテストし、満足のいく結果が得られることを確認する必要があります。

LLM オーケストレーション ツールを使用する

セマンティック カーネルでベクトル データベースとして使用する

セマンティック カーネルを使用して、Azure Cosmos DB for MongoDB 仮想コアと LLM からの情報取得を調整できます。 こちらをご覧ください。

https://github.com/microsoft/semantic-kernel/tree/main/python/semantic_kernel/connectors/memory/azure_cosmosdb

LangChain でベクトル データベースとして使用する

LangChain を使用して、Azure Cosmos DB for MongoDB 仮想コアと LLM からの情報取得を調整できます。 こちらをご覧ください。

LangChain でセマンティック キャッシュとして使用する

LangChain と Azure Cosmos DB for MongoDB (仮想コア) を使用して、セマンティック キャッシュをオーケストレーションします。これには、LLM API のコストを削減し、応答の待機時間を低減できる、前に記録した LLM 応答を使用します。 詳細はこちら

機能および制限事項

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

まとめ

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

次のステップ