Azure Cosmos DB for NoSQL におけるベクトル検索 (プレビュー)

適用対象: NoSQL

Azure Cosmos DB for NoSQL は、ベクトル インデックス作成と検索のプレビュー機能を提供します。 この機能は高次元のベクトルを処理するように設計されており、あらゆるスケールで効率的かつ正確なベクトル検索が可能になります。 ベクトルをデータと一緒にドキュメントに直接保存できるようになりました。 データベース内の各ドキュメントには、従来のスキーマ フリーのデータだけでなく、ドキュメントのその他のプロパティとして高次元ベクトルも含めることができます。 このようにデータとベクトルをコロケーションすることで、ベクトルが表すデータと同じ論理ユニットに格納されるため、効率的なインデックス作成と検索が可能になります。 ベクトルとデータをまとめることにより、データ管理、AIアプリケーション アーキテクチャ、およびベクトルベースの操作の効率が簡略化されます。

Azure Cosmos DB for NoSQL は、ベクトル インデックスの作成方法を柔軟に選択できます。

  • "フラット" または k ニアレストネイバーによる完全検索 (ブルートフォースと呼ばれることもあります) は、より小さく、より焦点を絞ったベクトル検索に対して、100% の取得の再現率を提供できます。 特に、クエリ フィルターやパーティション キーと組み合わせた場合です。
  • DiskANN ベースの量子化手法を用いてベクトルを圧縮し、kNN 検索の効率を向上させる量子化フラット インデックス。
  • DiskANN は、Microsoft Research によって開発された最先端のベクトル インデックス作成アルゴリズム スイートで、効率的で精度の高いベクトル検索をあらゆるスケールで実現します。

ベクトル インデックス作成の詳細はこちら

Azure Cosmos DB のベクトル検索は、WHERE 句を使用して、サポートされている他のすべての Azure Cosmos DB NoSQL クエリ フィルターやインデックスと組み合わせることができます。 これにより、ベクトル検索をアプリケーションに最も関連性の高いデータにすることができます。

この機能により、Azure Cosmos DB のコア機能が強化され、AI アプリケーションにおけるベクトル データや検索要件の処理の汎用性が高まります。

ベクター ストアとは

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

ベクター ストアのしくみ

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

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

ベクトル検索のプレビュー機能への登録

Azure Cosmos DB for NoSQL のベクトル検索には、Azure Cosmos DB の [機能] ページでのプレビュー機能の登録が必要です。 次の手順で登録します。

  1. Azure Cosmos DB for NoSQL リソース ページに移動します。

  2. [設定] メニュー項目の [機能] ウィンドウを選択します。

  3. [Azure Cosmos DB for NoSQL におけるベクトル検索] を選択します。

  4. 機能の説明を読み、プレビューに登録することを確認します。

  5. プレビューに登録するには [有効にする] を選択します。

Note

登録要求は自動承認されますが、反映されるまで数分かかる場合があります。

Note

DiskANN は早期の限定的なプレビューで利用でき、このフォームに入力する必要があります。 リソースが DiskANN インデックスを使用するようにオンボードされると、Azure Cosmos DB チームのメンバーから連絡を受けます。

ヒント

または、Azure CLI を使って、NoSQL ベクトル検索をサポートするようにアカウントの機能を更新します。

az cosmosdb update \
     --resource-group <resource-group-name> \
     --name <account-name> \
     --capabilities EnableNoSQLVectorSearch

コンテナー ベクトル ポリシー

Azure Cosmos DB for NoSQL でベクトル検索を行うには、コンテナーにベクトル ポリシーを定義する必要があります。 これにより、データベース エンジンがコンテナーのドキュメントで見つかったベクトルの効率的な類似性検索を行うために不可欠な情報が提供されます。 また、必要な情報をベクトル インデックス作成ポリシーに通知します。 含まれるベクトル ポリシーには、次の情報が含まれます。

  • “path”: ベクターを含むプロパティへのパス (必須)。
  • "datatype": ベクトル プロパティのデータ型 (既定値 Float32)。 
  • "dimensions": パス内の各ベクトルの次元または長さ。 パス内のすべてのベクトルは同じ次元数である必要があります。 (既定値 1536)。
  • "distanceFunction": 距離と類似度の計算に使われるメトリック。 サポートされているメトリックは次のとおりです。
    • cosine: 値は -1 (最低類似度) から +1 (最高類似度) までです。
    • dotproduct: 値は -inf (最低類似度) から +inf (最高類似度) までです。
    • euclidean: 値は 0 (最高類似度) から +inf (最低類似度) までです。

Note

それぞれの一意のパスは、最大 1 つのポリシーを持つことができます。 ただし、すべてのポリシーで異なるパスが対象になる場合は、複数のポリシーを指定できます。

コンテナー ベクトル ポリシーは、JSON オブジェクトとして記述できます。 有効なコンテナー ベクトルポリシーの 2 つの例を次に示します。

単一ベクトル パスを持つポリシー

{
    "vectorEmbeddings": [
        {
            "path":"/vector1",
            "dataType":"float32",
            "distanceFunction":"cosine",
            "dimensions":1536
        }
    ]
}

2 つのベクトル パスを持つポリシー

{
    "vectorEmbeddings": [
        {
            "path":"/vector1",
            "dataType":"float32",
            "distanceFunction":"cosine",
            "dimensions":1536
        },
        {
            "path":"/vector2",
            "dataType":"int8",
            "distanceFunction":"dotproduct",
            "dimensions":100
        }
    ]
}

ベクトル インデックス作成ポリシー

ベクトル インデックス作成では、VectorDistance システム関数を使用して、ベクトル検索の実行効率を向上させます。 ベクトル検索は、ベクトル インデックス作成を使用することで、待機時間を短縮し、スループットを高め、RU 消費を削減します。 次の種類のベクトル インデックス ポリシーを指定できます。

説明 最大ディメンション
flat 他のインデックス プロパティと同じインデックスにベクトルを格納します。 505
quantizedFlat インデックスに格納する前にベクトルを量子化 (圧縮) します。 これにより、わずかな精度を犠牲にして、待機時間とスループットを向上させることができます。 4096
diskANN 高速かつ効率的な概算検索のために、DiskANN に基づいてインデックスを作成します。 4096

Note

quantizedFlatdiskANN インデックスでは、少なくとも 1,000 個のベクトルを挿入する必要があります。 これは、量子化プロセスの精度を確保するためです。 ベクトルが 1,000 個未満の場合は、代わりにフル スキャンが実行され、ベクトル検索クエリの RU 料金が高くなります。

注意すべき点をいくつか次に示します。

  • flat および quantizedFlat インデックスの種類は、Azure Cosmos DB のインデックスを使用して、ベクトル検索の実行時に各ベクトルを格納し、読み取ります。 flat インデックスを持つベクトル検索はブルート フォース検索であり、100% の精度または再現率を生み出します。 つまり、データセットで最も類似したベクトルを見つけることが保証されています。 ただし、フラット インデックス上のベクトルには 505 次元の制限があります。

  • quantizedFlat インデックスには、量子化された(圧縮された)ベクトルが格納されます。 quantizedFlat インデックスを使用したベクトル検索もブルート フォース検索ですが、インデックスに追加する前にベクトルが量子化されるため、精度は 100% をわずかに下回る可能性があります。 ただし、quantized flat を使用したベクトル検索は flat インデックスでのベクトル検索よりも待機時間が短く、スループットが高く、RU コストが低くなります。 これは、小規模なシナリオ (クエリ フィルターを使ってベクトル検索を比較的小さなベクトル セットに絞り込むシナリオ) に適したオプションです。 quantizedFlat は、少なくとも 1,000 個のベクトルがあり、コンテナー内に 100,000 個未満のベクトルがある場合に使用する必要があります。

  • diskANN インデックスは、Microsoft Research によって開発されたハイ パフォーマンス ベクトル インデックス作成アルゴリズム スイートである DiskANN を使用する、ベクトル専用に定義された個別のインデックスです。 DiskANN インデックスでは、高い精度を維持しながら、最短の待機時間、最高のスループット、および最小の RU コスト クエリが提供されます。 しかし、DiskANN は近似ニアレストネイバー (ANN) インデックスであるため、精度は quantizedFlatflat よりも低くなる可能性があります。 DiskANN は早期の限定的なプレビューで利用でき、このフォームに入力する必要があります。

重要

プレビューの初期段階では、一度作成したベクトル インデックスを変更することはできません。 代わりに、変更が必要な場合は、新しいベクトル インデックス ポリシーを使用して新しいコンテナーを作成する必要があります。

有効なベクトル インデックス ポリシーの例を次に示します。

{
    "indexingMode": "consistent",
    "automatic": true,
    "includedPaths": [
        {
            "path": "/*"
        }
    ],
    "excludedPaths": [
        {
            "path": "/_etag/?"
        },
        {
            "path": "/vector1"
        }
    ],
    "vectorIndexes": [
        {
            "path": "/vector1",
            "type": "quantizedFlat"
        }
    ]
}
{
    "indexingMode": "consistent",
    "automatic": true,
    "includedPaths": [
        {
            "path": "/*"
        }
    ],
    "excludedPaths": [
        {
            "path": "/_etag/?"
        },
        {
            "path": "/vector1",
        },
        {
            "path": "/vector2",
        }
    ],
    "vectorIndexes": [
        {
            "path": "/vector1",
            "type": "quantizedFlat"
        },
        {
            "path": "/vector2",
            "type": "DiskANN"
        }
    ]
}

重要

挿入の最適なパフォーマンスを確保するためにインデックス作成ポリシーの "excludedPaths" セクションに追加されたベクトル パス。 ベクトル パスを "excludedPaths" に追加しないと、ベクトル挿入に対してより高い RU 料金と待機時間が発生します。

重要

現時点のベクトル検索プレビューでは、ベクトル ポリシーのパスにおいて、入れ子になったパスまたはワイルドカード文字は使われません。 ベクトル ポリシーでの置換操作は、現在サポートされていません。

VectorDistance() を使用したクエリによるベクトル検索を実行する

望ましいベクトル ポリシーでコンテナーを作成し、コンテナーにベクトル データを挿入すると、クエリで Vector Distance システム関数を使用してベクトル検索を行うことができます。 類似スコアをエイリアス SimilarityScore として投影し、類似性を最も高いものから最も低いものの順に並べ替える NoSQL クエリの例:

SELECT c.title, VectorDistance(c.contentVector, [1,2,3]) AS SimilarityScore   
FROM c  
ORDER BY VectorDistance(c.contentVector, [1,2,3])   

現在の制限と制約

Azure Cosmos DB for NoSQL のベクトル インデックス作成と検索は、パブリック プレビューの初期段階ではいくつかの制限事項があります。

  • ベクトル インデックス ポリシーで指定できるインデックスの種類は、パスごとに最大 1 つです。
  • コンテナーごとに指定できる DiskANN インデックスの種類は最大 1 つです
  • ベクトル インデックス作成は新しいコンテナーでのみサポートされています。
  • flat インデックスの種類でインデックス作成されたベクトルは、最大 505 次元です。 quantizedFlat または DiskANN インデックスの種類でインデックス作成されたベクトルは、最大 4096 次元です。
  • quantizedFlat は DiskANN と同じ量子化方法を活用し、現時点では構成できません。
  • 共有スループット データベースでは、現時点ではベクトル検索プレビュー機能を使用できません。
  • DiskANN の早期プレビューの使用中は、取り込み量を制限する必要があります。
  • プレビューの現時点で、ベクトル検索は、分析ストア、共有スループット、カスタマー マネージド キー、継続的バックアップ、Storage Analytics、およびすべてのバージョンと削除変更フィードを持つアカウントではサポートされていません。

次のステップ