配置 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 是唯一的评分算法。 如果你尝试在新服务上将“相似性”算法设置为 ClassicSimilarity,会返回 HTTP 400 错误,因为服务不支持该算法。
对于较旧的服务,经典相似性仍然是默认算法。 旧服务可以按索引升级到 BM25。 从经典算法切换到 BM25 时,搜索结果的排序方式预期会出现一些差异。
设置 BM25 参数
BM25 排名提供两个参数以优化相关性分数计算。
使用创建或更新索引请求设置 BM25 参数:
PUT [service-name].search.azure.cn/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"
设置为自定义值,然后发送请求。properties 类型 说明 k1 数字 控制每个匹配字词的字词频率与文档-查询对的最终相关性分数之间的调整函数。 值通常为 0.0 到 3.0,默认值为 1.2。
值为 0.0 表示“二进制模型”,其中单个匹配词条的贡献对所有匹配文档相同,无论该词条在文本中出现多少次。 更大的 k1 值允许分数继续增加,因为文档中可找到同一字词的更多实例。
如果搜索查询中包含多个词条,则务必使用更大的 k1 值。 在这些情况下,可能希望选择匹配更多查询字词的文档,而不是仅多次匹配单个字词的文档。 例如,查询字词“阿波罗宇宙飞行”的文档时,面对一篇有关希腊神话的、几十次提到字词“阿波罗”但未提到“宇宙飞行”的文章,以及一篇明确提到了字词“阿波罗”和“宇宙飞行”,但只是提到了几次的文章,可能希望降低前一篇文章的评分。b 数字 控制文档长度如何影响相关性分数。 值介于 0 和 1 之间,默认值为 0.75。
值为 0.0 表示文档的长度不会影响分数。 值为 1.0 表示词频对相关性分数的影响由文档的长度规范化。
如果想要惩罚较长的文档,则按文档长度规范化词频很有用。 在一些情况下,与较短的文档相比,较长的文档(例如整篇小说)更有可能包含很多不相关的字词。
在旧服务上启用 BM25 评分
如果你运行的搜索服务是在 2014 年 3 月到 2020 年 7 月 15 日这段时间创建的,则可以通过在新索引上设置“similarity”属性来启用 BM25。 该属性仅在新索引上公开,因此,如果要在现有索引上启用 BM25,则必须删除该索引,然后在将“相似性”属性设置为Microsoft.Azure.Search.BM25Similarity
的情况下重新生成索引。
存在具有“similarity”属性的索引后,可以在 BM25Similarity
和 ClassicSimilarity
之间进行切换。
以下链接介绍了 Azure SDK 中的 Similarity 属性。
客户端库 | Similarity 属性 |
---|---|
.NET | SearchIndex.Similarity |
Java | SearchIndex.setSimilarity |
JavaScript | SearchIndex.Similarity |
Python | SearchIndex 上的 similarity 属性 |
REST 示例
你还可以使用 REST API。 以下示例会创建一个新索引,该索引的“similarity”属性设置为 BM25:
PUT [service-name].search.azure.cn/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"
}
}