Learning To Rank モデルのデプロイと管理

この機能はバージョン 8.12.0 で導入され、特定のサブスクリプションレベルでのみ利用可能です。詳細については、https://www.elastic.co/subscriptionsを参照してください。

Eland を使用してモデルをトレーニングおよびデプロイする

通常、XGBoost モデルのトレーニングプロセスは、Pandas や scikit-learn などの標準的な Python データサイエンスツールを使用します。

私たちは、elasticsearch-labs リポジトリで利用可能な 例のノートブック を開発しました。このインタラクティブな Python ノートブックは、エンドツーエンドのモデルトレーニングとデプロイメントのワークフローを詳述しています。

LTR を Elasticsearch で扱うための重要な機能を提供するため、ワークフローで eland の使用を強くお勧めします。eland を使用して:

  • 特徴抽出を構成する
  • トレーニング用の特徴を抽出する
  • Elasticsearch にモデルをデプロイする

Eland での特徴抽出の構成

特徴抽出器はテンプレート化されたクエリを使用して定義されます。Eland は、これらの特徴抽出器を Python で直接定義するための eland.ml.ltr.QueryFeatureExtractor を提供します:

Python

  1. from eland.ml.ltr import QueryFeatureExtractor
  2. feature_extractors=[
  3. # We want to use the score of the match query for the title field as a feature:
  4. QueryFeatureExtractor(
  5. feature_name="title_bm25",
  6. query={"match": {"title": "{{query}}"}}
  7. ),
  8. # We can use a script_score query to get the value
  9. # of the field rating directly as a feature:
  10. QueryFeatureExtractor(
  11. feature_name="popularity",
  12. query={
  13. "script_score": {
  14. "query": {"exists": {"field": "popularity"}},
  15. "script": {"source": "return doc['popularity'].value;"},
  16. }
  17. },
  18. ),
  19. # We can execute a script on the value of the query
  20. # and use the return value as a feature:
  21. QueryFeatureExtractor(
  22. feature_name="query_length",
  23. query={
  24. "script_score": {
  25. "query": {"match_all": {}},
  26. "script": {
  27. "source": "return params['query'].splitOnToken(' ').length;",
  28. "params": {
  29. "query": "{{query}}",
  30. }
  31. },
  32. }
  33. },
  34. ),
  35. ]

特徴抽出器が定義されると、それらは後のトレーニングステップで使用するために eland.ml.ltr.LTRModelConfig オブジェクトにラップされます:

Python

  1. from eland.ml.ltr import LTRModelConfig
  2. ltr_config = LTRModelConfig(feature_extractors)

トレーニング用の特徴の抽出

データセットを構築することは、トレーニングプロセスにおいて重要なステップです。これには、関連する特徴を抽出し、それらを判断リストに追加することが含まれます。このプロセスには、Eland の eland.ml.ltr.FeatureLogger ヘルパークラスの使用をお勧めします。

Python

  1. from eland.ml.ltr import FeatureLogger
  2. # 特徴を取得するために {es} にクエリを送信するために使用される特徴ロガーを作成します:
  3. feature_logger = FeatureLogger(es_client, MOVIE_INDEX, ltr_config)

FeatureLogger は、判断リストから特定のドキュメントの特徴を抽出するための extract_features メソッドを提供します。同時に、以前に定義された特徴抽出器にクエリパラメータを渡すことができます:

Python

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

私たちの 例のノートブック は、判断リストに特徴を追加することによってトレーニングデータセットを構築する方法を FeatureLogger を使用して説明しています。

特徴抽出に関する注意事項

  • 自分で特徴抽出を実装することは強くお勧めしません。トレーニング環境と Elasticsearch での推論間で特徴抽出の一貫性を維持することが重要です。Elasticsearch と共に開発およびテストされた eland ツールを使用することで、一貫して機能することを保証できます。
  • 特徴抽出は、Elasticsearch サーバー上でクエリを実行することによって行われます。判断リストに多くの例が含まれている場合や、多くの特徴がある場合、クラスターに大きな負荷がかかる可能性があります。私たちの特徴ロガーの実装は、サーバーに送信される検索リクエストの数を最小限に抑え、負荷を軽減するように設計されています。ただし、ユーザー向けの本番トラフィックから隔離された Elasticsearch クラスターを使用してトレーニングデータセットを構築するのが最善かもしれません。

モデルを Elasticsearch にデプロイする

モデルがトレーニングされると、Elasticsearch クラスターにデプロイできるようになります。Eland の MLModel.import_ltr_model method を使用できます:

Python

  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=ranker,
  6. model_id=LEARNING_TO_RANK_MODEL_ID,
  7. ltr_model_config=ltr_config,
  8. es_if_exists="replace",
  9. )

このメソッドは、トレーニングされたモデルと Learning To Rank 構成(特徴抽出を含む)を Elasticsearch が理解できる形式でシリアライズします。モデルは、その後、Create Trained Models API を使用して Elasticsearch にデプロイされます。

現在、Elasticsearch で LTR にサポートされているモデルのタイプは次のとおりです:

将来的には、さらに多くのモデルタイプがサポートされる予定です。

Learning To Rank モデル管理

モデルが Elasticsearch にデプロイされると、トレーニング済みモデル API を使用して管理できます。これで、検索時 にリスコアラーとして LTR モデルを使用する準備が整いました。