Когда нейросеть вроде ChatGPT или Claude выдаёт нерабочий код с выдуманными библиотеками и несуществующими функциями, причина почти всегда кроется не в модели, а в расплывчатом запросе — промпт для написания кода требует той же точности, что и техническое задание для живого разработчика. Фраза «напиши скрипт для обработки файлов» не содержит ни языка, ни формата данных, ни ожидаемого результата, поэтому модель вынуждена додумывать контекст сама — и часто додумывает его неверно.
В этой статье разберём, из каких элементов состоит качественный промпт для генерации кода, как адаптировать запрос под разные задачи — от написания функции с нуля до отладки и рефакторинга — и какие ошибки чаще всего приводят к бесполезным ответам.
Что такое промпт для генерации кода и почему он решает всё
Промпт — это текстовый запрос, который вы отправляете языковой модели. В контексте программирования он выполняет роль технического задания: чем точнее сформулированы входные данные, ограничения и ожидаемый результат, тем выше шанс получить рабочий код с первой попытки.
Ключевое отличие кодового промпта от обычного вопроса — необходимость указывать контекст исполнения. Модель не видит ваш проект, не знает версии интерпретатора и не помнит, какие библиотеки у вас установлены. Всё это нужно передавать явно, иначе ответ будет синтаксически правильным, но практически бесполезным.
Хорошо составленный запрос экономит время дважды: сокращает число итераций уточнений и уменьшает объём ручной доработки полученного кода.
Структура эффективного промпта
Универсальная структура запроса на генерацию кода состоит из пяти блоков. Не обязательно использовать все в каждом запросе, но чем сложнее задача, тем больше блоков стоит заполнить.
- 🎯 Задача — что именно должен делать код, одним-двумя предложениями без воды.
- 🛠️ Стек и окружение — язык, версия, фреймворк, ключевые библиотеки.
- 📥 Входные данные — формат, примеры, граничные случаи.
- 📤 Ожидаемый результат — что функция возвращает, как выглядит вывод.
- 🚧 Ограничения — что нельзя использовать, требования к стилю, производительности.
Вот как выглядит запрос, собранный по этой схеме:
Напиши функцию на Python 3.11, которая читает CSV-файл
с колонками name, email, date и возвращает список словарей.
Пропускай строки с пустым email. Используй только стандартную
библиотеку (csv, без pandas). Добавь обработку FileNotFoundError.
Сравните с вариантом «напиши код для чтения CSV» — во втором случае модель сама решит, использовать ли pandas, как обрабатывать ошибки и что возвращать, и её выбор может не совпасть с вашими потребностями.
Промпты под разные задачи: генерация, отладка, рефакторинг
Тип задачи определяет, какие детали критичны в запросе. Для генерации нового кода важнее всего спецификация результата, для отладки — полный текст ошибки и воспроизводимый пример, для рефакторинга — критерии улучшения.
При отладке всегда вставляйте полный traceback и минимальный фрагмент кода, который его вызывает. Запрос «у меня не работает код» без текста ошибки заставляет модель гадать — и она начнёт перечислять все возможные причины вместо конкретной.
| Тип задачи | Что включить в промпт | Частая ошибка |
|---|---|---|
| Генерация функции | Сигнатура, вход/выход, ограничения | Не указана версия языка |
| Отладка | Код, полный traceback, шаги воспроизведения | Ошибка описана словами |
| Рефакторинг | Исходный код, критерии улучшения | Непонятно, что считать «лучше» |
| Написание тестов | Тестируемый код, фреймворк, граничные случаи | Не указан фреймворк тестов |
| Объяснение кода | Фрагмент кода, уровень подробности | Слишком большой листинг |
Для ревью и рефакторинга полезно явно просить не переписывать всё целиком, а указать проблемные места списком — так проще контролировать изменения и не сломать работающую логику.
Работа с контекстом и большими фрагментами кода
Языковые модели имеют ограниченное окно контекста, поэтому вставлять в запрос весь проект бессмысленно. Вам нужно выделить минимальный воспроизводимый пример: только те функции, классы и импорты, которые участвуют в задаче.
Если код зависит от внешних данных, опишите их структуру текстом или приведите короткий пример. Например, вместо пересылки всей базы данных достаточно указать: «таблица users с полями id, name, created_at».
⚠️ Внимание: не вставляйте в промпты пароли, API-ключи, токены и персональные данные пользователей. Запросы могут обрабатываться на сторонних серверах — заменяйте секреты на заглушки вроде API_KEY = "..." перед отправкой.
☑️ Проверка промпта перед отправкой
Типичные ошибки при составлении промптов
Первая и самая распространённая ошибка — отсутствие версии языка. Синтаксис и стандартная библиотека меняются между версиями: код для Python 2 и Python 3 несовместим, а фичи вроде match/case доступны только в свежих выпусках. Без явного указания модель выберет версию на свой вкус.
Вторая ошибка — смешивание нескольких задач в одном запросе. Просьба «напиши парсер, добавь логирование, покрой тестами и оптимизируй» почти гарантированно даст поверхностный результат по каждому пункту. Разбивайте работу на последовательные итерации.
- ❌ Расплывчатые формулировки: «сделай красиво», «оптимизируй», «улучши».
- ❌ Запрос без примера желаемого вывода — модель не знает, какой формат вам нужен.
- ❌ Ожидание, что модель помнит ваш предыдущий проект из другой сессии.
- ❌ Слепое копирование ответа без запуска и проверки.
Пример слабого и сильного промпта
Слабый: «Напиши API на питоне». Сильный: «Напиши REST-эндпоинт на FastAPI (Python 3.11): POST /users принимает JSON {name: str, age: int}, валидирует через Pydantic, возвращает созданный объект с id. При age < 0 возвращай 422. Добавь один тест через pytest с TestClient».
Проверка и итеративное улучшение ответа
Сгенерированный нейросетью код нельзя считать рабочим, пока он не запущен и не протестирован на реальных данных. Модели склонны уверенно выдумывать названия методов, параметры функций и даже целые библиотеки — это известное поведение, а не сбой конкретного сервиса.
Если первый ответ не подошёл, не начинайте диалог заново — уточняйте. Формулировки вроде «функция падает с TypeError на строке 12, вот traceback: ...» или «перепиши без рекурсии, используй итеративный подход» работают лучше, чем общее «не то, переделай».
⚠️ Внимание: код, работающий с файловой системой, сетью или базой данных, сначала тестируйте на копии данных или в изолированном окружении. Модель может не учесть побочные эффекты — например, перезапись файла или отсутствие отката транзакции.
Полезный приём — попросить модель самостоятельно найти слабые места в собственном решении: «проанализируй этот код на граничные случаи и потенциальные баги». Такой саморевью-шаг часто выявляет проблемы с пустыми входными данными, кодировками и обработкой исключений.
Готовые шаблоны промптов для разработчика
Ниже — базовые заготовки, которые можно адаптировать под свой стек. Квадратные скобки заменяйте своими данными.
Роль: ты senior-разработчик на [язык].
Задача: [что должен делать код].
Окружение: [версия языка, фреймворк, ОС].
Вход: [формат данных + пример].
Выход: [что возвращается + пример].
Ограничения: [запрещённые библиотеки, требования к стилю].
Формат ответа: код + краткое пояснение ключевых решений.
Для отладки шаблон короче, но требует точности в деталях:
Код ниже выдаёт ошибку. Найди причину и предложи исправление.
Код: [фрагмент]
Ошибка: [полный traceback]
Ожидалось: [что должно было произойти]
Версия: [язык и библиотеки]
⚠️ Внимание: не полагайтесь на нейросеть в вопросах безопасности — криптографию, аутентификацию и работу с платежами всегда сверяйте с официальной документацией библиотек и актуальными рекомендациями. Модель может предложить устаревший или уязвимый подход.
Частые вопросы
Какой длины должен быть промпт для написания кода?
Оптимум — столько, сколько нужно для однозначного понимания задачи. Для простой функции хватает 3–5 предложений, для сложного модуля — структурированное описание на 10–15 строк. Избыточный контекст вреден так же, как и недостаточный.
Можно ли писать промпт на русском, если код нужен на английском?
Да, современные модели одинаково понимают запросы на русском и английском, а код в любом случае генерируют с английскими идентификаторами. Пишите на том языке, на котором вам проще точно сформулировать задачу.
Почему нейросеть выдумывает несуществующие функции и библиотеки?
Модель предсказывает правдоподобный текст, а не выполняет код — она может скомбинировать название метода, который логично выглядел бы, но не существует. Проверяйте незнакомые функции по официальной документации и всегда запускайте полученный код.
Стоит ли указывать роль («ты senior-разработчик») в промпте?
Задание роли может слегка сместить стиль ответа в сторону более строгих решений, но оно не заменяет конкретики. Указание стека, версий и ограничений влияет на результат заметно сильнее, чем ролевая приставка.
Как заставить модель не переписывать весь код при правках?
Явно попросите показать только изменённые фрагменты или описать правки списком: «не выводи весь файл, укажи только строки, которые нужно заменить, и на что». Это экономит время и снижает риск потерять работающие части кода.