Практика: структурирование сложного промпта
Практика: структурирование сложного промпта
В этом уроке мы пройдём полный путь: возьмём сложную бизнес-задачу и построим для неё структурированный промпт с использованием разделителей и XML-тегов. Ты увидишь, как «рыхлый» запрос превращается в инженерно точный инструмент.
Задача
Компания получает десятки писем от клиентов. Нужно автоматически извлекать из каждого письма: тему (одна из 5 категорий), суть обращения (одно предложение), контактные данные (email и/или телефон) и срочность (высокая/средняя/низкая). Письма на русском, часто с опечатками и в свободной форме.
Шаг 1: Пишем zero-shot версию
Первый набросок — сплошным текстом:
Извлеки из письма тему, суть, контакты и срочность. Тема — одна из:
«доставка», «возврат», «качество», «сайт», «другое». Контакты —
email или телефон. Срочность — высокая, средняя или низкая.
Письмо: "Здравствуйте! Заказ №12345 не пришёл уже неделю! Когда
будет доставка? Мой телефон +79001234567. Это срочно!!!"
Проблемы: инструкции смешаны с данными, категории тем перечислены в строку, нет формата ответа. Модель справится, но есть риск: перепутает email клиента с email из подписи письма; не поймёт, что «неделю» = срочность «высокая».
Шаг 2: Добавляем секции
Разделим на логические блоки:
<task>Извлеки из письма клиента ключевую информацию.</task>
<categories>
- «доставка» — проблемы с доставкой заказа.
- «возврат» — желание вернуть товар или деньги.
- «качество» — товар сломан/бракован/не соответствует описанию.
- «сайт» — проблемы с сайтом или приложением.
- «другое» — всё, что не подходит под первые 4 категории.
</categories>
<urgency_rules>
- Высокая: клиент угрожает обращением в суд/Роспотребнадзор, прошло
больше 5 дней без ответа, товар испорчен/опасен.
- Средняя: клиент недоволен, но без угроз; сроки поджимают.
- Низкая: вопрос общего характера, благодарность, предложение.
</urgency_rules>
<output_format>
{
"topic": "одна из категорий",
"summary": "суть обращения, одно предложение",
"email": "email или null",
"phone": "телефон в формате +7... или null",
"urgency": "высокая / средняя / низкая"
}
</output_format>
Теперь у модели есть: определение каждой категории, правила определения срочности, точная JSON-схема ответа.
Шаг 3: Добавляем примеры (few-shot + структура)
<examples>
<example>
<input>
Здравствуйте! Заказ №12345 не пришёл уже неделю! Когда будет
доставка? Мой телефон +79001234567. Это срочно!!!
</input>
<output>
{
"topic": "доставка",
"summary": "Заказ №12345 не доставлен через неделю после заказа",
"email": null,
"phone": "+79001234567",
"urgency": "высокая"
}
</output>
</example>
<example>
<input>
Добрый день. Я купила у вас телефон, а он не включается.
Что мне делать? Верните деньги! Меня зовут Анна, anna@mail.ru
</input>
<output>
{
"topic": "качество",
"summary": "Купленный телефон не включается, клиентка требует возврат",
"email": "anna@mail.ru",
"phone": null,
"urgency": "высокая"
}
</output>
</example>
<example>
<input>
Подскажите пожалуйста, вы работаете 1 мая?
</input>
<output>
{
"topic": "другое",
"summary": "Вопрос о графике работы в праздничный день",
"email": null,
"phone": null,
"urgency": "низкая"
}
</output>
</example>
</examples>
Примеры показывают модели: как обрабатывать эмоциональные письма, как извлекать телефон vs email, как отличать «другое» от остальных категорий.
Шаг 4: Собираем итоговый промпт
<task>
Ты — сотрудник службы поддержки. Извлеки из письма клиента ключевую
информацию для регистрации обращения в CRM.
</task>
<categories>
- «доставка» — проблемы с доставкой заказа.
- «возврат» — желание вернуть товар или деньги.
- «качество» — товар сломан, бракован или не соответствует описанию.
- «сайт» — проблемы с работой сайта или мобильного приложения.
- «другое» — всё, что не подходит под первые 4 категории.
</categories>
<urgency_rules>
- Высокая: клиент угрожает обращением в контролирующие органы,
товар испорчен или опасен, прошло более 5 дней без ответа.
- Средняя: клиент недоволен, но без угроз; сроки ограничены.
- Низкая: общий вопрос, благодарность, предложение, уточнение.
</urgency_rules>
<output_format>
Ответ должен быть строго в формате JSON без дополнительного текста:
{
"topic": "одна из категорий",
"summary": "суть обращения, одно предложение",
"email": "email или null",
"phone": "телефон в формате +7... или null",
"urgency": "высокая / средняя / низкая"
}
</output_format>
<examples>
(примеры из шага 3)
</examples>
<query>
<input>Здравствуйте, хочу оформить возврат кроссовок — они мне
велики. Заказ №56789. Моя почта: ivan@mail.ru. Спасибо!</input>
</query>
Выход модели:
{
"topic": "возврат",
"summary": "Клиент хочет вернуть кроссовки из заказа №56789 — не подошёл размер",
"email": "ivan@mail.ru",
"phone": null,
"urgency": "средняя"
}
Точно, структурированно, готово к загрузке в CRM.
Что дала структура
| Аспект | Без структуры | Со структурой |
|---|---|---|
| Определение категории | Модель гадает, что значит «качество» | Чёткое описание каждой категории |
| Срочность | «Это срочно!!!» → высокая (угадала) | Правила: угрозы, сроки, опасность |
| Формат ответа | Текст (нужно парсить) | JSON — сразу в систему |
| Примеры | Отсутствуют | 3 примера на разные категории |
| Отделение данных | Письмо в той же строке | Тег <query> с <input> |
Проверь себя
Дана задача: модель получает описание товара (свободный текст) и должна заполнить карточку для интернет-магазина (название, цена, характеристики списком). Спроектируй структуру промпта: какие секции, какие теги, нужны ли примеры.
Итог
- Сложный промпт собирается слоями: задача → секции → правила → формат → примеры → запрос.
- Структура превращает «рыхлый» текст в инженерный инструмент с предсказуемым поведением.
- Комбинируй разделители и XML-теги: теги для вложенных структур, разделители для простых границ.
- Хорошо структурированный промпт легко читать, тестировать и переиспользовать через месяц.
Что дальше
Ты научился структурировать промпты. Теперь перейдём к особому типу инструкций, который задаёт тон всему общению с моделью — системным промптам и ролям. Один раз настроил роль — и модель ведёт себя нужным образом без повторения инструкций в каждом сообщении.