Jev или structured outputs / JSON mode у LLM: в чём разница

Обновлено

Structured outputs у OpenAI, Anthropic и Google тоже обещают ответ строго по схеме. Зачем тогда отдельная модель? Сравниваем, что именно гарантирует каждый подход, откуда берутся вероятности и во что обходится ответ.

Коротко

JSON mode Structured outputs Jev
Что гарантировано Синтаксически верный JSON Соответствие вашей JSON-схеме, с оговорками Ответ — один из заданных вариантов
Как получается ответ Генерация токен за токеном Генерация, ограниченная схемой Распределение по вариантам за один проход
Вероятности Нет Только если попросить или через logprobs В каждом ответе
Скорость Зависит от модели и длины ответа То же, плюс задержка на новую схему 70–500 мс, по данным TypeSafe
Цена Входные и выходные токены То же $0,042 за 1 млн входных, выход бесплатный
Текст, извлечение значений Да Да Нет

Что гарантируют structured outputs

Все три крупных провайдера умеют заставить модель отвечать по JSON-схеме. Гарантии похожи, но оговорки разные. Ниже — то, что написано в их документации на сентябрь 2026 года.

OpenAI

Structured Outputs гарантирует соответствие ответа вашей JSON Schema: модель не пропустит обязательное поле и не придумает значение вне enum. JSON mode гарантирует только синтаксически верный JSON без проверки схемы, и OpenAI советует везде, где можно, использовать Structured Outputs. Оговорки:

  • при отказе по соображениям безопасности ответ приходит с отдельным полем refusal и схеме не следует;
  • при достижении лимита токенов ответ обрывается;
  • первый запрос с новой схемой идёт дольше, пока API её обрабатывает;
  • ответ по схеме всё равно может содержать ошибки, а если вход не подходит под схему, модель будет её заполнять и может выдумать данные.

У схемы есть пределы: до 5000 свойств, до 10 уровней вложенности и до 1000 значений enum на всю схему.

Anthropic (Claude)

У Claude две функции: JSON-ответы (output_config.format) и строгий вызов инструментов (strict: true). Anthropic обещает всегда валидный по схеме ответ за счёт ограниченного декодирования. Нюансы:

  • схему компилируют в грамматику: первый запрос медленнее, затем грамматику кешируют на 24 часа;
  • модель получает дополнительный системный промпт о формате, поэтому входных токенов чуть больше;
  • при отказе (stop_reason: "refusal") ответ может не совпасть со схемой, а токены всё равно оплачиваются;
  • при обрыве по max_tokens ответ тоже может оказаться неполным и не совпасть со схемой;
  • регистр строковых значений enum не гарантирован, поэтому Anthropic советует сравнивать их без учёта регистра.

Google Gemini

Gemini поддерживает подмножество JSON Schema и прямо называет классификацию по заранее заданным категориям одним из сценариев. Google пишет, что ответ будет синтаксически верным JSON, но значения всё равно нужно проверять в приложении и обрабатывать ответы, которые соответствуют схеме, но неверны по смыслу. Слишком большие и глубоко вложенные схемы API может отклонить.

Общее у всех троих: форма почти гарантирована, правильность — нет.

Что гарантирует Jev

Jev не генерирует строку, которую потом проверяют по схеме. Пространство ответов задаёт сам вопрос: Choice выбирает из ваших вариантов (до 255), Score — уровень на шкале из 2–10 делений, Noul — вероятность ответа «да». TypeSafe называет ошибку типа в таком ответе математически невозможной и уточняет, что 0% ошибок схемы на её графиках — следствие устройства модели, а не измерение.

В справочнике API Jev нет аналогов отказа или обрыва по лимиту. Ответ приходит на каждый вопрос, а проблемы с запросом возвращаются кодами ошибок HTTP: 401, 422, 429 или 529.

Правильность Jev тоже не гарантирует. TypeSafe формулирует это прямо: модель не придумает категорию вне списка, но может выбрать неверную. Подробнее — в статье о галлюцинациях Jev. На вопрос о разнице с JSON mode компания отвечает в FAQ так: валидный JSON даёт программе читаемый формат, но, загоняя LLM в этот формат, можно потерять часть её возможностей. System One-модели, по словам TypeSafe, изначально учат принимать структурированные решения с откалиброванными вероятностями.

Вероятности — главное отличие

Одно и то же решение в двух форматах. JSON Schema для LLM:

{
  "type": "object",
  "properties": {
    "department": { "type": "string", "enum": ["billing", "technical", "sales"] }
  },
  "required": ["department"],
  "additionalProperties": false
}

Вопрос для Jev:

"department": {
  "type": "choice",
  "instructions": "Какой отдел должен обработать обращение?",
  "criteria": {
    "billing": "Оплата, счета, возвраты",
    "technical": "Ошибки и интеграции",
    "sales": "Цены и тарифы"
  }
}

LLM вернёт одно значение, например "technical". Jev вернёт выбранный вариант, вероятности всех трёх и confidence: например, technical — 0,85, billing — 0,15, sales — 0 (числа для примера). С таким ответом код сам решает, действовать автоматически, переспросить или отдать случай человеку. Как ставить такие пороги, описано в статье об уверенности Jev.

Получить вероятности от LLM можно двумя способами, и у обоих есть оговорки:

  • Попросить модель написать число в JSON. Это сгенерированный текст, и калибровку никто не обещает. Даже открытый адаптер TypeSafe, который задаёт те же вопросы LLM, умеет перенормировать распределения, если их сумма не равна единице, и повторять запрос при сломанной структуре.
  • Включить logprobs. В Chat Completions API у OpenAI есть параметры logprobs и top_logprobs — до 20 самых вероятных токенов на каждой позиции. Но это вероятности токенов, а не ваших вариантов, и метки из нескольких токенов придётся сопоставлять самим.

У Jev распределение — основной выход, а метод обучения RLCD нацелен на калибровку. Это заявление компании. В независимом пилоте калибровка Jev оказалась лучше, чем у GLiNER 2.5, на двух наборах данных и заметно хуже на третьем, подробности — в сравнении Jev с классификаторами.

Скорость и цена

LLM генерирует ответ последовательно, каждый токен зависит от предыдущего, и режим схемы этого не меняет. Jev считает все ответы параллельно за один проход. По данным TypeSafe, передовые LLM отвечают за 3–329 секунд, Jev — за 70–500 мс. В демо на главной странице TypeSafe один и тот же запрос занял 0,114 с и $0,000081 у Jev против 8,566 с и $0,01388 у LLM.

На сайте эвалов TypeSafe языковые модели отвечали на те же типизированные вопросы через обёртку, которая заставляет их выдавать структурированные решения. Средние по четырём рабочим задачам:

Модель Точность Цена за случай Время
Jev 67,8% $0,0004 0,4 с
GPT-5.6 Terra 67,9% $0,0304 10,1 с
Claude Sonnet 5 67,8% $0,1174 78,1 с
GPT-5.6 Sol 74,1% $0,0836 23,3 с
Claude Opus 5 73,1% $0,1761 37,8 с

Это тесты самой компании: эталонные ответы — среднее от GPT-6 Astra и Claude Fable 5.1, задачи составляла команда TypeSafe. Но порядок цифр показателен. По этим данным при сопоставимой точности Jev примерно в 25–200 раз быстрее и в 75–300 раз дешевле. Лучшие LLM при этом точнее на 5–6 пунктов.

По подсчёту TypeSafe, входные токены LLM стоят от $0,20 до $10 за миллион, а выходные примерно в 5 раз дороже входных. У Claude structured outputs добавляют ещё и системный промпт. Расчёт для Jev — в статье о ценах.

Что structured outputs умеют, а Jev нет

  • Извлекать значения: имена, суммы, даты, адреса. Jev строк не генерирует. TypeSafe советует находить кандидатов регулярным выражением или LLM, а Jev оставлять выбор из них.
  • Заполнять сложные схемы: вложенные объекты, массивы, числа, свободные строки. У Jev три примитива и до 255 вариантов в Choice.
  • Объяснять решение в соседнем поле. System One-модели, по документации TypeSafe, объяснений своих рассуждений не генерируют.
  • Работать с картинками и аудио. Jev принимает только текст.

Как выбрать и как проверить

Jev подходит, если нужно решение из закрытого списка, вопросов к одному входу много, важны задержка и цена на больших объёмах, а маршрутизация строится на уверенности.

Structured outputs подходят, если нужно извлечь значения, написать текст, заполнить сложную структуру или разобрать изображение.

Оба сразу — частая схема: Jev разбирает поток, а случаи с низкой уверенностью уходят в LLM со structured outputs. Подробнее — в статье о каскаде Jev и LLM.

Сравнить подходы на своих данных помогает открытый System One Adapter от TypeSafe. Это замена TypeSafeClient, которая отправляет те же вопросы в модели OpenAI или Anthropic:

from system_one_adapter import SystemOneAdapterClient, Noul

client = SystemOneAdapterClient(
    structured_outputs=True,          # нативный режим схемы у провайдера
    llm_answer_mode="probabilities",  # или "discrete"
    normalize_probabilities=True,     # перенормировать распределения LLM
)
response = client.system_one(
    state="Книга читается на одном дыхании.",
    questions={"positive": Noul(instructions="Отзыв о книге положительный?")},
    provider="openai",
    model="gpt-4o-mini",
)

Вопросы остаются прежними, а в ответе адаптера есть число повторов, суммарные токены и задержка. Прогоните одну размеченную выборку через Jev и через LLM и сравните точность, время и стоимость одного решения.

Частые вопросы

Чем Jev отличается от JSON mode?

JSON mode гарантирует только валидный JSON, но не соответствие вашей схеме. Structured outputs гарантируют схему, но ответ по-прежнему генерируется токен за токеном. Jev текст не генерирует вовсе и возвращает распределение вероятностей по заданным вами вариантам.

Могут ли structured outputs нарушить схему?

В крайних случаях да. OpenAI и Anthropic описывают отказы модели и обрыв ответа по лимиту токенов, а Anthropic отдельно предупреждает, что не гарантирует регистр строковых значений enum.

Можно ли получить вероятности от LLM?

Можно попросить модель написать число в JSON или включить logprobs, если API это позволяет. Но число в JSON — это сгенерированный текст, а logprobs описывают токены, а не ваши варианты. Калибровку в обоих случаях придётся проверять самим.

Источники