LifeStyle
active,
Founded 13 months ago

Разработка сайта, который будет рекомендовать книги, фильмы, сериалы и на Хабре

RecSysAITalentHub

MFDP-RecSys. Проект LifeStyle

MVP: https://trybind-mfdp-recsys-main-z5amqv.streamlit.app/

  1. Данные и концепция
  2. Техническая реализация MVP
  3. Краткий отчет по моделям
    1. Отчет по подготовке MVP

1. Данные и концепция

Концепция

Идея - разработка сайта (пока сайт (так быстрее), в светлом будущем и мобильное приложение, потому что это кажется более подходящей реализацией:)), который будет рекомендовать книги, фильмы, сериалы, а еще может быть еще статьи, например, на Хабре, подкасты, курсы и многое многое другое в зависимости от того, сколько свободного времени есть у пользователя. Можно построить рекомендательную систему для нового контента и для контента, добавленного в "Избранное".

С одной стороны это будет похоже на "Смотреть позже" на Ютубе, только для любого контента - книги, фильмы, сериалы, статьи, подкасты и тд и тп. С другой стороны, это будет рекомендательная система для нового контента, на основе "Избранного".

Какую "боль" закрывает: У меня весь интересующий меня контент (книги, статьи, фильмы) разбросан по перепискам с самим собой, вкладкам в браузерах на телефоне и ПК и так далее. И, когда появляются 20-30 свободных минут, я могу их потратить на поиск и выбор того, что мне интересно прямо сейчас. А иногда хочется чего-то нового, но похожего на то, что тебе нравится.

Сценарий использования MVP:

  1. Пользователь заходит на сайт
  2. Пользователь авторизуется (или регистрируется)
  3. Пользователь попадает на начальную страницу рекомендаций нового контента, есть возможность добавить один из вариантов предложенного контента в избранное. Кроме этого есть фильтры, где он может указать время, которое у него есть и что-то еще (Например, предпочтения, или еще что-то). В светлом будущем можно будет попытаться предсказывать, сколько времени есть у пользователя на основе его предыдущих интеракций. Но это кажется большой новой фичей, которая должна встраиваться в уже работающий продукт (имеющий постоянных пользователей)
  4. Можно переключиться на вкладку избранное и выбрать себе контент из избранного, так же по фильтрам
  5. Можно переключиться на страницу с поиском и найти контент по ключевым словам. (Опционально, если получится, то можно добавлять кастомный контент, например ссылки на статью или pdf файлы с книгами и тд)

В идеале оба вида рекомендаций должны быть основаны на времен и настроении пользователя, предсказывать, хочет пользователь сейчас, например, образовательного контента или расслабляющего.

Данные

Так как идея в том, чтобы рекомендовать в зависимости от количества свободного времени, то нужно иметь, как возможность рекомендовать что-то длинное - фильм, что-то относительно короткое - сериалы, или что-то не сильно привязаное ко времени - книги (статьи)

Данные: Книги - Book-Crossing Dataset (http://www2.informatik.uni-freiburg.de/~cziegler/BX/) (Будут переведены на русский)

Фильмы и сериалы Kion - RecSys Course Competition (https://ods.ai/competitions/competition-recsys-21/data)

Статьи: Хабр

2. Техническая реализация MVP (PoC)

На этапе MVP должен получиться сайт, с авторизацией, которая позволяет делать персонофицированные рекомендации и сохранять избранное. Сценарий пользования сайтам указан выше. MVP можно собрать на базе Streamlit, они даже предоставляют возможность деплоя сайта на их сервис, при условии, что сайт не будет потреблять много памяти. Ссылка на шаблон сайта с минимальным функционалом указан выше.

Вообще, в условиях нехватки данных для нового сервиса с новыми клиентами, есть желание построить модель, где, возможно, используются контекстуальные многорукие бандиты + классический RecSys. Из бонусов, данная иситема сможет подстраиваться на каждого уникального пользователя. Но пока будем использовать для начала открытые датасеты о книгах, фильмах и сериалах (потом можно собрать датасет по статьям на Хабре и подкастам на основе интеракций на сайте). А потом можно разработать алгоритмы онлайн-дообучения собрать маленькую тестовую группу, на которой проверить насколько хорошо работают эти алгоритмы обучения или настроить имитационную модель и проверять обучение на ней.

Дальше можно собирать информацию о паттернах поведения пользователя, распозновать эмоции и все это учитывать при рекомендации. Добавить функции планирования и составления расписания. Но это уже для других пилотов и релизов)

Метрики

В качестве основной метрики того, что сайт работает хорошо можно использовать MAP@k. Эта обратная величина к этой метрике * 20 логичным образом может трактоваться, как средняя позиция валидной рекомендации пользователю. И чем больше метрика, тем меньше обратная величина, что говорит, что валидная рекомендация ближе к началу списка.

3. Краткий отчет по моделям

Здесь будет совсем краткий отчет, чтобы не загромождать основной README проекта с более менее финальными выводами. Более подробный отчет с ходом мысли (потому что кажется, что было бы интересно проследить за эволюцией моего решения + систематизировать проделанную работу) будет в отдельной README в папке src/models + я стараюсь аккуратно оформлять notebook`и c исследованиями, чтобы было приятно почитать) + Я вел MLFlow с экспериментами, но я не знаю как его удачно зашарить и где хранить всю инфу и артефакты (гит засорять не хочется), поэтому вставлял некоторые скрины в подробное описание. Если можете подсказать, как это удобно сделать, то я только рад поделиться результатами!

Итоги работы по сравнению моделей.

  1. Придумал более менее удобную архитектуру под данный проект. Подробности в src/models. Если коротко, то обучение и рекомендации должны быть отдельно, так как модели учатся офлайн, а рекомендации идут онлайн. + рекомендации дложны быть исключительно на основе избранного у пользователя, а не его id или инфа про этого пользователя.

  2. Я разбил весь контент на несколько непересекающися доменов (книги, сериалы, фильмы + статьи на Хабре) и для каждого из доменов провел эксперименты с подбором моделей. Для Книг и Фильмов - ALS модели, для сериалов модель на основе Косинусного Расстояния. Моделью для книг я доволен. Модели для сериалов и кино получились спорными, но рабочими. Сравнивал модели по показателям: MAP@10, скорость рекомндации, вес модели, адекватность рекомендаций. Подробнее - описано в src/models

  3. Разработал адаптивный рекомендатор домена - чем больше пользователь выбирает тот или иной домен, тем чаще он всплывает в рекомендациях

  4. Подобрал гипперпараметры для моделей для фильмов и сериалов с помощью Optuna

  5. Написал несложную модель на основе схожести контента для рекомендаций статей на Хабре.

Кажется, что если соеденить теперь все эти части воедино, получится более менее рабочая рекомендательная система.

В папке src/models/models_storage лежат модели, обученные офлайн, которые будут использоваться с сервисе рекомендаций:

  1. books_model_1 - Основная модель для рекомендации книг на основе ALS с 50 факторами
  2. books_model_2 - Запасная модель (для сравнения) для рекомендации книг на основе ALS с 200 факторами
  3. films_model_1 - Основная модель для рекомендации фильмов на основе ALS с 6 факторами
  4. films_model_2 - Запасная модель для рекомендации фильмов на основе ALS c 10 факторами
  5. series_model - Основная модель для рекомендации сериалов на осове косинусного расстояния

4. Отчет по подготовке MVP

Кратко опишу, что было сделано в рамках подготовки MVP, потому что была проделана большая работа, но она немного остается в тени) Ссылка на MVP все та же!

  1. Переписан код "фронта" на более логичный и менее нагромажденный
  2. Добавлена аутентификация - можно зарегистрироваться и ваше избранное будет сохраняться. Все вроде как даже более менее безопасно - у меня (и вообще у кого либо) нет доступа к импровизированной БД + я еще постараюсь навернуть хеширование, чтобы совсем правильно и защищенно
  3. Подготовил Докерфайл, который собирает сервис (одним большим монолитом, но это осознанный компромис. Подробнее в документации)
  4. Развертывание Сервиса на Streamlit Cloud + CI/CD (Любое обновление мэйна гита хукается и обновляет сервис)
  5. Описал в тех.доке (см docs/README.md) про развертывание сервиса в докере + немного про архитектуру и взаимодействие основных компонентов (ML-классов и Frontend-классов)
  6. Расширил описание экспериментов

Тех.доку писал по принципу, что ее будет читать человек, совершенно не знакомый с проектом. Я старался дать именно верхнеуровневое понимание работы кода, потому что детали по хорошему код должен говорить сам за себя)

Не совсем успел сделать прям все, что хотел, но мне кажется в общем и целом получилось вполне достойно. Хочу потом по чуть-чуть возвращаться к этому проекту, пробовать новые технологии и разные подходы, оттачивать и улучшать архитектуру и в целом улучшать и рефакторить проект!

Cookies help us deliver our services. By using our services, you agree to our use of cookies.