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 описывают токены, а не ваши варианты. Калибровку в обоих случаях придётся проверять самим.
Источники
- OpenAI — Structured model outputs
- OpenAI — Chat Completions API reference
- Anthropic — Structured outputs
- Google — Gemini API, Structured outputs
- TypeSafe AI — Introducing System One Models & Jev
- TypeSafe AI — главная страница и FAQ
- TypeSafe Docs — System One
- TypeSafe Docs — API reference
- TypeSafe Docs — Jev 1.13 jaggedness
- TypeSafe — Workflow evals
- GitHub — typesafe-ai/system-one-adapter-python