Как кеширование кандидатов оптимизирует работу рекомендательных систем
В мире, где контент генерируется потоками, а пользователи ожидают мгновенных рекомендаций, нагрузка на рекомендательные системы растёт экспоненциально. Одной из ключевых проблем является вычислительная стоимость ранжирования: если модель считает скор для каждого кандидата по отдельности, её стоимость растёт линейно вместе с числом объектов на входе. Решением, которое уже успешно применяется в таких сервисах, как VK Видео и VK Клипы, стало кеширование кандидатов. Это позволяет значительно снизить нагрузку на инфраструктуру, сохраняя при этом высокую релевантность выдачи.
Архитектура рекомендателя: от стримов к оптимизации
Современные рекомендательные движки редко работают как монолитная система. Обычно они разбиты на несколько независимых потоков, или стримов. Каждый стрим отвечает за свою часть контента: один может заниматься основным персонализированным контентом, другой — свежими объектами, третий — контентом от важных авторов, а четвёртый — промо-материалами. Такой подход позволяет структурировать сбор кандидатов, но и усложняет масштабирование.
Для сбора этих кандидатов используются различные типы селекторов. Среди них можно выделить:
- Item-to-item: ищет предметы, похожие на те, с которыми пользователь недавно взаимодействовал.
- Source-to-item: (тип селектора)
- Векторные: используют индексы, например, HNSW.
- Неперсонализированные: работают с общими данными.
- Продуктовые: отвечают за специальные пулы, вроде прогрева или промо-подборок.
Интересно, что неперсонализированные селекторы, работающие на снапшоте, оказались наименее рискованными для кеширования, поскольку их выдача и так меняется нечасто.
Как работает кеширование кандидатов?
Главная инженерная идея при оптимизации — не кешировать итоговую рекомендацию целиком. Вместо этого кешируется только результат отбора кандидатов — то есть, список из $k$ лучших кандидатов из каждого стрима. Этот список сохраняется в быструю базу данных, например, Redis.
Процесс выглядит так: после обычного запроса система берёт из каждого стрима топ-$k$ кандидатов с наивысшим скором и записывает их в кеш. Ключ для этого кеша формируется из комбинации пользователя и контекста рекомендации — это может быть тип рекомендера, платформа или конкретная поверхность продукта.
Но кеш не должен быть статичным. Чтобы поддерживать актуальность, в кешированном режиме активируются реактивные селекторы. Это облегчённые версии обычных селекторов, которые учитывают только те новые сигналы, которые появились в системе после того, как кеш был записан.
[IMAGE]
query: caching candidates in recommendation system architecture
subject: схема кеширования кандидатов в рекомендательной системе
placement: после абзаца про Redis
alt: схема кеширования кандидатов
caption: Кеширование снижает нагрузку на вычисления.
[/IMAGE]
Экономический эффект и настройка
Внедрение кеширования — это не просто