Reciprocal Rank Fusion (RRF) を使用したハイブリッド検索での関連性スコアリング
Reciprocal Rank Fusion (RRF) は、以前にランク付けされた複数の結果の検索スコアを評価して、統合された結果セットを生成するアルゴリズムです。 Azure AI Search では、並列で実行される 2 つ以上のクエリがある場合は、常に RRF が使用されます。 各クエリがランク付けされた結果セットを生成し、RRF はランク付けをマージして、クエリ応答で返される 1 つの結果セットに均質化するために使用されます。 常に RRF が使用されるシナリオの例としては、ハイブリッド検索、同時に実行される複数のベクター クエリなどがあります。
RRF は、"逆順位" の概念に基づいています。これは、検索結果のリスト内の最初の関連ドキュメントのランクの逆数です。 この手法の目標は、元のランキング内の項目の位置を考慮して、複数のリストで上位にランク付けされた項目により高い重要性を与えることです。 これにより、最終的なランク付けの全体的な品質と信頼性が向上し、複数の順序付けされた検索結果を融合するタスクに役立ちます。
Note
2024-09-01-preview の新機能は、RRF ランク付け検索スコアをそのコンポーネント サブスコアに分解する機能です。 これにより、すべてのスコア構成に対する透明性が得られます。 詳細については、この記事の検索スコアのアンパック (プレビュー) に関する記述を参照してください。
RRF ランク付けのしくみ
RRF は、複数の方法から検索結果を取得し、結果の各ドキュメントに逆順位スコアを割り当て、スコアを組み合わせて新しいランク付けを作成することで機能します。 この概念では、複数の検索方法で上位の位置に表示されるドキュメントはより関連性が高い可能性があるため、結合された結果の上位にランク付けされます。
RRF プロセスの簡単な説明を次に示します。
並列で実行される複数のクエリからランク付けされた検索結果を取得します。
ランク付けされた各リストの結果に対して逆順位スコアを割り当てます。 RRF は、各結果セットの一致ごとに新しい
@search.score
を生成します。 検索結果のドキュメントごとに、エンジンはリスト内の位置に基づいて逆順位スコアを割り当てます。 スコアは1/(rank + k)
として計算されます。ここで、rank
はリスト内のドキュメントの位置であり、k
は定数で、60 などの小さな値に設定されている場合に最適に実行されることが実験で確認されています。 このk
値は RRF アルゴリズムの定数であり、最も近い近傍の数を制御するk
とは完全に別の定数であることに注意してください。スコアを結合します。 各ドキュメントについて、エンジンは各検索システムから取得した逆順位スコアを合計し、各ドキュメントの結合スコアを生成します。
エンジンは、結合されたスコアに基づいてドキュメントをランク付けし、それらを並べ替えます。 結果のリストは融合されたランキングです。
スコアリングには、インデックスで searchable
としてマークされているフィールド、またはクエリで searchFields
としてマークされているフィールドのみが使用されます。 retrievable
としてマークされたフィールド、またはクエリの select
で指定されたフィールドのみが、検索スコアと共に検索結果に返されます。
並列クエリの実行
RRF は、複数のクエリが実行されるたびに使用されます。 次の例は、並列クエリ実行が行われるクエリ パターンを示しています。
- フルテキスト クエリと 1 つのベクター クエリ (単純なハイブリッド シナリオ) は、2 つのクエリ実行に相当します。
- フルテキスト クエリと、2 つのベクター フィールドを対象とする 1 つのベクター クエリは、3 つのクエリ実行に相当します。
- フルテキスト クエリと、5 つのベクター フィールドを対象とする 2 つのベクター クエリは、11 個のクエリ実行に相当します
ハイブリッド検索結果のスコア
結果がランク付けされるたびに、@search.score
プロパティには結果の順序付けに使用される値が含まれます。 スコアは、方法ごとに異なるランク付けアルゴリズムによって生成されます。 各アルゴリズムには、独自の範囲と大きさがあります。
次の表に、各関連性ランク付けアルゴリズムの各一致で返されるスコアリング プロパティ、アルゴリズム、スコアの範囲を示します。
検索メソッド | パラメーター | スコアリング アルゴリズム | Range |
---|---|---|---|
フルテキスト検索 (full-text search) | @search.score |
BM25 アルゴリズム | 上限なし。 |
ベクトル検索 | @search.score |
HNSW アルゴリズム。HNSW 構成で指定された類似性メトリックを使用します。 | 0.333 - 1.00 (Cosine)、Euclidean と DotProduct の場合は 0 から 1。 |
ハイブリッド検索 | @search.score |
RRF アルゴリズム | 上限は結合されるクエリの数によって制限され、各クエリは RRF スコアに対して最大約 1 を寄与します。 たとえば、3 つのクエリをマージすると、2 つの検索結果のみがマージされる場合よりも RRF スコアが高くなります。 |
セマンティック ランク付け | @search.rerankerScore |
セマンティック ランク付け | 0.00 - 4.00 |
セマンティック ランク付けは、RRF による結果のマージ後に発生します。 そのスコア (@search.rerankerScore
) は、常にクエリ応答で個別に報告されます。 セマンティック ランカーでは、フルテキストやハイブリッドの検索結果が、セマンティックにリッチなコンテンツを持つフィールドを含んでいるという前提の下、それらの検索結果を再ランク付けします。 検索ドキュメントに、セマンティックに関連のあるコンテンツを含むテキスト フィールドが含まれている場合、純粋ベクトル クエリの再ランク付けが行えます。
検索スコアをサブスコアにアンパックする (プレビュー)
2024-09-01-preview を使用すると、検索スコアを分解して、そのサブスコアを表示できます。
ベクトル クエリの場合、この情報は、ベクトル重み付けに適切な値を決定したり、最小しきい値を設定するのに役立ちます。
サブスコアを取得するには:
最新のプレビュー Search Documents REST API または機能を提供する Azure SDK ベータ パッケージを使用します。
クエリ要求を変更し、
vector
、semantic
(セマンティック ランカーを使用する場合)、またはall
のいずれかに設定された新しいdebug
パラメーターを追加します。
デバッグ モードでサブスコアを返すハイブリッド クエリの例を以下に示します。
POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2024-09-01=preview
{
"vectorQueries": [
{
"vector": [
-0.009154141,
0.018708462,
. . .
-0.02178128,
-0.00086512347
],
"fields": "DescriptionVector",
"kind": "vector",
"exhaustive": true,
"k": 10
},
{
"vector": [
-0.009154141,
0.018708462,
. . .
-0.02178128,
-0.00086512347
],
"fields": "DescriptionVector",
"kind": "vector",
"exhaustive": true,
"k": 10
}
],
"search": "historic hotel walk to restaurants and shopping",
"select": "HotelName, Description, Address/City",
"debug": "vector",
"top": 10
}
加重スコア
2024-07-01 以降のプレビュー API バージョン を使用して、ベクトル クエリの重み付けを設定し、ハイブリッド クエリで重要度を増減させることができます。
特定のドキュメントの RRF を計算する場合、検索エンジンにより、表示される各結果セットについてそのドキュメントのランクが検索されることを思い出してください。 1 つのドキュメントが 3 つの別々の検索結果に表示され、結果が 2 つのベクトル クエリと 1 つのテキスト BM25 ランク クエリからのものであるとします。 ドキュメントの位置は、結果ごとに異なります。
一致項目 | 結果内の位置 | @search.score | 重み付け乗数 | @search.score (加重済み) |
---|---|---|---|---|
ベクター結果 1 | 位置 1 | 0.8383955 | 0.5 | 0.41919775 |
ベクター結果 2 | 位置 5 | 0.81514114 | 2.0 | 1.63028228 |
BM25 結果 | 位置 10 | 0.8577363 | NA | 0.8577363 |
各結果セットでのドキュメントの位置は、初期スコアに対応します。これは、そのドキュメントの最終的な RRF スコアを作成するために追加されます。
ベクトルの重みを追加した場合、初期スコアは、スコアを増減する重み付け乗数の影響を受けます。 既定値は 1.0 で、重み付けがなく、初期スコアは RRF スコアリングでそのまま使用されることを意味します。 ただし、0.5 の重みを追加すると、スコアが下がり、その結果は結合されたランク付けでは重要度が低くなります。 反対に、2.0 の重みを追加すると、RRF スコア全体でのスコアの影響が大きくなります。
この例では、@search.score (加重済み) の値は、RRF ランク付けモデルに渡されます。
ハイブリッド クエリ応答のランク付けされた結果の数
既定では、改ページを使用していない場合、検索エンジンは、フルテキスト検索では上位 50 位のランクの一致、ベクトル検索では最も類似した k
個の一致を返します。 ハイブリッド クエリでは、top
によって応答の結果の数が決まります。 既定に基づいて、統合結果セットの上位 50 にランク付けされた一致が返されます。
多くの場合、検索エンジンは top
や k
よりも多くの結果を見つけます。 より多くの結果を返すには、ページング パラメーター top
、skip
、next
を使用します。 ページングは、各論理ページ上の結果の数を決定し、完全なペイロードを導く方法です。 maxTextRecallSize
をより大きな値 (既定値は 1,000) に設定すると、ハイブリッド クエリのテキスト側からより多くの結果を返すことができます。
既定では、フルテキスト検索には、最大 1,000 件の一致という制限が適用されます (「API 応答の制限」を参照)。 1,000 件の一致が見つかると、検索エンジンはそれ以上の検索を行いません。
詳細については、「検索結果の操作方法」を参照してください。
検索スコアリング ワークフローの図
次の図は、スコアリング プロファイルによるブーストとセマンティック ランク付けを使用して、キーワード検索やベクトル検索を呼び出すハイブリッド クエリを示しています。
前のワークフローを生成するクエリは、次のようになります。
POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2024-07-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
"queryType":"semantic",
"search":"hello world",
"searchFields":"field_a, field_b",
"vectorQueries": [
{
"kind":"vector",
"vector": [1.0, 2.0, 3.0],
"fields": "field_c, field_d"
},
{
"kind":"vector",
"vector": [4.0, 5.0, 6.0],
"fields": "field_d, field_e"
}
],
"scoringProfile":"my_scoring_profile"
}