COMRAD404 / HOWTO

Как писать промпты для кода: best practices

Пошаговая инструкция по промптам для кода: как формулировать задачу, отделять контекст, задавать формат ответа, добавлять примеры и проверять результат тестами и JSON-схемой.

Понадобится

25–35 минут
  • Доступ к одному из инструментов для кодогенерации или API
  • Тестовый файл, задача или небольшой репозиторий для проверки промптов
  • Возможность запускать unit-тесты, линтер или хотя бы ручные тест-кейсы
  • Понимание целевого языка программирования и ожидаемого результата
  • Готовность сверяться с актуальной документацией конкретного вендора

После выполнения этой инструкции вы сможете писать промпты для кода так, чтобы модель чаще возвращала пригодный к запуску, ревью и автоматической проверке результат: с понятной задачей, ограничениями, форматом вывода и способом валидации.

Практический вердикт: для кода обычно лучше работает не короткое «напиши функцию», а компактное ТЗ из блоков: задача, контекст, ограничения, формат ответа, примеры и проверка. Официальные рекомендации OpenAI, GitHub Copilot, Gemini и Anthropic сходятся именно на этом, хотя детали зависят от модели и среды.

  • Время: 25–35 минут
  • Сложность: средний
  • Стоимость: документация бесплатна; использование API, IDE-ассистента или платного плана зависит от выбранного вендора, тариф и доступность проверяйте на официальной странице pricing
  • Что потребуется: доступ к одному из кодовых ассистентов или API, тестовый файл или репозиторий, возможность запускать тесты или проверки формата, понимание целевого языка программирования
  • Актуальная база: официальные руководства OpenAI, GitHub Copilot, Gemini API и Anthropic Claude, а также репозитории OpenAI и 2 исследования; актуальность источников проверена на 2026-08-17

Редакционное ограничение: здесь нет обещаний про «универсальный лучший промпт» и нет численных бенчмарков, потому что источники прямо указывают на зависимость от семейства моделей, контекста IDE и быстро меняющихся релизов. Перед публикацией внутренних стандартов промптинга перепроверьте changelog и документацию конкретного инструмента.

Что добавить в промпт Зачем это нужно На чём основано
Одна чёткая задача Снижает размытость и облегчает проверку Gemini рекомендует прямые, хорошо структурированные запросы; Copilot — дробить сложные задачи
Отдельные блоки инструкций и контекста Модель реже смешивает требования с входными данными OpenAI советует разделять инструкции и контекст; Gemini и Claude поддерживают XML-подобную структуру
Формат ответа Проще автоматизировать постобработку и сравнение OpenAI рекомендует явно задавать формат; Structured Outputs поддерживает JSON schema
Примеры Фиксируют желаемый паттерн решения OpenAI, Copilot и Anthropic рекомендуют добавлять примеры
Границы контекста и инструменты Меньше скрытых предположений и лишних действий Copilot учитывает текущий файл и историю чата; GPT-5 cheatsheet советует явный tool budget
Тесты и evals Позволяют сравнивать версии промпта, а не спорить о вкусе OpenAI рекомендует pin model versions и evals; Copilot — валидировать код перед использованием

1. Сформулируйте одну наблюдаемую задачу

Начните с одного результата, который можно проверить. Для кода это обычно функция, SQL-запрос, патч, тест, миграция или рефакторинг с ограниченным объёмом. GitHub Copilot рекомендует разбивать сложные задачи на меньшие части, а Gemini — писать прямые и хорошо структурированные запросы с ясными ограничениями.

Плохой вариант:

Оптимизируй backend.

Рабочий вариант:

Напишите функцию на Python, которая читает CSV из stdin,
агрегирует строки по полю status и печатает итог в JSON.
Не меняйте интерфейс CLI.
Верните только код и unit-тесты.

Ожидаемый результат: после этого шага у вас есть запрос, который можно проверить по одному критерию: код либо делает именно это, либо нет.

2. Отделите инструкции от контекста

OpenAI рекомендует разделять инструкции и контекст, а Gemini и Anthropic прямо допускают XML-подобные теги или Markdown-заголовки как удобный способ структурирования. Для кода это особенно полезно: требования не смешиваются с фрагментами репозитория, логами и примерами входных данных.

Используйте такой каркас:

<task>
Напишите функцию на Python для нормализации email.
</task>

<context>
Функция используется в API регистрации.
Текущий формат входа: строка или null.
</context>

<constraints>
Не используйте внешние зависимости.
Сохраните совместимость с Python 3.
Не меняйте публичное имя функции.
</constraints>

<output_format>
1. Короткое объяснение до 5 пунктов.
2. Один блок кода.
3. Набор unit-тестов.
</output_format>

Если вам нужен только черновик структуры, OpenAI также советует использовать Generate Anything для наброска промпта под задачу. Но черновик не заменяет ручную проверку ограничений и критериев готовности.

Ожидаемый результат: промпт читается как спецификация, а не как поток мыслей.

3. Зафиксируйте язык, стиль и формат вывода

Не заставляйте модель угадывать, на чём писать и как отвечать. OpenAI рекомендует быть конкретным насчёт формата ответа. Для кодогенерации официальный гайд также отмечает простой приём управления стилем: ведущие слова вроде import направляют ответ к Python-стилю, а SELECT — к SQL-стилю.

Примеры:

import
Напишите минимальный Python-скрипт, который читает JSON из файла и валидирует поле id.
SELECT
Составьте SQL-запрос, который возвращает 10 последних заказов по customer_id.

Если код нужен для CI, укажите точный формат вывода:

Верните ответ в таком порядке:
1. Краткий план.
2. Один блок кода.
3. Один блок тестов.
4. Никаких пояснений после кода.

Это переносимая практика: она работает лучше, чем просьба «сделай красиво», потому что даёт машине проверяемый контракт.

4. Добавьте пример и крайний случай

Когда задача неоднозначна, примеры экономят больше всего итераций. OpenAI, Copilot и Anthropic рекомендуют использовать примеры там, где они помогают зафиксировать шаблон ответа. Для кода полезны не только позитивные примеры, но и крайние случаи.

Пример входа:
["[email protected] ", "[email protected]", null]

Ожидаемый выход:
["[email protected]", "[email protected]", null]

Крайний случай:
Пустая строка должна возвращаться как пустая строка, а не как null.

Если хотите исключить нежелательный стиль решения, добавьте контрпример или запрет:

Не используйте глобальное состояние.
Не добавляйте ORM.
Не переписывайте существующий интерфейс класса.

Ожидаемый результат: модель получает не только цель, но и эталон поведения на спорных входах.

5. Ограничьте контекст и инструменты

GitHub Copilot учитывает текущий файл и историю чата как контекст, а его рекомендации советуют открывать релевантные файлы, выделять нужный код и начинать новый тред, когда старая история больше мешает, чем помогает. Для агентных сценариев GPT-5 cheatsheet рекомендует явный tool budget, а Anthropic — в том числе правило очистки временных файлов. Gemini рекомендует подключать grounding через Google Search для редких или свежих фактов и инструмент code execution для вычислений.

Практически это означает: прямо скажите модели, какой контекст использовать и что ей можно делать.

<context_scope>
Используйте только текущий файл и код ниже.
Не предполагайте существование других модулей.
Если в истории обсуждались старые требования, игнорируйте их.
</context_scope>

<tools>
Если ваш инструмент поддерживает поиск по сети, используйте его только для редких или свежих фактов.
Если ваш инструмент поддерживает выполнение кода, используйте его для вычислений и проверки арифметики.
Бюджет инструментов: не более 2 вызовов.
</tools>

<agent_rules>
После проверки удалите временные файлы, созданные для теста.
</agent_rules>

Ожидаемый результат: в ответе меньше скрытых предположений, а поведение модели проще повторить в новой сессии.

6. Попросите машинно-проверяемый вывод

Для рабочих процессов, где код идёт в пайплайн, естественного языка мало. Репозиторий OpenAI по Structured Outputs прямо указывает, что Structured Outputs заставляет ответы и tool calls соблюдать заданную JSON schema. Это удобно, если вы дальше разбираете результат программно, сравниваете версии промпта или автоматически создаёте файлы.

Минимальный пример схемы ответа:

{
  "type": "object",
  "properties": {
    "summary": {"type": "string"},
    "files": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "path": {"type": "string"},
          "content": {"type": "string"}
        },
        "required": ["path", "content"],
        "additionalProperties": false
      }
    }
  },
  "required": ["summary", "files"],
  "additionalProperties": false
}

Если вы работаете через CLI и автоматизацию, полезен и JSON-вывод на уровне инструмента. В документации Claude Code описан флаг --output-format json, что подходит для скриптовой проверки. Даже если вы не используете Claude, логика та же: чем меньше свободного текста, тем легче автоматическая валидация.

Ожидаемый результат: ответ можно проверить не глазами, а схемой, парсером или тестом.

7. Проверяйте промпт тестами и фиксируйте базовую версию модели

OpenAI в API-документации рекомендует для устойчивого поведения закреплять версии моделей и использовать evals. Репозиторий OpenAI Cookbook показывает практический evaluation flywheel: вы меняете промпт, измеряете результат, сравниваете конфигурации и не путаете улучшение промпта с изменением модели. GitHub Copilot отдельно рекомендует валидировать сгенерированный код перед использованием. Исследования из arXiv и ACM также подтверждают, что формулировка промпта влияет на кодогенерацию и важна для безопасного кода.

Минимальный рабочий цикл такой:

  1. Зафиксируйте одну версию модели.
  2. Подготовьте 3–5 тест-кейсов: нормальный вход, крайний случай, ошибочный вход.
  3. Прогоните старый и новый промпт на одном и том же наборе.
  4. Сравните не «красоту», а прохождение тестов, формат ответа и объём ручных правок.

Если промпт хорош только в одной длинной истории чата, а в новой сессии ломается, это плохой стандарт для команды.

Как проверить, что всё работает

  • Проверка 1. Запустите промпт в новой чистой сессии. Ответ должен сохранять ту же структуру без опоры на скрытую историю.
  • Проверка 2. Убедитесь, что вывод точно соответствует запрошенному формату: только код, код плюс тесты или JSON по заданной схеме.
  • Проверка 3. Запустите unit-тесты или хотя бы три ручных кейса: штатный, крайний и ошибочный.
  • Проверка 4. Если используете IDE-ассистента, повторите задачу с открытыми релевантными файлами или выделенным фрагментом и сравните, насколько меняется качество ответа.
  • Проверка 5. Если задача требует свежих фактов или вычислений, проверьте, что вы включили соответствующий инструмент только там, где он действительно нужен.

Короткий критерий успеха: хороший промпт для кода воспроизводим, проверяем и не зависит от догадок модели о вашем проекте.

Частые ошибки и исправления

  • Ошибка: «Сделай рефакторинг сервиса» без границ задачи. Исправление: разбейте запрос на один наблюдаемый результат: например, «вынеси валидацию из контроллера в отдельную функцию и сохрани сигнатуры методов».
  • Ошибка: модель смешивает объяснение, код и рассуждения. Исправление: явно задайте формат ответа и порядок блоков; при автоматизации переходите на JSON schema или другой машинно-проверяемый контракт.
  • Ошибка: в IDE ответ зависит от случайного состояния истории чата. Исправление: откройте нужные файлы, выделите релевантный код и начните новый тред, если старый контекст больше не нужен.
  • Ошибка: модель пишет «умный», но неисполняемый код. Исправление: требуйте тесты, фиксируйте ограничения по версиям и прогоняйте результат через проверку, а не принимайте по внешнему виду.
  • Ошибка: промпт для продакшена не учитывает безопасность. Исправление: сделайте требования к безопасному коду явными и отдельно проводите ревью; исследования по secure code generation показывают, что безопасность нужно задавать и проверять как отдельный критерий.

Безопасность и ограничения

  • Промптинг не заменяет проверку безопасности. Даже хороший запрос не гарантирует безопасный код; требования безопасности и постпроверка должны быть отдельным шагом.
  • Советы не универсальны для всех моделей. Источники охватывают GPT-5, GitHub Copilot, Gemini 3 и Claude 4; переносите рекомендации между вендорами только после проверки.
  • Документация меняется быстро. В changelog Gemini видно, что даже параметры и рекомендации к взаимодействию с моделями меняются со временем; то же относится и к другим платформам.
  • Стоимость и лимиты не фиксированы в этой инструкции. В исходном пакете нет единой актуальной таблицы цен, rate limits и региональной доступности, поэтому эти параметры нужно проверять у каждого вендора отдельно.
  • Агентные сценарии требуют гигиены артефактов. Если ассистент создаёт временные файлы для проверки, включайте в инструкции явную очистку таких файлов после работы.

Практический вывод: если вы хотите улучшить кодовые промпты одним действием уже сегодня, добавьте явный формат ответа и способ проверки. Это самая полезная и наиболее переносимая рекомендация из всего набора источников.

Что делать дальше

Источники

Вопросы и ответы

Нужно ли всегда писать промпт для кода в XML-подобной структуре?

Нет. Но OpenAI советует отделять инструкции от контекста, а Gemini и Anthropic считают XML-подобные теги удобным способом такой структуры. Если задача простая, хватит и Markdown-заголовков.

Когда добавлять примеры в промпт?

Когда без примера возможны разные интерпретации. Особенно полезны примеры входа-выхода и крайние случаи, потому что они снижают число итераций и фиксируют желаемый паттерн кода.

Как понять, что промпт стал лучше?

Не по ощущению, а по проверке: закрепите версию модели, прогоните одинаковые тест-кейсы, сравните прохождение тестов, точность формата ответа и объём ручных исправлений. Именно такой подход поддерживают рекомендации про evals и validation.

Можно ли переносить один и тот же промпт между Copilot, GPT, Gemini и Claude?

Частично. Базовые принципы совпадают, но источники подчёркивают модельную и продуктовую специфику: у Copilot важен контекст текущего файла и истории, у Gemini и Claude полезны структурные теги, у OpenAI для стабильности важны pin model versions и evals.

Что важнее для автоматизации: красивый ответ или строгий формат?

Строгий формат. Для пайплайнов и скриптов лучше требовать машинно-проверяемый вывод, например JSON по схеме, потому что его можно валидировать автоматически и сравнивать между версиями промпта.

Шаги

HOW-TO
  1. Сформулируйте одну наблюдаемую задачу

    | Опишите один конкретный результат, который можно проверить: функцию, SQL-запрос, патч или тест. Не просите модель «сделать всё сразу».

  2. Отделите инструкции от контекста

    | Разнесите задачу, фон, ограничения и ожидаемый формат по отдельным блокам. Для этого подойдут XML-подобные теги или Markdown-заголовки.

  3. Зафиксируйте язык, стиль и формат вывода

    | Скажите, на каком языке нужен код, что именно возвращать и в каком порядке. Для некоторых задач полезны направляющие токены вроде import или SELECT.

  4. Добавьте пример и крайний случай

    | Покажите образец входа-выхода и хотя бы один спорный сценарий. Это снижает неоднозначность и помогает модели воспроизвести нужный паттерн.

  5. Ограничьте контекст и инструменты

    | Явно укажите, какой код и какие файлы считать источником правды, когда начинать новый тред и какие инструменты допустимы для поиска или вычислений.

  6. Попросите машинно-проверяемый вывод

    | Если результат пойдёт в автоматизацию, требуйте JSON по схеме или другой строгий формат. Это упростит валидацию и постобработку.

  7. Проверьте промпт тестами и закрепите версию модели

    | Запускайте один и тот же набор тест-кейсов на закреплённой версии модели и сравнивайте новые варианты промпта по прохождению тестов и формату ответа.

Источники

SOURCES

Вопросы и ответы

FAQ
Нужно ли всегда писать промпт для кода в XML-подобной структуре?

Нет. Но OpenAI рекомендует отделять инструкции от контекста, а Gemini и Anthropic считают XML-подобные теги удобным способом такой структуры. Для простых задач достаточно Markdown-заголовков или чётко разделённых блоков.

Когда добавлять примеры в промпт?

Когда задача допускает несколько интерпретаций. Примеры входа-выхода и крайние случаи особенно полезны для кода, потому что фиксируют желаемое поведение и сокращают число итераций.

Как понять, что промпт стал лучше?

Закрепите версию модели, прогоните одинаковые тест-кейсы и сравните прохождение тестов, точность формата ответа и объём ручных правок. Ориентируйтесь на evals и проверяемый результат, а не на субъективное впечатление.

Можно ли использовать один и тот же промпт в Copilot, GPT, Gemini и Claude?

Частично. Общие принципы совпадают, но официальные источники подчёркивают продуктовую специфику: у Copilot важен контекст файла и история чата, у Gemini и Claude полезны структурные теги, у OpenAI для стабильности важны pin model versions и evals.

Что важнее для автоматизации: красивый ответ или строгий формат?

Строгий формат. Для рабочих пайплайнов лучше требовать машинно-проверяемый вывод, например JSON по схеме, потому что его можно валидировать автоматически и сравнивать между версиями промпта.

Читайте также

LINKS