Menu

Промпты для программирования: рабочий код от ИИ

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

Каждый промпт на этой странице можно изменить и открыть в ChatGPT, Claude или другом ИИ-приложении.

Промпт для кода: это техзадание. Модель не видела вашего проекта, не знает, какую версию языка вы используете, и не может спросить, что должно происходить при пустом входе. Всё, что промпт не сказал, она заполняет самым распространённым вариантом из данных обучения, а самый распространённый вариант часто не ваш. Промпты ниже оставляют модели меньше поводов угадывать.

Сначала техзадание, потом код

Блок ниже просит небольшую функцию на Python. Каждая часть промпта отвечает на вопрос, на который иначе ответила бы за вас модель. Отключайте части по одной и представляйте ответ без них: без ограничений вы можете получить стороннюю библиотеку, без контекста модели придётся угадывать, что считать корректным входом, без формата вы можете остаться без тестов.

Функция по техзаданию
Fill in
Parts
Ты аккуратный Python-разработчик, который пишет небольшие протестированные функции.
Напиши функцию `parse_duration(text)`, которая превращает строку с длительностью в число секунд.
Корректные входы выглядят как "1h30m", "45m", "2h" и "90s": часы, минуты и секунды, каждая часть необязательна, порядок всегда такой. "1h30m" возвращает 5400. Всё остальное, включая пустую строку, некорректно.
Python 3.11, только стандартная библиотека. Для некорректного входа выбрасывай ValueError, указав вход в сообщении. Не принимай дробные значения вроде "1.5h".
Сначала функция, затем тесты pytest, покрывающие все примеры выше плюс три некорректных входа. Никаких объяснений, кроме одного предложения.
Try it
Example replyReplies vary between models and runs.

Функция сопоставляет три необязательные части по порядку и отвергает совпадение, в котором все три пустые.

import re

_PATTERN = re.compile(r"(?:(\d+)h)?(?:(\d+)m)?(?:(\d+)s)?")

def parse_duration(text: str) -> int:
    match = _PATTERN.fullmatch(text)
    if not match or not any(match.groups()):
        raise ValueError(f"invalid duration: {text!r}")
    hours, minutes, seconds = (int(g) if g else 0 for g in match.groups())
    return hours * 3600 + minutes * 60 + seconds
import pytest
from duration import parse_duration

@pytest.mark.parametrize("text, expected", [
    ("1h30m", 5400), ("45m", 2700), ("2h", 7200), ("90s", 90),
])
def test_valid(text, expected):
    assert parse_duration(text) == expected

@pytest.mark.parametrize("text", ["", "1m1h", "1.5h"])
def test_invalid(text):
    with pytest.raises(ValueError):
        parse_duration(text)

Основную работу в этом промпте делают четыре детали:

  • Примеры с ответами. «1h30m возвращает 5400»: это тест, по которому модель может проверить свой код, и он снимает любые сомнения насчёт единиц.
  • Версия языка и разрешённые библиотеки. Без них вы можете получить библиотеку, которая у вас не установлена, или синтаксис новее вашего интерпретатора.
  • Что считать некорректным и что тогда делать. Обработку ошибок модели легко пропустить, когда о ней никто не просит.
  • Тесты в ответе. Они превращают «выглядит правильно» в то, что можно запустить. Если тест падает, вы вставляете ошибку обратно, и это гораздо лучшее продолжение, чем «не работает».

Проверка any(match.groups()) тоже заслуживает внимания: сам шаблон совпадает с пустой строкой, потому что все части необязательны. Именно строка промпта про пустую строку заставляет этот случай появиться и в коде, и в тестах.

Называйте версию, стек и то, что уже есть

Модели тяготеют к стилю, который чаще всего встречался в данных обучения. Для JavaScript это может означать CommonJS require в проекте на ES-модулях, для Python: API библиотеки, который с тех пор изменился (частый случай: Pydantic 1 против 2), а для любого быстро меняющегося фреймворка: паттерн двухверсионной давности. Обычно помогает одна строка: «Node 22, ES-модули, без TypeScript» или «React 19, функциональные компоненты, обычные CSS-модули».

Когда вы дописываете существующий проект, модели нужно видеть части, которых коснётся новый код. Вставьте сигнатуру функции, которую нужно вызывать, форму данных, которые придут на вход, и один существующий файл, показывающий ваши соглашения. «Используй хелпер db.query(sql, params) из файла ниже» даёт код, который вписывается; без этого вы можете получить новое подключение к базе, написанное с нуля. Не вставляйте файлы, не имеющие отношения к изменению, потому что каждую лишнюю строку модель может попытаться переиспользовать.

Просите по одному небольшому шагу

Самая частая ошибка в «вайб-кодинге», создании приложения через его описание ИИ: просить всё приложение сразу. Модели приходится выбрать фреймворк, базу данных, структуру папок и десяток функций в одном ответе, а в одном ответе редко помещается рабочий код для всего этого, поэтому часто возвращается набросок. Сравните две вкладки.

Сделай мне приложение со списком дел: аккаунты пользователей, база данных, напоминания и тёмная тема.
Try it
Example replyReplies vary between models and runs.

Вот полноценное приложение со списком дел на React, Node.js с Express и MongoDB.

Структура проекта

todo-app/
  client/   (фронтенд на React)
  server/   (API на Express, авторизация, напоминания)

server/index.js

const express = require("express");
const mongoose = require("mongoose");
const app = express();
app.use(express.json());
// ... auth routes, todo routes and the reminder scheduler go here

Для авторизации можно добавить JWT через jsonwebtoken, а для напоминаний планировщик вроде node-cron. Скажите, если хотите, чтобы я заполнил какую-то из этих частей.

Первый ответ не ошибочен, но это скелет: он выбрал за вас три технологии и оставил настоящую работу в комментариях. Второй ответ достаточно короткий, чтобы его прочитать, работает сразу, как только вы откроете файл, и даёт рабочую основу для шага 2 («теперь сохраняй список в localStorage, чтобы он переживал перезагрузку»). Каждый шаг настолько мал, что когда что-то ломается, вы знаете, какое изменение это сломало.

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

Просите план перед большим изменением

Для всего, что больше одной функции, просите сначала план, а потом код: «Перечисли файлы, которые ты бы изменил, и что делает каждое изменение. Код пока не пиши». План быстро прочитать и быстро поправить. Если он предлагает новую зависимость, которая вам не нужна, или пропускает файл, который точно затронут, вы исправляете это одним предложением, а не обнаруживаете где-то в трёхстах строках кода.

Проверяйте то, что пришло

Сгенерированный код ломается несколькими предсказуемыми способами, и для каждого есть привычка в промпте, которая это ловит:

  • Выдуманные API. Модель может вызвать функцию или импортировать пакет, которых не существует, потому что название звучит правдоподобно. Проверяйте незнакомые импорты, прежде чем их устанавливать; почему так происходит, объясняет страница галлюцинации ИИ.
  • Молчаливые крайние случаи. Код, который работает в счастливом сценарии и падает на пустом списке. Перечислить крайние случаи в промпте и попросить тесты: самое дешёвое решение.
  • Тихие изменения. Когда вы просите исправление в длинном файле, модель может заодно переименовать что-то или перестроить код, о котором вы не просили. Добавьте «меняй только необходимое и перечисли все изменения, которые ты сделал».

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

Часто задаваемые вопросы

Какой промпт лучше всего подходит для программирования с ChatGPT или Claude?

Единственного волшебного промпта нет. Работающие промпты читаются как короткое техзадание: язык и версия, что код получает и возвращает, два-три примера входных данных с результатами, крайние случаи и всё, чего код использовать не должен. Если закончить фразой «ещё напиши тесты для этих случаев», у вас будет способ проверить ответ, а не верить ему на слово.

Что такое промпты для вайб-кодинга?

«Вайб-кодинг» (vibe coding): это создание программ в основном через описание желаемого ИИ и принятие написанного им кода, часто без внимательного чтения. Проект на вайб-кодинге держится на маленьких промптах: одна функция за запрос, ясное описание того, что уже есть, и просьба запустить или протестировать результат, прежде чем идти дальше. Большие запросы «всё и сразу»: то место, где такие проекты обычно ломаются.

Нужно ли говорить ИИ, какую версию языка использовать?

Да. Языки и библиотеки меняются от версии к версии, а модель иначе напишет в том стиле, который был чаще всего в её данных обучения, и он может оказаться старше вашей среды. Если назвать версию («Python 3.12», «React 19 с функциональными компонентами», «Node 22, ES-модули»), вы не получите ответ на API, которых у вас нет.

Можно ли доверять коду, написанному ИИ?

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

Почему код от ИИ ломается, когда проект растёт?

Модель видит только то, что есть в разговоре. Когда проект растёт, она перестаёт видеть файлы, которые ей не показали, и заполняет пробелы догадками об именах, структуре и прошлых решениях. Вставляйте нужные файлы, называйте соглашения, которым следует проект, и ограничивайте каждый запрос одним изменением.

Coddy programming languages illustration

Учитесь программировать с Coddy

НАЧАТЬ