介绍 Elasticsearch 中的 Learning to Tank - 学习排名

作者:来自 Elastic Aurélien Foucret

从 Elasticsearch 8.13 开始,我们提供了原生集成到 Elasticsearch 中的学习排名 (learning to rank - LTR) 实现。LTR 使用经过训练的机器学习 (ML) 模型为你的搜索引擎构建排名功能。通常,该模型用作第二阶段重新排名器,以提高由更简单的第一阶段检索算法返回的搜索结果的相关性。

这篇博文将解释此新功能如何帮助提高文本搜索中的文档排名以及如何在 Elasticsearch 中实现它。

无论你是尝试优化电子商务搜索、为检索增强生成 (RAG) 应用程序构建最佳上下文,还是基于数百万篇学术论文制作基于问答的搜索,你可能已经意识到准确优化搜索引擎中的文档排名是多么困难。这就是学习排名的作用所在。

了解相关性特征以及如何构建评分函数

相关性特征是确定文档与用户查询或兴趣的匹配程度的信号,所有这些都会影响搜索相关性。这些特征可能会因上下文而异,但它们通常分为几类。让我们来看看不同领域中使用的一些常见相关性特征:

  • 文本相关性分数(例如 BM25、TF-IDF):从文本匹配算法得出的分数,用于衡量文档内容与搜索查询的相似性。这些分数可以从 Elasticsearch 中获得。
  • 文档属性(例如产品价格、发布日期):可以直接从存储的文档中提取的特征。
  • 流行度指标(例如点击率、浏览量):文档的流行度或访问频率的指标。流行度指标可以通过搜索分析工具获得,Elasticsearch 提供了开箱即用的搜索分析工具。

评分函数结合了这些特征,为每个文档生成最终的相关性分数。得分较高的文档在搜索结果中的排名较高。

使用 Elasticsearch Query DSL 时,你会隐式编写一个评分函数,该函数对相关性特征进行加权,并最终定义你的搜索相关性。

Elasticsearch 查询 DSL 中的评分

考虑以下示例查询:

{"query": {"function_score": {"query": {"multi_match": {"query": "the quick brown fox","fields": ["title^10", "content"]}},"field_value_factor": {"field": "monthly_views","modifier": "log1p"}}}
}

该查询转换为以下评分函数:

score = 10 x title_bm25_score + content_bm25_score + log(1+ monthly_views)

虽然这种方法效果很好,但它有一些局限性:

  • 权重是估算的:分配给每个特征的权重通常基于启发式或直觉。这些猜测可能无法准确反映每个特征在确定相关性方面的真正重要性。
  • 文档之间的统一权重:手动分配的权重统一应用于所有文档,忽略特征之间的潜在相互作用以及它们的重要性在不同查询或文档类型之间的变化。例如,新近度的相关性对于新闻文章可能更重要,但对于学术论文则不那么重要。

随着特征和文档数量的增加,这些限制变得更加明显,使得确定准确的权重变得越来越具有挑战性。最终,所选权重成为一种折衷方案,可能导致许多情况下排名不理想。

一个引人注目的替代方案是用基于 ML 的模型替换使用手动权重的评分函数,该模型使用相关性特征计算分数。

你好,学习排名 (LTR)!

LambdaMART 是一种流行且有效的 LTR 技术,它使用梯度提升决策树 (GBDT) 从判断列表中学习最佳评分函数。

判断列表是一个数据集,其中包含查询和文档对以及它们相应的相关性标签或等级。相关性标签通常是二进制的(例如相关/不相关)或分级的(例如,0 表示完全不相关,4 表示高度相关)。判断列表可以由人工手动创建,也可以从用户参与度数据(例如点击次数或转化次数)生成。

下面的示例使用分级相关性判断。

LambdaMART 使用决策树将排名问题视为回归任务,其中树的内部节点是相关性特征的条件,而叶子是预测分数。

LambdaMART 使用梯度提升树方法,在训练过程中,它会构建多个决策树,其中每棵树都会纠正其前辈的错误。此过程旨在根据判断列表中的示例优化 NDCG 等排名指标。最终模型是各个树的加权和。

XGBoost 是一个著名的库,它提供了 LambdaMART 的实现,使其成为基于梯度提升决策树实现排名的热门选择。

在 Elasticsearch 中开始使用 LTR

从 8.13 版开始,Learning To Rank 直接集成到 Elasticsearch 和相关工具中,作为技术预览功能。

训练并将 LTR 模型部署到 Elasticsearch

Eland 是我们用于 Elasticsearch 中的 DataFrames 和机器学习的 Python 客户端和工具包。Eland 与大多数标准 Python 数据科学工具兼容,例如 Pandas、scikit-learn 和 XGBoost。

我们强烈建议使用它来训练和部署你的 LTR XGBoost 模型,因为它提供了简化此过程的功能:

1)训练过程的第一步是定义 LTR 模型的相关特征。使用下面的 Python 代码,你可以使用 Elasticsearch Query DSL 指定相关功能。

from eland.ml.ltr import LTRModelConfig, QueryFeatureExtractorfeature_extractors=[# We want to use the score of the match query for the fields title and content as a feature:QueryFeatureExtractor(feature_name="title_bm25_score",query={"match": {"title": "{{query_text}}"}}),QueryFeatureExtractor(feature_name="content_bm25_score",query={"match": {"content": "{{query_text}}"}}),# We can use a script_score query to get the value# of the field popularity directly as a featureQueryFeatureExtractor(feature_name="popularity",query={"script_score": {"query": {"exists": {"field": "popularity"}},"script": {"source": "return doc['popularity'].value;"},}},)
]ltr_config = LTRModelConfig(feature_extractors)

2)该过程的第二步是构建训练数据集。在此步骤中,你将计算并添加判断列表每一行的相关性特征:

为了帮助你完成此任务,Eland 提供了 FeatureLogger 类:

from eland.ml.ltr import FeatureLoggerfeature_logger = FeatureLogger(es_client, MOVIE_INDEX, ltr_config)feature_logger.extract_features(query_params={"query": "foo"},doc_ids=["doc-1", "doc-2"]
)

3)当训练数据集建立后,模型训练起来非常容易(如 notebook 中所示):

from xgboost import XGBRanker
from sklearn.model_selection import GroupShuffleSplit# Create the ranker model:
ranker = XGBRanker(objective="rank:ndcg",eval_metric=["ndcg@10"],early_stopping_rounds=20,
)# Shaping training and eval data in the expected format.
X = judgments_with_features[ltr_config.feature_names]
y = judgments_with_features["grade"]
groups = judgments_with_features["query_id"]# Split the dataset in two parts respectively used for training and evaluation of the model.
group_preserving_splitter = GroupShuffleSplit(n_splits=1, train_size=0.7).split(X, y, groups
)
train_idx, eval_idx = next(group_preserving_splitter)train_features, eval_features = X.loc[train_idx], X.loc[eval_idx]
train_target, eval_target = y.loc[train_idx], y.loc[eval_idx]
train_query_groups, eval_query_groups = groups.loc[train_idx], groups.loc[eval_idx]# Training the model
ranker.fit(X=train_features,y=train_target,group=train_query_groups.value_counts().sort_index().values,eval_set=[(eval_features, eval_target)],eval_group=[eval_query_groups.value_counts().sort_index().values],verbose=True,
)

4)训练过程完成后,将模型部署到 Elasticsearch:

from eland.ml import MLModelLEARNING_TO_RANK_MODEL_ID = "ltr-model-xgboost"MLModel.import_ltr_model(es_client=es_client,model=trained_model,model_id=LEARNING_TO_RANK_MODEL_ID,ltr_model_config=ltr_config,es_if_exists="replace",
)

要了解有关我们的工具如何帮助你训练和部署模型的更多信息,请查看此端到端 notebook。

在 Elasticsearch 中使用 LTR 模型作为重新评分器

在 Elasticsearch 中部署模型后,你可以通过 rescorer 增强搜索结果。重新评分器允许你使用 LTR 模型提供的更复杂的评分来优化搜索结果的首次排名:

GET my-index/_search
{"query": {"multi_match": {"fields": ["title", "content"],"query": "the quick brown fox"}},"rescore": {"learning_to_rank": {"model_id": "ltr-model-xgboost","params": {"query_text": "the quick brown fox"}},"window_size": 100}
}

在此示例中:

  • 首次查询:multi_match 查询检索在标题和内容字段中与查询 "the quick brown fox" 匹配的文档。此查询旨在快速捕获大量潜在相关文档。
  • 重新评分阶段:learning_to_rank 重新评分器使用 LTR 模型细化首次查询中的顶级结果。
    • model_id:指定已部署的 LTR 模型的 ID(在我们的示例中为 ltr-model-xgboost)。
    • params:提供 LTR 模型提取与查询相关的特征所需的任何参数。此处 query_text 允许你指定我们的某些特征提取器期望的用户发出的查询。
    • window_size:定义首次查询发出的搜索结果中要重新评分的顶级文档(top documents)数量。在此示例中,将对前 100 个文档进行重新评分。

通过将 LTR 集成为两阶段检索过程,你可以通过结合以下方式优化检索过程的性能和准确性:

  • 传统搜索的速度:首次查询可以非常快速地检索大量具有广泛匹配的文档,从而确保快速响应时间。
  • 机器学习模型的精度:LTR 模型仅应用于顶部结果(top results),优化其排名以确保最佳相关性。这种有针对性的模型应用可以提高精度,而不会影响整体性能。

自己尝试一下!?

无论你是在努力为电子商务平台配置搜索相关性,旨在提高 RAG 应用程序的上下文相关性,还是只是想提高现有搜索引擎的性能,你都应该认真考虑 LTR。

要开始实施 LTR,请务必访问我们的 notebook,其中详细介绍了如何在 Elasticsearch 中训练、部署和使用 LTR 模型,并阅读我们的文档。如果你根据这篇博文构建了任何内容,或者你对我们的讨论论坛和社区 Slack 频道有疑问,请告诉我们。

准备好自己尝试一下了吗?开始免费试用。
想要获得 Elastic 认证吗?了解下一次 Elasticsearch 工程师培训何时开始!

原文:Elasticsearch Learning to Rank: How to Improve Search Ranking — Search Labs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/380211.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

postman接口测试实战篇

击杀小游戏接口测试 接口测试简单介绍击杀小游戏代码下载单接口测试(postman)接口关联并参数化接口测试简单介绍 首先思考两个问题:1.接口是什么?2.接口测试是什么? 1.我们总是把接口想的很复杂,其实呢,它就是一个有特定输入和输出参数的交互逻辑处理单元,它不需要知…

通过 EMR Serverless Spark 提交 PySpark 流任务

在大数据快速发展的时代,流式处理技术对于实时数据分析至关重要。EMR Serverless Spark提供了一个强大而可扩展的平台,它不仅简化了实时数据处理流程,还免去了服务器管理的烦恼,提升了效率。本文将指导您使用EMR Serverless Spark…

PostgreSQL使用(二)

说明:本文介绍PostgreSQL的DML语言; 插入数据 -- 1.全字段插入,字段名可以省略 insert into tb_student values (1, 张三, 1990-01-01, 88.88);-- 2.部分字段插入,字段名必须写全 insert into tb_student (id, name) values (2,…

[数据集][目标检测]导盲犬拐杖检测数据集VOC+YOLO格式4635张2类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):4635 标注数量(xml文件个数):4635 标注数量(txt文件个数):4635 标注…

graham 算法计算平面投影点集的凸包

文章目录 向量的内积(点乘)、外积(叉乘)确定旋转方向numpy 的 cross 和 outernp.inner 向量与矩阵计算示例np.outer 向量与矩阵计算示例 python 示例生成样例散点数据图显示按极角排序的结果根据排序点计算向量转向并连成凸包 基本…

Linux云计算 |【第一阶段】ENGINEER-DAY3

主要内容: LVM逻辑卷管理、VDO、RAID磁盘阵列、进程管理 一、新建逻辑卷 1、什么是逻辑卷 逻辑卷(Logical Volume)是逻辑卷管理(Logical Volume Management,LVM)系统中的一个概念。LVM是一种用于磁盘管理…

C++ :友元类

友元类的概念和使用 (1)将类A声明为B中的friend class后,则A中所有成员函数都成为类B的友元函数了 (2)代码实战:友元类的定义和使用友元类是单向的 (3)友元类是单向的,代码实战验证 互为友元类 (1)2个类可以互为友元类,代码实战…

Intel和AMD用户再等等!微软确认Win11 24H2年底前登陆

微软近日确认,Windows 11 24H2版本将于2024年底前正式登陆使用英特尔和AMD处理器的PC。 根据微软介绍,Windows 11 24H2将作为传统功能更新,将在今年晚些时候提供给所有设备。 此前,微软已向搭载骁龙X Plus和X Elite系列处理器的Co…

VS2019安装MFC组件

VS2019支持的MFC版本是mfc140 ~ mfc142版本,它兼容VS2015、VS2017之前的老版本程序。 一、MFC的历史版本 MFC的历史版本如下: IDE发布时间工具集版本MSC_VERMSVCMFC版本dllVisual C6.01998V601200MSVC6.06.0mfc42.dll、mfcce400.dllVisual Studio 2002…

Linux的热插拔UDEV机制和守护进程

目录 一、Linux的热插拔UDEV机制 二、守护进程 2.1 守护进程概念和基本特点: 2.2 显示进程信息: 2.3 守护进程和后台进程的区别: 2.4 创建守护进程的步骤和守护进程的特征: 2.4.1 创建守护进程的步骤: 2.4.2 守…

前端不懂 Docker ?先用它换掉常规的 Vue 项目部署方式

本项目代码已开源,具体见: 前端工程:vue3-ts-blog-frontend 后端工程:express-blog-backend 数据库初始化脚本:关注公众号程序员白彬,回复关键字“博客数据库脚本”,即可获取。 为什么需要容器化…

如何在 Mac 上下载安装植物大战僵尸杂交版? 最新版本 2.2 详细安装运行教程问题详解

植物大战僵尸杂交版已经更新至2.2了,但作者只支持 Windows、手机等版本并没有支持 MAC 版本,最近搞到了一个最新的杂交 2.2 版本的可以在 Macbook 上安装运行的移植安装包,试了一下非常完美能够正常在 MAC 上安装运行,看图&#x…

Linux云计算 |【第一阶段】ENGINEER-DAY5

主要内容: SELinux、系统故障修复、HTTPD/FTP服务搭建、防火墙策略管理、服务管理 一、SELinux安全制度 SELinux(Security-Enhanced Linux),美国NSA国家安全局主导开发,一套增强Linux系统安全的强制访问控制体系&…

大模型只是轮子,与其闭门重复造轮子,不如深耕场景应用

如何理解李彦宏说的“不要卷模型,要卷应用” 7月4日,2024世界人工智能大会暨人工智能全球治理高级别会议全体会议在上海世博中心举办。在产业发展主论坛上,百度创始人、董事长兼首席执行官李彦宏呼吁:“大家不要卷模型&#xff0…

JavaWeb JavaScript ① JS简介

目录 一、HTML&CSS&JavaScript的作用 二、前后端关联标签——表单标签 1.form标签 2.input标签 3.get/post提交的差异 4.表单项标签 5.布局相关标签 块元素——div 行内元素——span 三、CSS 1.CSS引入方式 方式1 行内式 方式2 内嵌式 方式3 外部样式表 2.CSS选择器 元…

第三届智能机械与人机交互技术学术会议(IHCIT 2024)

【北航主办丨本届SPIE独立出版丨已确认ISSN号】 第三届智能机械与人机交互技术学术会议(IHCIT 2024) 2024 3rd International Conference on Intelligent Mechanical and Human-Computer Interaction Technology 2024年7月27日----中国杭州&#xff0…

Artix7系列FPGA实现SDI视频编解码,基于GTP高速接口,提供3套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案在Xilinx--Kintex系列FPGA上的应用本方案在Xilinx--Zynq系列FPGA上的应用 3、详细设计方案设计原理框图SDI 输入设备Gv8601a 均衡器GTP 高速接口-->解串与串化SMPTE SD/HD/3G SDI IP核BT1120转…

Python+Flask+MySQL/Sqlite的个人博客系统(前台+后端管理)【附源码,运行简单】

PythonFlaskMySQL/Sqlite的个人博客系统(前台后端管理)【附源码,运行简单】 总览 1、《个人博客系统》1.1 方案设计说明书设计目标工具列表 2、详细设计2.1 管理员登录2.2 程序主页面2.3 笔记新增界面2.4 文章新增界面2.5 文章/笔记管理界面2…

实战:Eureka的概念作用以及用法详解

概叙 什么是Eureka? Netflix Eureka 是一款由 Netflix 开源的基于 REST 服务的注册中心,用于提供服务发现功能。Spring Cloud Eureka 是 Spring Cloud Netflix 微服务套件的一部分,基于 Netflix Eureka 进行了二次封装,主要负责…

C/C++ json库

文章目录 一、介绍1.1 json 介绍 二、C/C json 库选型2.1 选型范围2.2 jsoncpp2.2.2 jsoncpp 编译和交叉编译 2.3 rapidjson2.4 nlohmann/json2.5 sonic-cpp 五、常见问题5.1 jsoncpp 中关于浮点数的控制和中文显示问题5.2 jsoncpp序列化double类型时精度损失问题的解决办法 一…