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
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
オブジェクトにラップされます:
Python
from eland.ml.ltr import LTRModelConfig
ltr_config = LTRModelConfig(feature_extractors)
トレーニング用の特徴の抽出
データセットを構築することは、トレーニングプロセスにおいて重要なステップです。これには、関連する特徴を抽出し、それらを判断リストに追加することが含まれます。このプロセスには、Eland の eland.ml.ltr.FeatureLogger
ヘルパークラスの使用をお勧めします。
Python
from eland.ml.ltr import FeatureLogger
# 特徴を取得するために {es} にクエリを送信するために使用される特徴ロガーを作成します:
feature_logger = FeatureLogger(es_client, MOVIE_INDEX, ltr_config)
FeatureLogger は、判断リストから特定のドキュメントの特徴を抽出するための extract_features
メソッドを提供します。同時に、以前に定義された特徴抽出器にクエリパラメータを渡すことができます:
Python
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 method
を使用できます:
Python
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",
)
このメソッドは、トレーニングされたモデルと Learning To Rank 構成(特徴抽出を含む)を Elasticsearch が理解できる形式でシリアライズします。モデルは、その後、Create Trained Models API を使用して Elasticsearch にデプロイされます。
現在、Elasticsearch で LTR にサポートされているモデルのタイプは次のとおりです:
将来的には、さらに多くのモデルタイプがサポートされる予定です。
Learning To Rank モデル管理
モデルが Elasticsearch にデプロイされると、トレーニング済みモデル API を使用して管理できます。これで、検索時 にリスコアラーとして LTR モデルを使用する準備が整いました。