Структурированные выходные данные (Structured Outputs)
Структурированные выходные данные (Structured Outputs)
В уроке 6.1 мы освоили JSON как формат ответа. Теперь идём дальше: структурированные выходные данные. Это не просто «JSON вместо текста», а гарантированная, предсказуемая схема ответа, которую можно напрямую использовать в коде.
Проблема «свободного JSON»
Представь: ты просишь модель классифицировать отзывы и возвращать JSON. Ты написал:
Ответь в JSON: {"sentiment": "positive" или "negative"}
На 100 запросах модель возвращает хороший JSON. На 101-м — пишет "positive " с пробелом. Или "Positive" с заглавной. Или "нейтральный" — хотя такого варианта не было. Или вообще пропускает поле.
Это проблема неструктурированного подхода к структурированным данным. Ты попросил JSON — модель дала JSON. Но ты не гарантировал валидность схемы.
Техники обеспечения валидной схемы
1. Ограничение значений (enum)
Явно перечисли допустимые значения:
Ответь JSON с полем "sentiment". Допустимые значения ТОЛЬКО:
"positive", "negative", "neutral".
2. Описание типов данных
Укажи не только имена полей, но и типы:
Ответь JSON с полями:
- "name": строка, только буквы и пробелы.
- "age": число, целое, от 0 до 120.
- "email": строка в формате email или null.
- "tags": массив строк (может быть пустым).
3. Вложенные структуры
Опиши иерархию:
Ответь JSON со следующей структурой:
{
"order": {
"id": "строка",
"date": "дата в формате YYYY-MM-DD",
"items": [
{
"product": "строка",
"quantity": "целое число > 0",
"price_per_unit": "число"
}
],
"total": "число, сумма price_per_unit * quantity по всем items"
}
}
Модель понимает вложенность и связи между полями (total = сумма).
4. Схема-пример (самый надёжный)
Лучший способ гарантировать структуру — показать пример валидного объекта:
Ответь JSON-объектом со следующей структурой. Вот пример валидного
ответа:
{
"status": "ok",
"data": {
"name": "Иван Петров",
"skills": ["JavaScript", "Python"],
"experience_years": 5
},
"errors": []
}
Верни такой же объект для запроса: "Анна Смирнова, Java, Kotlin, опыт 3 года".
Пример валидного объекта снимает 95% неопределённости.
Обработка ошибок в структуре
В production-промптах нужно предусмотреть, что модель может не найти данные:
Извлеки имя и телефон из обращения. Ответь JSON:
{
"name": "строка или null, если имя не найдено",
"phone": "строка или null, если телефон не найден",
"confidence": "число от 0 до 1 — насколько ты уверен в извлечённых данных"
}
Поле confidence — метрика, которая позволяет коду решить, доверять ли ответу.
Реальная схема: аналитика обращения клиента
Соберём комплексный пример:
Извлеки информацию из обращения клиента. Ответь СТРОГО по схеме ниже.
Никакого текста вне JSON.
СХЕМА:
{
"topic": "строка, одна из: доставка, возврат, качество, сайт, другое",
"is_urgent": "boolean, true если клиент угрожает или требует срочно",
"sentiment": "строка, одна из: негативная, нейтральная, позитивная",
"key_details": {
"order_id": "строка или null",
"product": "строка или null",
"issue": "строка, краткое описание проблемы"
},
"contact": {
"email": "строка или null",
"phone": "строка или null"
},
"confidence": "число от 0 до 1"
}
Обращение: "Заказ 98765 не пришёл! Я жду уже 5 дней. Если завтра
не получу — пойду в суд. Мой email: angry@mail.ru"
Выход:
{
"topic": "доставка",
"is_urgent": true,
"sentiment": "негативная",
"key_details": {
"order_id": "98765",
"product": null,
"issue": "заказ не доставлен в течение 5 дней"
},
"contact": {
"email": "angry@mail.ru",
"phone": null
},
"confidence": 0.95
}
Structured Outputs в веб-интерфейсе
В браузерной версии языковой модели ты вставляешь описание схемы прямо в промпт. Некоторые веб-интерфейсы предоставляют специальный режим «JSON mode» — если он есть, включи его. Это дополнительно гарантирует, что ответ будет валидным JSON.
Проверь себя
Спроектируй JSON-схему для ответа модели, которая извлекает из текста вакансии: название должности, зарплату (мин и макс), город, требования (массив) и является ли вакансия удалённой. Покажи пример валидного объекта.
Итог
- Structured Outputs — это не просто JSON, а гарантированно валидная схема ответа.
- Основные техники: enum-ограничения, описание типов, вложенные структуры, пример валидного объекта.
- Всегда предусматривай null для необязательных полей — лучше null, чем выдуманное значение.
- Добавляй поле
confidence— оно позволяет коду принять решение, доверять ли ответу. - В веб-интерфейсе используй JSON mode, если он доступен.
Что дальше
Ты освоил весь арсенал управления выводом: формат, стиль, verbosity и структурированные схемы. В финальном уроке модуля — практика: настроим формат ответа для сквозной задачи от начала до конца.