Structured Output — это практика заранее задавать форму ответа. В 2026 важно различать два уровня: human-readable structure для удобного чтения и machine-validated structure для интеграций, где ответ должен проходить по схеме без ручной правки.
Если вы просите "сделай 5 пунктов с плюсами и минусами", это уже structured output. Если вы просите строгую JSON-схему для кода, это более жёсткая версия той же идеи.
Структурированный вывод нужен, когда ответ должен быть не просто хорошим по смыслу, но и удобным по форме:
список;
таблица;
memo;
rubric;
JSON / schema.
Без техники
Оцени идею стартапа
С техникой
Оцени идею в формате: summary, upside, risks, open questions, next step
Главный вопрос не "нужна ли структура вообще", а "какая именно структура нужна downstream-потребителю". В одной задаче достаточно ясного markdown-отчёта. В другой нужен ответ, который приложение сможет принять без дополнительного парсинга и ручной чистки.
Ошибка многих команд — просить "JSON" там, где нужен просто удобный markdown-отчёт, и наоборот, просить "список" там, где downstream-сервис ждёт строгую схему.
Практически structured output решает сразу три разных задачи:
Делает ответ повторяемым.
Упрощает проверку и ревью.
Уменьшает хрупкость следующего шага в пайплайне.
Когда этого нет, даже сильная модель начинает "дрейфовать" по форме ответа: в одном случае даёт список, в другом добавляет вступление, в третьем смешивает вывод, caveats и next steps в одном абзаце.
Если ответ в первую очередь читает человек, начинайте с readable structure. Если ответ сразу идёт в код, workflow, tool call или БД, начинайте с schema-first формата.
Сценарий
Что обычно лучше
Memo для команды
Markdown-секции
Аналитический разбор
Таблица + rubric
Triage тикетов
JSON/schema
Tool invocation
Strict arguments
Handoff между агентами
Schema или typed tool payload
На практике между этими полюсами есть промежуточная зона. Например, продуктовый аналитик может хотеть одновременно:
краткий readable summary для человека;
и отдельный блок decision_payload для автоматизации.
Тогда выгоднее не пытаться "впихнуть всё в один текст", а явно просить двухслойный ответ: сначала summary, затем strict payload.
Хорошо комбинируется с few-shot, routing и tool use
Минусы
Слишком жёсткий формат может ухудшать качество рассуждения
Сложные схемы увеличивают latency
Если схема плохая, модель начинает заполнять её бесполезными значениями
Не все задачи требуют machine-readable структуры
Лучше всего техника работает там, где нужно стабилизировать "поверхность" ответа:
классификация;
extraction;
оценка по рубрике;
handoff между системами;
генерация action items;
подготовка аргументов для инструмента.
Слабее всего structured output помогает там, где сама задача ещё неясна. Если вы не понимаете, какие поля реально нужны, схема почти всегда будет либо слишком узкой, либо слишком шумной.
Оцени запуск новой onboarding-версии.
Верни ответ в двух частях:
1. Короткий markdown summary для product team
2. JSON payload с полями decision, confidence, main_risk, next_test
Ответ модели
Summary
Новый onboarding улучшил activation, но пока не доказал влияние на monetization.
{"decision":"continue_test","confidence":"medium","main_risk":"uplift может ограничиваться первым шагом funnel","next_test":"измерить retention и trial-to-paid через 14 дней"}
Такой смешанный формат часто лучше чистого JSON, если результат одновременно нужен и человеку, и системе.
Structured output ломается не потому, что модель "не умеет формат", а потому что разработчик выбирает неправильный уровень жёсткости.
Самые частые ошибки:
Просить строгий JSON там, где нужен просто ясный memo.
Просить "список" там, где downstream ждёт строгую схему.
Делать схему слишком широкой и расплывчатой.
Не различать optional, required и nullable поля.
Считать, что хороший формат автоматически гарантирует хорошие факты.
Отдельная ловушка — forcing format слишком рано. На сложных reasoning-задачах иногда полезно сначала дать модели коротко подумать, а уже потом просить финальный структурированный слой. Иначе качество рассуждения падает, потому что модель всё время "смотрит на форму", а не на смысл.
prompt = """
Оцени решение в формате:
summary: одно предложение
main_risk: одно предложение
confidence: low | medium | high
next_step: одно действие
Решение: перенести поиск с PostgreSQL на отдельный search service.
"""
Если результат дальше парсится кодом, почти всегда выгоднее сразу использовать schema constraints, а не надеяться на "примерно такой же текст, как в прошлый раз".
def validate_decision_payload(data: dict) -> dict:
allowed_decisions = {"ship", "iterate", "reject"}
allowed_confidence = {"low", "medium", "high"}
if data["decision"] not in allowed_decisions:
raise ValueError("invalid decision")
if data["confidence"] not in allowed_confidence:
raise ValueError("invalid confidence")
if not data["summary"].strip():
raise ValueError("empty summary")
return data
Это важно, потому что даже при строгой схеме модель может вернуть формально валидный, но семантически бесполезный объект.