Теперь разработчики могут гарантировать, что JSON, возвращаемый LLM, соответствует заданной структуре, подключив схемы Zod к Vercel AI SDK или API tool-use от Anthropic, что исключает сбои во время выполнения (runtime crashes), возникающие, когда модель добавляет неожиданное поле.

Необходимость в надежной защите стала очевидной в январе, когда классификатор, запущенный в продакшн, начал возвращать второй ключ «explanation» после трех недель безупречной работы. Код ожидал только одно поле, поэтому лишний ключ вызвал исключение — и это произошло без единого деплоя кода. Этот инцидент иллюстрирует более широкую проблему: большинство туториалов ограничиваются JSON.parse(response), предполагая, что модель будет следовать схеме из промпта. На деле же LLM часто отклоняются от правил — меняют регистр, добавляют поля или оборачивают вывод в markdown-рамки, что приводит к скрытому повреждению данных или полному сбою.

Почему небезопасно использовать обычный парсинг JSON

LLM обучаются быть полезными, а не послушными. Промпт, запрашивающий

{ "category": "string" }

не накладывает на модель жестких ограничений по этой структуре. Даже хорошо составленный промпт может быть проигнорирован внутренними эвристиками модели, особенно если параметр temperature настроен на креативность или если последующая инструкция побуждает её к более подробному ответу. В результате получается поток текста, который выглядит как JSON, но имеет достаточно отклонений, чтобы сломать парсеры, ожидающие строгого формата.

Когда такое несоответствие попадает в продакшн-код, последствия наступают мгновенно: выброшенное исключение, неудачный запрос и, потенциально, каскад ошибок в последующих сервисах. В крупных сервисах эти минуты простоя оборачиваются потерей выручки и подрывом доверия пользователей.

Zod + Vercel AI SDK: трехступенчатая страховочная сетка

Zod — это валидатор схем, ориентированный на TypeScript, который позволяет описать точную структуру данных, которую должна выдавать модель. В сочетании с помощником Output.object из Vercel AI SDK валидация происходит автоматически сразу после того, как модель сгенерирует ответ.

  1. Определите схему — напишите Zod-объект, который зеркально отражает желаемый JSON. Для простого классификатора это может быть z.object({ category: z.string() }); для сложного экстрактора счетов схема может содержать вложенные объекты, массивы и discriminated unions.
  2. Передайте её в SDK — оберните схему с помощью Output.object(schema). SDK внедряет промпт, который велит модели выдать JSON-блок, соответствующий схеме, и парсит результат с помощью safeParse из Zod.
  3. Обработайте ошибкиsafeParse возвращает объект результата вместо того, чтобы выбрасывать исключение. Если парсинг не удался, отправьте ошибку обратно модели и повторите попытку. Модели можно дать инструкцию исправить вывод на основе конкретного сообщения о валидации, превращая большинство пограничных случаев в цикл самовосстановления.

Поскольку SDK берет на себя промптинг, парсинг и логику повторных попыток в одном месте, разработчики заменяют набор разрозненных манипуляций со строками одним типизированным вызовом.

Anthropic tool use: принудительный структурированный вывод

При работе напрямую с API Anthropic того же результата можно добиться с помощью «tool use» (использования инструментов). Инструмент определяется как функция, схема входных данных которой выражена в JSON Schema; модель Anthropic вызовет инструмент только в том случае, если сможет удовлетворить этой схеме. Установив tool_choice в значение "any" (или указав имя конкретного инструмента), вы заставляете модель возвращать структурированный блок вместо произвольного текста.

Рабочий процесс повторяет подход Vercel:

  • Напишите Zod-схему.
  • Преобразуйте её в полезную нагрузку JSON Schema для определения инструмента.
  • Включите инструмент в запрос и потребуйте от модели вызвать его.
  • Распарсите ответ инструмента с помощью zod.safeParse.

Если модель всё же выдает некорректные данные, применяется тот же паттерн «повтор с обратной связью».

Когда валидация всё равно не срабатывает

Даже при строгом соблюдении схемы иногда случаются несоответствия. Причины могут быть следующими:

  • Галлюцинации модели: модель может сгенерировать строку, которая выглядит как JSON, но содержит синтаксические ошибки.
  • Утечка промпта: предыдущие реплики диалога могут содержать инструкции по форматированию, которые перекрывают запрос схемы.
  • Различия в версиях: новые релизы моделей иногда меняют способ интерпретации вызовов инструментов.

Рекомендуемый способ смягчения последствий — легковесный цикл повторных попыток. В случае ошибки парсинга код отправляет уточняющий промпт, например: «Ваш последний ответ не был валидным JSON. Он содержал … Пожалуйста, верните только те поля, которые определены в схеме». Поскольку ошибка валидации явная, модель может исправить себя без участия человека.

Соображения производительности и стоимости

Adding Zod validation introduces negligible CPU overhead—the safeParse operation runs in microseconds for typical payloads. Network latency is unchanged; the extra round-trip for a retry only occurs on the rare failure case. In practice, the cost of a single prevented exception far outweighs the marginal increase in request time.

Counter-argument: is schema enforcement overkill?

Some developers argue that strict schemas limit the model’s flexibility, especially when new fields could provide valuable context. The trade-off is between safety and openness. In mission-critical services—payment processing, identity verification, compliance reporting—predictability wins. In exploratory prototypes, a looser approach may be acceptable, but even there a minimal guard (e.g., z.object({}).passthrough()) can catch catastrophic parsing errors without discarding useful extensions.

What to watch next

  • SDK evolution: Vercel’s AI SDK roadmap includes built-in retry policies and richer error reporting, which will streamline the repair loop further.
  • Tooling standardization: As more providers adopt tool-use conventions, cross-provider schema validators could emerge, reducing the need for provider-specific adapters.
  • Community patterns: Open-source libraries are beginning to bundle Zod schemas with prompt templates, making the “schema-first” workflow a reusable asset.

Takeaway

By treating a Zod schema as a contract that the model cannot break, developers move from fragile JSON.parse hacks to a deterministic pipeline where unexpected fields cause a controlled validation failure, not a production crash. The combination of Vercel’s Output.object helper and Anthropic’s tool-use mechanism turns LLMs from unpredictable text generators into reliable data providers, letting teams focus on business logic instead of endless edge-case debugging.