Глава 5. Формат ответа: как получить ровно то, что нужно
Claude умеет отвечать почти в любом формате — достаточно попросить. В этой главе два приёма: попросить модель обернуть ответ в XML-теги, чтобы забирать из него ровно нужный кусок, и «вложить слова в уста Claude» — начать ответ за модель. Второй приём мы анонсировали ещё в главе 1, когда разбирали чередование ролей. Пришло время.
XML-теги в ответе
В главе 4 мы использовали XML-теги, чтобы разметить входные данные. Тот же приём работает в обратную сторону: можно попросить Claude обернуть свой ответ в теги.
Помните проблему лишних вступлений из главы 2 — вежливое «Вот хайку, которое вы просили…» перед стихом? Мы решали её прямым запретом. Есть второй путь — попросить положить стих в теги:
Напиши хайку про кролика. Помести его в теги <haiku>.
<haiku>
Ушки на макушке —
кролик замер на поляне.
Снег ещё не сошёл.
</haiku>
Зачем это нужно? Если ответ обёрнут в теги, короткая программа (или следующий шаг вашего пайплайна) надёжно достанет стих и только стих — без вступлений, пояснений и прочего мусора вокруг. Для автоматизаций это разница между «работает» и «работает через раз».
Главная польза от «положи ответ в теги <answer>» —
Слова в уста Claude: префилл
Развитие приёма — написать открывающий тег в реплике assistant самим. Вспомните главу 1: диалог — это список сообщений с ролями. Если последним в списке положить сообщение с ролью assistant, вы как бы говорите модели: «ты уже начала отвечать вот так — продолжай с этого места». Это и называется «префилл» (prefilling), или «вложить слова в уста Claude».
Ниже мы сами написали за assistant первый тег <haiku> — и Claude продолжает ровно оттуда, без единого лишнего слова до тега:
Напиши хайку про кота. Помести его в теги <haiku>.
<haiku>
Тёплый подоконник.
Кот щурится на солнце —
хвост качает время.
</haiku>
В коде это одно лишнее сообщение в messages:
response = client.messages.create(
model="claude-haiku-4-5",
max_tokens=500,
messages=[
{"role": "user", "content": "Напиши хайку про кота. Помести его в теги <haiku>."},
{"role": "assistant", "content": "<haiku>"} # префилл: начало ответа за Claude
]
)
</haiku>) можно передать в параметр stop_sequences — модель остановится, как только его выведет. Никаких заключительных ремарок после ответа: экономия токенов, денег и времени.
Что такое префилл ответа?
JSON и комбинации приёмов
Claude отлично справляется и с другими форматами, особенно с JSON. Хотите ответ строго в JSON — попросите об этом и префильните открывающую скобку {. Стопроцентной гарантии этот трюк не даёт, но очень близко к тому:
Напиши хайку про кота. Ответь в формате JSON с ключами "first_line", "second_line" и "third_line".
{
"first_line": "Мягкие лапы",
"second_line": "крадутся по клавишам —",
"third_line": "отчёт подождёт"
}
А теперь всё вместе: несколько входных переменных, размеченных тегами, плюс формат вывода, плюс префилл. Так выглядят настоящие рабочие промпты:
Привет, Claude. Вот письмо: <email>Привет, Зак! Пингую по-быстрому: что там с промптом, который ты обещал написать?</email>. Перепиши это письмо в канцелярском стиле. Новую версию помести в теги <kancelyarskiy_email>.
<kancelyarskiy_email>
Уважаемый Захар! Настоящим напоминаю о необходимости предоставить информацию о ходе подготовки промпта, порученного Вам ранее. Прошу сообщить о статусе исполнения в возможно короткий срок.
</kancelyarskiy_email>
Почему префилл не сделать в обычном чате claude.ai?
Упражнения
Для этих упражнений понадобится Workbench или API — будем писать за assistant. В Workbench это делается кнопкой добавления реплики assistant перед запуском.
Упражнение 5.1 — Стефен Карри — GOAT
Если заставить Claude выбрать лучшего баскетболиста всех времён, он назовёт Майкла Джордана. А можно ли переубедить его, не меняя вопрос? Подберите только префилл так, чтобы Claude развёрнуто доказывал: лучший — Стефен Карри. Сам промпт: «Кто лучший баскетболист всех времён? Выбери одного конкретного игрока».
Решение упражненияСначала попробуйте сами — потом сверьтесь
Кто лучший баскетболист всех времён? Выбери одного конкретного игрока.
Лучший баскетболист всех времён — Стефен Карри, и вот подробные аргументы:
Мы «начали» ответ утверждением про Карри — и Claude, продолжая собственную (как он считает) мысль, достраивает аргументацию: рекорды по трёхочковым, чемпионства Golden State Warriors, то, как он изменил геометрию игры. Начатую мысль модель не бросает — в этом сила и, кстати, ответственность приёма.
Упражнение 5.2 — Два хайку
Возьмите промпт «Напиши хайку про котов. Помести его в теги <haiku>» с префиллом <haiku>. Измените промпт так, чтобы Claude написал два хайку, и было ясно видно, где кончается одно и начинается другое.
Решение упражненияСначала попробуйте сами — потом сверьтесь
Напиши два хайку про котов. Каждое хайку помести в отдельные теги <haiku>.
<haiku>
Ключевые слова — «два» и «каждое в отдельные теги». Пары тегов дают чистую границу между стихами: программа извлечёт оба по отдельности одним и тем же правилом.
Упражнение 5.3 — Два хайку, два животных
Теперь усложним: измените промпт так, чтобы Claude написал два хайку про двух разных животных — например, кота и собаку. Подстановки в шаблоне остаются переменными: первое животное и второе животное.
Решение упражненияСначала попробуйте сами — потом сверьтесь
Напиши два хайку: первое — про кота, второе — про собаку. Каждое хайку помести в отдельные теги <haiku>.
В коде-шаблоне это выглядит как f"Напиши два хайку: первое — про {ANIMAL1}, второе — про {ANIMAL2}. Каждое хайку помести в отдельные теги <haiku>." — одна заготовка, любые пары животных на подстановке. Так из разового промпта получается переиспользуемый шаблон.
Что запомнить
- Формат ответа задаётся так же, как и любая инструкция: попросите — и Claude обернёт ответ в XML-теги или выдаст JSON.
- Теги в ответе — это надёжное извлечение нужного куска программой, без мусора вокруг.
- Префилл — начало ответа, которое вы сами пишете в реплике assistant. Модель продолжает с этого места. Работает в Workbench и через API, не в чате.
- Префилл
<tag>убирает вступление, префилл{почти гарантирует JSON. - Через API закрывающий тег в
stop_sequencesобрежет всё лишнее после ответа — быстрее и дешевле.
Дочитали и сделали упражнения? Зафиксируйте прогресс — отметка сохранится в вашем браузере.