16 KiB
16 KiB
LLM Prompt Training Log
Дата: 2026-04-28 Цель: довести универсальный промпт для генерации кода функций до состояния, при котором сгенерированный код проходит синтаксическую проверку и проверку смысла "LLM что делает" на всех языках, с учетом кривых пользовательских условий.
Правило цикла
- Составить человеческую задачу для LLM.
- Получить сгенерированный код.
- Прогнать код через линтер / syntax check.
- Прогнать проверку "LLM что делает".
- Зафиксировать результат в этом файле.
- Исправить промпт.
- Повторить на новых задачах и новых языках.
Цели промпта
- Пользователь может давать неточные, неполные или кривые условия.
- LLM должна уточнять или нормализовать задачу внутри ответа.
- LLM должна возвращать код функции, который соответствует реальному runtime-контуру.
- Сгенерированный код должен быть проверяемым линтером.
- Сгенерированный код должен проходить семантическую проверку "LLM что делает".
- Промпт должен работать на всех поддерживаемых языках.
Критерии успеха
- Код валиден по синтаксису.
- Код соответствует ожидаемому entrypoint/handler контракту.
- Код не содержит лишнего wrapper-кода, если он не нужен для пользовательского артефакта.
- Ответ LLM объясняет, что делает код.
- Ответ LLM не выдумывает поведение, которого нет в коде.
- На негативных примерах LLM не маскирует ошибки.
Языки для прогона
- Node.js
- Python
- PHP
- Ruby
- Go
Формат записи по каждому циклу
- Дата и номер итерации.
- Исходный промпт.
- Набор задач.
- Что сгенерировала LLM.
- Результат линтера.
- Результат проверки "LLM что делает".
- Что сломалось.
- Что изменено в промпте.
- Результат следующего прогона.
Текущий статус
- Базовая структура журнала создана.
- Следующий шаг: сформировать первый универсальный промпт и прогнать по языкам на множестве задач.
Итерация 1
Промпт
- Набор прямых задач на генерацию кода по языкам.
- Требование: код + краткое объяснение.
Прогон
- Node.js, Python, PHP, Ruby, Go.
Результат
- Все сгенерированные куски кода прошли syntax/lint check.
- Объяснение присутствовало во всех ответах, но формат заголовка плавал:
**Explanation**,**Что делает код**,**LLM**,**LLM:**. - Node.js ответ был runtime-safe в синтаксическом смысле, но prompt ещё не фиксировал достаточно жёстко формат блока объяснения.
- PHP/Ruby ответы местами использовали более свободные runtime-объяснения, чем хотелось бы для единого шаблона.
Вывод
- Нужен более жёсткий универсальный промпт: точный заголовок блока объяснения, явный запрет на выдуманные SDK/контракты, более тесная привязка к runtime.
Что изменено в промпте после итерации 1
- Зафиксирован точный заголовок
LLM что делает. - Добавлены явные ограничения по runtime-контракту.
Итерация 8
Промпт
- Строгий формат ответа сохранился.
- Добавлены более разнообразные задачи: greeting и sum numbers.
Прогон
- Node.js, Python, PHP, Ruby.
Результат
- Все четыре языка стабильно выдавали синтаксически корректный код и проходили lint.
- Node.js держит exact heading
LLM что делаети на greeting, и на sum numbers. - Python и Ruby также стабильно соблюдают exact heading и fenced code block.
- PHP на части mixed-case ответов всё ещё иногда отдаёт нестандартный заголовок вроде
LLM greeting handlerилиLLM what does, хотя код и lint проходят.
Вывод
- Prompt уже достаточно силён для кода и линтера на всех поддерживаемых языках.
- Главная остаточная проблема — полная фиксация заголовка explanation в PHP во всех разновидностях задач.
- Для следующей правки стоит ещё сильнее зажать именно PHP‑формат ответа либо принять это как локальную особенность модели.
- Добавлены запреты на выдуманные SDK, фреймворки и wrapper-код.
Итерация 2
Промпт
- Универсальный prompt с акцентом на broken user input, runtime contract и точный раздел
LLM что делает. - Go исключён из цикла по явному указанию пользователя.
Прогон
- Node.js, Python, PHP, Ruby.
Результат
- На первом проходе Node.js с более тяжёлой формулировкой давал
HTTP 400 invalid JSON: unexpected EOFот AI endpoint. - После упрощения Node.js запроса он стал проходить syntax/lint check.
- Python, PHP, Ruby прошли syntax/lint check.
- Во всех ответах explanation был, но заголовок снова не совпал с точным
LLM что делает; LLM использовала варианты**LLM:**,**Explanation**и похожие.
Вывод
- Главная оставшаяся проблема — формат блока объяснения.
- Для следующей итерации нужен ещё более жёсткий формат ответа: literal heading без markdown-обёрток и без альтернативных названий.
Что изменено в промпте после итерации 2
- Усилен запрет на альтернативные заголовки блока объяснения.
- Добавлено требование, чтобы первая строка раздела была ровно
LLM что делает. - Уточнено, что после заголовка должны идти только короткие пункты.
Итерация 3
Промпт
- Универсальный prompt с фиксированным разделом
LLM что делает. - Кривые и разнотипные пользовательские задачи: приветствие, сумма чисел, default fallback, missing fields.
- Go уже исключён из цикла.
Прогон
- Node.js, Python, PHP, Ruby.
Результат
- Python, PHP и Ruby стабильно вернули синтаксически корректный код.
- Node.js дважды отвалился на уровне AI endpoint с
HTTP 400 invalid JSON: unexpected EOFдо получения ответа. - Для Python/PHP/Ruby explanation присутствовал, но часть ответов оборачивала пояснение в markdown или использовала нестандартную форму заголовка, из-за чего точный парсинг блока
LLM что делаетбыл нестабилен. - Линтер везде, где код был получен, показал
✅ Синтаксис корректен.
Вывод
- Prompt уже близок к рабочему, но ещё не дожат по формату блока объяснения.
- Нужна ещё более жёсткая инструкция: explanation без markdown-обёрток, ровно один заголовок, затем только пункты.
- Node.js-case надо формулировать проще, иначе AI endpoint иногда вообще не возвращает JSON-ответ.
Что изменено в промпте после итерации 3
- Уточнено, что раздел
LLM что делаетдолжен идти без**, без code fences и без альтернативных названий. - Проговаривание структуры ответа стало ещё более жёстким.
Итерация 4
Промпт
- Ещё более жёсткая формулировка ответа.
- Короткие и разнообразные задачи: greet, sum numbers, fallback defaults, broken input.
- Go не используется.
Прогон
- Node.js, Python, PHP, Ruby.
Результат
- Node.js, Python, PHP и Ruby синтаксически сгенерировались, но формат ответа был нестабилен.
- Node.js вернул ответ с заголовками
Normalized task:/Code:/LLM что делает:вместо требуемой точной структуры. - Python ответил без точного заголовка
LLM что делаети с markdown-упаковкой блока. - PHP и Ruby в части случаев вообще не отдали код в fenced-блоке, из-за чего extractor не смог вытащить код.
- Где код удалось извлечь, syntax/lint check проходил.
Вывод
- Prompt уже умеет удерживать синтаксис, но всё ещё не закрепил формат ответа.
- Следующая правка должна требовать строгую структуру ответа: фиксированный порядок секций, fenced code block и plain-text heading
LLM что делает.
Что изменено в промпте после итерации 4
- Усилен запрет на альтернативные заголовки и markdown-упаковку explanation.
- Следующий вариант должен требовать точную структуру ответа с fenced code block.
Итерация 5
Промпт
- Строгий шаблон ответа: нормализация, fenced code block,
LLM что делает. - Набор разнообразных задач: приветствие, default fallback, суммы чисел.
- Go по-прежнему исключён.
Прогон
- Node.js, Python, PHP, Ruby.
Результат
- Python, PHP и Ruby для части задач вернули синтаксически корректный код и соблюли fenced block + heading.
- Ruby с задачей про сумму чисел выполнил требование почти полностью: точный heading
LLM что делаетприсутствовал. - Python/Php с простыми задачами тоже начали соблюдать заголовок и fenced code block.
- Node.js и часть PHP/Python задач всё ещё иногда падали на уровне AI endpoint с
HTTP 400 invalid JSON: unexpected EOF. - Ruby с задачей про greeting показал английский заголовок
LLM what it does, то есть prompt ещё не полностью зафиксировал язык заголовка.
Вывод
- Структура ответа уже заметно улучшилась на части кейсов.
- Нужно отдельно добить два оставшихся класса проблем:
- endpoint иногда не отдает ответ на Node/часть других задач
- LLM иногда переводит заголовок explanation на английский
Что изменено в промпте после итерации 5
- Усилен запрет на любые альтернативные заголовки, включая английский перевод.
- Подчёркнуто, что допустим только literal
LLM что делает.
Итерация 6
Промпт
- Очень короткие задачи с жёстким форматом ответа.
- Node.js, Python, PHP, Ruby.
Прогон
- Node.js, Python, PHP, Ruby.
Результат
- Python, PHP и Ruby уже стабильно выдали fenced code block, точный
LLM что делаети синтаксически корректный код. - Node.js тоже перестал падать на уровне AI endpoint и начал возвращать код.
- Node.js всё ещё печатает заголовок как
LLM Что делаетс заглавной буквойЧто, то есть строгая фиксация регистра ещё не дожата. - Где код был получен, lint проходил успешно.
Вывод
- Prompt почти готов: структура и код в основном держатся, кроме единичного расхождения в регистре заголовка на Node.js.
- Следующий шаг — явно зафиксировать lower-case
чтои ещё раз прогнать короткий цикл.
Что изменено в промпте после итерации 6
- Добавлено жёсткое указание на точный регистр заголовка
LLM что делает. - Запрещены любые заголовки с иным регистром или переводом.
Итерация 7
Промпт
- Короткие задачи с минимальной формулировкой.
- Жёстко фиксированный
LLM что делает.
Прогон
- Node.js, Python, PHP, Ruby.
Результат
- Все четыре языка вернули code block и точный заголовок
LLM что делает. - Линтер везде показал
✅ Синтаксис корректен. - Node.js перестал падать на уровне AI endpoint даже при коротком prompt.
- Формат ответа стал предсказуемым: normalization + fenced code block + explanation.
Вывод
- Текущий prompt уже работает на коротких и простых кейсах.
- Следующий шаг — проверить его на более разнообразных задачах, чтобы убедиться, что шаблон не ломается за пределами приветствий.