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