Рекомендации нашей мечты: Как «Баннерная крутилка» Яндекса делает 700 тысяч RPS и подбирает для вас рекламу

Зачем бариста земснаряд, а электромонтёру перкуссионный массажёр? Как так получается, что стоит только подумать об отпуске, как все баннеры предлагают путёвки в Дагестан? И почему после одного-единственного запроса о поворотниках для BMW ещё месяц продолжают крутиться объявления о покупке б/у запчастей? За всё это отвечает «Баннерная крутилка». Сервис обрабатывает 99% запросов всего за 200 миллисекунд, использует ML и серьёзно экономит ресурсы компании. И вот, как это всё работает.

понятия не имею, что «под ключ»

понятия не имею, что «под ключ»

Фильтрация объявлений

После отбора релевантные рекламные объявления поступают в «Баннерную крутилку». На первом этапе все они проходят фильтрацию. Например, рекламодатель ограничил возможность показа на определенных сайтах или же само объявление идёт с пометкой 18+.

Обработка документов

И дальше начинается самое интересное — обработка документов. Тут систему можно сравнить со скульптором, которому принесли огромную глыбу мрамора. Нужно отсечь всё лишнее. И пока глыба (наш массив объявлений) большая, действовать можно самыми простыми и «грубыми» инструментами.

Кластеризация и «ленивая материализация»

Все объекты в массиве разбиваются на кластеры. Иерархия такая: клиент → кампания → группа → баннер. На этом этапе крутилка работает с верхнеуровневыми элементами. Так можно сразу отсекать неподходящие кластеры, а это большой объём данных.

ba0f631a15f7c433931dd6a44076860d.gif

Далее «Баннерная крутилка» идёт по иерархии вниз, убирая из массива всё больше и больше неподходящих объявлений, пока не останутся наиболее релевантные. Здесь применяется так называемая «ленивая материализация объектов». То есть все объявления ранжируются по какому-то значению и система движется по получившемуся списку в порядке убывания приоритета. Так менее подходящие документы не попадают в итоговую подборку, с которой работают более «тяжелые» модели. И это тоже экономия ресурсов.

При этом не обязательно взаимодействовать со всем объектом/объявлением. Достаточно посмотреть его атрибуты. Например, если есть ограничения по возрасту или домену, мы просто сравниваем данный атрибут с белым/чёрным списком.

Наконец-то ИИ

И вот когда мы имеем готовый список самых релевантных объявлений, который, очевидно, гораздо меньше начального, можно запускать ML. Верхняя часть нейросети обрабатывает объявления, а нижняя — запросы потенциального кандидата. И только потом получившиеся результаты связываются в виде скалярного произведения. Так и происходит обучение таргета.

Далее система составляет топ, а кандидатов из нижней части убирает. И вот здесь уже можно применять тяжелые модели, которые делают инференс кандидатов. Так подбираются самые релевантные объявления по интересам пользователя.

Как модель ускоряют

Чтобы ускорить работу «Баннерной крутилки» и освободить ресурсы, используют шардирование. Объявления попадают в шарды по принципу shard=Id% NumberOfShards. То есть практически случайным образом. Так шардирование можно сделать более равномерным.

Разработчики Яндекса строят микросервисную архитектуру. А для перекладывания информации из одного сервиса в другой применяют протоколы Protobuf и Flatbuffers. Так сокращается время на сериализацию и десериализацию.

Текст составлен на основе доклада Артёма Ваншулина, руководителя разработки ранжирования в команде баннерной системы Яндекса.

© Habrahabr.ru