設定 BM25 相關性評分

在本文中,了解如何設定 Azure AI 搜尋服務用於全文檢索搜尋查詢的 BM25 相關性評分演算法。 其也會說明如何在較舊的搜尋服務上啟用 BM25。

BM25 適用於:

  • 在具有 searchable 屬性的文字欄位上,使用 search 參數進行全文檢索搜尋的查詢。
  • 評分的範圍限定在 searchFields,或限定在所有 searchable 欄位 (如果 searchFields 為 null)。

搜尋引擎會使用 BM25,為給定查詢中的每個相符項目計算 @searchScore。 相符文件會依其搜尋分數進行排名,而查詢回應中會傳回排名最高的結果。 即使從針對相同搜尋索引執行的相同查詢,也可以在結果中取得一些分數變化,但通常這些變化很小,而且不會變更結果的整體排名。

BM25 具有加權字詞頻率和文件長度的預設值。 如果預設值不適合您的內容,您可以自訂這些屬性。 設定變更的範圍包括個別索引,因此您可以根據個別索引的特性調整相關性評分。

預設評分演算法

根據您搜尋服務的存留期,Azure AI 搜尋服務支援兩種評分演算法,用於全文檢索搜尋查詢:

  • Okapi BM25 演算法 (2020 年 7 月 15 日之後)
  • 傳統相似度演算法 (2020 年 7 月 15 日之前)

系統預設使用 BM25 排名,因為這項演算法產生的搜尋排名通常較與使用者期望的結果相符。 這項演算法的參數可根據文件大小等因素微調結果。 針對 2020 年 7 月後建立的搜尋服務,BM25 是唯一的評分演算法。 如果您嘗試在新服務上將 "similarity" 設定為 ClassicSimilarity,則會傳回 HTTP 400 錯誤,因為服務不支援該項演算法。

針對舊版服務,傳統相似度會維持預設演算法。 舊版服務可依個別索引升級至 BM25。 從傳統切換至 BM25 時,您會發現搜尋結果的順序產生些許變化。

設定 BM25 參數

BM25 排名會提供兩個參數,用於調整相關性分數計算。

  1. 使用建立或更新索引要求來設定 BM25 參數:

    PUT [service-name].search.windows.net/indexes/[index-name]?api-version=2020-06-30&allowIndexDowntime=true
    {
        "similarity": {
            "@odata.type": "#Microsoft.Azure.Search.BM25Similarity",
            "b" : 0.75,
            "k1" : 1.2
        }
    }
    
  2. 如果索引是即時的,請在要求上附加 allowIndexDowntime=true URI 參數,如上述範例所示。

    由於 Azure AI 搜尋服務不允許更新即時索引,您必須先讓索引離線,才能新增參數。 索引離線時,編製索引和查詢要求都會失敗。 更新索引所需的時間即為中斷持續的期間,通常只需要幾秒鐘。 更新完成後,索引就會自動重新上線。

  3. "b""k1" 設定為自訂值,然後傳送要求。

    屬性 類型​ 描述
    k1 數值 控制各比對字詞的字詞頻率,與文件-查詢配對最終相關性分數的縮放函式。 其值通常介於 0.0 到 3.0,預設值為 1.2。

    值 0.0 代表「二進位模型」,不論單一比對字詞出現在文字中多少次數,該字詞對所有比對文件的貢獻都相同。 較大的 k1 值允許分數繼續增加,因為在文件中找到更多相同字詞的執行個體。

    在搜尋查詢中包含多個字詞的情況下,使用較大的 k1 值很重要。 在這些情況下,您可能想要優先使用比對更多查詢字詞的文件,而不是比對單一字詞多次的文件。 例如,針對 "Apollo Spaceflight" 字詞進行查詢時,相較於另一篇同時提到 "Apollo" 和 "Spaceflight" 僅幾次的希臘神話文章,您可能想要降低包含 "Apollo" 字詞幾十次而未提及 "Spaceflight" 的希臘神話文章分數。
    b 數值 控制文件長度對相關性分數的影響。 其值通常介於 0 到 1,預設值為 0.75。

    值 0.0 表示文件的長度不會影響分數。 值 1.0 表示字詞頻率對相關性分數的影響是由文件的長度正規化。

    如果您想要抑制較長的文件,則透過文件的長度將字詞頻率正規化,會是相當實用的做法。 在某些案例中,較長的文件 (例如整本小說) 與內容較短的文件相比,更容易包含許多不相關的字詞。

在舊版服務上啟用 BM25 評分

如果您執行在 2014 年 3 月到 2020 年 7 月 15 日之間建立的搜尋服務,則可在新的索引上設定 "similarity" 屬性,藉此啟用 BM25。 屬性只會在新的索引上公開,因此,如果您想在現有的索引上套用 BM25,則必須在 "similarity" 屬性設為 Microsoft.Azure.Search.BM25Similarity 的情況下,卸除並重建索引

索引擁有 [相似度] 屬性後,即可在 BM25SimilarityClassicSimilarity 之間切換。

下列連結說明 Azure SDK 中的 [相似度] 屬性。

用戶端程式庫 相似度屬性
.NET SearchIndex.Similarity
Java SearchIndex.setSimilarity
JavaScript SearchIndex.Similarity
Python SearchIndex 上的 [相似度] 屬性

REST 範例

您也可以使用 REST API。 下列範例會建立 [相似度] 屬性設為 BM25 的全新索引:

PUT [service-name].search.windows.net/indexes/[index name]?api-version=2020-06-30
{
    "name": "indexName",
    "fields": [
        {
            "name": "id",
            "type": "Edm.String",
            "key": true
        },
        {
            "name": "name",
            "type": "Edm.String",
            "searchable": true,
            "analyzer": "en.lucene"
        },
        ...
    ],
    "similarity": {
        "@odata.type": "#Microsoft.Azure.Search.BM25Similarity"
    }
}

另請參閱