В этом посте мы рассмотрим, как вы можете настроить и использовать API персонализированного ранжирования Metarank с Постоянство Redis с Docker Compose.

Подготовка данных

Metarank — это служба персонализированного ранжирования с открытым исходным кодом, которую вы можете быстро настроить и улучшить взаимодействие с пользователем с помощью персонализации. От социальных сетей до служб доставки и приложений для знакомств, персонализация может быть применена для повышения конверсии пользователей, вовлеченности или упрощения жизни ваших пользователей, предоставляя контактные предложения при отправке нового электронного письма.

Когда дело доходит до создания системы, которая будет выполнять персонализацию для любого типа рейтинга, самой большой проблемой в большинстве случаев является управление данными. Metarank решает проблему хранения и управления данными для обучения модели, однако вам по-прежнему необходимо предоставлять исторические данные для первоначального обучения модели.

Metarank ожидает, что исторические данные будут отформатированы в JSON и сохранены в файл JSON. Вот пример события Метаданные элемента, описывающего свойства предметов, которые необходимо персонализировать:

Вам нужно будет предоставить как минимум события метаданных Элемент, Рейтинг и Взаимодействие для Metarank, чтобы создать модель персонализации для вашего варианта использования.

Исторические данные должны быть упорядочены по отметке времени в порядке возрастания, так как Metarank считывает данные построчно. Если ваши данные не отсортированы, вы можете использовать режим sort интерфейса командной строки Metarank для сортировки данных, прежде чем предоставлять их для обучения.

Мы будем использовать наш набор данных Ranklens, который поддерживает нашу демонстрацию, которая предоставляет эти 3 типа событий и уже отсортирована по отметке времени. Вы можете загрузить полный файл событий с помощью следующей команды:

curl -o events.jsonl.gz https://media.githubusercontent.com/media/metarank/metarank/master/src/test/resources/ranklens/events/events.jsonl.gz

Конфигурационный файл метаранка

Конфигурация YAML Metarank предоставляет простой способ настроить персонализацию ваших данных. Персонализированное ранжирование основано на функциях, которые использует модель машинного обучения. Вы можете прочитать нашу предыдущую запись в блоге о разработке функций с помощью Metarank, в этой статье мы будем использовать минимальный набор функций: genre , liked_genre и liked_actors . Вы можете поиграть с различными функциями, чтобы увидеть, как изменятся результаты. Кроме того, вы можете использовать режим autofeature Metarank для автоматического создания функций на основе ваших данных.

Мы также будем использовать режим сохранения Redis в конфигурации, чтобы обученные данные и взаимодействия, которые произошли после запуска Metarank, не терялись при перезапуске. Мы рекомендуем использовать режим In-Memory только для локальной разработки и тестирования.

Файл конфигурации с тремя вышеуказанными функциями и Redis будет следующим:

Обратите внимание, что мы явно установили свойство api конфигурации, чтобы Metarank был доступен из среды Docker.

Докер сочиняет

Metarank предоставляет образ Docker, поэтому вы можете создать файл компоновки докеров, чтобы легко объединить Metarank с Redis:

Для запуска Metarank мы используем его режим standalone, который сочетает в себе чтение данных, обучение модели и запуск API.

Играйте с персонализированным рейтингом

Теперь, когда у нас есть все необходимое, давайте запустим API персонализированного ранжирования и поэкспериментируем с ним!

Вот структура проекта, содержащая файл компоновки докера, файл конфигурации и файл событий.

Теперь давайте запустим API с помощью простой команды docker compose:

docker compose up

Как только все данные будут обработаны, Metarank выдаст красивый лог о том, что он готов начать получать данные:

metarank_standalone  | 11:42:11.883 INFO  ai.metarank.main.command.Train$ - liked_genre: weight=334.0 zero=66785 nz=143767 dist=[0.00,0.00,0.02,0.10,0.16,0.21,0.27,0.33,0.45]
metarank_standalone  | 11:42:11.883 INFO  a.metarank.main.command.Standalone$ - model training finished
metarank_standalone  | 11:42:12.742 INFO  ai.metarank.main.command.Serve$ - Starting API...
metarank_standalone  | 11:42:12.934 INFO  o.h.blaze.server.BlazeServerBuilder -
metarank_standalone  |   _   _   _        _ _
metarank_standalone  |  | |_| |_| |_ _ __| | | ___
metarank_standalone  |  | ' \  _|  _| '_ \_  _(_-<
metarank_standalone  |  |_||_\__|\__| .__/ |_|/__/
metarank_standalone  |              |_|
metarank_standalone  | 11:42:12.959 INFO  o.h.blaze.server.BlazeServerBuilder - http4s v1.0.0-M36 on blaze v1.0.0-M36 started at http://127.0.0.1:8080/

По умолчанию Metarank запускается на порту 8080, поэтому мы можем отправить несколько запросов curl, чтобы получить персонализированные ответы.

  1. Давайте используем следующий запрос, чтобы получить начальный рейтинг для набора элементов.
curl http://0.0.0.0:8080/rank/xgboost?explain=true -d '{
    "event": "ranking",
    "id": "id1",
    "items": [
        {"id":"72998"}, {"id":"67197"}, {"id":"77561"},
        {"id":"68358"}, {"id":"79132"}, {"id":"103228"}
    ],
    "user": "test1",
    "session": "test1",
    "timestamp": 1663164199915
}'

Мы используем параметр explain=true, чтобы показать, как вычисляемые функции меняются после наших запросов.

Вот ответ Метаранка:

{
  "items": [
    {
      "features": {
        "genre": "adventure@5",
        "liked_actors": 0,
        "liked_genre": 0
      },
      "item": "77561",
      "score": 0.059091829552052236
    },
    {
      "features": {
        "genre": "action@4",
        "liked_actors": 0,
        "liked_genre": 0
      },
      "item": "72998",
      "score": 0.03967099890674036
    },
    {
      "features": {
        "genre": "action@4",
        "liked_actors": 0,
        "liked_genre": 0
      },
      "item": "67197",
      "score": 0.03967099890674036
    },
    {
      "features": {
        "genre": "action@4",
        "liked_actors": 0,
        "liked_genre": 0
      },
      "item": "79132",
      "score": 0.03967099890674036
    },
    {
      "features": {
        "genre": "action@4",
        "liked_actors": 0,
        "liked_genre": 0
      },
      "item": "103228",
      "score": 0.03967099890674036
    },
    {
      "features": {
        "genre": "science fiction@8",
        "liked_actors": 0,
        "liked_genre": 0
      },
      "item": "68358",
      "score": -0.034844059827564444
    }
  ],
  "state": {
    ...
  }
}

2. Нам нужно указать Metarank порядок элементов, показываемых пользователю. Это делается вызовом API Feedback с Ranking event payload:

curl http://localhost:8080/feedback -d '{
    "event": "ranking",
    "id": "id1",
    "items": [
        {"id":"72998"}, {"id":"67197"}, {"id":"77561"}, 
        {"id":"68358"}, {"id":"79132"}, {"id":"103228"}
    ],
    "user": "test1",
    "session": "test1",
    "timestamp": 1663164200915
}'

3. Выполните действие click над фильмом с идентификатором 103228 . Обратите внимание, что мы используем id1 в параметре ranking вызова, чтобы указать, на каком ранге произошло взаимодействие:

curl http://localhost:8080/feedback -d '{
    "event": "interaction",
    "type": "click",
    "id": "id2",
    "ranking": "id1",
    "item": "103228",
    "user": "test1",
    "session": "test1",
    "timestamp": 1663164202915
}'

4. Теперь давайте попросим Metarank персонализировать тот же набор элементов после нашего взаимодействия:

{
  "items": [
    {
      "features": {
        "genre": "action@4",
        "liked_actors": 1,
        "liked_genre": 1
      },
      "item": "103228",
      "score": 3.4156795975319816
    },
    {
      "features": {
        "genre": "adventure@5",
        "liked_actors": 0,
        "liked_genre": 1
      },
      "item": "77561",
      "score": 0.559094548886528
    },
    {
      "features": {
        "genre": "action@4",
        "liked_actors": 0,
        "liked_genre": 1
      },
      "item": "72998",
      "score": 0.4854114126690249
    },
    {
      "features": {
        "genre": "action@4",
        "liked_actors": 0,
        "liked_genre": 1
      },
      "item": "79132",
      "score": 0.4854114126690249
    },
    {
      "features": {
        "genre": "science fiction@8",
        "liked_actors": 0,
        "liked_genre": 1
      },
      "item": "68358",
      "score": 0.33323295913272516
    },
    {
      "features": {
        "genre": "action@4",
        "liked_actors": 0,
        "liked_genre": 0.6666666666666666
      },
      "item": "67197",
      "score": 0.08805971814908203
    }
  ],
  "state": {...}
}

Вы можете видеть, что порядок элементов изменился, а также функции liked_genre и liked_actors изменили свои значения в зависимости от нашего взаимодействия.

Чем больше взаимодействий вы совершаете, тем более точные прогнозы для вашего пользователя генерирует API персонализированного ранжирования.

Что дальше?

Вы можете найти все примеры из этого поста в этом репозитории. Поэкспериментируйте с включением различных функций из нашей демонстрационной конфигурации и примените Metarank к своим данным!

Дайте нам знать, если у вас есть какие-либо вопросы или проблемы в нашем канале Slack.

Компания Metarank Labs обеспечивает полную адаптацию и постоянную поддержку установок Metarank. Свяжитесь с нами, чтобы получить дополнительную информацию.