Практика: настройка формата ответа
Практика: настройка формата ответа
В этом уроке соберём все инструменты управления выводом на сквозной задаче. Мы начнём с «обычного» ответа и шаг за шагом превратим его в структурированный, валидный JSON с контролируемым стилем и verbosity.
Задача
Модель получает описание товара в свободной форме и должна заполнить карточку для интернет-магазина. Ответ должен быть JSON с гарантированной структурой.
Шаг 1: От свободного текста к JSON
Вход (без контроля формата):
Опиши товар по этому тексту: "iPhone 15 Pro, 256 ГБ, цвет чёрный,
цена 120 000 рублей, есть в наличии."
Выход (размытый текст):
Это iPhone 15 Pro с памятью 256 ГБ в чёрном цвете. Стоимость
составляет 120 000 рублей. Товар есть в наличии.
Проблемы: не структурировано, цена в тексте, нет чётких полей.
Добавляем JSON:
Извлеки информацию о товаре и ответь JSON:
{
"name": "...",
"storage": "...",
"color": "...",
"price": ...,
"in_stock": ...
}
Текст: "iPhone 15 Pro, 256 ГБ, цвет чёрный, цена 120 000 рублей,
есть в наличии."
Выход:
{
"name": "iPhone 15 Pro",
"storage": "256 ГБ",
"color": "чёрный",
"price": 120000,
"in_stock": true
}
Уже лучше. Но есть проблемы: цена как число (потеряли «рублей»), in_stock как булево значение (а если будет «ожидается через 3 дня»?).
Шаг 2: Уточняем типы и ограничения
Извлеки информацию о товаре. Ответь СТРОГО по схеме. Никакого текста
вне JSON.
СХЕМА:
{
"name": "строка — название модели",
"storage_gb": "число — объём памяти в ГБ (только число, без ГБ)",
"color": "строка — цвет",
"price_rub": "число — цена в рублях (только число, без текста)",
"in_stock": "boolean — true если явно указано наличие, false если
указано отсутствие, null если не указано"
}
Текст: "iPhone 15 Pro, 256 ГБ, цвет чёрный, цена 120 000 рублей,
есть в наличии."
Выход:
{
"name": "iPhone 15 Pro",
"storage_gb": 256,
"color": "чёрный",
"price_rub": 120000,
"in_stock": true
}
Теперь схема точнее: storage_gb — число, price_rub — число, in_stock имеет три варианта (true/false/null).
Шаг 3: Добавляем verbosity контроля
Иногда нужно не только извлечь данные, но и добавить описание:
Извлеки информацию о товаре. Ответь СТРОГО по схеме JSON.
СХЕМА:
{
"name": "строка",
"storage_gb": "число",
"color": "строка",
"price_rub": "число",
"in_stock": "boolean или null",
"description_short": "строка — описание для карточки товара,
ровно одно предложение, не длиннее 80 символов",
"description_full": "строка — полное описание, 3–4 предложения,
выделяющее ключевые преимущества, 200–300 символов"
}
Стиль описаний: дружелюбный, как консультант в магазине. Не используй
маркетинговые штампы «революционный», «инновационный», «лучший».
Текст: "iPhone 15 Pro, 256 ГБ, цвет чёрный, цена 120 000 рублей,
есть в наличии."
Выход:
{
"name": "iPhone 15 Pro",
"storage_gb": 256,
"color": "чёрный",
"price_rub": 120000,
"in_stock": true,
"description_short": "iPhone 15 Pro с 256 ГБ памяти в чёрном цвете — мощный и надёжный.",
"description_full": "iPhone 15 Pro — это профессиональный инструмент в элегантном чёрном корпусе. 256 ГБ памяти хватит для тысяч фото, видео и приложений. Мощный процессор справляется с любыми задачами мгновенно. Доступен прямо сейчас."
}
Шаг 4: Обработка отсутствующих данных
Реальность: не все товары имеют полное описание. Добавим устойчивость:
Извлеки информацию о товаре. Если какого-то поля нет в тексте —
поставь null. НЕ придумывай значения.
СХЕМА: (та же)
Текст: "Ноутбук б/у, работает нормально, торг."
Выход:
{
"name": "Ноутбук б/у",
"storage_gb": null,
"color": null,
"price_rub": null,
"in_stock": null,
"description_short": "Ноутбук б/у в рабочем состоянии, возможен торг.",
"description_full": "Ноутбук бывший в употреблении, полностью исправен. Продавец открыт к переговорам о цене. Для уточнения деталей свяжитесь с продавцом."
}
Важно: модель не придумала бренд или характеристики — то, чего не было в тексте, получило null.
Шаг 5: Итоговый промпт
Собираем всё:
Извлеки информацию о товаре из описания. Ответь СТРОГО по схеме.
Никакого текста вне JSON. Если данных нет — ставь null, не придумывай.
СХЕМА:
{
"name": "строка — название",
"storage_gb": "число — ГБ, только цифра, или null",
"color": "строка или null",
"price_rub": "число — цена в рублях, только цифра, или null",
"in_stock": "true/false если указано явно, иначе null",
"description_short": "строка — ровно 1 предложение до 80 символов",
"description_full": "строка — 3–4 предложения, 200–300 символов"
}
ПРАВИЛА:
- Описания: дружелюбный тон, как консультант в магазине.
- Без штампов: «революционный», «инновационный», «лучший».
- Если ТОВАР не указан в тексте вообще — верни {"error": "нет товара"}.
Текст: {{product_description}}
Проверь себя
Возьми итоговый промпт из шага 5 и протестируй на трёх текстах: а) полное описание со всеми данными, б) минимальное описание из 2 слов, в) текст, в котором вообще нет товара. Для каждого — какой JSON ожидается?
Итог
- Управление выводом — это слоёный процесс: формат → типы → ограничения → verbosity → обработка краевых случаев.
- Каждый слой добавляет предсказуемости и надёжности.
- Схема с null для отсутствующих данных надёжнее, чем схема, где модель вынуждена придумывать.
- Итоговый промпт — это production-ready шаблон: параметризован (
{{product_description}}), с чёткой схемой и правилами обработки ошибок.
Что дальше
Ты освоил управление выводом. Модель возвращает ответ именно в том виде, который тебе нужен. Теперь поднимем планку качества ответа: научимся просить модель «рассуждать шаг за шагом» — техника Chain of Thought. Она особенно полезна для сложных задач, где первый ответ модели часто бывает неверным.