Оптимизация рекомендательных систем VK через кеширование кандидатов
Habr AI · оригинал
Материал подготовлен автоматизированной редакционной системой. Факты можно сверить по указанному первоисточнику.

Команда AI VK внедрила механизм кеширования кандидатов в рекомендательных системах VK Видео и VK Клипов, что позволило снизить нагрузку на серверы без потери качества выдачи. Подход основан на переиспользовании сильных результатов отбора из предыдущих запросов и дополнении их свежими сигналами.
Снижение вычислительных затрат позволяет масштабировать сервисы и высвобождает ресурсы для разработки новых алгоритмов персонализации.
Рекомендательные системы крупных платформ сталкиваются с серьезными ограничениями производительности. Каждый запрос требует сбора множества потенциальных объектов (кандидатов) из различных источников: похожих материалов, контента от знакомых авторов, свежих публикаций и продуктовых квот. Эти кандидаты затем проходят этап ранжирования, где модель вычисляет скор для каждого объекта индивидуально. Поскольку стоимость этого процесса растет линейно с количеством входных данных, даже небольшое увеличение числа кандидатов приводит к значительному росту задержки (latency) и потребления CPU. При этом в итоговую выдачу попадают лишь единицы объектов, а остальные используются только для выбора лучших. Это создает естественный вопрос: можно ли сократить объем вычислений, не ухудшив качество рекомендаций?
Команда AI VK предложила решение, основанное на гипотезе о стабильности интересов пользователя в краткосрочной перспективе. Анализ данных показал, что соседние запросы одного пользователя часто содержат пересекающиеся наборы кандидатов. Это позволяет один раз вычислить топ-k лучших объектов, сохранить их во временном хранилище (Redis) и переиспользовать в последующих запросах. Такой подход не отменяет ранжирование: кандидаты из кеша все равно проходят скоринг в текущем контексте, но количество объектов, доходящих до модели, существенно уменьшается.
Архитектура решения включает два уровня отбора: стримы и селекторы. Стримы отвечают за разные типы контента (персонализированный, свежий, промо), а внутри них работают селекторы, извлекающие данные из источников. Селекторы делятся на несколько типов: item-to-item (похожие объекты), source-to-item (от авторов), векторные (через HNSW-индексы), неперсонализированные и продуктовые. Стратегия кеширования зависит от типа селектора. Неперсонализированные селекторы, работающие на снапшотах данных, подходят для кеша лучше всего, так как их выдача меняется редко. Тяжелые персонализированные селекторы являются главной целью оптимизации, поскольку они потребляют основную долю вычислительных ресурсов. Продуктовые селекторы, обеспечивающие обязательные гарантии, не кешируются, чтобы избежать нарушения бизнес-требований.
Ключевыми параметрами настройки являются размер кеша (k) и время жизни записи (TTL). Слишком маленький k может привести к нехватке качественных кандидатов и падению вовлеченности, а слишком большой — снизит экономический эффект. Длинный TTL повышает долю запросов, обслуживаемых из кеша, но делает рекомендации менее реактивными. Для балансировки качества и производительности используются A/B-эксперименты, в ходе которых подбираются оптимальные значения k и TTL для каждого конкретного рекомендателя.
Чтобы кеш не делал выдачу инертной, в системе работают реактивные селекторы. Это облегченные версии обычных алгоритмов, которые учитывают только новые сигналы пользователя, появившиеся после записи кеша. Например, вместо анализа всей истории взаимодействий (item-to-item) реактивная версия обрабатывает лишь события, произошедшие за короткий промежуток времени. Это позволяет системе быстро реагировать на изменения интересов пользователя, сохраняя при этом значительную часть вычислительной нагрузки в кеше.
Техническая реализация предполагает два режима работы: обычный (без кеша) и кешированный. Обычный режим активируется, если кеш отсутствует, протух или исчерпан. Кешированный режим включается при наличии свежего кеша для конкретного пользователя и контекста. Ключ кеша формируется из идентификатора пользователя и типа рекомендации (платформа, поверхность продукта). Значение содержит timestamp и наборы кандидатов по каждому стриму с их скоринами. Основной метрикой эффективности является hit rate — доля запросов, успешно обработанных в кешированном режиме.
На момент публикации механизма уже работают в VK Видео и VK Клипах. Внедрение позволило сократить потребление CPU, RAM, NVME и LAN за счет вывода части реплик рекомендателя. Часть сэкономленных ресурсов была направлена на масштабирование кластеров Redis. Важно отметить, что перевод на кеш — это не просто включение флага, а сложный процесс настройки конфигурации селекторов, размера k и TTL для каждого продукта. Эффективность варьируется в зависимости от доли некешируемого трафика (например, блок «Смотрите также» в VK Видео не кешируется, так как зависит от конкретного видео) и исходного количества кандидатов.
Таким образом, кеширование кандидатов позволяет оптимизировать инфраструктуру рекомендательных систем, сохраняя качество выдачи. Подход заключается не в кешировании финальных рекомендаций, а в переиспользовании результатов этапа отбора. Это высвобождает вычислительные мощности, которые можно направить на разработку новых механик персонализации.