次の方法で共有


Cosmos DB のインデックス ベクター データ (AzureとFabric)

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

Cosmos DB は、ベクター インデックス作成方法を選択する際に提供する柔軟性を提供します。

  • "フラット" または k ニアレストネイバーによる完全検索 (ブルートフォースと呼ばれることもあります) は、より小さく、より焦点を絞ったベクトル検索に対して、100% の取得の再現率を提供できます。 特に、クエリ フィルターやパーティション キーと組み合わせた場合です。

  • DiskANN ベースの量子化手法を用いてベクトルを圧縮し、kNN 検索の効率を向上させる量子化フラット インデックス。

  • DiskANN は、Microsoft Research によって開発された最先端のベクター インデックス作成アルゴリズムのスイートで、あらゆる規模で効率的で高精度なマルチモーダル ベクター検索を実現します。

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

この機能により、Cosmos DB のコア機能が強化され、AI アプリケーションでのベクター データと検索の要件を処理するための汎用性が高くなります。

ベクター ストアとは

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

ベクター ストアのしくみ

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

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

コンテナー ベクター ポリシー

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

  • path: ベクターを含むプロパティ (必須)。

  • datatype: vector プロパティのデータ型。 サポートされている型は、 float32 (既定)、 int8、および uint8です。

  • dimensions: パス内の各ベクトルの次元または長さ。 パス内のすべてのベクトルは同じ次元数である必要があります。 (既定の 1536)。

  • distanceFunction: 距離/類似性の計算に使用されるメトリック。 サポートされているメトリックは次のとおりです。

    • cosineは、$-1$ (最も似た値) から $+1$ (最も似ている) までの値を持ちます。

    • dot productは、$-\infty$ (最も類似) から $+\infty$ (最も類似) までの値を持ちます。

    • euclideanは、$0$ (最も似ている) から $+\infty$ (最も似た値) までの値を持ちます。

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

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

1 つのベクター パスを持つポリシー

この例では、1 つのベクター パスを持つベクター埋め込みポリシー構成を示します。コサインの類似性を持つ 1536 次元 float32 ベクターを格納するための基本的な設定を示します。 この構成は、次の例を示しています。

  • /[0]: 1536 次元ベクトルに対してコサインの類似性を持つ float32 データ型を使用します (OpenAI 埋め込みで一般的)
{
  "vectorEmbeddings": [
    {
      "path": "/vector1",
      "dataType": "float32",
      "distanceFunction": "cosine",
      "dimensions": 1536
    }
  ]
}

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

この例では、2 つの異なるベクター埋め込みパスを使用してベクター インデックス作成ポリシーを構成する方法を示します。各パスには、個別のデータ型、距離関数、およびディメンションがあります。 この構成は、次の例を示しています。

  • /[0]: 1536 次元ベクトルに対してコサインの類似性を持つ float32 データ型を使用します (OpenAI 埋め込みで一般的)
  • /[1]:100 次元ベクトルに対してドット積距離を持つ int8 データ型を使用します (小さな埋め込みではメモリ効率が高くなります)
{
  "vectorEmbeddings": [
    {
      "path": "/vector1",
      "dataType": "float32",
      "distanceFunction": "cosine",
      "dimensions": 1536
    },
    {
      "path": "/vector2",
      "dataType": "int8",
      "distanceFunction": "dotproduct",
      "dimensions": 100
    }
  ]
}

コンテナー ベクター ポリシーの設定の詳細と例については、 ベクター インデックス作成ポリシーのサンプルを参照してください。

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

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

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

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

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

  • quantizedFlat インデックスには、量子化された(圧縮された)ベクトルが格納されます。 quantizedFlat インデックスを使用したベクトル検索もブルート フォース検索ですが、インデックスに追加する前にベクトルが量子化されるため、精度は 100% をわずかに下回る可能性があります。 ただし、quantized flat を使用したベクトル検索は flat インデックスでのベクトル検索よりも待機時間が短く、スループットが高く、RU コストが低くなります。 このインデックスは、小さなシナリオや、クエリ フィルターを使用してベクター検索を比較的小さなベクターセットに絞り込むシナリオに適しています。 quantizedFlat は、インデックスを作成するベクトルの数が物理パーティションあたり約 50,000 個以下である場合に推奨されます。 ただし、この推奨事項は一般的なガイドラインに過ぎず、実際のパフォーマンスをテストする必要があります。各シナリオは異なる場合があります。

  • diskANN インデックスは、DiskANN を使用するベクターに対して特別に定義された独立したインデックスです。これは、Microsoft Research によって開発された一連の高性能ベクター インデックス作成アルゴリズムです。 DiskANN インデックスでは、高い精度を維持しながら、最短の待機時間、最高のスループット、および最小の RU コスト クエリが提供されます。 一般に、物理パーティションあたり 50,000 個を超えるベクトルがある場合、DiskANN がすべてのインデックスの種類で最もパフォーマンスが高くなります。

  • quantizedFlatインデックスとdiskANNインデックスでは、vectorIndexes プロパティを使用して、quantizerType オブジェクトの 2 つの量子化方法 (productspherical) がサポートされます。

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

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

量子化メソッド

さらに、 vectorIndexes オブジェクトで量子化方法を直接指定することもできます。 Cosmos DB では、 product、既定の方法、 spherical (パブリック プレビュー) の 2 つの量子化方法がサポートされています。これにより、インデックス作成時間の短縮や再呼び出しの増加など、パフォーマンス特性が向上する可能性があります。 量子化方法は、次に示すように、quantizerType オブジェクトの vectorIndexes プロパティを使用して指定できます。

{
  "vectorIndexes": [
    {
      "path": "/vector1",
      "type": "diskANN",
      "quantizerType": "spherical"
    }
  ]
}

Important

ワイルドカード文字 (*[]) は現在、ベクター ポリシーまたはベクター インデックスではサポートされていません。

を使用してクエリでベクター検索を実行する VECTORDISTANCE

目的のベクター ポリシーを使用してコンテナーを作成し、ベクター データをコンテナーに挿入したら、クエリ で組み込みの VECTORDISTANCE 関数 を使用してベクター検索を実行できます。 類似性スコアをエイリアス score として投影し、最も類似度が最も低い順に並べ替えるNoSQL クエリの例を次に示します。

SELECT TOP 10
  c.title,
  VECTORDISTANCE(c.contentVector, [1,2,3]) AS score 
FROM
  container c
ORDER BY
  VECTORDISTANCE(c.contentVector, [1,2,3])   

Important

クエリの TOP N ステートメントでは、常に SELECT 句を使用してください。 それ以外の場合、ベクター検索は、より多くの結果を返そうとするため、クエリは要求ユニット (RU) のコストが高くなり、必要以上に待ち時間が長くなります。