部署和管理 Learning To Rank 模型

编辑

部署和管理 Learning To Rank 模型编辑

Learning To Rank 功能目前处于技术预览阶段,未来版本中可能会更改或删除。Elastic 将努力修复任何问题,但此功能不受官方 GA 功能支持 SLA 的约束。

此功能在 8.12.0 版本中引入,并且仅适用于某些订阅级别。有关更多信息,请参阅 https://elastic.ac.cn/subscriptions

使用 Eland 训练和部署模型编辑

通常,XGBoost 模型训练过程使用标准的 Python 数据科学工具,如 Pandas 和 scikit-learn。

我们在 elasticsearch-labs 存储库中提供了一个 示例笔记本。这个交互式 Python 笔记本详细介绍了端到端的模型训练和部署工作流程。

我们强烈建议您在工作流程中使用 eland,因为它为在 Elasticsearch 中使用 LTR 提供了重要的功能。使用 eland 可以

  • 配置特征提取
  • 提取用于训练的特征
  • 在 Elasticsearch 中部署模型
在 Eland 中配置特征提取编辑

特征提取器使用模板化查询进行定义。Eland 提供了 eland.ml.ltr.QueryFeatureExtractor,可以直接在 Python 中定义这些特征提取器

from eland.ml.ltr import QueryFeatureExtractor

feature_extractors=[
    # We want to use the score of the match query for the title field as a feature:
    QueryFeatureExtractor(
        feature_name="title_bm25",
        query={"match": {"title": "{{query}}"}}
    ),
    # We can use a script_score query to get the value
    # of the field rating directly as a feature:
    QueryFeatureExtractor(
        feature_name="popularity",
        query={
            "script_score": {
                "query": {"exists": {"field": "popularity"}},
                "script": {"source": "return doc['popularity'].value;"},
            }
        },
    ),
    # We can execute a script on the value of the query
    # and use the return value as a feature:
    QueryFeatureExtractor(
        feature_name="query_length",
        query={
            "script_score": {
                "query": {"match_all": {}},
                "script": {
                    "source": "return params['query'].splitOnToken(' ').length;",
                    "params": {
                        "query": "{{query}}",
                    }
                },
            }
        },
    ),
]

定义特征提取器后,将它们包装在 eland.ml.ltr.LTRModelConfig 对象中,以便在以后的训练步骤中使用

from eland.ml.ltr import LTRModelConfig

ltr_config = LTRModelConfig(feature_extractors)
提取用于训练的特征编辑

构建数据集是训练过程中的关键步骤。这涉及提取相关特征并将其添加到您的判断列表中。我们建议您使用 Eland 的 eland.ml.ltr.FeatureLogger 帮助程序类来完成此过程。

from eland.ml.ltr import FeatureLogger

# Create a feature logger that will be used to query {es} to retrieve the features:
feature_logger = FeatureLogger(es_client, MOVIE_INDEX, ltr_config)

FeatureLogger 提供了一个 extract_features 方法,使您能够从判断列表中提取特定文档列表的特征。同时,您可以将查询参数传递给先前定义的特征提取器

feature_logger.extract_features(
    query_params={"query": "foo"},
    doc_ids=["doc-1", "doc-2"]
)

我们的 示例笔记本 解释了如何使用 FeatureLogger 通过向判断列表添加特征来构建训练数据集。

特征提取注意事项编辑
  • 我们强烈建议不要自行实现特征提取。在训练环境和 Elasticsearch 中的推理之间保持特征提取的一致性至关重要。通过使用与 Elasticsearch 协同开发和测试的 eland 工具,您可以确保它们始终如一地协同工作。
  • 特征提取是通过在 Elasticsearch 服务器上执行查询来执行的。这可能会给您的集群带来很大压力,尤其是当您的判断列表包含大量示例或您有许多特征时。我们的特征记录器实现旨在最大程度地减少发送到服务器的搜索请求数量并减少负载。但是,最好使用与任何面向用户的生产流量隔离的 Elasticsearch 集群来构建训练数据集。
将模型部署到 Elasticsearch 中编辑

训练模型后,您将能够将其部署到 Elasticsearch 集群中。您可以使用 Eland 的 MLModel.import_ltr_model 方法

from eland.ml import MLModel

LEARNING_TO_RANK_MODEL_ID="ltr-model-xgboost"

MLModel.import_ltr_model(
    es_client=es_client,
    model=ranker,
    model_id=LEARNING_TO_RANK_MODEL_ID,
    ltr_model_config=ltr_config,
    es_if_exists="replace",
)

此方法将以 Elasticsearch 可以理解的格式序列化训练后的模型和 Learning To Rank 配置(包括特征提取)。然后使用 创建训练模型 API 将模型部署到 Elasticsearch。

Elasticsearch 的 LTR 当前支持以下类型的模型

未来将支持更多模型类型。

Learning To Rank 模型管理编辑

将模型部署到 Elasticsearch 中后,您可以使用 训练模型 API 对其进行管理。现在,您可以在 搜索时 将 LTR 模型用作重新评分器。