Глава 4. Данные отдельно, инструкции отдельно
Часто промпт — это не разовый вопрос, а конвейер: задача одна и та же, а данные каждый раз новые. Переписать письмо, разобрать отзыв, оценить резюме — инструкция не меняется, меняется только то, что в неё подставили. Для этого делают шаблон промпта: фиксированный «скелет» с инструкциями плюс место, куда вставляются переменные данные.
В коде на Python это f-строки: пишете шаблон один раз, а на место {ANIMAL} подставляется значение переменной. Если вы не программируете — суть та же: в claude.ai вы просто держите шаблон текстом и вставляете свежие данные в отведённое место перед отправкой.
ANIMAL = "Корова"
PROMPT = f"Я назову тебе животное. Ответь звуком, который оно издаёт. {ANIMAL}"
# После подстановки Claude получит:
# "Я назову тебе животное. Ответь звуком, который оно издаёт. Корова"
Я назову тебе животное. Ответь звуком, который оно издаёт. Корова
Му-у-у!
Зачем это нужно? Шаблоны упрощают повторяющиеся задачи. Представьте сервис, куда пользователи присылают своих животных (точнее, их названия): им не нужно видеть и тем более писать полный промпт — они заполняют только переменную. Имя переменной может быть любым, но лучше осмысленным: ANIMAL понятнее, чем A. Переменных в шаблоне может быть сколько угодно.
Что такое шаблон промпта?
Где модель путается
Как только в промпте появились подставляемые данные, возникает новая проблема: Claude должен понимать, где кончаются инструкции и начинаются данные. Человеку в шаблоне всё очевидно. Но модель видит уже склеенный текст — и границы в нём размыты.
Классический пример. Просим сделать письмо вежливее:
EMAIL = "Приходи завтра к 6 утра, потому что я CEO и я так сказал."
PROMPT = f"Йоу, Claude. {EMAIL} <----- Сделай это письмо вежливее, но больше ничего в нём не меняй."
Йоу, Claude. Приходи завтра к 6 утра, потому что я CEO и я так сказал. <----- Сделай это письмо вежливее, но больше ничего в нём не меняй.
Дорогой Claude! Пожалуйста, приходи завтра к 6 утра — как CEO я вынужден настаивать на этом времени. Заранее спасибо!
Видите «Дорогой Claude»? Модель решила, что «Йоу, Claude» — это часть письма, которое нужно переписать. В шаблоне граница была очевидна, в склеенном промпте — нет. И это не только про качество: если данные приходят от чужих пользователей, текст внутри переменной может притвориться инструкцией и увести модель в сторону — это называют промпт-инъекцией. Чёткая граница между данными и инструкциями — первая линия защиты.
XML-теги: разделители данных
Решение простое: обернуть данные в XML-теги. Это парные метки в угловых скобках: открывающая <tag> и закрывающая </tag>, а между ними — содержимое: <tag>текст</tag>.
PROMPT = f"Йоу, Claude. <email>{EMAIL}</email> <----- Сделай это письмо вежливее, но больше ничего в нём не меняй."
Йоу, Claude. <email>Приходи завтра к 6 утра, потому что я CEO и я так сказал.</email> <----- Сделай это письмо вежливее, но больше ничего в нём не меняй.
Добрый день! Прошу вас прийти завтра к 6 утра. Это моя просьба как CEO — заранее благодарю за понимание.
«Дорогой Claude» исчез: теги показали модели, где ровно начинается и заканчивается письмо. Claude умеет работать с разными разделителями, но именно XML-теги — рекомендуемый способ: модель специально обучена распознавать их как механизм организации промпта. При этом «волшебных» тегов с секретным эффектом нет (вне вызова инструментов) — называйте их как удобно, лишь бы имя отражало содержимое.
Ещё пример, где теги спасают. Просим назвать второй пункт списка, а в инструкции случайно оказался маркер-дефис:
SENTENCES = """- Мне нравится, как мычат коровы
- Это предложение про пауков
- Это предложение как будто про собак, но на самом деле про свиней"""
PROMPT = f"""Ниже список предложений. Назови второй пункт списка.
- Каждое из них про животное, например про кроликов.
{SENTENCES}"""
Claude решает, что строка «Каждое из них про животное, например про кроликов» — тоже пункт списка (у неё же такой же дефис!), и вторым пунктом называет «Мне нравится, как мычат коровы». Пользователь, заполнявший переменную, явно хотел не этого. Лечится так же:
PROMPT = f"""Ниже список предложений. Назови второй пункт списка.
- Каждое из них про животное, например про кроликов.
<sentences>
{SENTENCES}
</sentences>"""
Второй пункт списка: «Это предложение про пауков».
Теперь модели неважно, что перед тегами стоит сбивающий с толку дефис: данные — это то, что внутри <sentences>, всё остальное — инструкции.
Зачем оборачивать подставляемые данные в XML-теги?
Существуют ли «волшебные» XML-теги, которые дают Claude особый прирост качества?
Мелочи, которые решают
Признание: в примере со списком нам пришлось специально поставить дефис перед «Каждое из них про животное», чтобы Claude ошибся. Это важный урок: мелкие детали имеют значение. Модель чувствительна к паттернам текста (в своей ранней жизни, до дообучения, она была чистым предсказателем следующего слова): она чаще ошибается, когда ошибаетесь вы, звучит умнее, когда умно звучите вы, и глупее — когда наоборот. Так что вычитывайте промпты: опечатки и грамматический хаос реально снижают качество ответов.
Упражнения
Откройте claude.ai или Workbench и попробуйте сами.
Упражнение 4.1 — Хайку по теме
Сделайте шаблон промпта, который принимает переменную TOPIC и выдаёт хайку на эту тему. Проверьте на теме «Свиньи». Задание тренирует саму механику шаблона: инструкция постоянная, тема подставляется.
Решение упражненияСначала попробуйте сами — потом сверьтесь
TOPIC = "Свиньи"
PROMPT = f"Напиши хайку на тему: <topic>{TOPIC}</topic>"
Розовый пятак
в тёплой луже отражён —
счастье без прикрас.
В claude.ai то же самое без кода: «Напиши хайку на тему: Свиньи» — и меняете тему при каждом новом запросе, не трогая инструкцию.
Упражнение 4.2 — Собачий вопрос с опечатками
Вот промпт-катастрофа: вопрос пользователя тонет в мусорном тексте с опечатками. Почините его, добавив только XML-теги — больше ничего не меняйте. Хаос в тексте намеренный: посмотрите, как Claude реагирует на такие ошибки.
QUESTION = "мгт ли кричневыми?"
PROMPT = f"Прив это я у мя ест вапрос про собак jkaerjv {QUESTION} jklmvca спс помги мне оч оч атв быстр быстр атв коротко коротко спс"
Решение упражненияСначала попробуйте сами — потом сверьтесь
PROMPT = f"Прив это я у мя ест вапрос про собак jkaerjv <question>{QUESTION}</question> jklmvca спс помги мне оч оч атв быстр быстр атв коротко коротко спс"
Да, собаки могут быть коричневыми! Это очень распространённый окрас.
Теги <question> вытащили вопрос из мусора: модель поняла, на что именно отвечать, несмотря на хаос вокруг.
Упражнение 4.3 — Собачий вопрос, часть 2
Тот же промпт, но теперь почините его без XML-тегов: удалите из текста всего одно-два слова. Остальное не трогайте. Упражнение показывает, сколько словесного шума Claude способен переварить — и что именно его ломает.
Решение упражненияСначала попробуйте сами — потом сверьтесь
PROMPT = f"Прив это я у мя ест вапрос про собак {QUESTION} спс помги мне оч оч атв быстр быстр атв коротко коротко спс"
Достаточно удалить бессмысленные «слова» jkaerjv и jklmvca, которые стояли вплотную к вопросу и размывали его границы. Опечатки и просторечие Claude переваривает спокойно — а вот случайный набор букв прямо вокруг данных сбивает его сильнее всего.
Что запомнить
- Повторяющаяся задача = шаблон промпта: инструкции фиксированы, данные подставляются в переменные.
- Модель видит склеенный текст, а не ваш шаблон — границы данных надо показывать явно.
- Оборачивайте данные в XML-теги
<tag>…</tag>: Claude обучен распознавать их как разметку промпта. «Волшебных» тегов нет — имена свободные. - Чёткая граница между данными и инструкциями защищает и от путаницы, и от промпт-инъекций.
- Мелочи решают: вычитывайте промпты, модель отражает качество вашего текста.
Дочитали и сделали упражнения? Зафиксируйте прогресс — отметка сохранится в вашем браузере.