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

16 KiB
Raw Blame History

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 уже работает на коротких и простых кейсах.
  • Следующий шаг — проверить его на более разнообразных задачах, чтобы убедиться, что шаблон не ломается за пределами приветствий.