
Structured outputs, которые не работают: пять ситуаций, где схема есть, а гарантий нет
badcasedaily1 15 минут назад Structured outputs, которые не работают: пять ситуаций, где схема есть, а гарантий нет Средний 9 мин 460 Блог компании OTUS Программирование * Искусственный интеллект Python * Java * Обзор...
18 Temmuz'da Wellington'da en yüksek sıcaklık 14°C olacak mı?
Вот важная новость с фронта ИИ: badcasedaily1 15 минут назад Structured outputs, которые не работают: пять ситуаций, где схема есть, а гарантий нет Средний 9 мин 460 Блог компании OTUS Программирование * Искусственный интеллект Python * Java * Обзор Привет, Хабр! Strict‑режим появился у OpenAI в августе 2024 года и за полтора года стал способом по умолчанию получать от модели структурированный ответ. Сейчас его в том или ином виде поддерживают все крупные провайдеры, а на self‑hosted моделях ту же роль играет grammar‑constrained decoding в llama.
Схема пишется первой, промпт строится вокруг неё, а не наоборот. Разница между strict‑режимом и старым JSON Mode большая. JSON Mode обещает синтаксически корректный JSON и ничего больше: поля могут пропасть, типы поплыть, ключи появиться из воздуха.
Технические детали
Strict‑режим компилирует JSON Schema в автомат и на каждом шаге генерации обнуляет вероятность токенов, которые уводят с валидного пути. Модель не может вернуть невалидную структуру не потому, что хорошо обучена, а потому, что нужных токенов у неё в этот момент физически нет. Гарантия сильная, и именно поэтому вокруг неё столько разочарований.
Схема отправлена, strict: true выставлен, а в логах лежит мусор. Ниже пять ситуаций, в которых код выглядит правильным, а гарантия не работает. Ограничения из Pydantic Field молча исчезаютПишем модель для извлечения профиля пользователя и аккуратно проставляем ограничения.
from pydantic import BaseModel, Field from openai import OpenAI class UserProfile(BaseModel): user_id: str = Field(pattern=r"^USR-\ $ name: str = Field(min_length=1, max_length=100) age: int = Field(ge=0, le=120)Запрос проходит, ответ парсится, всё зелёное. Через неделю в базе обнаруживаются пользователи 250 лет от роду и идентификаторы вида USER123, которые никакому паттерну не соответствуют. Причина в том, что strict‑режим понимает не весь JSON Schema, а его подмножество.
Отраслевые последствия
Из него вычеркнуты ровно те слова, которые тут используются: pattern, minimum, maximum, multipleOf, minItems, maxItems, minLength, maxLength. Дальше возможны два исхода: API отвергнет схему с ошибкой валидации, либо (что чаще, потому что современные обёртки санитизируют схему перед отправкой) лишние ключи будут тихо выброшены. Во втором случае никто ничего не заметит: ограничения были в коде, но до декодера не доехали.
Фиксится это разделением ответственности. Структура (типы, обязательность, форма объекта) остаётся в схеме и обеспечивается декодером. Семантика (диапазоны, форматы, бизнес‑правила) уезжает в валидаторы, которые срабатывают уже на разборе ответа.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.





