Помогаем пользователям OLX.pl найти работу своей мечты

Вступление

OLX помогает людям не только покупать и продавать автомобили, дома, товары, но и находить работу. OLX Jobs - приоритетное направление для компании прямо сейчас. Одним из новых достижений является предоставление рекомендательных услуг для новых вакансий на основе модели альтернативного метода наименьших квадратов (ALS).

В этом блоге мы поговорим об архитектуре нашей системы предоставления рекомендаций по работе соискателям. Мы покроем:

  • Случаи применения
  • Модель ALS
  • Архитектура сервиса
  • Рекомендательная система ALS
  • Система доставки электронной почты / push-уведомлений

Случаи применения

Сгенерированные рекомендации сейчас используются в двух местах:

  • Электронная почта и push-кампании для активных соискателей
  • Страница профиля кандидата

Кампании по электронной почте состоят из 10 рекомендаций о вакансиях, похожих на те, которые соискатели перечисляли или подавали ранее, тогда как push-уведомления предоставляют только одну из этих рекомендаций. Вот пример (в переводе с польского) рекомендательного письма.

На странице профиля кандидата мы предоставляем панель с лучшими рекомендациями. Часть рекомендаций на панели управления обслуживается также системой рекомендаций ALS (см. Переведенный пример ниже).

Эффект рекомендаций был измерен в кампаниях по рассылке электронных писем / push-уведомлений, и он показал значительный рост наших основных бизнес-показателей: ~ 5% по количеству соискателей и ~ 2,5% по заявкам.

Модель ALS

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

Алгоритмы матричной факторизации (и ALS в частности) работают путем разложения матрицы взаимодействия пользователя с элементом (см. Иллюстрацию ниже) на произведение двух прямоугольных матриц меньшей размерности:

  • Матрица пользователей, где строки представляют пользователей, а столбцы - скрытые факторы (факторы, которые не наблюдаются напрямую, но выводятся из других переменных);
  • Матрица элементов, где столбцы представляют элементы, а строки - скрытые факторы элементов.

В нашем конкретном случае элементы представляют собой вакансии, на которые соискатели (пользователи) могут подать заявку:

Мы протестировали два фреймворка матричной факторизации на python: Implicit и LightFM. Мы оценивали эти фреймворки в автономных экспериментах, и Implicit показал лучшие результаты с точки зрения точность, отзывчивость, NDCG. Есть и другие показатели, но мы подробно рассмотрим нашу автономную систему оценки в следующих статьях.

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

Архитектура сервиса

Как упоминалось ранее, есть два варианта использования предоставленных рекомендаций, но здесь мы опишем архитектуру только для отправки уведомлений, которая состоит из двух подсистем:

  • Рекомендательная система ALS для выработки рекомендаций;
  • Система доставки по электронной почте / push для предоставления рекомендаций соискателям.

Разделение части рекомендации и доставки помогает легко повторно использовать рекомендации ALS на будущих этапах на панели мониторинга профиля кандидата.

Архитектура рекомендательной системы ALS

Чтобы дать рекомендации, нам потребуется два шага:

  • Подготовка данных для обучения модели;
  • Обучение модели и выработка рекомендаций.

Более подробные шаги представлены на следующей диаграмме:

Мы используем Airflow для оркестровки конвейера.

Первым шагом в рабочем процессе является получение почасовых взаимодействий между пользователем и предметом. Каждый час мы запрашиваем взаимодействие пользователя с категорией вакансий из глобальной базы данных и сохраняем ее во внутренней таблице. Для этого мы используем SQL и движок Presto для выполнения запросов.

Второй шаг - это агрегация взаимодействий пользователя с элементом за последние 7 дней из истории по часам взаимодействий и сохранение их в корзине, доступной для AWS Batch. В отличие от взаимодействий первого шага, агрегирование планируется только два раза в день.

Предлагаемое решение двухэтапной комбинации запросов значительно сокращает время агрегирования 7-дневных взаимодействий User-Item и снижает затраты на архитектуру.

После подготовки агрегированных взаимодействий Airflow запускает задание AWS Batch с подготовленным докер-контейнером. Контейнер включает скрипт python для обучения модели ALS на основе предоставленных взаимодействий и рекомендаций. Затем прогнозы сохраняются в сегменте S3. Рекомендации пользователей из корзины S3 используются позже в email / push-кампаниях и на панели инструментов профиля кандидата.

Давайте посмотрим на следующую часть, посвященную внедрению системы доставки по электронной почте / push-уведомлению.

Архитектура системы доставки Email / Push

Конвейер, который готовит электронные письма и push-уведомления, использует взаимодействия с пользователем и элементами и рекомендации, подготовленные конвейером рекомендаций ALS. Из рекомендаций отфильтровываются пользователи, которые в настройках отказались от любых писем и push-уведомлений.

Список пользователей, которые должны быть отфильтрованы, готовится с помощью SQL и выполняется механизмом Presto. Составление списка активных объявлений о вакансиях выполняется Presto параллельно. После подготовки списков пользователей и активных объявлений Airflow запускает задание AWS Batch, в котором выполняется задание фильтрации.

Скрипт Python внутри задания AWS Batch сначала отфильтровывает рекомендации на основе подготовленных списков пользователей и активных элементов. Затем он отфильтровывает пользователей, которые получили электронное письмо или отправили рекомендации о работе за последние 3 дня. Для этого у задания AWS Batch есть доступ к истории подготовленных кампаний. На последнем этапе скрипт python отправляет запросы API для отправки кампании нашему внутреннему инструменту кампании и сохраняет результаты отправки в сегменте S3 журналов кампании.

Ограничение текущей системы заключается в выполнении некоторых операций ETL внутри задания AWS Batch в скрипте Python, а не за его пределами в запросах SQL. Мы должны сделать это для поддержки объединения и фильтрации различных источников данных.

Выводы

  • Подготовка и предоставление рекомендаций о вакансиях в пакетном режиме помогла нам быстро внедрить и существенно повлиять на наши основные бизнес-показатели: количество соискателей и заявлений.
  • Разработка двух отдельных систем для генерации и предоставления рекомендаций помогает нам повторно использовать подготовленные рекомендации в других системах.
  • Оптимизация запросов SQL может значительно улучшить их производительность. Пример: разделение агрегирования взаимодействий на два этапа запроса.
  • Airflow в сочетании с сервисами AWS может предоставить очень удобные и гибкие инструменты для построения рекомендательных конвейеров.