分享方式:


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

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

RRF 是以倒數排名的概念為基礎,這是搜尋結果清單中第一個相關文件的排名反向排列。 此技巧的目標是要考慮到項目在原始排名中的位置,並強調在多個清單中排名較高的項目。 這有助於改善最終排名的整體品質和可靠性,使其更適合用於融合多個已排序的搜尋結果工作。

注意

2024-09-01-preview新功能是將 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 (餘弦),0 至 1 適用於 Euclidean 和 DotProduct。
混合式搜尋 @search.score RRF 演算法 上限是由要融合的查詢數目所限定,每個查詢最多提供 1 至 RRF 分數。 例如,合併三個查詢會產生高於合併兩個搜尋結果的 RRF 分數。
語意排名 @search.rerankerScore 語意排名 0.00 - 4.00

語意排名會在 RRF 合併結果之後發生。 其分數 (@search.rerankerScore) 一律會在查詢回應中個別報告。 語意排名工具可以重新產生全文檢索搜尋和混合式搜尋結果,假設這些結果包含具有語意豐富內容的欄位。 如果搜尋文件包含的文字欄位中包含語意相關的內容,其可以重新排名單純向量查詢。

將搜尋分數解壓縮到子核心中 (預覽)

使用 2024-09-01-preview,您可以解構搜尋分數來檢視其子核心。

對於向量查詢,這項資訊可協助您判斷適用於向量加權的適當值,或設定最小臨界值

若要取得子核心:

  • 使用最新的預覽搜尋檔 REST API 或提供此功能的 Azure SDK Beta 套件。

  • 變更查詢要求,如果使用語意排名器或 all,請將新的debug參數新增至 其中一vectorsemantic個 。

以下是以偵錯模式傳回子核心的混合式查詢範例:

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 時,搜尋引擎會查看該文件在其出現的每個結果集中的排名。 假設文件出現在三個不同的搜尋結果中,其中結果來自兩項向量查詢和一項文字 BM25 排名查詢。 文件的位置因每個結果而異。

找到相符項目 結果中的位置 @search.score 加權乘數 @search.score (加權)
向量結果一 位置 1 0.8383955 0.5 0.41919775
向量結果二 位置 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 個最高排名相符項目。

搜尋引擎尋找的結果通常會比 topk更多。 若要傳回更多結果,請使用分頁參數 topskipnext。 分頁可供您決定每個邏輯頁面上的結果數目並瀏覽完整承載。 您可將 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"
}

另請參閱