Files
fission-console/LLM/LLM_PROMPT_TRAINING_2026-04-28.md
T

238 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 уже работает на коротких и простых кейсах.
- Следующий шаг — проверить его на более разнообразных задачах, чтобы убедиться, что шаблон не ломается за пределами приветствий.