Создание каталога курсов на Stepik

Создание каталога курсов на Stepik

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

Зачем был нужен новый каталог

Каждый день на Stepik создаются и публикуются новые курсы. На сегодняшний день на платформе открыто для записи несколько тысяч курсов по самым разным темам: помимо всем известных курсов по программированию, тестированию и аналитике данных, у нас есть курсы про историю викингов, правильное приготовление кофе, фехтование и даже про шоу мыльных пузырей. Такое разнообразие контента сильно затрудняет навигацию для учащихся, а авторам бывает сложно определить темы, где не хватает качественных курсов, которые они могли бы разработать.

Пока такого каталога не было, его роль выполняли тематические подборки курсов, которые составлялись вручную, и поиск (по темам, ключевым словам и авторам). Но ни ручные подборки, ни поиск не могут показать все разнообразие курсов. В выдаче курсов важно определить, какие критерии должны иметь больший вес, чтобы, с одной стороны, не дискриминировать авторов, а с другой — предоставлять пользователям наиболее релевантный контент. Мы должны учитывать популярность курсов и оценки, но при этом отдавать приоритет хорошим новым курсам, чтобы они не затерялись среди «классиков».

Для решения этой задачи в 2023 году мы пошли путем всех зрелых маркетплейсов и разработали систему тегов разного уровня, с помощью которой разметили все курсы. А потом, на основании этих тегов, распределили все курсы по категориям каталога.

Процесс создания

Первая проблема, с которой мы столкнулись, — это разметка контента. При таком разнообразии курсов сложно было даже обозначить список возможных категорий. Мы начали с того, что отсортировали курсы по количеству учащихся и тому, насколько они готовы, выбрали верхушку и попросили ML-модель абстрактно определить по описанию курса на промостранице к каким в принципе категориям он может быть отнесен. Раньше ChatGPT мог использовать интернет для парсинга промостраниц курсов, что значительно упрощало задачу. К апрелю 2023 года эта функциональность уже была ограничена, и нам пришлось самим формировать текст описания из разных полей курса, чтобы отдать его на проверку модели. Так мы получили массив всевозможных тегов.

После этого мы посмотрели, какие категории в этом списке встречаются чаще всего, и как их можно логически сгруппировать, чтобы выстроить дерево тегов. Кстати, почему именно дерево, а не просто список? Организация тегов в виде иерархической структуры помогает 1) реализовать идею многоуровневой вложенности тега, если добавить курсу категорию нижнего уровня, «лист», мы сможем автоматически приписать ему и все теги более высокого уровня, не указывая их отдельно, 2) наглядно представить все темы и быстро находить нужные, 3) дублировать отдельные теги в разные категории (например, курс по английскому языку может быть ориентирован на школьников или студентов-лингвистов, программистов или просто на тех, кто хочет подтянуть лексику за просмотром сериалов. И это будут совершенно разные курсы. Поэтому мы добавили не только общий тег по английскому, но и Business English в ветвь по бизнесу, школьный английский в школьные предметы и лингвистику в академические дисциплины).

Получившееся дерево можно посмотреть здесь.

Задачу составления структуры тематических рубрик можно решать множеством способов. Мы обратились к рубрикаторам в библиотеках, структурам российских и западных университетов, каталогам образовательных платформ и к Bing AI, в котором на тот момент была самая свежая и доступная модель от OpenAI.

Создание каталога курсов на Stepik

Каталог на Udemy

Помимо этого, требовалось соотнести данные категории с существующими рубриками фида Яндекса. На текущий момент рубрикатор Яндекса для образовательных продуктов выглядит так

Создание каталога курсов на Stepik

Интересно, что несколько лет назад в Stepik уже применялась другая система тегов, основанная на графе знаний Wikidata и созданная для работы адаптивных курсов. Каждому заданию в таком курсе присваивался один или несколько тегов — условных «навыков», которые это задание должно сформировать. Про то, как мы делали адаптивные курсы на Stepik, можно почитать в статье про рекомендательные системы. В результате адаптивность легла в основу другого проекта — Hyperskill, а со Stepik такие курсы убрали.

Третий этап, после создания списка тегов и их структурирования, — это соотнесение массива курсов с получившимся деревом тегов. Для этого надо было сначала выбрать ту LLM, которая бы справлялась с задачей лучше других: мы пробовали использовать семейство GPT и вышедшую тогда Llama 2. У YaGPT был закрыт API, а от GigaChat мы не смогли добиться внятного результата. Требовалось придумать такие промпты и подобрать параметры запросов, которые помогли бы этой модели устанавливать четкое соответствие между курсами и тегами, причем не откуда-нибудь, а строго из нашего дерева. Модель упорно пыталась творчески подойти к задаче и добавляла свои теги. Причем теги желательно было выбирать самого низкого уровня и ограничивать их количество, не указывая все, которые хоть немного могли бы подойти.

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

В процессе автоматического проставления тегов стало ясно, что человека в этой работе пока заменить не получится (да и цели такой не было) и потребуется работа по редактированию тегов. Из-за галлюцинаций нейросети многие теги были проставлены очень странным образом (например, некоторые курсы по программированию получили сразу все теги с языками программирования, от Python и Go до экзотических). А еще часто только авторы точно знают, какие теги лучше соответствуют их курсам, поэтому у каждого автора есть возможность изменить теги курса. Кроме того, бывает, что слушатели курсов сами пишут нам, заметив, что курс попал явно не в свою категорию каталога. Получается, что в работе над разметкой курсов участвуют авторы, учащиеся, команда Stepik и нейросети.

Почему теги и рубрики каталога не совпадают?

Вернемся к примеру выше: вы решили разработать курс для подготовки к ЕГЭ по английскому языку. Если вы присвоите ему теги «Подготовка к ЕГЭ» и «Английский язык» в «школьных предметах», в каталоге он попадет в категорию «Подготовка к ЕГЭ по английскому языку» в теме курсов для школьников. Скорее всего, именно в этой категории его и будут искать.

Создание каталога курсов на Stepik

Если бы рубрикатор в точности повторял дерево тегов, он был бы не трехуровневым, как сейчас, а разноуровневым, каждому тегу напрямую соответствовала бы одна категория курсов (и наоборот), а каждый курс попадал бы во все категории, теги которых ему добавлены, из-за чего было бы сложнее находить интересные курсы.

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

Сравним…

Начать дискуссию