Рекомендации историй ВКонтакте: от простой эвристики до ML-системы

Привет, Хабр! Я Степан Малькевич, руковожу командой рекомендации ленты ВКонтакте, AI VK. Сегодня расскажу, как мы за последний год прокачали алгоритмы рекомендаций для историй. Это был путь от MVP с простыми эвристиками до ML‑системы с моделированием авторов, поведенческими фичами и прицелом на онлайновые реакции. Когда мы только запустили истории в ленте в формате MVP, ранжирование строилось на показе пользователю историй от друзей и сообществ просто по времени (свежие сверху). Такой подход годился для проверки гипотезы и сбора первичных данных, но лента историй требует персонализации. Из сотен подписок не все одинаково интересны пользователю. Простое решение через эвристику тоже не давало желаемого эффекта. Нужно было что‑то умнее. Мы решили поступить так же, как в классической задаче рекомендаций: обучить модель предсказывать рейтинговый скор для каждой истории под конкретного пользователя. На основе этого скоринга можно ранжировать контент. Казалось бы, задача знакомая — чем рекомендации историй отличаются от ранжирования постов? Однако у историй есть нюанс: пользователь обычно просматривает несколько историй одного автора подряд. Если просто отсортировать вообще все истории, перемешав авторов, то получится каша: истории одного и того же человека разлетаются по ленте. Поэтому родилась двухуровневая схема: сперва предсказываем релевантность каждой отдельной истории пользователю, затем группируем истории по авторам и как‑то агрегируем их скоры, после чего уже ранжируем авторов по этому агрегированному значению. Так мы покажем самых интересных авторов первыми, а внутри одного автора истории пойдут подряд. Звучит разумно, но реализация породила множество вопросов — о них дальше. Первую модель сделали максимально простой: никаких нейросетей, только легковесный классификатор. В качестве признаков взяли то, что было под рукой: базовые сведения о пользователе (возраст, платформа и т. п.), свойства истории (время публикации, тип контента), кое‑что про связь пользователя и автора (например, есть ли недавние взаимодействия). Целевой метрикой сначала выбрали факт просмотра истории — то есть попытались учить модель отличать просмотренные пользователем истории от пропущенных. Обучили модель на первых собранных логах и выкатили. Эффект не заставил себя ждать, по сравнению с хаотичным показом мы подняли просмотры историй на десятки процентов. Алгоритм начал точнее угадывать, какие истории пользователь, скорее всего, не пролистает. Конечно, радость была недолгой: улучшения быстро вышли на плато, а некоторые очевидные проблемы базового решения проявили себя на практике. После первых успехов мы сели и трезво оценили: чтобы идти дальше, нужно расширять горизонт. Во‑первых, добавить побольше информативных признаков, как про пользователя, так и про автора истории. Во‑вторых, пересмотреть целевую переменную для обучения модели (вдруг мы стреляем мимо?). Собрали мозговой штурм: какие есть данные и сигналы, влияющие на интерес пользователя к историям? Признаки, доступные нам для обучения, разделились на несколько категорий: User features: характеристики пользователя (пол, возраст, устройство), его общая активность в VK, любовь к форматам историй и постов и т. п. Story features: свойства самой истории — время публикации, тип (фото, видео), длина, наличие интерактивности. Owner (author) features: свойства автора истории — сколько у него подписчиков, сколько историй он выкладывает, тематика контента, средние просмотры. User‑Author features: персональная история взаимодействия пользователя с этим автором — смотрел ли раньше его истории, реагировал ли (лайки/комменты в историях, переходил ли в профиль автора). Content features: например, тематики (теги) истории и интересы…
Источник: habr.com — habr.com/ru/companies/vk/articles/947456/