Тестирующая система для курса по SQL: задания пишет нейросеть, ответы проверяет движок
SQL Практика — практикум с автоматической проверкой решений. Преподаватель собирает набор заданий в локальной студии. Студент пишет запросы на настоящем PostgreSQL у себя на компьютере. Каждое решение прогоняется на десятках вариантов данных, и нейросеть в этой проверке не участвует.
Практику по SQL трудно составить и ещё труднее честно проверить
Чтобы студенты научились писать запросы, им нужны задания и быстрый ответ, верно ли решение. На этом пути у преподавателя несколько проблем:
- придумать задания под конкретную лекцию и учебную базу — отдельная работа перед каждым занятием;
- проверять запросы глазами долго, а на большом потоке не получается совсем;
- проверка на одном наборе строк пропускает ошибки: запрос без нужного условия проходит, если лишних строк в таблице нет;
- задание, которое целиком сочинила нейросеть, может оказаться двусмысленным или с неверным эталоном;
- у студента решение проходит, а на проверке у преподавателя падает, потому что окружение другое.
SQL Практика делит работу на две части. Нейросеть пишет формулировки и черновик эталона. Данные, ожидаемые результаты и сама проверка считаются детерминированным кодом, одинаковым у автора, студента и в CI.
Один запрос прогоняется на 53 наборах данных
Выбрать кофейни, которые сейчас работают и в которых не менее 40 посадочных мест.
-- решение студента SELECT name, city, seats FROM shops WHERE is_active = true AND seats > 40;
Студент пробует запрос на своей живой базе и нажимает «Проверить решение». Проверка идёт в отдельной чистой базе.
solutions/t01_active_shops_with_seats.sql
53 варианта данных
- смесь
- нет действующих
- только действующие
один вариант изнутри
- BEGIN
- данные варианта
- решение студента
- снять результат
- ROLLBACK
- привести к одному виду
- сравнить с ожидаемым
- Откуда берутся варианты
- Нейросеть описывает только классы строк и крайние случаи. Строки строит движок: сначала крайности, где каждый класс пуст или остался один, затем случайные смеси.
- С чем сравнивается ответ
- Эталонное решение заранее прогнано на каждом варианте. Перед сравнением оба результата приводятся к одному виду: регистр имён колонок, точность чисел, даты,
NULL, порядок строк, если он не важен. - Что видит студент
- Три открытых примера целиком. Скрытый вариант открывается только после того, как решение на нём упало. Эталонное решение не показывается.
- Где ещё идёт эта проверка
- В CI преподавателя. Тот же образ читает папку
solutions/из репозитория студента, прогоняет те же варианты и выдаёт отчёт по заданиям.
Упавший вариант показывает, что именно не сошлось
| name | city | seats |
|---|---|---|
| Цех на Литейном | Санкт-Петербург | 40 |
| Цех у вокзала | Казань | 56 |
| Цех на набережной | Самара | 72 |
| name | city | seats |
|---|---|---|
| этой строки в ответе нет | ||
| Цех у вокзала | Казань | 56 |
| Цех на набережной | Самара | 72 |
Готового ответа система не даёт. Она показывает данные, на которых решение разошлось с эталоном: в пропавшей строке ровно 40 мест, а в запросе стоит «больше 40». Кнопка «В мою базу» загружает этот вариант в живую базу студента, и запрос можно отладить на тех же строках. Кофейни в примере вымышлены.
как звучат другие причины
- форма результатаНе тот состав колонок: не хватает «city»
- число строкНе то число строк: 7
- совпадение результатаСтроки верные, а порядок — нет: расходится с 3-й позиции
- состояние таблиц · INSERT, UPDATE, DELETEТаблица «drinks» после ваших команд выглядит иначе
- структура схемы · CREATE, ALTERСтруктура схемы отличается от ожидаемой: не хватает индексов: 1
- конструкции SQLРешение написано не теми конструкциями: нельзя использовать «JOIN»
- ошибка PostgreSQLЗапрос не выполнился на этих данных — текст ошибки показан дословно
Конструкции проверяются по разбору запроса, а не поиском подстроки: уникальность через GROUP BY вместо требуемого DISTINCT проверка заметит.
Нейросеть пишет задания, движок решает, годятся ли они
| шаг студии | нейросеть | движок | автор |
|---|---|---|---|
| 1Лекция | По конспекту предлагает тему занятия, учебную базу, темы SQL и число заданий | Правит предложение в форме | |
| 2Область | Описывает учебную базу и её таблицы | Утверждает область | |
| 3Задания | Пишет условие для студента, точную формулировку и ограничения | Считает покрытие тем заданиями | Утверждает задания |
| 4Решения и проверки | Пишет три решения, описание данных и неверные решения | Строит варианты данных, считает ожидаемые результаты, собирает проверки, проводит приёмку | Читает отчёт приёмки |
| 5Выпуск | Проверяет пак, шифрует закрытую часть, собирает архив для группы | Выбирает оформление и выпускает комплект |
шаг 4 · как задание проходит приёмку
Три независимых решения
- первая модель, промпт Аотпечаток 4c1f…9ab2
- первая модель, промпт Ботпечаток 4c1f…9ab2
- вторая модельотпечаток 4c1f…9ab2
Сравниваются не тексты запросов, а результаты на всех вариантах данных. Отпечатки разошлись — формулировку можно прочитать двояко, и задание возвращается на шаг 3.
Заведомо неверные решения
- совпадение результата
seats > 40вместо>= 40 - забытосовпадение результата
is_active = true - в ответе две колонки из трёхформа результата
- ответ вписан константамисовпадение результата
Справа — проверка, которая поймала ошибку. Первую из них сделал студент в примере выше. Решение, не пойманное ничем, студия помечает как дыру в проверках.
Задание принимается, когда эталон проходит на всех вариантах, а каждая основная проверка проваливает хотя бы одно неверное решение. Любой шаг можно пройти и без встроенной модели: студия выдаёт готовый промпт для своей нейросети.
Экраны студента и автора
Сеть кофеен «Тёплый Цех», её сотрудники, меню и конспект лекции на снимках вымышлены. Ответы нейросети на снимках студии взяты из заготовок, без обращения к модели.












Курсам по SQL и проектам, где ответ нейросети нужно проверять
Система рассчитана на тех, кто учит писать запросы:
- преподаватели вузов и колледжей с курсом по базам данных;
- школы программирования и онлайн-курсы для аналитиков;
- компании, которые обучают сотрудников работе с данными.
Общего сервера нет. Студия работает на компьютере автора, раннер — у студента и в CI, а практика хранится папкой в git. Оформление приложения студента меняется темой: шесть готовых или своя, с логотипом и цветами курса.
На этом продукте виден подход, который мы применяем в проектах с ИИ: нейросеть готовит материал, а годится ли он, решает строгая автоматическая проверка и человек, который утверждает результат.
Нужна проверяемая автоматизация с ИИ? Напишите в Telegram
Расскажите, какую работу хотите поручить нейросети, — покажем, где её ответ можно проверять автоматически.