238 lines
16 KiB
Markdown
238 lines
16 KiB
Markdown
# LLM Prompt Training Log
|
||
|
||
Дата: 2026-04-28
|
||
Цель: довести универсальный промпт для генерации кода функций до состояния, при котором сгенерированный код проходит синтаксическую проверку и проверку смысла "LLM что делает" на всех языках, с учетом кривых пользовательских условий.
|
||
|
||
## Правило цикла
|
||
1. Составить человеческую задачу для LLM.
|
||
2. Получить сгенерированный код.
|
||
3. Прогнать код через линтер / syntax check.
|
||
4. Прогнать проверку "LLM что делает".
|
||
5. Зафиксировать результат в этом файле.
|
||
6. Исправить промпт.
|
||
7. Повторить на новых задачах и новых языках.
|
||
|
||
## Цели промпта
|
||
- Пользователь может давать неточные, неполные или кривые условия.
|
||
- 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 уже работает на коротких и простых кейсах.
|
||
- Следующий шаг — проверить его на более разнообразных задачах, чтобы убедиться, что шаблон не ломается за пределами приветствий.
|