Онлайн-курсы давно столкнулись с одной и той же проблемой: студент застрял на задаче в 23:00, куратор недоступен, ответ придёт завтра. Разработчик и автор курсов на Stepik описал на Habr, как он собрал прототип ИИ-куратора, который закрывает этот разрыв — без сложного стека и внешних фреймворков.

Архитектура прототипа намеренно плоская. Пять модулей: Extractor определяет, о каком уроке или шаге идёт речь — через динамическую Inline Keyboard в Telegram, которая строится прямо из структуры курса. AbuseChecker проверяет сообщение до того, как оно попадёт к основной модели. PromptBuilder собирает промпт с учётом контекста урока и истории диалога. AnswerBuilder решает, идти в LLM или вернуть предупреждение. UI — Telegram-бот на синхронной библиотеке telebot.

МодульФункция
ExtractorОпределяет контекст: раздел, урок, шаг через навигацию по Inline Keyboard
AbuseCheckerКлассифицирует запрос: ok / forbidden / solution / injection
PromptBuilderСобирает промпт из контекста урока и истории диалога
AnswerBuilderРешает, идти в LLM или вернуть предупреждение пользователю
UITelegram-бот на библиотеке telebot

Ключевой элемент — модуль AbuseChecker, реализованный по принципу LLM as a judge. Та же языковая модель, что отвечает студентам, сначала классифицирует каждый запрос по четырём категориям: ok, forbidden, solution и injection. Категория solution ловит не только прямые просьбы «дай код», но и завуалированные — «как решить», «покажи ответ». Injection — попытки сломать логику модели через команды вроде «игнорируй предыдущие указания». При первом срабатывании пользователь получает предупреждение, при повторном — блокировку. Сообщение пользователя оборачивается в markdown-цитату перед подстановкой в промпт: это дополнительный барьер против инъекций.

Модерация построена по принципу LLM as a judge: модель классифицирует запрос на ok, forbidden, solution или injection.

Архитектура ИИ куратора
Архитектура ИИ куратора · Источник: Habr AI

База знаний — обычный JSON-файл с иерархией: курс → секции → уроки → шаги. Каждый шаг имеет тип: «обучение» или «задача». Задачи бывают двух видов — тест с вариантами ответов и задача на программирование с эталонным решением. Решение хранится в базе знаний и используется куратором для подсказок, но не выдаётся студенту напрямую — именно это и блокирует AbuseChecker.

В качестве LLM автор выбрал Gemini Flash Lite Preview — модель из семейства Google Gemini, ориентированную на низкую стоимость вызовов при приемлемом качестве. Это не флагманская Gemini 2.5 Pro, но для задачи куратора начального уровня характеристики оказались достаточными. Полноценная СУБД в прототипе отсутствует: данные читаются из JSON, история диалога хранится там же.

Подобный подход — намеренное упрощение стека — противоположен тому, что предлагают готовые RAG-фреймворки вроде LangChain или LlamaIndex. Те требуют векторной базы данных, эмбеддингов и оркестрации цепочек вызовов. Здесь весь контекст передаётся напрямую в промпт, потому что база знаний достаточно компактна. Для небольшого курса это работает; при масштабировании на тысячи документов потребуется переход к векторному поиску.

Автор честно обозначает границы: это прототип, а не production-решение. Telebot синхронный, JSON не масштабируется, формат ответа модератора задан в промпте, а не через схему — это менее стабильно. Но цель была другой: быстро проверить гипотезу, что ИИ-куратор с модерацией и контекстом урока вообще работает как идея. Судя по описанию, проверка прошла успешно.