Команда рекомендаций Авито опубликовала 24 сентября 2026 в блоге AvitoTech на «Хабре» разбор перестройки рекомендаций на главной: коллаборативную модель avitofm перевели с редких пакетных обновлений на дообучение по 20-минутным окнам кликстрима, что ускорило обновление рекомендаций в 18 раз, а p99 пути от события до рекомендации теперь не превышает 25 минут. Для этого раздробленные по категориям и регионам чанковые модели объединили в одну модель на категорию, а A/B-эксперимент зафиксировал +1% контактов с продавцами.

image

Что произошло

Разбор написал Салават Динмухаметов, senior ML-engineer команды рекомендаций. Старая система опиралась на пакетную коллаборативную модель avitofm, которая переобучалась раз в шесть часов; свежие объявления, на которые спрос приходится в первые часы после публикации, попадали в рекомендации с опозданием и упускали пик интереса. Модернизация прошла в два шага. Сначала команда реализовала инкрементальное дообучение поверх существующих батчевых эмбеддингов: первый шаг дал офлайн-прирост +6% Recall@K, а окончательный выбор в пользу новых архитектур команда проверила A/B-тестом на живом трафике. Затем заработал neartime-контур: кликстрим из Kafka нарезается на 20-минутные окна, дообучением эмбеддингов на A100 и H100 занимаются GPU-воркеры, обновлённые эмбеддинги выгружаются в Redis, а оркестрацией управляет внутренняя платформа Авифлоу, построенная на Kubeflow. Параллельно пересобрали сам парк моделей: вместо 4420 чанковых моделей, по одной на каждое пересечение 52 категорий и 85 регионов, осталось 52 модели, по одной на категорию.

Контекст

Чанкование вида «модель на каждое пересечение категории и региона» долгое время выглядело разумным компромиссом: локальные модели учатся на локальных данных, а объёмы обучения и инференса остаются предсказуемыми. Обратная сторона — медленный цикл: чем мельче сегменты, тем меньше данных на каждый и тем реже имеет смысл их переобучать, поэтому эмбеддинги неизбежно отстают от событий ленты. Свежесть в классайфайдах при этом не инфраструктурная мелочь, а прямое продуктовое свойство: пик спроса на объявление приходится на первые часы его жизни, и любой разрыв между событием и попаданием товара в ленту означает упущенный контакт. Эффект, которого добилась команда, построен не на новом алгоритме, а на структурном трейд-оффе: одна модель на категорию собирает заметно больше данных, парк артефактов для обучения, хранения и мониторинга резко сокращается, а освободившиеся ресурсы можно направить на частое дообучение. Показателен и сам путь: сначала дешёвая инкрементальная надстройка поверх работающего батча, и только после подтверждения эффекта полноценное перестроение контура.

Почему это важно для индустрии

Для инженеров, которые строят рекомендательные системы под давлением свежести, это готовый чек-лист миграции, а не абстрактная идея: watermark при чтении окон, дедупликация событий по ключу user, item, event, time, снапшоты затронутых эмбеддингов в Redis и автоподхват упавших окон в Авифлоу и Kubeflow образуют зрелый стриминговый ML-контур, который можно копировать по частям. Экономика тоже озвучена: дообучение всех категорий укладывается примерно в четыре GPU-пода при расходе порядка 6 ГБ на категорию, а консолидация парка моделей снизила расход памяти примерно втрое. Команды, которые до сих пор держат отдельную модель на каждое сегментное разбиение, могут сверить свои метрики с опубликованными и посчитать пилот без крупных капзатрат. Если рецепт повторится у других площадок, связка «одна модель на категорию плюс частое выборочное дообучение» станет типовым решением для маркетплейсов и классайфайдов, а чанкование по регионам рискует превратиться в признанный антипаттерн для крупных платформ.

Почему это важно для пользователей

Для покупателя разница ощутима на живом примере: объявление из свежих публикаций быстрее оказывается в ленте тех, кому оно нужно, и не дожидается конца многочасового цикла, пока спрос на него не иссякнет. Читателям-инженерам материал даёт путь наименьшего сопротивления: первый шаг воспроизводится на своих данных без перестройки архитектуры, потому что инкрементальное дообучение поверх работающих батчевых эмбеддингов не трогает остальной пайплайн, и у Avito переход начался именно с него. Дальше стоит сверить собственный роадмап с описанным контуром: оконное дообучение, выборочная выгрузка эмбеддингов, автоподхват сбоев, и честно прикинуть, сколько подов и памяти потребовала бы такая миграция на своих объёмах. Продуктовым командам кейс даёт аргумент для руководства: свежесть выдачи конвертируется в измеренный бизнес-эффект, а не только в красивую офлайн-метрику.

Что пока неизвестно / ограничения

Переносимость рецепта на другую площадку в материале не показана: объединение регионов повышает требования к плотности событий на категорию, и на платформах с разреженными взаимодействиями слияние чанков может не дать описанной выгоды. Приведённые цифры публикует сама команда, независимой проверки на чужих данных нет, а разрыв между офлайн- и онлайн-метриками означает, что Recall@K нельзя использовать как прямой прогноз продуктового эффекта. Открытого кода и публичных бенчмарков к разбору не прилагалось, поэтому до повторения рецепта другими командами его ценность остаётся в задокументированных решениях и граблях, а не в гарантии воспроизводимости.

Источники

Автор

Look at AI, редакция