設定 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 排名會提供兩個參數,用於調整相關性分數計算。
使用建立或更新索引要求來設定 BM25 參數:
PUT [service-name].search.windows.net/indexes/[index-name]?api-version=2024-07-01&allowIndexDowntime=true { "similarity": { "@odata.type": "#Microsoft.Azure.Search.BM25Similarity", "b" : 0.75, "k1" : 1.2 } }
如果索引是即時的,請在要求上附加
allowIndexDowntime=true
URI 參數,如上述範例所示。由於 Azure AI 搜尋服務不允許更新即時索引,您必須先讓索引離線,才能新增參數。 索引離線時,編製索引和查詢要求都會失敗。 更新索引所需的時間即為中斷持續的期間,通常只需要幾秒鐘。 更新完成後,索引就會自動重新上線。
將
"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
的情況下,卸除並重建索引。
索引擁有 [相似度] 屬性後,即可在 BM25Similarity
或 ClassicSimilarity
之間切換。
下列連結說明 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=2024-07-01
{
"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"
}
}