Ошибка 1 — слишком общие промпты без контекста
Тема 5/5: День 5. Главные ошибки новичков и следующий шаг → Урок 1/9
«Сделай красивый сайт» — после такого промпта новички жалуются, что Claude делает не то, что они хотели. Проблема не в Claude, проблема в промпте. В этом уроке — какие четыре элемента должны быть в каждом промпте, чтобы получить нужный результат с первой попытки.
Как выглядит плохой промпт
Типичный «лобовой» промпт новичка выглядит так:
Сделай мне красивый сайт для моего бизнеса.
Проблема в том, что почти на каждое слово этого промпта у Claude нет ответа. Какой именно бизнес — парикмахерская и фитнес-клуб требуют совершенно разных сайтов. Кому его показывать — премиум-клиентам или массовому сегменту. Сколько страниц — одна или десять. Что вообще значит «красивый» — минимализм, богатый дизайн, игровой стиль. И какой результат измеряем — записи на услуги, заявки клиентов, оплаты. Ни на один из этих вопросов в промпте ответа нет, а Claude Code должен где-то их взять. Он угадает — и с большой вероятностью не так, как хотите вы. Дальше остаётся либо долго исправлять результат итерациями, либо переписать промпт заново.
Структура хорошего промпта — четыре блока
Хороший промпт собирается из четырёх блоков: контекст, цель, ограничения и критерии готовности. Разберём каждый на примере одного и того же сервиса.
Контекст
Сначала расскажите, кто вы, что за проект, что уже сделано и какие технологии используются. Это та рамка, внутри которой агент будет принимать решения.
Я делаю сервис «ИИ-генератор постов для Telegram». Стек: Next.js 16 + TypeScript + Tailwind v4 + shadcn/ui + Postgres + Prisma + Auth.js v5. Дизайн — тёмная тема, бирюзовый акцент. На сайте уже есть: главная (src/app/page.tsx), страница тарифов (src/app/pricing/page.tsx), регистрация через magic-link (Auth.js v5).
Цель
Дальше — что конкретно должно появиться после этой задачи: что увидит пользователь и что он сможет сделать.
Цель: добавить страницу /dashboard для авторизованных пользователей. На странице — форма с тремя полями (тема, стиль, количество постов 1-10). После сабмита — спиннер, потом 10 карточек с сгенерированными постами и кнопкой «Скопировать» под каждой.
Ограничения
Затем — что делать нельзя и где проходят границы. Без этого блока агент свободно выберет любое решение, которое кажется ему разумным, и оно может разойтись с тем, как устроен остальной проект.
Ограничения:
- Не использовать внешние UI-библиотеки кроме shadcn/ui
- Стиль такой же как на main/pricing — тёмная тема, скруглённые элементы, отступы как в существующих компонентах
- Тексты на русском
- Адаптив для mobile (карточки в 1 колонку, на десктоп в 2)
- Не добавлять статусы загрузки сверх того что нужно (только спиннер во время генерации)
- Не использовать localStorage для хранения постов
Критерии готовности
И наконец — когда считать, что задача решена. Это превращает расплывчатое «сделай» в проверяемый результат, по которому и вы, и агент понимаете, что работа закончена.
Готово когда:
- Страница /dashboard открывается у авторизованного пользователя
- Не авторизованного — редиректит на /login
- Форма валидируется (тема — обязательно, количество — 1-10)
- При клике «Сгенерировать» — спиннер, потом результаты
- При ошибке — toast с понятным сообщением
- npm run build проходит без ошибок
- npm run lint без warning-ов
Полный пример хорошего промпта
Если сложить все четыре блока вместе, получается такой промпт:
Я делаю сервис «ИИ-генератор постов для Telegram». Стек: Next.js 16 + TypeScript + Tailwind v4 + shadcn/ui + Postgres + Prisma + Auth.js v5. Дизайн — тёмная тема, бирюзовый акцент. На сайте уже есть: главная, тарифы, регистрация через magic-link.
Цель: добавить страницу /dashboard. Форма с полями «Тема» (textarea), «Стиль» (select: экспертный/лёгкий/продающий), «Количество» (1-10). После сабмита — спиннер, потом 10 карточек с постами и кнопкой «Скопировать».
Ограничения:
- Только shadcn/ui
- Стиль такой же как на main/pricing
- Тексты на русском
- Адаптив: mobile 1 колонка, десктоп 2
- Не использовать localStorage
Готово когда:
- /dashboard работает для авторизованных, для неавторизованных редирект на /login
- Форма валидируется (тема обязательно, количество 1-10)
- При ошибке — toast
- npm run build проходит
- npm run lint без warning-ов
По такому промпту Claude Code с первого раза выдаёт основную массу того, что нужно, и остаётся лишь доработать мелочи. Разница с «лобовым» вариантом в том, что агенту больше не нужно ничего угадывать — все решения вы приняли за него заранее.
Промпт-шаблон в CLAUDE.md
Писать блок контекста заново перед каждой задачей утомительно и бессмысленно. Поэтому контекст хранят в файле CLAUDE.md в корне проекта — Claude Code читает его автоматически перед каждой задачей.
# ИИ-генератор постов — Project Context
## Стек
Next.js 16 + TypeScript + Tailwind v4 + shadcn/ui + Postgres + Prisma + Auth.js v5 + OpenRouter
## Структура
src/app — страницы
src/components — UI
src/lib — утилиты
src/lib/auth — Auth.js v5 конфиг
src/lib/db — Prisma client
## Стиль
Тёмная тема, бирюзовый акцент. Тексты на русском.
Адаптив: mobile 1 колонка, планшет 2, десктоп 3.
## Конвенции
Компоненты — PascalCase
Только Tailwind, не CSS-модули
Только shadcn/ui для UI
## Проверки перед коммитом
npm run build && npm run lint
С таким файлом промпт сводится к одной-двум строкам вроде «добавь страницу /dashboard с формой и результатами» — весь контекст подтянется сам.
Когда лобовой промпт всё-таки работает
Из правила есть важное исключение — исследовательские задачи без чёткого результата. Когда вы просите агента посмотреть проект и предложить, как улучшить производительность, или найти возможные ошибки в обработке платежей, или предложить варианты структуры базы данных, общий промпт оказывается плюсом, а не недостатком. Здесь вы ищете не готовый результат, а идеи, и намеренно оставляете агенту простор. А дальше из его ответов выбираете, что углубить, — уже точным, структурированным промптом.
Что в следующем уроке
Промпт — это вход. Следующая по частоте ошибка — отсутствие CLAUDE.md, из-за которого агент каждый раз «забывает» контекст. На следующем уроке разберём, как настроить CLAUDE.md правильно.