Множество примитивных запросов для генеративных сетей представлено сегодня на просторах интернета, и выдают они совершенно нежизнеспособные схемы буквально из двух-трёх таблиц. Устав от суеты с ручным написанием десятков строк кода для студентов или младших разработчиков, опытный ментор неминуемо обращается к большим языковым моделям. Казалось бы, достаточно попросить умную машину сделать проверочный тест, и готовый добротный материал польётся рекой. На самом деле всё обстоит несколько иначе, ведь без строгих ограничений искусственный интеллект скатывается в банальности вроде абстрактного магазина с товарами и покупателями. Однако спектр возможных предметных областей не ограничивается одной лишь коммерцией, поэтому для получения по-настоящему сложной практики придётся изрядно потрудиться над формулировками.
Архитектура базы: тонкости диалектов
Задача не из лёгких. Ведь именно сырая, непродуманная структура сводит на нет всю образовательную ценность геймифицированного процесса. С чего начинается выбор? С определения конкретной СУБД и строгого контекста. Не стоит скупиться на детали в первом же предложении вашего обращения к чат-боту. Отличной стартовой точкой станет английская конструкция вроде:
Act as a Senior Database Developer. Design a relational database schema for a regional hospital management system using PostgreSQL
Далее следует чётко ограничить количество сущностей, добавив бескомпромиссную фразу:
Include exactly 7 tables
К следующему этапу относится прописывание связей, где выручит формулировка:
Все топовые нейросети в одной подписке! 🚀
Устали оплачивать десятки сервисов отдельно и постоянно включать VPN? Появилась платформа, которая объединяет более 90 передовых ИИ в одном окне. Пишите тексты с новейшими версиями GPT и Claude, создавайте шедевры в Midjourney и генерируйте видео в Sora и Kling. Тексты, изображения, видео и музыка — всё работает на любых устройствах без «танцев с бубном».
Попробуйте бесплатно прямо сейчас! Переходите по ссылке и получите бонусные токены для старта 👉 https://clck.ru/3RNCRL
Ensure at least two many-to-many relationships and use UUIDs for primary keys
И всё-таки алгоритм довольно часто забывает про индексы, поэтому последним в этом монолитном текстовом блоке идёт требование:
Write DDL statements including appropriate indexes for foreign keys
Разумеется, такой скрупулёзный подход забирает время, но результат того стоит.
Генерация тестовых данных
Особый интерес вызывает первичное наполнение созданных таблиц. Буквально десятилетие назад ручное написание INSERT-скриптов съедало львиную долю времени рядового преподавателя, но сейчас эту скучную рутину можно полностью делегировать нейросети. Правда, здесь есть свои скрытые подводные камни. Если просто скомандовать добавить записи, в колонках осядет абсолютно нечитаемый мусор из случайных символов или бесконечные клоны «John Doe». Чтобы этого избежать, стоит использовать метод контекстного программирования, усиленный жёсткими рамками. Рабочий и проверенный временем промт звучит так:
Generate INSERT statements to populate the previously created tables. Create 50 realistic records for the Patients table, ensuring dates of birth range from 1950 to 2010
К слову, для имитации бурной деятельности в системе не забудьте указать машине:
Add 200 records to the Appointments table, simulating a busy schedule where 15% of appointments are cancelled
Внести лепту в реалистичность поможет и прямое требование использовать конкретную локализацию, например, исключительно русские фамилии и реалистичные адреса. Бьёт по бюджету обычно покупка готовых обезличенных дампов, а тут железный помощник всё сделает абсолютно бесплатно.
Как выбрать сложность задач?
Сложно ли заставить ИИ написать хитрые задания на выборку? Да, если оставить всё на откуп стандартным настройкам температуры генерации. Обыватель обычно просит в лоб «придумать пять вопросов», получая в ответ элементарные выборки с одним примитивным условием фильтрации. Настоящий же колоритный хардкор начинается там, где в дело вступает агрегация и оконные функции. К первой группе требований можно отнести базовые выборки, написав:
Create 3 beginner-level SQL tasks involving basic SELECT, WHERE, and ORDER BY clauses
Затем градус напряжения стоит повысить, потребовав от бота:
Generate 3 intermediate tasks requiring INNER and LEFT JOINs, GROUP BY, and HAVING
Ну и, наконец, изюминка любой серьёзной проверки знаний — сложные аналитические запросы. Для них великолепно подойдёт запрос:
Formulate 2 advanced practical tasks. The user must use window functions (ROW_NUMBER, RANK) and CTEs to solve them
Безусловно, такой громоздкий, многоступенчатый промт творит чудеса, заставляя нейросеть мыслить категориями реального бизнеса и соблюдать нерушимые постулаты реляционной алгебры.
Форматирование вывода и оформление
Забытая точка с запятой в конце строки. Именно с такой мелкой, казалось бы, проблемы начинается долгий процесс отладки сгенерированного искусственным интеллектом скрипта. Чтобы синтаксические махинации нейросети не отнимали драгоценные часы, нужно строго регламентировать формат итогового ответа. Впрочем, многие ошибочно считают, что ИИ сам поймёт, как лучше оформить текст, но на практике он часто смешивает пояснения на естественном языке и SQL-код в нечитаемую кашу. Выручит добавление в самый конец вашего текстового промта специального блока-инструкции. Звучать он может примерно так:
Output format: 1. DDL Script in a single SQL code block. 2. DML Script in a separate SQL code block. 3. Tasks listed in Markdown format
Тем более, что чёткое визуальное разделение позволит вам моментально скопировать нужный фрагмент и перенести его в любую среду разработки (например, в DBeaver). Да и самим тестируемым комфортнее работать с чистым текстом, где каждая задача аккуратно отделена от предыдущей отступами.
Эталонные ответы и ключи для тестирования
Обе стороны медали должны быть проработаны одинаково хорошо. Ведь недостаточно просто придумать заковыристый вопрос про объединение таблиц, на него ещё нужно иметь стопроцентно верный скрипт-ответ. Не стоит забывать про генерацию так называемых «ключей» для автоматизированной проверки. Конечно, настоящий ИТ-бомонд и сам напишет запрос за пару минут, однако зачем тратить собственные интеллектуальные ресурсы? Обязательно ли указывать это отдельным длинным промтом? Вовсе нет. Довольно часто практики просто вшивают в первоначальную команду короткую фразу:
For each generated task, provide the correct SQL solution. Hide the solutions under a Markdown spoiler
Кстати, если вы планируете загружать эти тесты в LMS-систему, имеет смысл сразу попросить перевести весь полученный массив данных в формат JSON. Мощный современный парсер легко проглотит такой файл, если вы напишете:
Format the tasks and their correct queries as a JSON array where each object has ‘question_text’, ‘difficulty_level’, and ‘expected_sql’ keys
Ролевой контекст и поиск антипаттернов
Сухие академические задачки давно никого не привлекают на профильных курсах. Студенты искренне грезят о реальных коммерческих проектах, поэтому антураж заданий играет далеко не последнюю роль. Вместо абстрактной базы захудалой библиотеки лучше погрузить своё виртуальное чадо в атмосферу агрессивного финтеха или динамичного геймдева. Попробуйте такой нестандартный заход:
Act as a Lead Data Engineer at a fast-growing crypto exchange. You need to test a new junior analyst. Create a schema for user wallets and transactions
Зрелище удручающее, когда выпускники курсов не понимают бизнес-логики, но подобные ситуативные промты решают эту проблему на корню. Кроме того, можно попросить нейросеть добавить намеренные ошибки в архитектуру, чтобы ученик их самостоятельно нашёл. Формулировка
Introduce 3 anti-patterns in the schema design and ask the student to identify and fix them
станет тем самым спасательным кругом для развития навыков рефакторинга. Это же железное правило касается и оптимизации: попросите сгенерировать заведомо медленный запрос с кучей вложенных подзапросов и поставьте задачу его ускорить.
Тактика итеративного взаимодействия
Код для избранных. Многие пытаются уместить абсолютно все требования в одно короткое сообщение, панически боясь превысить лимит контекстного окна. На самом деле жёсткая экономия здесь совершенно неуместна, а попытка получить всё и сразу обречена на провал. Скупой платит дважды. Ведь если машина не получит исчерпывающих вводных на старте, позже обязательно всплывут критические логические нестыковки. Например, может внезапно оказаться, что в таблице платежей отсутствует прямая привязка к идентификатору клиента. Нужно отметить, что наилучшие результаты в промпт-инжиниринге достигаются при строгом итеративном подходе. Сначала вы скармливаете боту запрос на создание исключительно DDL-схемы, затем придирчиво проверяете её глазами, и только после этого отправляете следующий промт:
Based on the approved schema above, generate the test data
Ну а третьим, финальным шагом уже просите алгоритм разложить по полочкам саму практику и ответы к ней. Такой процесс, разделённый на понятные этапы, усиленный ролевым контекстом, ограниченный жёсткими правилами синтаксиса, выдаёт на выходе невероятно качественный материал.
Разработать глубокий учебный материал при помощи нейросетей — задача вполне посильная, если подходить к ней без лишней спешки. Грамотно составленный многослойный промт станет отличным решением для любого загруженного рутиной тимлида. Созданная таким образом изысканная SQL-практика гарантированно порадует домочадцев вашего учебного центра.
