Azure Cosmos DB for NoSQL におけるハイブリッド検索 (プレビュー)
Azure Cosmos DB for NoSQL では、逆ランク Fusion (RRF) 関数を使用してベクトル検索とフル テキスト検索スコアリング (BM25) を組み合わせた強力なハイブリッド検索機能がサポートされるようになりました。
Note
フルテキストおよびハイブリッド検索は早期プレビュー段階であり、現時点では一部のリージョンでは利用できない場合があります。
ハイブリッド検索とは
ハイブリッド検索では、ベクトルベースと従来のキーワードベースの検索方法の両方の長所を活用して、より関連性の高い正確な検索結果を提供します。 Azure Cosmos DB for NoSQL では、メタデータとベクトルの両方を同じドキュメント内に格納できるため、ハイブリッド検索は簡単に実行できます。
Azure Cosmos DB for NoSQL のハイブリッド検索には、次の 2 つの異なる検索方法が統合されています:
- ベクトル検索: 機械学習モデルを利用して、クエリとドキュメントのセマンティックな意味を理解します。 これにより、より微妙でコンテキストに対応した検索結果が得られ、従来のキーワード検索が不足する可能性がある複雑なクエリに特に役立ちます。
- フル テキスト検索 (BM25): 単語と用語の存在と頻度に基づいてドキュメントをスコア付けする、確立されたアルゴリズム。 BM25 は、単純なキーワード検索に特に効果的であり、検索の関連性に対する堅牢なベースラインを提供します。
ベクトル検索とフル テキスト検索の結果は、逆ランク融合 (RRF) 関数を使用して結合されます。 RRF は、複数の検索アルゴリズムのランク付けをマージして、1 つの統一されたランク付けを生成するランク集計方法です。 これにより、最終的な検索結果は、両方の検索アプローチの長所からメリットを得られ、複数の利点を提供します。
- 関連性の強化: セマンティック理解とキーワード マッチングを組み合わせることで、ハイブリッド検索は、さまざまなクエリに対してより関連性の高い結果を提供します。
- 精度の向上: RRF 関数を使用すると、両方の検索方法の最も適切な結果が優先されます。
- 汎用性: 取得拡張生成 (RAG) など、独自のデータに基づいて LLM によって生成される応答を改善するさまざまなユース ケースに適しています。
ハイブリッド検索の使用方法
- Azure Cosmos DB for NoSQL でのベクトル検索機能を有効にします。
- NoSQL のフル テキストとハイブリッド検索プレビュー機能を有効にします。
- ベクトル ポリシー、フル テキスト ポリシー、ベクトル インデックス、フルテ キスト インデックスを使用してコンテナーを作成します。
- テキストとベクトル プロパティを使用してデータを挿入します。
- データに対してハイブリッド クエリを実行します。
ハイブリッド検索用にポリシーとインデックスを構成する
重要
現在、ベクトル ポリシーとベクトル インデックスは、作成後に変更できません。 変更するには、新しいコレクションを作成してください。
サンプル ベクトル ポリシー
{
"vectorEmbeddings": [
{
"path":"/vector",
"dataType":"float32",
"distanceFunction":"cosine",
"dimensions":3
},
}
サンプル フル テキスト ポリシー
{
"defaultLanguage": "en-US",
"fullTextPaths": [
{
"path": "/text",
"language": "en-US"
}
]
}
フル テキスト インデックスとベクトル インデックスの両方を含むサンプル インデックス作成ポリシー
{
"indexingMode": "consistent",
"automatic": true,
"includedPaths": [
{
"path": "/*"
}
],
"excludedPaths": [
{
"path": "/\"_etag\"/?"
},
{
"path": "/vector/*"
}
],
"fullTextIndexes": [
{
"path": "/text"
}
],
"vectorIndexes": [
{
"path": "/vector",
"type": "DiskANN"
}
]
}
ハイブリッド検索クエリ
ハイブリッド検索クエリは、VectorDistance
関数と FullTextScore
の両方を含む ORDER BY RANK
句で RRF
システム関数を利用することで実行できます。 たとえば、最も関連性の高い結果に上位の k を検索するパラメーター化されたクエリは、次のようになります:
SELECT TOP @k *
FROM c
ORDER BY RANK RRF(VectorDistance(c.vector, @queryVector), FullTextScore(c.content, [@searchTerm1, @searchTerm2, ...]))
プロパティ c.vector
内の各ドキュメントにベクター埋め込みと、プロパティ c.text に含まれるテキスト データを含むドキュメントがあるとします。 ハイブリッド検索を使用して最も関連性の高い 10 個のドキュメントを取得するには、クエリを次のように記述します:
SELECT TOP 10 *
FROM c
ORDER BY RANK RRF(VectorDistance(c.vector, [1,2,3]), FullTextScore(c.text, ["text", "to", "search", "goes" ,"here])