Azure Cosmos DB for 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 の [機能] ページでの有効化が必要です。 次の手順で登録します。
Azure Cosmos DB for NoSQL リソース ページに移動します。
[設定] メニュー項目の [機能] ウィンドウを選択します。
[Azure Cosmos DB for NoSQL におけるベクトル検索] 機能を選択します。
機能の説明を読み、有効にすることを確認します。
[有効] を選択して、ベクトル インデックス作成と検索機能を有効にします。
ヒント
または、Azure CLI を使って、NoSQL ベクトル検索をサポートするようにアカウントの機能を更新します。
az cosmosdb update \ --resource-group <resource-group-name> \ --name <account-name> \ --capabilities EnableNoSQLVectorSearch
Note
登録要求は自動承認されますが、アカウントで完全にアクティブになるまで 15 分かかる場合があります。
コンテナー ベクトル ポリシー
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
quantizedFlat
と diskANN
インデックスでは、少なくとも 1,000 個のベクトルを挿入する必要があります。 これは、量子化プロセスの精度を確保するためです。 ベクトルが 1,000 個未満の場合は、代わりにフル スキャンが実行され、ベクトル検索クエリの RU 料金が高くなります。
注意すべき点をいくつか次に示します。
flat
およびquantizedFlat
インデックスの種類は、Azure Cosmos DB のインデックスを使用して、ベクトル検索の実行時に各ベクトルを格納し、読み取ります。flat
インデックスを持つベクトル検索はブルート フォース検索であり、100% の精度または再現率を生み出します。 つまり、データセットで最も類似したベクトルを見つけることが保証されています。 ただし、フラット インデックス上のベクトルには505
次元の制限があります。quantizedFlat
インデックスには、量子化された(圧縮された)ベクトルが格納されます。quantizedFlat
インデックスを使用したベクトル検索もブルート フォース検索ですが、インデックスに追加する前にベクトルが量子化されるため、精度は 100% をわずかに下回る可能性があります。 ただし、quantized flat
を使用したベクトル検索はflat
インデックスでのベクトル検索よりも待機時間が短く、スループットが高く、RU コストが低くなります。 これは、小規模なシナリオ (クエリ フィルターを使ってベクトル検索を比較的小さなベクトル セットに絞り込むシナリオ) に適したオプションです。quantizedFlat
は、インデックスを作成するベクトルの数が物理パーティションあたり約 50,000 個以下である場合に推奨されます。 ただし、これは単なる一般的なガイドラインであり、各シナリオが異なる可能性があるので、実際のパフォーマンスをテストする必要があります。diskANN
インデックスは、Microsoft Research によって開発されたハイ パフォーマンス ベクトル インデックス作成アルゴリズム スイートである DiskANN を使用する、ベクトル専用に定義された個別のインデックスです。 DiskANN インデックスでは、高い精度を維持しながら、最短の待機時間、最高のスループット、および最小の RU コスト クエリが提供されます。 一般に、物理パーティションあたり 50,000 個を超えるベクトルがある場合、DiskANN がすべてのインデックスの種類で最もパフォーマンスが高くなります。
有効なベクトル インデックス ポリシーの例を次に示します。
{
"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"
}
]
}
重要
挿入の最適なパフォーマンスを確保するためにインデックス作成ポリシーの "excludedPaths" セクションに追加されたベクトル パス。 ベクトル パスを "excludedPaths" に追加しないと、ベクトル挿入に対してより高い RU 料金と待機時間が発生します。
重要
ワイルドカード文字 (*、[]) は、現時点でベクトル ポリシーまたはベクトル インデックスではサポートされていません。
VectorDistance() を使用したクエリによるベクトル検索を実行する
望ましいベクトル ポリシーでコンテナーを作成し、コンテナーにベクトル データを挿入すると、クエリで Vector Distance システム関数を使用してベクトル検索を行うことができます。 類似スコアをエイリアス SimilarityScore
として投影し、類似性を最も高いものから最も低いものの順に並べ替える NoSQL クエリの例:
SELECT TOP 10 c.title, VectorDistance(c.contentVector, [1,2,3]) AS SimilarityScore
FROM c
ORDER BY VectorDistance(c.contentVector, [1,2,3])
重要
クエリの SELECT
ステートメントでは、常に TOP N
句を使用してください。 そうしないと、ベクトル検索はもっと多くの結果を返そうとし、クエリにかかる RU が増え、必要以上に待ち時間が長くなります。
現在の制限
Azure Cosmos DB for NoSQL のベクトル インデックス作成と検索には、いくつかの制限があります。
quantizedFlat
とdiskANN
インデックスでは、量子化が正確であることを保証するために、少なくとも 1,000 個のベクトルのインデックスを作成する必要があります。 インデックスが作成されるベクトルが 1,000 個未満の場合は、代わりにフルスキャンが使用され、RU 料金が高くなる可能性があります。flat
インデックスの種類でインデックス作成されたベクトルは、最大 505 次元です。quantizedFlat
またはDiskANN
インデックスの種類でインデックス作成されたベクトルは、最大 4096 次元です。quantizedFlat
インデックスは DiskANN と同じ量子化方法を利用します。- ベクトル挿入のレートは制限されます。 非常に大規模なインジェスト (5M ベクトルを超える) には、追加のインデックス ビルド時間が必要になる場合があります。
- 共有スループット データベースは、サポートされていません。
- 現時点では、ベクトル インデックス作成と検索は、分析ストア (および Synapse Link) と共有スループットを持つアカウントではサポートされていません。
- コンテナーでベクトル インデックス作成と検索が有効になったら、無効にすることはできません。
関連するコンテンツ
- DiskANN と Azure Cosmos DB - Microsoft Mechanics ビデオ
- .NET - ベクトル データのインデックス作成とクエリの方法
- Python - ベクトル データのインデックス作成とクエリの方法
- Java - ベクトル データのインデックス作成とクエリの方法
- VectorDistance システム関数
- ベクトル インデックスの概要
- ベクトル インデックス ポリシー
- インデックスの管理
- 統合: