Глава 5. Формат ответа: как получить ровно то, что нужно

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

Первый приём (XML-теги в ответе) работает где угодно, включая обычный чат claude.ai. А вот префилл — начало ответа за assistant — доступен там, где вы управляете репликами напрямую: в Workbench или через API. В чате его не сделать — там за assistant пишет только Claude.

XML-теги в ответе

В главе 4 мы использовали XML-теги, чтобы разметить входные данные. Тот же приём работает в обратную сторону: можно попросить Claude обернуть свой ответ в теги.

Помните проблему лишних вступлений из главы 2 — вежливое «Вот хайку, которое вы просили…» перед стихом? Мы решали её прямым запретом. Есть второй путь — попросить положить стих в теги:

user

Напиши хайку про кролика. Помести его в теги <haiku>.

assistant

<haiku>
Ушки на макушке —
кролик замер на поляне.
Снег ещё не сошёл.
</haiku>

Зачем это нужно? Если ответ обёрнут в теги, короткая программа (или следующий шаг вашего пайплайна) надёжно достанет стих и только стих — без вступлений, пояснений и прочего мусора вокруг. Для автоматизаций это разница между «работает» и «работает через раз».

Квиз 1

Главная польза от «положи ответ в теги <answer>» —

Слова в уста Claude: префилл

Развитие приёма — написать открывающий тег в реплике assistant самим. Вспомните главу 1: диалог — это список сообщений с ролями. Если последним в списке положить сообщение с ролью assistant, вы как бы говорите модели: «ты уже начала отвечать вот так — продолжай с этого места». Это и называется «префилл» (prefilling), или «вложить слова в уста Claude».

Ниже мы сами написали за assistant первый тег <haiku> — и Claude продолжает ровно оттуда, без единого лишнего слова до тега:

user

Напиши хайку про кота. Помести его в теги <haiku>.

assistant · префилл (пишем мы)

<haiku>

assistant · продолжает Claude

Тёплый подоконник.
Кот щурится на солнце —
хвост качает время.
</haiku>

В коде это одно лишнее сообщение в messages:

response = client.messages.create(
    model="claude-haiku-4-5",
    max_tokens=500,
    messages=[
        {"role": "user", "content": "Напиши хайку про кота. Помести его в теги <haiku>."},
        {"role": "assistant", "content": "<haiku>"}   # префилл: начало ответа за Claude
    ]
)
Бонус для тех, кто работает через API: закрывающий тег (например, </haiku>) можно передать в параметр stop_sequences — модель остановится, как только его выведет. Никаких заключительных ремарок после ответа: экономия токенов, денег и времени.
Квиз 2

Что такое префилл ответа?

JSON и комбинации приёмов

Claude отлично справляется и с другими форматами, особенно с JSON. Хотите ответ строго в JSON — попросите об этом и префильните открывающую скобку {. Стопроцентной гарантии этот трюк не даёт, но очень близко к тому:

user

Напиши хайку про кота. Ответь в формате JSON с ключами "first_line", "second_line" и "third_line".

assistant · префилл (пишем мы)

{

assistant · продолжает Claude

"first_line": "Мягкие лапы",
"second_line": "крадутся по клавишам —",
"third_line": "отчёт подождёт"
}

А теперь всё вместе: несколько входных переменных, размеченных тегами, плюс формат вывода, плюс префилл. Так выглядят настоящие рабочие промпты:

user

Привет, Claude. Вот письмо: <email>Привет, Зак! Пингую по-быстрому: что там с промптом, который ты обещал написать?</email>. Перепиши это письмо в канцелярском стиле. Новую версию помести в теги <kancelyarskiy_email>.

assistant · префилл (пишем мы)

<kancelyarskiy_email>

assistant · продолжает Claude

Уважаемый Захар! Настоящим напоминаю о необходимости предоставить информацию о ходе подготовки промпта, порученного Вам ранее. Прошу сообщить о статусе исполнения в возможно короткий срок.
</kancelyarskiy_email>

Квиз 3

Почему префилл не сделать в обычном чате claude.ai?

Упражнения

Для этих упражнений понадобится Workbench или API — будем писать за assistant. В Workbench это делается кнопкой добавления реплики assistant перед запуском.

Упражнение 5.1 — Стефен Карри — GOAT

Если заставить Claude выбрать лучшего баскетболиста всех времён, он назовёт Майкла Джордана. А можно ли переубедить его, не меняя вопрос? Подберите только префилл так, чтобы Claude развёрнуто доказывал: лучший — Стефен Карри. Сам промпт: «Кто лучший баскетболист всех времён? Выбери одного конкретного игрока».

Решение упражненияСначала попробуйте сами — потом сверьтесь
user

Кто лучший баскетболист всех времён? Выбери одного конкретного игрока.

assistant · префилл (пишем мы)

Лучший баскетболист всех времён — Стефен Карри, и вот подробные аргументы:

Мы «начали» ответ утверждением про Карри — и Claude, продолжая собственную (как он считает) мысль, достраивает аргументацию: рекорды по трёхочковым, чемпионства Golden State Warriors, то, как он изменил геометрию игры. Начатую мысль модель не бросает — в этом сила и, кстати, ответственность приёма.

Упражнение 5.2 — Два хайку

Возьмите промпт «Напиши хайку про котов. Помести его в теги <haiku>» с префиллом <haiku>. Измените промпт так, чтобы Claude написал два хайку, и было ясно видно, где кончается одно и начинается другое.

Решение упражненияСначала попробуйте сами — потом сверьтесь
user

Напиши два хайку про котов. Каждое хайку помести в отдельные теги <haiku>.

assistant · префилл (пишем мы)

<haiku>

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

Упражнение 5.3 — Два хайку, два животных

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

Решение упражненияСначала попробуйте сами — потом сверьтесь
user

Напиши два хайку: первое — про кота, второе — про собаку. Каждое хайку помести в отдельные теги <haiku>.

В коде-шаблоне это выглядит как f"Напиши два хайку: первое — про {ANIMAL1}, второе — про {ANIMAL2}. Каждое хайку помести в отдельные теги <haiku>." — одна заготовка, любые пары животных на подстановке. Так из разового промпта получается переиспользуемый шаблон.

Что запомнить

  • Формат ответа задаётся так же, как и любая инструкция: попросите — и Claude обернёт ответ в XML-теги или выдаст JSON.
  • Теги в ответе — это надёжное извлечение нужного куска программой, без мусора вокруг.
  • Префилл — начало ответа, которое вы сами пишете в реплике assistant. Модель продолжает с этого места. Работает в Workbench и через API, не в чате.
  • Префилл <tag> убирает вступление, префилл { почти гарантирует JSON.
  • Через API закрывающий тег в stop_sequences обрежет всё лишнее после ответа — быстрее и дешевле.

Дочитали и сделали упражнения? Зафиксируйте прогресс — отметка сохранится в вашем браузере.

Перевод и адаптация главы «Formatting Output and Speaking for Claude» курса Prompt Engineering Interactive Tutorial © Anthropic, лицензия CC BY-NC 4.0. Перевод: Дарья Воронкина (@aishipuchka). Материал изменён: переведён на русский, примеры и названия моделей актуализированы, добавлены квизы. Используется некоммерчески.