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

打印 上一主题 下一主题

主题 1027|帖子 1027|积分 3081

作者:来自 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 中的评分

考虑以下示例查询:
  1. {
  2.   "query": {
  3.     "function_score": {
  4.       "query": {
  5.         "multi_match": {
  6.           "query": "the quick brown fox",
  7.           "fields": ["title^10", "content"]
  8.         }
  9.       },
  10.       "field_value_factor": {
  11.         "field": "monthly_views",
  12.         "modifier": "log1p"
  13.       }
  14.     }
  15.   }
  16. }
复制代码
该查询转换为以下评分函数:
  1. 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 指定干系功能。
  1. from eland.ml.ltr import LTRModelConfig, QueryFeatureExtractor
  2. feature_extractors=[
  3.     # We want to use the score of the match query for the fields title and content as a feature:
  4.     QueryFeatureExtractor(
  5.         feature_name="title_bm25_score",
  6.         query={"match": {"title": "{{query_text}}"}}
  7.     ),
  8.     QueryFeatureExtractor(
  9.         feature_name="content_bm25_score",
  10.         query={"match": {"content": "{{query_text}}"}}
  11.     ),
  12.     # We can use a script_score query to get the value
  13.     # of the field popularity directly as a feature
  14.     QueryFeatureExtractor(
  15.         feature_name="popularity",
  16.         query={
  17.             "script_score": {
  18.                 "query": {"exists": {"field": "popularity"}},
  19.                 "script": {"source": "return doc['popularity'].value;"},
  20.             }
  21.         },
  22.     )
  23. ]
  24. ltr_config = LTRModelConfig(feature_extractors)
复制代码

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

为了帮助你完成此使命,Eland 提供了 FeatureLogger 类:
  1. from eland.ml.ltr import FeatureLogger
  2. feature_logger = FeatureLogger(es_client, MOVIE_INDEX, ltr_config)
  3. feature_logger.extract_features(
  4.     query_params={"query": "foo"},
  5.     doc_ids=["doc-1", "doc-2"]
  6. )
复制代码

3)当练习数据集创建后,模型练习起来非常容易(如 notebook 中所示):
  1. from xgboost import XGBRanker
  2. from sklearn.model_selection import GroupShuffleSplit
  3. # Create the ranker model:
  4. ranker = XGBRanker(
  5.     objective="rank:ndcg",
  6.     eval_metric=["ndcg@10"],
  7.     early_stopping_rounds=20,
  8. )
  9. # Shaping training and eval data in the expected format.
  10. X = judgments_with_features[ltr_config.feature_names]
  11. y = judgments_with_features["grade"]
  12. groups = judgments_with_features["query_id"]
  13. # Split the dataset in two parts respectively used for training and evaluation of the model.
  14. group_preserving_splitter = GroupShuffleSplit(n_splits=1, train_size=0.7).split(
  15.     X, y, groups
  16. )
  17. train_idx, eval_idx = next(group_preserving_splitter)
  18. train_features, eval_features = X.loc[train_idx], X.loc[eval_idx]
  19. train_target, eval_target = y.loc[train_idx], y.loc[eval_idx]
  20. train_query_groups, eval_query_groups = groups.loc[train_idx], groups.loc[eval_idx]
  21. # Training the model
  22. ranker.fit(
  23.     X=train_features,
  24.     y=train_target,
  25.     group=train_query_groups.value_counts().sort_index().values,
  26.     eval_set=[(eval_features, eval_target)],
  27.     eval_group=[eval_query_groups.value_counts().sort_index().values],
  28.     verbose=True,
  29. )
复制代码

4)练习过程完成后,将模型部署到 Elasticsearch:
  1. from eland.ml import MLModel
  2. LEARNING_TO_RANK_MODEL_ID = "ltr-model-xgboost"
  3. MLModel.import_ltr_model(
  4.     es_client=es_client,
  5.     model=trained_model,
  6.     model_id=LEARNING_TO_RANK_MODEL_ID,
  7.     ltr_model_config=ltr_config,
  8.     es_if_exists="replace",
  9. )
复制代码
要了解有关我们的工具怎样帮助你练习和部署模型的更多信息,请查看此端到端 notebook。

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

在 Elasticsearch 中部署模型后,你可以通过 rescorer 增强搜索结果。重新评分器答应你利用 LTR 模型提供的更复杂的评分来优化搜索结果的首次排名:
  1. GET my-index/_search
  2. {
  3.   "query": {
  4.     "multi_match": {
  5.       "fields": ["title", "content"],
  6.       "query": "the quick brown fox"
  7.     }
  8.   },
  9.   "rescore": {
  10.     "learning_to_rank": {
  11.       "model_id": "ltr-model-xgboost",
  12.       "params": {
  13.         "query_text": "the quick brown fox"
  14.       }
  15.     },
  16.     "window_size": 100
  17.   }
  18. }
复制代码

在此示例中:


  • 首次查询: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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

自由的羽毛

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表