部署和管理学习排序模型

编辑

部署和管理学习排序模型

编辑

此功能在 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 BM25 score of the match query for the title field as a feature:
    QueryFeatureExtractor(
        feature_name="title_bm25",
        query={"match": {"title": "{{query}}"}}
    ),
    # We want to use the the number of matched terms in the title field as a feature:
    QueryFeatureExtractor(
        feature_name="title_matched_term_count",
        query={
            "script_score": {
                "query": {"match": {"title": "{{query}}"}},
                "script": {"source": "return _termStats.matchedTermsCount();"},
            }
        },
    ),
    # 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 extract the number of terms in the query as feature.
   QueryFeatureExtractor(
        feature_name="query_term_count",
        query={
            "script_score": {
                "query": {"match": {"title": "{{query}}"}},
                "script": {"source": "return _termStats.uniqueTermsCount();"},
            }
        },
    ),
]

将词项统计信息作为特征

LTR 模型通常利用原始词项统计信息作为特征。要提取此信息,您可以使用 词项统计信息特征,该特征作为 script_score 查询的一部分提供。

定义特征提取器后,它们将包装在 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 可以理解的格式序列化训练好的模型和学习排序配置(包括特征提取)。然后,使用 创建训练模型 API 将模型部署到 Elasticsearch。

目前,以下类型的模型受 Elasticsearch 的 LTR 支持

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

学习排序模型管理

编辑

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