Привет, Хабр! Меня зовут Полина Шнайдер, я ML-инженер в лаборатории LISA в ИТМО. Сейчас я разрабатываю систему, которая помогает нашим преподавателям создавать программы учебных курсов. Разработка учебной программы ― творческая работа, во многом завязанная на опыт преподавателя. Но в ней есть большая доля рутины, например, глубокий анализ и проработка тематического плана, которую я и хотела бы автоматизировать с помощью больших языковых моделей, дополненных данными из нашей университетской базы знаний. Надо отметить, что я не просто решаю практическую задачу, а занимаюсь исследованиями. Не все большие языковые модели (особенно облегчённые версии) обладают глубокими знаниями по университетским дисциплинам. Поэтому одной из целей моей работы было выяснить, могут ли модели меньшего размера давать адекватные ответы с дополнительным контекстом из университетской базы.
В этой статье расскажу, что у нас получилось.
В среднем, по нашему опыту разработки учебных программ, работа над одним курсом занимает 2-3 недели ― от формулирования названия до описания конкретных лекций. Правда, надо учесть, что, помимо этого, у нас есть и другая занятость.
Процесс в целом понятный. Программы курса часто опираются на аналогичные курсы, однако составление программы требует глубокого анализа. Так что прежде чем перейти к творчеству по написанию лекций, необходимо пройти через некоторый этап рутины.
Предположим, что на старте у вас есть только название курса: «Человекоориентированные решения». Сходу не всегда понятно, какое именно должно быть наполнение. По опыту скажу: такая неопределенность и отсутствие четко поставленной задачи легко вгоняют в прокрастинацию. Чтобы двигаться дальше, нам надо ответить сразу на несколько вопросов:
Как перечень тем в курсе будет стыковаться с требованиями учебных планов и образовательными стандартами университета.
Какие темы стоит рассмотреть в начале, а какие ― потом.
Какие в принципе темы необходимо включить, чтобы студенты усвоили основной материал.
Как этот перечень адаптировать, допустим, для магистрантов (здесь надо учитывать, что они уже успели изучить на других курсах университета).
Как упаковать курс с учетом его длительности ― программы на четыре лекции и на два семестра принципиально отличаются.
Как правило, автор курса начинает прорабатывать эти вопросы с поиска аналогичных или близких программ в базе университета. Даже если у него в голове уже есть четкая структура будущего курса, он все равно попытается побрейнштормить, чтобы сделать свою задумку лучше. И на это может уйти до недели.
Мы задумались: а можно ли оптимизировать эту работу? ChatGPT сейчас не использует только ленивый, поэтому логично, что мы обратились именно к нему и попробовали применить его к рутинной части ― разработке структуры образовательного курса.
Но есть нюанс. Сама по себе большая языковая модель ― особенно ChatGPT 4 ― уже дает довольно качественные ответы, хотя там и не хватает глубоких знаний по университетским дисциплинам. В контексте вуза для подобных задач все же требуется дополнительное обучение ― просто правильно составленным промптом задачу не решишь. Так что мы взялись за разработку.
Как работает инструмент
Предположим, преподаватель хочет разработать новый учебный курс. С одной стороны, логично опираться на то, что уже преподают в университете. С другой ― хочется добавить новую информацию.
Преподаватель отправляет системе запрос, который содержит предполагаемое название учебного курса, ступень обучения студентов, а также ключевые темы и конкретные навыки, которые будут даваться на курсе. По этим ключевым словам инструмент проводит поиск в уже имеющейся базе курсов ИТМО, формируя из результатов контекст. Далее получившиеся данные отправляются в большую языковую модель. На выходе инструмент выдает рекомендацию по программе учебного курса: набор тем и подтем без содержимого.
Главный критерий оценки качества работы инструмента ― экспертная оценка автора курса. Он может либо приступить к созданию курса по предложенной программе, либо сообщить системе, что результат не релевантен, и попробовать скорректировать запрос: добавить другие ключевые слова и тем самым подтянуть иной контекст из базы данных университета. Еще можно поиграться с промптами, но об этом дальше.
Если структура подошла, преподаватель раскрывает ее уже самостоятельно ― но так он уже экономит до недели на подготовительной работе.
В какой степени ссылаться на другие курсы, которые читают в ИТМО, преподаватель решает сам. Да и содержимое учебного курса мы не генерим, поскольку в университете важно видение конкретного преподавателя. В этом смысле «усреднение знаний», которое проводит большая языковая модель, не подходит. Все-таки это авторская работа и преподаватели не будут рады, если у них ее заберут.
Как шла разработка
На первом этапе мы проиндексировали все курсы, которые прошли модерацию в университете. Из них удалили лишнее (общеупотребительные слова: «студент», «курс» и так далее, а также знаки пунктуации), выделили ключевые слова и все это поместили в Elasticsearch.
Для разработки использовали Python и Django, с помощью которого было удобно создавать все эндпоинты.
Запрос в базу данных формируется из JSON или текстового файла. Elasticsearch обеспечивает максимально быстрый поиск по ключевым словам среди уже существующих курсов. Полученные в результате этого поиска данные подаются на вход большой языковой модели в центре решения.
Обкатывая инструмент, мы сгенерировали около 500 учебных программ, используя разные техники промптинга ― без дополнительного контекста, с примерами аналогичных учебных курсов, указанием создать цепочку или дерево рассуждений (chain-of-thought, tree-of-thought). Использовали и нестандартные подходы: например, предлагали большой языковой модели представить, что курс создают 10 опытных экспертов, и в него надо включить только те темы, которые готовы выбрать семь экспертов из десяти.
Языковая модель генерирует ответы «как человек». Чтобы объективно оценить качество созданных учебных программ, нам потребовалась формализация. Из ответа большой языковой модели мы выделяли так называемые эмбединги ― учебные сущности, то есть знания и навыки, которые относятся к конкретной предметной области. Для физики это может быть «длина волны», «оптический резонатор», «дифракция», а для программирования ― «база данных», «алгоритм», названия языков программирования и так далее. Те же сущности мы извлекли из эталонных (референсных) учебных программ университета и все это нормализовали. Так для каждого сгенерированного курса мы получали два вектора ключевых слов, которые можно было сравнить между собой, посчитав косинусное расстояние.
Очевидно, что точного совпадения векторов мы не требовали, поскольку повторение в деталях уже существующей учебной программы в университете не требуется. Однако близкое расположение ― это хорошая характеристика. Она отражает «суть» курсов — ключевые темы, которые рассматриваются в дисциплине (например, фотосинтез, оптоволокно, высоконагруженное программирование). Также мы измеряли количество извлеченных учебных сущностей.
Помимо этих численных оценок, мы спрашивали мнения преподавателей. Хоть выборка экспертов была небольшой (около 15 человек), большинство признали результаты релевантными и полезными. В ближайшем будущем планируем провести глубинное интервью с экспертами. Поверхностное мнение: интеграция LLM помогает преодолеть «страх чистого листа» и генерирует полезные идеи для содержания курса. Важно отметить, что контекст из университетской базы освобождает от рутинной задачи изучения аналогичных курсов.
Мы пробовали применить не только ChatGPT, но и другие языковые модели ― например, Open Chat и даже Saiga, более заточенную на русский текст. Open Chat показал себя достойно ― хуже, чем ChatGPT 4, но лучше, чем версия 3.5 turbo. Так что мы можем посоветовать его для бюджетного шеринга знаний в вузах и компаниях. ChatGPT благодаря большому количеству параметров и более обширной базе знаний лучше учитывал контекст университетской базы и генерировал структуру курса с большим количеством учебных сущностей, что облегчало работу преподавателя. Модели с меньшим количеством параметров выдавали более поверхностные результаты и хуже справлялись с продвинутыми техниками, такими как tree-of-thought и chain-of-thought. А вот Saiga, хоть и требует меньше ресурсов, но с творческими подходами (особенно в том, что касается цепочки или дерева рассуждений) справилась плохо. Она часто «терялась» при работе с университетским контекстом. Ей требуется более точный файн-тюнинг для успешной работы в таких задачах.
Сейчас инструмент обернут в Docker и выложен на GitHub под лицензией open source: вот ссылка. Отдельная ветка Хабр создана для читателей этой статьи ― здесь зафиксирован инструмент в том виде, в каком он был на момент написания текста. Плюс здесь нет завязки на структуру дампа базы данных курсов Университета ИТМО, то есть можно взять этот инструмент, собственный ключ от ChatGPT или любой другой большой языковой модели и настроить на генерацию курсов на основе ее контента.
Мы сейчас интегрируем инструмент во внутренние системы ИТМО, чтобы преподаватели могли им пользоваться через веб-интерфейс, где достаточно будет заполнить форму с параметрами курса (названием, ключевыми словами, уровнем образования студентов), а промпт будет сконструирован автоматически ― под капотом.
Какие перспективы
Как я уже упомянула, преподаватель может принять или не принять рекомендацию инструмента. Сейчас его мнение никак не используется для подстройки инструмента. Но мы предполагаем, что отказ преподавателей использовать предложенный список тем стоит рассматривать как негативную оценку генерации, включив ее в обратную связь. Эту обратную связь можно было бы использовать для дополнительной настройки решения ― улучшения качества генерации. Однако мы понимаем, что эту обратную связь надо использовать аккуратно. Если одному преподавателю при генерации курса по фронтенду не подошел React, это не значит, что модель не должна его рекомендовать никому другому. Так что использование обратной связи мы пока прорабатываем.
Возможно, мы используем идентификаторы преподавателей, чтобы инструмент давал более индивидуальные подсказки. То есть мы планируем привязать историю взаимодействия с инструментом к конкретным авторам курсов ― используем систему курсов, которые когда-либо разрабатывал именно этот преподаватель, и будем учитывать их при формировании рекомендаций.