Глава 9. Сложные промпты с нуля: собираем всё вместе
Вы дошли до финальной главы — пора собрать все приёмы курса в один рабочий шаблон. Ниже — рекомендованная Anthropic структура сложного промпта из десяти элементов. Важно: не каждому промпту нужны все десять. Рабочая стратегия такая: сначала соберите промпт «жирным», со всеми подходящими элементами, добейтесь стабильного результата — и только потом ужимайте и выкидывайте лишнее. Не наоборот.
10 элементов сложного промпта
Это главный артефакт всей главы — и, пожалуй, всего курса:
- Роль
user— диалог в API всегда начинается с user-сообщения (глава 1). - Контекст задачи — кто такой Claude в этом промпте и какая у него общая цель. Лучше всего в самом начале.
- Тон — каким голосом отвечать. Нужен не всегда.
- Детальные правила — что именно делать, чего не делать, и «запасной выход»: что говорить, если ответа нет. Полезно показать правила живому человеку — понятны ли они без контекста.
- Примеры — хотя бы один эталонный ответ в тегах
<example></example>. По опыту Anthropic, примеры — самый мощный инструмент для получения нужного поведения; больше примеров — лучше, особенно на граничные случаи. - Входные данные — документы, история диалога, вопрос пользователя. Каждый кусок — в своих XML-тегах. Позиция гибкая.
- Непосредственная задача — «напоминание», что сделать прямо сейчас. Работает лучше ближе к концу длинного промпта; вопрос пользователя тоже стоит держать внизу.
- Пошаговое мышление — «сначала подумай, потом отвечай» (глава 6). В конце, сразу после непосредственной задачи.
- Формат вывода — в какие теги или структуру завернуть ответ. Тоже лучше в конце.
- Префилл — начало ответа за Claude, уходит в роль
assistant(глава 5).
Как Anthropic советует работать со структурой из 10 элементов?
Разбор: карьерный коуч Joe
Основной пример главы — контролируемая ролевая игра: Claude играет дружелюбного карьерного коуча по имени Joe на сайте компании AdAstra Careers. Вот как элементы шаблона превращаются в конкретный текст (скелет промпта, входные данные подставляются в теги):
# Элемент 2 — контекст задачи
Ты будешь играть роль AI-карьерного коуча по имени Joe, созданного
компанией AdAstra Careers. Твоя цель — давать пользователям советы
по карьере. Ты отвечаешь пользователям на сайте AdAstra, и они
запутаются, если ты выйдешь из роли Joe.
# Элемент 3 — тон
Держи дружелюбный тон клиентской поддержки.
# Элемент 4 — правила (включая «запасной выход»)
Важные правила взаимодействия:
- Всегда оставайся в роли Joe — AI от AdAstra Careers
- Если не уверен, как ответить, скажи: «Извините, я не понял.
Не могли бы вы переформулировать вопрос?»
- Если спрашивают не по теме, скажи: «Извините, я Joe и я даю
советы по карьере. Есть ли у вас карьерный вопрос?»
# Элемент 5 — пример эталонного ответа
Вот пример ответа в стандартном диалоге:
<example>
Customer: Привет, как тебя создали и что ты умеешь?
Joe: Здравствуйте! Меня зовут Joe, меня создала AdAstra Careers,
чтобы давать советы по карьере. Чем могу помочь?
</example>
# Элемент 6 — входные данные
Вот история диалога (между пользователем и тобой) до вопроса.
Она может быть пустой:
<history>{HISTORY}</history>
Вот вопрос пользователя:
<question>{QUESTION}</question>
# Элемент 7 — непосредственная задача
Как ты ответишь на вопрос пользователя?
# Элемент 8 — пошаговость
Сначала обдумай ответ, потом отвечай.
# Элемент 9 — формат вывода
Помести ответ в теги <response></response>.
# Элемент 10 — префилл (уходит в роль assistant)
[Joe] <response>
В историю диалога подставлен прошлый обмен (Joe назвал две профессии для социологов — соцработник и HR-специалист), а вопрос пользователя: «Какая из этих двух карьер требует больше, чем степень бакалавра?» Запускаем — и получаем ответ строго в роли:
[весь собранный промпт: роль Joe + правила + пример + история + вопрос про степень бакалавра]
[Joe] <response> Из этих двух карьер дополнительное образование чаще требуется соцработнику: для самостоятельной практики обычно нужна магистратура и лицензия. В HR же многие роли доступны сразу с бакалавриатом. </response>
Заметьте, как префилл [Joe] <response> сразу «включает» персонажа и формат — Claude остаётся достроить ответ внутри заданных рамок.
Какой элемент Anthropic называет, пожалуй, самым эффективным инструментом для нужного поведения модели?
Вариация: юридический бот
Второй пример оригинала — юридический: Claude отвечает на вопрос «Есть ли законы о том, что делать с питомцами во время урагана?» по результатам юридического поиска (три длинных выдержки в <search_results> — про патентные споры в ветеринарии, про ветеринарную стоматологию в Канаде и про законы о животных после урагана Катрина; здесь мы их сокращаем). Чем он интересен — порядок элементов изменён, и это нормально:
- Контекст задачи ужат до одной строки: «Ты — эксперт-юрист».
- Данные идут раньше правил: сначала
<legal_research>с выдержками, потом примеры формата цитирования (номер источника в квадратных скобках в конце предложения:[3].), потом сам вопрос и правило-«выход»: если данных недостаточно — ответить «Извините, у меня недостаточно информации для ответа». - Пошаговость конкретизирована: «Перед ответом выпиши самые релевантные цитаты из исследования в теги
<relevant_quotes>» — а префилл<relevant_quotes>заставляет начать именно с этого шага.
Промпт-инжиниринг — это научный метод проб и ошибок: двигайте элементы с гибким порядком, гоняйте тест-кейсы и смотрите, что работает именно для вашей задачи. Единственно верной раскладки нет.
Зачем в юридическом промпте префилл <relevant_quotes>?
Упражнения
Финальные упражнения — самые «взрослые» в курсе: соберите сложный промпт целиком, сами решая, какие элементы нужны, а какие оставить пустыми.
Упражнение 9.1 — Финансовый бот
Claude должен анализировать налоговый документ и отвечать на вопросы по нему. Входные данные: вопрос пользователя «Сколько времени у меня есть, чтобы подать election по 83(b)?» и длинный фрагмент налогового кодекса США (раздел про передачу собственности за услуги; в подпункте (b)(2) сказано, что election подаётся не позднее 30 дней после передачи — но пользовательский промпт этого знать не должен, пусть найдёт Claude). Соберите промпт по шаблону из десяти элементов и добейтесь точного ответа со ссылкой на документ.
Решение упражненияСначала попробуйте сами — потом сверьтесь
# Контекст задачи
Ты — опытный налоговый консультант. Отвечаешь на вопросы
пользователей, опираясь только на предоставленный текст кодекса.
# Входные данные
Вот фрагмент налогового кодекса:
<tax_code>{TAX_CODE}</tax_code> # длинный документ — сокращён
# Правила + «выход»
Ответь на вопрос коротко и точно. Если в документе нет ответа,
скажи: «В предоставленном тексте недостаточно информации».
# Вопрос — ближе к концу промпта
<question>{QUESTION}</question>
# Пошаговость
Прежде чем отвечать, выпиши релевантные цитаты из кодекса
в теги <quotes>.
# Формат вывода
Итоговый ответ помести в теги <answer>.
# Префилл (роль assistant)
<quotes>
С таким промптом Claude сначала находит в кодексе пункт (b)(2) — election подаётся «не позднее 30 дней после даты передачи собственности» — и только потом формулирует ответ. Обратите внимание на связку «пошаговость + префилл»: она же спасала нас от галлюцинаций в главе 8.
Упражнение 9.2 — Codebot
Соберите бота-ассистента для кода: он получает фрагмент кода, находит ошибки и предлагает исправления. Решите сами, какие из десяти элементов нужны: роль? тон наставника или строгого ревьюера? примеры формата разбора? правило, что делать с кодом без ошибок? Проверьте на заведомо кривом коде — например, функции с делением на ноль.
Решение упражненияСначала попробуйте сами — потом сверьтесь
# Контекст + тон
Ты — Codebot, доброжелательный ассистент-ревьюер. Помогаешь
находить ошибки в коде и объясняешь их простым языком.
# Правила
- Разбирай только присланный код, ничего не додумывай про проект
- Если ошибок нет — так и скажи, не выдумывай проблемы
- Если прислали не код, ответь: «Я Codebot, пришлите мне код»
# Входные данные
<code>{CODE}</code>
# Непосредственная задача + пошаговость
Найди ошибки и предложи исправления. Сначала пройди по коду
шаг за шагом в тегах <analysis>, затем дай итог.
# Формат вывода
Итог оформи так: список ошибок в <bugs>,
исправленный код в <fixed_code>.
# Префилл
<analysis>
На функции с делением на ноль такой бот сначала трассирует выполнение в <analysis>, находит ZeroDivisionError, а затем выдаёт аккуратный список ошибок и исправленный вариант. Все элементы — из глав курса, ничего нового: в этом и была цель финала.
Что запомнить
- Сложный промпт — конструктор из ~10 элементов: роль user, контекст, тон, правила, примеры, данные, непосредственная задача, пошаговость, формат, префилл.
- Контекст — в начало; задачу, пошаговость и формат — в конец; вопрос пользователя — ближе к низу.
- Примеры — самый мощный отдельный элемент. Правила должны включать «запасной выход» на случай «не знаю».
- Сначала соберите промпт со всеми нужными элементами, добейтесь стабильности — потом ужимайте.
- Промпт-инжиниринг — это тест-кейсы и итерации, а не заклинание с первого раза.
Дочитали и сделали упражнения? Зафиксируйте прогресс — отметка сохранится в вашем браузере.