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