Зачем бариста земснаряд, а электромонтёру перкуссионный массажёр? Как так получается, что стоит только подумать об отпуске, как все баннеры предлагают путёвки в Дагестан? И почему после одного-единственного запроса о поворотниках для BMW ещё месяц продолжают крутиться объявления о покупке б/у запчастей? За всё это отвечает «Баннерная крутилка». Сервис обрабатывает 99% запросов всего за 200 миллисекунд, использует ML и серьёзно экономит ресурсы компании. И вот, как это всё работает.
Фильтрация объявлений
После отбора релевантные рекламные объявления поступают в «Баннерную крутилку». На первом этапе все они проходят фильтрацию. Например, рекламодатель ограничил возможность показа на определенных сайтах или же само объявление идёт с пометкой 18+.
Обработка документов
И дальше начинается самое интересное — обработка документов. Тут систему можно сравнить со скульптором, которому принесли огромную глыбу мрамора. Нужно отсечь всё лишнее. И пока глыба (наш массив объявлений) большая, действовать можно самыми простыми и «грубыми» инструментами.
Кластеризация и «ленивая материализация»
Все объекты в массиве разбиваются на кластеры. Иерархия такая: клиент → кампания → группа → баннер. На этом этапе крутилка работает с верхнеуровневыми элементами. Так можно сразу отсекать неподходящие кластеры, а это большой объём данных.
Далее «Баннерная крутилка» идёт по иерархии вниз, убирая из массива всё больше и больше неподходящих объявлений, пока не останутся наиболее релевантные. Здесь применяется так называемая «ленивая материализация объектов». То есть все объявления ранжируются по какому-то значению и система движется по получившемуся списку в порядке убывания приоритета. Так менее подходящие документы не попадают в итоговую подборку, с которой работают более «тяжелые» модели. И это тоже экономия ресурсов.
При этом не обязательно взаимодействовать со всем объектом/объявлением. Достаточно посмотреть его атрибуты. Например, если есть ограничения по возрасту или домену, мы просто сравниваем данный атрибут с белым/чёрным списком.
Наконец-то ИИ
И вот когда мы имеем готовый список самых релевантных объявлений, который, очевидно, гораздо меньше начального, можно запускать ML. Верхняя часть нейросети обрабатывает объявления, а нижняя — запросы потенциального кандидата. И только потом получившиеся результаты связываются в виде скалярного произведения. Так и происходит обучение таргета.
Далее система составляет топ, а кандидатов из нижней части убирает. И вот здесь уже можно применять тяжелые модели, которые делают инференс кандидатов. Так подбираются самые релевантные объявления по интересам пользователя.
Как модель ускоряют
Чтобы ускорить работу «Баннерной крутилки» и освободить ресурсы, используют шардирование. Объявления попадают в шарды по принципу shard=Id% NumberOfShards. То есть практически случайным образом. Так шардирование можно сделать более равномерным.
Разработчики Яндекса строят микросервисную архитектуру. А для перекладывания информации из одного сервиса в другой применяют протоколы Protobuf и Flatbuffers. Так сокращается время на сериализацию и десериализацию.
Текст составлен на основе доклада Артёма Ваншулина, руководителя разработки ранжирования в команде баннерной системы Яндекса.