Organize LLM assets and function lifecycle fixes

This commit is contained in:
Naeel
2026-04-28 13:04:08 +03:00
parent 82eba079f6
commit a534fddd2c
22 changed files with 1409 additions and 72 deletions
+237
View File
@@ -0,0 +1,237 @@
# 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 уже работает на коротких и простых кейсах.
- Следующий шаг — проверить его на более разнообразных задачах, чтобы убедиться, что шаблон не ломается за пределами приветствий.