Elasticsearch 拥有众多新功能,可帮助您为您的用例构建最佳的搜索解决方案。在我们关于构建现代 Search AI 体验的实践网络研讨会上,您将学习如何将其付诸实践。您也可以开始免费云服务试用,或立即在您的本地计算机上试用 Elastic。
语义搜索为检索相关性开辟了全新可能。以 ELSER、E5、Jina Embedding v4 为代表的高质量稀疏-稠密混合模型,通过解析词义而非简单关键词匹配返回相关结果。然而,这类模型在处理长尾查询或索引缺乏相关内容时,可能返回无关结果,这种特性既可能导致用户困惑,也会造成大型语言模型 (LLM) 的算力资源浪费。
本文将介绍如何使用最低得分参数来提高语义搜索结果的精确度。如想测试本博客文章中提供的示例,请访问 相关 Jupyter 笔记本。
背景:精确率和召回率
在搜索相关性中,精确率和召回率是关键概念。强烈建议尚不熟悉这些内容的读者查阅相关资料。以下是摘要。
- 精确率:返回的搜索结果中与用户相关的比例。
- 召回率:搜索结果集中包含的语料库中所有相关文档的百分比。
或者换句话说,精确率只返回相关结果,而召回率则返回所有相关结果。可以想象,这些需求经常相互冲突。语义搜索往往具有很高的召回率,但在精确率方面可能会不理想。继续阅读,了解如何避免这种情况。
推出最低得分参数
min_score参数通过设定最低得分阈值提升检索精度,系统将自动过滤得分低于该阈值的匹配结果,从而精简结果集。以下是一个简单的示例:
得分归一化
设置最低得分阈值固然可行,但并非所有语义模型都能返回适用于静态阈值的分值。以 ELSER 为例,它所返回的分值是无界得分。有些密集模型得分是密集聚类的,只有在特定查询的背景下才有意义。
对于大多数语义搜索情况,我们建议在应用“min_score”之前使用归一化方法。归一化确保文档得分在规定区间内。Elasticsearch 检索器提供了两种此类归一化器,即“l2_norm”和“minmax”。最常用的是“minmax”,因为它简单易懂,在很多情况下都很有效。“minmax”的主要属性包括:
- 文档分数分布在 0 到 1 之间。
- 得分最高的文件总是记为 1 分。
- 得分最低的文件总是记为 0 分。
- 这可能会使其不太适合关键字搜索。更多讨论请参见“混合搜索”部分。
以下是一个包含min_score规范化语义查询的示例。排名窗口参数已增加到 500,使系统能够返回从第 100 条开始的更长结果列表。
当前参数已设置为高于生产环境的常规值,以便我们全面检验搜索结果质量并针对性优化输出。
使用线性检索器的混合搜索
对于混合搜索,最简单的方法是归一化所有分数,分配权重,并应用最低得分。请注意,通过选择总和为 1 的权重,可以将总分控制在 0-1 的范围内。这样使得最终得分易于解读,且便于调整 min_score。以下是一个示例:
使用 RRF 的混合搜索
使用 BM25 时,我们通常通过其他方式控制精度,例如使用AND 操作符或minimum_should_match 。此外,由单个、精确和罕见术语组成的查询自然会导致搜索结果较少,而且往往都是高度相关的结果。这就可能导致:
- 在 BM25 检索器中,排名靠后的结果即使绝对 BM25 分值接近头部结果,仍会被赋予较低的归一化分数。
- 将极低的 BM25 分值与语义分值相加,总分即可近似为语义分值。
- 缺少 BM25 分值参考可能导致
min_score threshold丢弃该文档。
作为解决方案,我们可以改用倒数排序融合 (RRF) 来结合 BM25 和语义结果。该方法通过关注各结果集中的文档位置而非原始分值,巧妙规避了不同检索算法评分体系难以直接比较的技术难题。在这种情况下,min_score 仅应用于语义检索器。
结论
通过采用 min_score,我们已验证可有效降低语义检索算法因高召回率导致的结果集中误报数量。要了解有关检索器的更多信息,请参阅本博文和Elasticsearch 文档。




