Развертывание и управление моделями обучения ранжированию
Эта функция была представлена в версии 8.12.0 и доступна только определённым уровням подписки. Дополнительную информацию см. на https://www.elastic.co/subscriptions.
Обучение и развертывание модели с помощью Eland
Обычно процесс обучения модели XGBoost использует стандартные инструменты Python для работы с данными, такие как Pandas и scikit-learn.
В репозитории elasticsearch-labs доступен пример ноутбука example notebook. Этот интерактивный Python-ноутбук подробно описывает процесс обучения и развертывания модели от начала до конца.
Мы настоятельно рекомендуем использовать eland в вашем рабочем процессе, так как он предоставляет важные возможности для работы с LTR в Elasticsearch. Используйте 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’s 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. Используя инструменты eland, разработанные и протестированные совместно с Elasticsearch, вы можете гарантировать, что они будут работать согласованно.
- Извлечение признаков выполняется путём выполнения запросов на сервере Elasticsearch. Это может создать большую нагрузку на кластер, особенно когда ваш список суждений содержит много примеров или у вас много признаков. Наша реализация FeatureLogger разработана для минимизации количества запросов к серверу и снижения нагрузки. Однако лучше всего создать ваш обучающий набор данных, используя Elasticsearch-кластер, изолированный от любого пользовательского трафика.
Развертывание вашей модели в Elasticsearch
После обучения вашей модели вы сможете развернуть её в вашем кластере Elasticsearch. Для этого можно использовать Eland’s MLModel.import_ltr_model method:
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. Затем модель развертывается в Elasticsearch с помощью API создания обученных моделей.
В настоящее время поддерживаются следующие типы моделей для LTR с Elasticsearch:
В будущем будет добавлена поддержка других типов моделей.
Управление моделью обучения ранжированию
После развертывания модели в Elasticsearch можно управлять ей с помощью API обученных моделей. Теперь вы готовы использовать свою модель LTR в качестве переоценщика на этапе поиска.
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/learning-to-rank-model-training.html