1. Золотое правило промптинга
Anthropic формулирует главный принцип так: «Be clear and direct» — будьте ясными и прямолинейными. Если вы не можете объяснить задачу коллеге за 30 секунд, значит промпт нуждается в переработке.
Тест «покажи коллеге»
Перед отправкой промпта в API задайте себе вопрос: «Если я покажу этот текст новому сотруднику, он поймёт задачу без дополнительных вопросов?» Если нет — промпт нужно дополнить. Это самый простой и действенный тест качества.
Ключевые принципы
- Конкретность: вместо «напиши хороший текст» укажите длину, тон, аудиторию, формат.
- Последовательность: разбейте сложную задачу на шаги. Claude лучше справляется с пошаговыми инструкциями.
- Контекст: дайте модели всю необходимую информацию. Claude не может догадаться о том, чего нет в промпте.
- Ограничения: явно укажите, чего делать не нужно. Например: «Не используй маркдаун. Не добавляй вступление.»
Плохой промпт:
Напиши статью про Python.
Хороший промпт:
Напиши статью на 1500 слов для начинающих разработчиков.
Тема: «5 библиотек Python для автоматизации рутинных задач».
Формат: введение (2-3 предложения), затем 5 разделов с заголовками H3.
Каждый раздел: описание библиотеки, пример кода в 5-10 строк, плюсы и минусы.
Тон: дружелюбный, без канцеляризмов.
Не используй маркдаун-разметку. Пиши чистым HTML.
2. XML-теги: структура промпта
XML-теги — фирменная техника Anthropic, которая радикально улучшает качество ответов Claude. Модель обучена распознавать XML-разметку и использовать её как семантические якоря. В отличие от GPT-моделей, Claude нативно понимает XML-теги и извлекает из них структуру задачи.
Основные теги
| Тег | Назначение | Когда использовать |
|---|---|---|
<instructions> | Основные инструкции для модели | Всегда — ядро любого промпта |
<context> | Фоновая информация, не требующая действий | Когда нужно задать контекст проекта или ситуации |
<examples> | Few-shot примеры ввода-вывода | Когда формат ответа критичен |
<document> | Внешние документы для анализа | RAG, суммаризация, Q&A по документам |
<output_format> | Описание желаемого формата ответа | Когда нужен JSON, таблица, определённая структура |
<thinking> | Пространство для рассуждений модели | Chain-of-thought задачи |
Полный реальный промпт с XML-тегами для бизнес-задачи
Допустим, вы строите систему классификации обращений клиентов в техподдержку. Вот как выглядит профессиональный промпт:
<instructions>
Ты — система классификации тикетов техподдержки.
Проанализируй обращение клиента и верни JSON с полями:
- category: одна из [billing, technical, account, feature_request, other]
- priority: одна из [low, medium, high, critical]
- sentiment: одна из [positive, neutral, negative, angry]
- summary: краткое описание проблемы в одном предложении на русском
- suggested_department: отдел, которому следует передать тикет
</instructions>
<context>
Компания: SaaS-платформа для управления проектами.
Продукт: облачное приложение с тарифами Free, Pro ($15/мес), Enterprise.
Частые проблемы: интеграции с Jira/Slack, проблемы с оплатой,
запросы на новые функции, баги в мобильном приложении.
</context>
<examples>
<example>
<input>Здравствуйте! Уже третий день не могу подключить интеграцию с Jira.
Пробовал переустановить, ничего не помогает. У нас Enterprise-тариф,
проект горит.</input>
<output>{
"category": "technical",
"priority": "high",
"sentiment": "negative",
"summary": "Клиент на Enterprise не может подключить интеграцию с Jira 3 дня",
"suggested_department": "integrations_team"
}</output>
</example>
<example>
<input>Было бы здорово, если бы вы добавили тёмную тему.
Работаю по ночам, глаза устают.</input>
<output>{
"category": "feature_request",
"priority": "low",
"sentiment": "positive",
"summary": "Запрос на добавление тёмной темы интерфейса",
"suggested_department": "product_team"
}</output>
</example>
</examples>
<output_format>
Верни ТОЛЬКО валидный JSON без пояснений, без маркдауна, без блоков кода.
</output_format>
<document>
{{TICKET_TEXT}}
</document>
Обратите внимание: каждый блок промпта семантически изолирован тегами. Claude точно понимает, где инструкции, где контекст, где примеры, а где входные данные. Это снижает вероятность «галлюцинаций» и повышает стабильность формата.
3. Системные промпты
Системный промпт (system prompt) — это специальное сообщение, которое задаёт модели глобальные правила поведения. Оно передаётся отдельно от пользовательского сообщения и имеет приоритет. Claude обучен следовать системным промптам как «конституции» разговора.
Когда использовать системный промпт
- Задание роли и тональности для всего диалога
- Ограничения: язык ответа, запрещённые темы, формат
- Инструкции по безопасности и compliance
- Описание инструментов и API, которые доступны модели
Пример: настройка через API (Python)
import anthropic
client = anthropic.Anthropic() # ANTHROPIC_API_KEY из переменных окружения
response = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
system="""Ты - старший финансовый аналитик в инвестиционной компании.
Правила:
1. Отвечай только на вопросы о финансах, инвестициях и экономике.
2. На любые другие темы отвечай: «Я специализируюсь только на финансовых вопросах».
3. Все цифры приводи с источниками. Если источника нет — предупреждай.
4. Формат ответа: структурированный текст с подзаголовками.
5. Язык: русский.""",
messages=[
{
"role": "user",
"content": "Стоит ли сейчас инвестировать в облигации федерального займа?"
}
]
)
print(response.content[0].text)
Системный промпт поддерживается во всех моделях Claude (Haiku, Sonnet, Opus) и во всех интерфейсах: API, Amazon Bedrock, Google Vertex AI. В веб-интерфейсе claude.ai системный промпт задаётся через «Projects» или «Custom Instructions».
4. Few-shot примеры
Few-shot prompting — техника, при которой вы показываете модели несколько примеров «вход → выход» прямо в промпте. Anthropic рекомендует давать 3-5 примеров для стабильного результата. Меньше — модель может не уловить паттерн. Больше — вы тратите контекстное окно без заметного улучшения качества.
Правила оформления few-shot примеров
- Оборачивайте в
<example>теги: Claude обучен распознавать эту разметку. - Покрывайте краевые случаи: если в данных могут быть аномалии, покажите пример с аномалией.
- Разнообразьте: не давайте 5 одинаковых примеров. Покажите разные категории, длины, форматы.
- Порядок имеет значение: последний пример оказывает наибольшее влияние на ответ.
<examples>
<example>
<input>Отзыв: «Курс отличный, но слишком короткий. Хотелось бы больше практики.»</input>
<output>{"sentiment": "mixed", "score": 3.5, "themes": ["качество", "длительность", "практика"]}</output>
</example>
<example>
<input>Отзыв: «Полная ерунда. Потратил деньги зря. Поддержка не отвечает.»</input>
<output>{"sentiment": "negative", "score": 1.0, "themes": ["качество", "стоимость", "поддержка"]}</output>
</example>
<example>
<input>Отзыв: «Лучший курс по Python, что я проходил! Преподаватель объясняет
просто и понятно. Рекомендую всем.»</input>
<output>{"sentiment": "positive", "score": 5.0, "themes": ["качество", "преподаватель", "рекомендация"]}</output>
</example>
<example>
<input>Отзыв: «Нормально»</input>
<output>{"sentiment": "neutral", "score": 3.0, "themes": ["общее впечатление"]}</output>
</example>
</examples>
Обратите внимание: четвёртый пример — краевой случай (минимальный отзыв из одного слова). Это учит модель обрабатывать нестандартные входные данные.
5. Role prompting
Role prompting — назначение модели конкретной роли через системный промпт. Это не просто «представь, что ты...» — роль задаёт экспертизу, тональность и рамки ответа. Anthropic рекомендует задавать роль в самом начале системного промпта.
Эффективный пример role prompting
system_prompt = """Ты — Мария, senior code reviewer в команде backend-разработки.
Стаж: 12 лет. Специализация: Python, FastAPI, PostgreSQL, Redis.
Как ты ведёшь код-ревью:
- Начинаешь с общей оценки: архитектура, читаемость, производительность (1-10).
- Затем построчные комментарии к проблемным местам.
- Для каждого замечания указываешь severity: critical / warning / suggestion.
- Всегда предлагаешь конкретный исправленный код, а не абстрактные советы.
- Завершаешь кратким резюме: что хорошо, что исправить, общий вердикт (approve / request changes).
Тон: профессиональный, но дружелюбный. Без снисходительности.
Язык: русский для комментариев, английский для кода."""
Такой промпт превращает Claude в предсказуемого «виртуального коллегу» с фиксированными стандартами. Каждый ответ будет следовать одной структуре, что критично для автоматизированных пайплайнов.
6. Long context prompting
Claude поддерживает контекстное окно до 200 000 токенов (около 150 000 слов). Но длинный контекст требует правильной организации — иначе модель «теряется» в тексте.
Три правила работы с длинным контекстом
- Документы — в начало, вопросы — в конец. Исследования Anthropic показывают, что размещение запроса после документов улучшает качество ответов на 30% по сравнению с обратным порядком. Модель сначала «впитывает» контекст, а затем фокусируется на задаче.
- Используйте теги
<document>с метаданными. Каждый документ оборачивайте тегами и добавляйте атрибуты: источник, дату, тип. - Нумеруйте документы. Это позволяет ссылаться на конкретный источник в запросе.
Шаблон для RAG-системы
<documents>
<document index="1">
<source>Внутренняя база знаний / Политика возврата товаров</source>
<date>2025-01-15</date>
<content>
Возврат товара возможен в течение 14 дней с момента получения.
Товар должен быть в оригинальной упаковке, без следов использования.
Возврат электроники — только при заводском браке (экспертиза 3-5 дней).
Денежные средства возвращаются в течение 10 рабочих дней.
</content>
</document>
<document index="2">
<source>FAQ / Частые вопросы по доставке</source>
<date>2025-03-01</date>
<content>
Доставка по Москве: 1-2 дня, бесплатно от 5000 руб.
Доставка по России: 3-7 дней, стоимость зависит от региона.
Самовывоз: доступен из 15 пунктов в Москве и 8 в Санкт-Петербурге.
</content>
</document>
</documents>
<instructions>
На основе документов выше ответь на вопрос клиента.
Ссылайся на конкретные документы по номеру.
Если информации нет в документах — скажи об этом честно.
</instructions>
Вопрос клиента: «Купил наушники 10 дней назад, один наушник перестал работать.
Могу ли вернуть? И сколько ждать денег?»
Claude ответит, сославшись на документ 1 (возврат электроники при браке, экспертиза 3-5 дней, возврат денег до 10 рабочих дней). Структурированная разметка исключает путаницу между источниками.
7. Extended Thinking
Extended Thinking — функция адаптивного мышления, доступная в Claude Opus 4.7 и новее. Когда она включена, модель рассуждает перед тем, как дать финальный ответ. Рассуждения видны в поле thinking ответа API, но не включаются в основной текст.
Параметр effort
Вместо фиксированного бюджета токенов Anthropic ввела параметр effort, который управляет глубиной размышлений:
| Уровень | Когда использовать | Типичные задачи |
|---|---|---|
low | Простые задачи, где скорость важнее | Классификация, форматирование, простой перевод |
medium | Задачи средней сложности | Суммаризация, рерайт, ответы на вопросы |
high | Сложные задачи, требующие анализа | Код-ревью, анализ данных, планирование |
xhigh | Глубокий анализ с несколькими шагами | Математические доказательства, сложный дебаг |
max | Максимальная глубина рассуждений | Исследовательские задачи, стратегическое планирование |
Пример вызова с Extended Thinking
import anthropic
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-opus-4-7-20250415",
max_tokens=8000,
thinking={
"type": "enabled",
"effort": "high" # low | medium | high | xhigh | max
},
messages=[
{
"role": "user",
"content": """Проанализируй следующий SQL-запрос.
Найди все проблемы с производительностью и предложи оптимизации.
SELECT u.*, o.*, p.*
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
LEFT JOIN products p ON o.product_id = p.id
WHERE u.created_at > '2024-01-01'
AND o.status IN ('pending', 'processing')
ORDER BY o.created_at DESC;"""
}
]
)
# Доступ к рассуждениям модели
for block in response.content:
if block.type == "thinking":
print("=== Рассуждения ===")
print(block.thinking)
elif block.type == "text":
print("=== Ответ ===")
print(block.text)
Когда НЕ нужен Extended Thinking: простые задачи (классификация, форматирование), ситуации, где важна скорость ответа и низкая стоимость. Для таких случаев лучше использовать Sonnet или Haiku без Extended Thinking.
8. Параллельный вызов инструментов
Claude поддерживает параллельный вызов инструментов (parallel tool use) — модель может запросить выполнение нескольких инструментов одновременно в одном ответе. Это критично для агентских систем, где нужно собрать данные из нескольких источников параллельно.
Пример промпта для параллельного вызова
import anthropic
import json
client = anthropic.Anthropic()
tools = [
{
"name": "get_weather",
"description": "Получает текущую погоду для указанного города",
"input_schema": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "Название города"}
},
"required": ["city"]
}
},
{
"name": "get_exchange_rate",
"description": "Получает текущий курс валют",
"input_schema": {
"type": "object",
"properties": {
"from_currency": {"type": "string"},
"to_currency": {"type": "string"}
},
"required": ["from_currency", "to_currency"]
}
},
{
"name": "search_flights",
"description": "Ищет авиабилеты",
"input_schema": {
"type": "object",
"properties": {
"origin": {"type": "string"},
"destination": {"type": "string"},
"date": {"type": "string", "description": "Дата в формате YYYY-MM-DD"}
},
"required": ["origin", "destination", "date"]
}
}
]
response = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
tools=tools,
messages=[
{
"role": "user",
"content": "Планирую поездку из Москвы в Стамбул 15 июля. "
"Какая там погода? Какой курс лиры к рублю? "
"И есть ли билеты?"
}
]
)
# Claude вернёт несколько tool_use блоков в ОДНОМ ответе:
for block in response.content:
if block.type == "tool_use":
print(f"Инструмент: {block.name}")
print(f"Параметры: {json.dumps(block.input, ensure_ascii=False)}")
print("---")
Claude самостоятельно определит, что для ответа на вопрос пользователя нужно вызвать все три инструмента сразу: погоду в Стамбуле, курс TRY→RUB и поиск билетов Москва→Стамбул на 15 июля. Это сокращает количество API-вызовов и общее время ответа.
Если вам нужно запретить параллельные вызовы (например, когда инструменты зависят друг от друга), добавьте в системный промпт: «Вызывай инструменты строго по одному, дожидаясь результата каждого перед следующим вызовом.»
9. Контроль формата вывода
По умолчанию Claude отвечает в формате Markdown. Для API-интеграций это часто неудобно. Вот проверенные техники контроля формата.
Способ 1: Прямое указание в инструкциях
Ответь строго в формате JSON. Никакого текста до или после JSON.
Не используй блоки кода (```). Только чистый JSON.
Способ 2: Тег <output_format>
<output_format>
Формат: JSON-объект.
Поля:
- "answer": строка с ответом
- "confidence": число от 0 до 1
- "sources": массив строк с источниками
Без маркдауна. Без пояснений. Только JSON.
</output_format>
Способ 3: Prefill — начало ответа за модель
Вы можете «начать» ответ за Claude, добавив сообщение с ролью assistant в конец:
messages = [
{"role": "user", "content": "Переведи на английский: 'Привет, мир!'"},
{"role": "assistant", "content": "{"} # Принуждаем начать с JSON
]
Claude продолжит с { и вернёт валидный JSON. Этот приём называется prefill и отлично работает для принудительного формата.
Минимизация маркдауна
Если вам нужен чистый текст без форматирования, добавьте в системный промпт:
Не используй Markdown-разметку: никаких #, *, `, ```, -, >.
Пиши чистым текстом. Для структуры используй нумерацию (1. 2. 3.)
и отступы.
10. Практические задания
Закрепите знания на реальных задачах. Каждое задание можно выполнить в Anthropic Console или через API.
Задание 1: Классификатор с XML-тегами
Напишите промпт с тегами <instructions>, <examples> и <output_format>, который классифицирует отзывы на онлайн-курсы по трём параметрам: sentiment (positive/negative/mixed), тема (контент/преподаватель/платформа/цена), и рейтинг (1-5). Дайте 4 few-shot примера, включая краевой случай (пустой отзыв).
Задание 2: Системный промпт для чат-бота
Создайте системный промпт для чат-бота техподдержки онлайн-школы. Бот должен: отвечать только на вопросы о платформе, отказываться обсуждать конкурентов, при невозможности помочь — предлагать связаться с оператором. Протестируйте на 5 разных вопросах, включая попытки «взлома» промпта (prompt injection).
Задание 3: RAG с длинным контекстом
Возьмите 3 реальных документа (например, условия использования трёх сервисов). Оберните их в теги <document> с метаданными. Задайте вопрос, ответ на который требует сопоставления информации из всех трёх документов. Убедитесь, что Claude ссылается на номера документов.
Задание 4: Extended Thinking для анализа кода
Напишите Python-функцию с 3 намеренными багами (off-by-one ошибка, SQL-инъекция, утечка памяти). Отправьте её в Claude Opus 4.7 с Extended Thinking (effort: "high"). Сравните качество ответа с effort: "low". Задокументируйте разницу.
Задание 5: Параллельные инструменты
Реализуйте мини-агента с тремя инструментами: get_user_info, get_order_history, get_loyalty_points. Напишите промпт, при котором Claude вызовет все три инструмента параллельно. Обработайте результаты и сформируйте итоговый ответ через второй вызов API.
11. Квиз: проверьте себя
Ответьте на 5 вопросов, чтобы проверить, насколько хорошо вы усвоили материал курса.
Заключение
Промптинг для Claude — это не «магия формулировок», а инженерная дисциплина со своими паттернами и лучшими практиками. Ключевые выводы:
- XML-теги — ваш главный инструмент структуризации. Используйте их всегда.
- Системный промпт задаёт «конституцию» поведения модели. Не пренебрегайте им.
- 3-5 few-shot примеров стабилизируют формат ответа лучше, чем многословные инструкции.
- Документы — в начало, вопрос — в конец при работе с длинным контекстом.
- Extended Thinking с правильным уровнем
effortраскрывает потенциал Opus на сложных задачах. - Параллельные инструменты сокращают latency в агентских системах.
Для углублённого изучения пройдите интерактивный туториал Anthropic: prompt-eng-interactive-tutorial (Jupyter-ноутбуки с упражнениями) и изучите рецепты в anthropic-cookbook.