使用倒數排名融合在混合式搜尋中的相關性評分 (RRF)

倒數排名融合 (RRF) 是一種演算法,可評估多個先前排名結果的搜尋分數,以產生統一的結果集。 在 Azure AI 搜尋中,每當有兩個以上的查詢平行執行時,就會使用 RRF。 每個查詢都會產生排名的結果集,而 RRF 可用來將排名合併並同質化為查詢回應中傳回的單一結果集。 一律使用 RRF 的案例範例包括 混合式搜尋 和同時執行的多個向量查詢。

RRF 是以倒數排名 的概念 為基礎,這是搜尋結果清單中第一個相關檔的順位反數。 此技術的目標是要考慮到專案在原始排名中的位置,並重視在多個清單中排名較高的專案。 這有助於改善最終排名的整體品質和可靠性,使其更適合用於撫摸多個已排序的搜尋結果的工作。

RRF 排名的運作方式

RRF 的運作方式是取得多個方法的搜尋結果、將相互排名分數指派給結果中的每個檔,然後結合分數來建立新的排名。 概念是,跨多個搜尋方法出現在頂端位置的檔可能會比較相關,而且應該在合併的結果中排名較高。

以下是 RRF 程式的簡單說明:

  1. 從平行執行的多個查詢取得排名搜尋結果。

  2. 針對每個排名清單中的結果,指派對等排名分數。 RRF 會為每個結果集中的每個相符專案產生新的 @search.score 。 針對搜尋結果中的每個檔,引擎會根據其在清單中的位置指派倒數排名分數。 分數會計算為 1/(rank + k) ,其中 rank 是檔在清單中的位置,而且 k 是常數,如果它設定為 60 之類的小值,則會以實驗方式觀察到最佳效能。 請注意,這個 k 值是 RRF 演算法中的常數,且與控制最接近鄰近數數目的 完全分開 k

  3. 結合分數。 針對每個檔,引擎會加總從每個搜尋系統取得的倒數排名分數,為每個檔產生合併的分數。 

  4. 引擎會根據合併分數對檔進行排名,並加以排序。 產生的清單是融合排名。

只有標示為 searchable 索引 searchFields 或查詢中的欄位才會用於評分。 只有標示為 retrievable 的欄位,或查詢中指定的 select 欄位,才會在搜尋結果中傳回,以及其搜尋分數。

平行查詢執行

每當有多個查詢執行時,就會使用 RRF。 下列範例說明平行查詢執行的查詢模式:

  • 全文檢索查詢,加上一個向量查詢(簡單混合式案例),等於兩個查詢執行。
  • 全文檢索查詢,加上一個以兩個向量欄位為目標的向量查詢,等於三個查詢執行。
  • 全文檢索查詢,加上兩個以五個向量欄位為目標的向量查詢,等於 11 個查詢執行

混合式搜尋結果中的分數

每當結果進行排名時, @search.score 屬性就會包含用來排序結果的值。 分數是由針對每個方法而有所不同的排名演算法所產生。 每個演算法都有自己的範圍和大小。

下圖會識別針對每個相關性排名演算法在每個相符專案、演算法和分數範圍上傳回的評分屬性。

搜尋方法 參數 評分演算法 範圍
全文檢索搜尋 @search.score BM25 演算法 沒有上限。
向量搜尋 @search.score HNSW 演算法,使用 HNSW 組態中指定的相似度計量。 0.333 - 1.00 (Cosine),0 到 1 適用于 Euclidean 和 DotProduct。
混合式搜尋 @search.score RRF 演算法 上限是由要融合的查詢數目所限定,每個查詢最多貢獻 1 到 RRF 分數。 例如,合併三個查詢會產生高於合併兩個搜尋結果的 RRF 分數。
語意排名 @search.rerankerScore 語意排名 0.00 - 4.00

語意排名不會參與 RRF。 其分數 ( @search.rerankerScore ) 一律會在查詢回應中個別報告。 語意排名可以重新產生全文檢索和混合式搜尋結果,假設這些結果包含具有語意豐富內容的欄位。

混合式查詢回應中的排名結果數目

根據預設,如果您未使用分頁,搜尋引擎會傳回全文檢索搜尋的前 50 個最高排名相符專案,以及向量搜尋最類似的 k 相符專案。 在混合式查詢中, top 判斷回應中的結果數目。 根據預設值,會傳回統一結果集的前 50 個最高排名相符專案。

搜尋引擎通常會尋找的結果比 topk 更多。 若要傳回更多結果,請使用分頁參數 topskipnext 。 分頁是決定每個邏輯頁面上的結果數目,並流覽完整承載的方式。

全文檢索搜尋受限於 1,000 個相符專案上限(請參閱 API 回應限制 )。 找到 1,000 個相符專案之後,搜尋引擎就不會再尋找更多專案。

如需詳細資訊,請參閱 如何使用搜尋結果

搜尋評分工作流程的圖表

下圖說明可叫用關鍵字和向量搜尋的混合式查詢,並透過評分設定檔和語意排名提升。

Diagram of prefilters.

產生上一個工作流程的查詢可能如下所示:

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2023-11-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"
}

另請參閱