Разница между AI-ассистентом, генерирующим посредственный бойлерплейт, и тем, что пишет production-качественный код в точном соответствии с вашим стилем и ограничениями, часто сводится к одному фактору: как вы его промптите.
Prompt engineering для программирования — это не магические слова и трюки. Это предоставление AI-ассистенту точного контекста, чётких ограничений и структурированного формата ответа. В этом руководстве мы рассмотрим ключевые техники — системные промпты, ролевые промпты, chain-of-thought, few-shot примеры — и покажем, как закрепить их постоянно в рабочем процессе через файлы .cursorrules и CLAUDE.md. Готовые шаблоны промптов вы найдёте в библиотеке промптов Mindaxis и библиотеке правил.
Почему большинство промптов для кода не работают
Большинство разработчиков пишут промпты так же, как поисковые запросы: короткие, перегруженные ключевыми словами, без контекста. Это работало для поисковых систем. Но не для генерации кода, где AI нужно знать версию языка, фреймворк, стайл-гайд, паттерны обработки ошибок и существующие абстракции.
Типичный неработающий промпт:
write a function to parse user input
И вот как выглядит эффективный промпт для той же задачи:
I'm building a CLI tool in Python 3.12 using the 'click' library.
Write a function parse_user_filters(raw: str) -> list[FilterSpec] that:
- Parses a comma-separated string of key:value pairs (e.g., "status:active,role:admin")
- Returns a list of FilterSpec dataclasses (defined below)
- Raises click.BadParameter with a helpful message on malformed input
- Handles whitespace around separators
- Is fully type-annotated
FilterSpec definition:
@dataclass
class FilterSpec:
key: str
value: str
Include a docstring and at least three pytest parametrize test cases covering
the happy path, whitespace handling, and malformed input.
Второй промпт с первой попытки дал рабочий, протестированный, аннотированный типами код. Первый потребовал трёх раундов правок. Паттерны, которые их разделяют, и являются предметом этого руководства.
Техника 1: Системные промпты — задай контекст один раз
Системный промпт — это постоянный контекст, который определяет фрейм каждого взаимодействия в сессии. Для программирования он описывает ваш технологический стек, предпочтения стиля, ограничения проекта и ожидаемый формат вывода — чтобы вы не повторяли это в каждом сообщении.
Большинство AI-инструментов для кода позволяют настроить системный промпт. В Claude Code он живёт в файле CLAUDE.md. В Cursor — в файле .cursorrules. В ChatGPT — в Custom Instructions.
Плохой системный промпт (слишком расплывчатый):
You are a helpful coding assistant. Write clean code.
Хороший системный промпт:
You are a senior Python engineer working on a FastAPI web service targeting Python 3.12.
Stack: FastAPI, SQLAlchemy 2.0 (async), PostgreSQL, Pydantic v2, pytest, Alembic.
Code style rules:
- Use async/await throughout; no synchronous database calls
- All functions must have full type annotations
- Raise HTTPException for API errors, never return error dicts
- Use Pydantic models for all request/response shapes
When writing tests:
- Use pytest fixtures, not setUp/tearDown
- Parametrize edge cases with @pytest.mark.parametrize
When you're unsure about requirements, ask one clarifying question before writing code.
Хорошо написанный системный промпт устраняет самые частые правки. Вы перестаёте десять раз в день говорить "не используй синхронный SQLAlchemy" — AI уже знает.
Техника 2: Ролевые промпты — вызови нужную персону
Ролевые промпты назначают AI-ассистенту экспертную идентичность, что последовательно улучшает качество вывода для специализированных задач. Механизм прост: языковые модели, обученные на человеческом тексте, видели экспертные тексты, связанные с определёнными ролями. Вызов этих ролей делает экспертные паттерны более вероятными в ответе.
Ключ — сделать роль конкретной и релевантной, а не обобщённой:
- Слабо: "Ты опытный программист."
- Сильно: "Ты Go-инженер по производительности, работавший над высоконагруженными gRPC-сервисами. Тебя глубоко заботят аллокации памяти, goroutine safety и оптимизация на основе бенчмарков."
- Слабо: "Ты эксперт по безопасности."
- Сильно: "Ты инженер по безопасности приложений, специализирующийся на OWASP Top 10 для Web API. Ты мыслишь threat models и проверяешь код на инъекции, обход аутентификации и небезопасную десериализацию."
Техника 3: Chain-of-Thought — заставь AI рассуждать перед кодом
Chain-of-thought (CoT) промптинг просит AI продумать задачу пошагово, прежде чем дать финальный ответ. Для сложных задач это драматически снижает количество ошибок, потому что AI раскрывает свои предположения и рассуждения, давая вам шанс выявить недопонимание до того, как оно закодируется в 100 строчках кода.
Как активировать:
- "Before writing any code, outline your approach in plain English."
- "Think step by step. First, identify the edge cases. Then describe the algorithm. Then write the implementation."
- "Reason through the type design before writing any functions."
Без CoT:
Write a function that detects circular imports in a Python package.
Результат: код сразу, но может иметь дефектный обход графа, упускающий некоторые циклы.
С CoT:
I need a function to detect circular imports in a Python package.
Before writing code, think through:
1. What data structure best represents the import graph?
2. What algorithm detects cycles in that structure?
3. What edge cases could cause false positives or missed cycles?
4. What should the function return to be maximally useful to the caller?
Then implement the function.
Результат: рассуждение AI часто выявляет, что DFS с множеством "currently in stack" надёжнее простого visited-set DFS для этой задачи — неочевидное различие, предотвращающее тонкие баги.
Техника 4: Few-Shot примеры — показывай, а не только описывай
Few-shot промптинг предоставляет 2-3 примера желаемого паттерна вход-выход перед запросом реального вывода. Для программирования это самый надёжный способ соблюсти точные стилистические или структурные требования, которые сложно описать словами.
Используйте, когда:
- Нужно, чтобы код точно соответствовал соглашениям существующей кодовой базы
- Формат вывода сложный (например, специфическая JSON-схема, конкретная структура тестов)
- Вы хотите, чтобы AI следовал паттерну, у которого нет общеизвестного названия
Пример — принуждение к конкретному паттерну обработки ошибок:
Here are two examples of how we handle errors in this codebase:
Example 1:
def get_user(user_id: int) -> Result[User, UserNotFoundError]:
user = db.query(User).filter(User.id == user_id).first()
if user is None:
return Err(UserNotFoundError(f"User {user_id} not found"))
return Ok(user)
Following this exact pattern, write a function
charge_subscription(subscription_id: int, amount: Decimal) -> Result[Payment, PaymentError].
Без few-shot примеров AI, скорее всего, использует исключения или вернёт None. С ними он точно воспроизводит ваш паттерн Result monad.
Техника 5: Запросы структурированного вывода
Указание AI точно, какие разделы нужны в ответе, устраняет вариативность в том, что вы получаете. Особенно полезно, когда нужны и код, и объяснение.
Шаблон:
Provide your response in these sections:
## Approach
One paragraph explaining the strategy and key design decisions.
## Implementation
The complete, runnable code with all imports.
## Tests
Pytest tests covering the main cases.
## Caveats
Any limitations or things to watch out for.
Постоянные промпты: .cursorrules и CLAUDE.md
Печатать хорошие промпты в каждой сессии лучше, чем плохие. Но лучший результат — не печатать их вообще. Cursor и Claude Code поддерживают файлы уровня проекта, которые автоматически внедряют ваши инструкции в каждый разговор.
.cursorrules
Файл .cursorrules лежит в корне проекта и автоматически загружается Cursor как системный промпт для этого проекта. Он коммитится в систему контроля версий, так что вся команда работает с одной AI-конфигурацией.
Эффективный .cursorrules охватывает: технологический стек и версии, предпочтения стиля кода, требования к тестированию, соглашения об организации файлов и явные запреты (например, "никогда не добавляй console.log", "никогда не используй var").
В библиотеке правил Mindaxis вы найдёте готовые rules-файлы от сообщества и сможете экспортировать их в проект одним кликом.
CLAUDE.md
CLAUDE.md выполняет ту же функцию для Claude Code. Когда Claude Code начинает сессию в директории с файлом CLAUDE.md, он читает его и использует как постоянный контекст для всей сессии.
Хорошо структурированный CLAUDE.md обычно содержит: обзор проекта, архитектурное резюме, ключевые команды и соглашения. Главная сила CLAUDE.md — он накапливается со временем. Каждый раз, когда AI делает ошибку, которую вы исправляете, добавляйте правило в CLAUDE.md, чтобы эта ошибка больше не повторялась.
Примеры до/после: переписывание реальных промптов
Случай 1: Рефакторинг
До:
refactor this function to be cleaner
После:
Refactor the following function. Goals:
1. Reduce cyclomatic complexity (currently 8, target ≤ 4)
2. Extract the validation logic into a separate private function
3. Replace the nested if/else with early returns
4. Keep the public API identical (same signature, same return type)
[function here]
Случай 2: Code Review
До:
review this code
После:
Review this Python function for:
1. Security: SQL injection, path traversal, input validation issues
2. Performance: N+1 queries, missing indexes, O(n²) operations
3. Error handling: unhandled exceptions or resource leaks
4. Type safety: missing annotations or incorrect types
For each issue: (a) description, (b) why it's a problem, (c) corrected code snippet.
Skip style feedback.
[code here]
Случай 3: Генерация тестов
До:
write tests for this
После:
Write pytest tests for the function below. Requirements:
- Use @pytest.mark.parametrize for input variations
- Cover: happy path (3 variants), empty input, None input, boundary values
- Mock external HTTP calls with pytest-mock
- Each test must have a docstring explaining what it verifies
- Target: 90%+ branch coverage
[function here]
Итог
Эффективные AI-промпты для программирования имеют пять характеристик: точный технический контекст, конкретный формат вывода, chain-of-thought для сложных задач, few-shot примеры там, где важен стиль, и инвестиции в постоянный контекст через системные промпты и файлы проекта.
Начните с создания .cursorrules или CLAUDE.md для вашего проекта сегодня — даже версия на 20 строк, отражающая ваш стек и три ключевых соглашения, заметно улучшит каждое AI-взаимодействие в проекте. Затем итерируйте: каждый раз, когда вы исправляете AI, добавляйте правило в файл, чтобы больше никогда не исправлять его в этом.
Используйте библиотеку промптов и правила Mindaxis как отправную точку — это сэкономит часы на создание конфигурации с нуля.
