// продукт студии · SQL Практика

Тестирующая система для курса по SQL: задания пишет нейросеть, ответы проверяет движок

SQL Практика — практикум с автоматической проверкой решений. Преподаватель собирает набор заданий в локальной студии. Студент пишет запросы на настоящем PostgreSQL у себя на компьютере. Каждое решение прогоняется на десятках вариантов данных, и нейросеть в этой проверке не участвует.

тип
Собственный продукт
для кого
Преподаватели и авторы курсов по SQL
направления
Образование · ИИ-интеграции
Рабочее место студента в SQL Практике: список заданий, условие задания, редактор SQL-запроса и таблица с результатом
рабочее место студента: задания, условие, редактор и результат запроса · данные учебной базы вымышленные
01 / задача

Практику по SQL трудно составить и ещё труднее честно проверить

Чтобы студенты научились писать запросы, им нужны задания и быстрый ответ, верно ли решение. На этом пути у преподавателя несколько проблем:

  • придумать задания под конкретную лекцию и учебную базу — отдельная работа перед каждым занятием;
  • проверять запросы глазами долго, а на большом потоке не получается совсем;
  • проверка на одном наборе строк пропускает ошибки: запрос без нужного условия проходит, если лишних строк в таблице нет;
  • задание, которое целиком сочинила нейросеть, может оказаться двусмысленным или с неверным эталоном;
  • у студента решение проходит, а на проверке у преподавателя падает, потому что окружение другое.

SQL Практика делит работу на две части. Нейросеть пишет формулировки и черновик эталона. Данные, ожидаемые результаты и сама проверка считаются детерминированным кодом, одинаковым у автора, студента и в CI.

02 / проверка

Один запрос прогоняется на 53 наборах данных

задание · действующие кофейни с залом

Выбрать кофейни, которые сейчас работают и в которых не менее 40 посадочных мест.

-- решение студента
SELECT name, city, seats
FROM shops
WHERE is_active = true
  AND seats > 40;

Студент пробует запрос на своей живой базе и нажимает «Проверить решение». Проверка идёт в отдельной чистой базе.

solutions/t01_active_shops_with_seats.sql

53 варианта данных

3 открытых примера — видны студенту
  • смесь
  • нет действующих
  • только действующие
50 скрытых — строит движок
50 сошлось3 нет: скрытые варианты 17, 31 и 44

один вариант изнутри

  1. BEGIN
  2. данные варианта
  3. решение студента
  4. снять результат
  5. ROLLBACK
  6. привести к одному виду
  7. сравнить с ожидаемым
Откуда берутся варианты
Нейросеть описывает только классы строк и крайние случаи. Строки строит движок: сначала крайности, где каждый класс пуст или остался один, затем случайные смеси.
С чем сравнивается ответ
Эталонное решение заранее прогнано на каждом варианте. Перед сравнением оба результата приводятся к одному виду: регистр имён колонок, точность чисел, даты, NULL, порядок строк, если он не важен.
Что видит студент
Три открытых примера целиком. Скрытый вариант открывается только после того, как решение на нём упало. Эталонное решение не показывается.
Где ещё идёт эта проверка
В CI преподавателя. Тот же образ читает папку solutions/ из репозитория студента, прогоняет те же варианты и выдаёт отчёт по заданиям.
03 / разбор ошибки

Упавший вариант показывает, что именно не сошлось

скрытый вариант 17первый упавший раскрывается самВ мою базу
ожидается · 3 строки
namecityseats
Цех на ЛитейномСанкт-Петербург40
Цех у вокзалаКазань56
Цех на набережнойСамара72
ваш результат · 2 строки
namecityseats
этой строки в ответе нет
Цех у вокзалаКазань56
Цех на набережнойСамара72
причина словамиРезультат не совпал с эталоннымОжидается 3 строки, у вас 2. Не хватает строк: 1.

Готового ответа система не даёт. Она показывает данные, на которых решение разошлось с эталоном: в пропавшей строке ровно 40 мест, а в запросе стоит «больше 40». Кнопка «В мою базу» загружает этот вариант в живую базу студента, и запрос можно отладить на тех же строках. Кофейни в примере вымышлены.

как звучат другие причины

  • форма результатаНе тот состав колонок: не хватает «city»
  • число строкНе то число строк: 7
  • совпадение результатаСтроки верные, а порядок — нет: расходится с 3-й позиции
  • состояние таблиц · INSERT, UPDATE, DELETEТаблица «drinks» после ваших команд выглядит иначе
  • структура схемы · CREATE, ALTERСтруктура схемы отличается от ожидаемой: не хватает индексов: 1
  • конструкции SQLРешение написано не теми конструкциями: нельзя использовать «JOIN»
  • ошибка PostgreSQLЗапрос не выполнился на этих данных — текст ошибки показан дословно

Конструкции проверяются по разбору запроса, а не поиском подстроки: уникальность через GROUP BY вместо требуемого DISTINCT проверка заметит.

04 / сторона автора

Нейросеть пишет задания, движок решает, годятся ли они

шаг студиинейросетьдвижокавтор
1ЛекцияПо конспекту предлагает тему занятия, учебную базу, темы SQL и число заданийПравит предложение в форме
2ОбластьОписывает учебную базу и её таблицыУтверждает область
3ЗаданияПишет условие для студента, точную формулировку и ограниченияСчитает покрытие тем заданиямиУтверждает задания
4Решения и проверкиПишет три решения, описание данных и неверные решенияСтроит варианты данных, считает ожидаемые результаты, собирает проверки, проводит приёмкуЧитает отчёт приёмки
5ВыпускПроверяет пак, шифрует закрытую часть, собирает архив для группыВыбирает оформление и выпускает комплект

шаг 4 · как задание проходит приёмку

однозначна ли формулировка

Три независимых решения

  • первая модель, промпт А
    отпечаток 4c1f…9ab2
  • первая модель, промпт Б
    отпечаток 4c1f…9ab2
  • вторая модель
    отпечаток 4c1f…9ab2

Сравниваются не тексты запросов, а результаты на всех вариантах данных. Отпечатки разошлись — формулировку можно прочитать двояко, и задание возвращается на шаг 3.

ловят ли проверки ошибки

Заведомо неверные решения

  • seats > 40 вместо >= 40
    совпадение результата
  • забыто is_active = true
    совпадение результата
  • в ответе две колонки из трёх
    форма результата
  • ответ вписан константами
    совпадение результата

Справа — проверка, которая поймала ошибку. Первую из них сделал студент в примере выше. Решение, не пойманное ничем, студия помечает как дыру в проверках.

Задание принимается, когда эталон проходит на всех вариантах, а каждая основная проверка проваливает хотя бы одно неверное решение. Любой шаг можно пройти и без встроенной модели: студия выдаёт готовый промпт для своей нейросети.

05 / как выглядит

Экраны студента и автора

Сеть кофеен «Тёплый Цех», её сотрудники, меню и конспект лекции на снимках вымышлены. Ответы нейросети на снимках студии взяты из заготовок, без обращения к модели.

Задание решено: полоса из 53 зелёных штрихов и сообщение, что решение верно на всех вариантах данных
Проверка пройдена: 53 варианта из 53.
Проверка не пройдена: полоса прогона с красными штрихами, построчное сравнение ожидаемого результата с ответом и пояснение про порядок строк
Разбор ошибки: что не сошлось и почему.
Вкладка «Примеры данных»: три открытых набора и таблица сотрудников одного из них
Примеры данных: открытые варианты задания.
Вкладка «История»: список выполненных запросов с временем, числом строк и кнопкой «В редактор»
История запросов: вернуть любой в редактор.
Страница «О базе данных»: описание учебной базы сети кофеен и карточки таблиц с колонками
О базе данных: область и таблицы курса.
Шаг «Лекция» в студии автора: конспект лекции, пожелания и предложение модели по темам и числу заданий
Студия, лекция: практика из конспекта.
Шаг «Предметная область»: выбор учебной базы и тем SQL с количеством заданий по каждой
Студия, область: база и темы практики.
Шаг «Задания»: покрытие тем заданиями и карточки заданий с условием и точной формулировкой
Студия, задания: покрытие тем и формулировки.
Отчёт задания в студии: проверка однозначности тремя решениями, правильное решение, список проверок и покрытие ошибок
Отчёт приёмки: всё о задании на одной странице.
Вкладка «Варианты данных» в студии: таблица открытых и скрытых вариантов с квотами и отпечатками результата
Варианты данных: открытые и скрытые наборы.
Вкладка «Негативные решения»: неверные запросы с метками проверок, которые их ловят
Негативные решения: проверка самих проверок.
Шаг «Выпуск»: выбор темы оформления, состав архива для студентов и редактор файлов комплекта
Студия, выпуск: комплект для группы.
06 / кому подойдёт

Курсам по SQL и проектам, где ответ нейросети нужно проверять

Система рассчитана на тех, кто учит писать запросы:

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

Общего сервера нет. Студия работает на компьютере автора, раннер — у студента и в CI, а практика хранится папкой в git. Оформление приложения студента меняется темой: шесть готовых или своя, с логотипом и цветами курса.

На этом продукте виден подход, который мы применяем в проектах с ИИ: нейросеть готовит материал, а годится ли он, решает строгая автоматическая проверка и человек, который утверждает результат.

07 / под капотом
стек: Python, FastAPI · PostgreSQL 16 · React, Vite, CodeMirror
проверка: общая библиотека для студии, раннера и CI; запросы разбираются как SQL, а не ищутся подстрокой
ИИ: модели через OpenRouter; любой шаг проходится и вручную, с готовым промптом для своей нейросети
поставка: Docker-образ раннера, зашифрованный пак практики, шаблоны для GitLab CI и GitHub Actions
документация: руководства автора и студента на сайте продукта

Нужна проверяемая автоматизация с ИИ? Напишите в Telegram

Расскажите, какую работу хотите поручить нейросети, — покажем, где её ответ можно проверять автоматически.

Написать в Telegram