Руководство и понимание

Структурированные выходные данные в многомодельном шлюзе API: схема JSON, вызовы инструментов и семантические ограждения

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

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

Практическое решение — это не одна волшебная подсказка. Это многоуровневый шаблон шлюза: нормализуйте желаемую схему разработчика, преобразуйте ее в собственные форматы структурированного вывода или вызова инструментов, где это возможно, проверьте возвращаемый объект и примените семантические ограничения перед любым побочным эффектом.

В этом руководстве разделены три разные цели, которые часто смешивают:

<ул>
  • Синтаксическая достоверность: ответ представляет собой анализируемый JSON.
  • Действительность схемы. JSON соответствует обязательным полям, типам, перечислениям и структурным правилам.
  • Бизнес-корректность: объект безопасен, соответствует намерениям пользователя и действителен для последующих действий.
  • Производственный сбой: действительный JSON, неправильное действие

    Рассмотрим автоматизацию поддержки, которая маршрутизирует входящие заявки:

    {
      "ticket_id": "t_481",
      "категория": "биллинг",
      «приоритет»: «срочно»,
      "action": "refund_customer",
      "amount_usd": 499
    

    Этот объект синтаксически допустим. Он может даже передать простую схему, если action — это строка, а amount_usd — число. Но это все еще может быть неправильно. Возможно, клиент запросил только копию счета. Возможно, возврат средств на сумму более 100 долларов США требует одобрения менеджера. Возможно, у пользователя вообще нет прав на возврат средств.

    Структурированные выходные данные уменьшают количество ошибок анализа. Они не заменяют авторизацию, проверку политик, инвентаризацию, проверку цен, идемпотентность или подтверждение человеком рискованных операций.

    Факты: что дают и чего не обещают режимы структурированного вывода провайдера

    Среда поставщиков быстро меняется, но для архитектуры важны несколько стабильных фактов:

    <ул>
  • Режим JSON может помочь создать действительный JSON, но действительный JSON — это не то же самое, что соответствие определенной схеме.
  • Режимы структурированного вывода, встроенные в поставщика, предназначены для улучшения соответствия схемы, но обычно они поддерживают только подмножество схемы JSON.
  • Вызов инструмента обычно лучше подходит для действий, чем JSON свободной формы, поскольку модель выбирает объявленный инструмент и возвращает структурированные аргументы, а приложение остается ответственным за выполнение.
  • Разные поставщики предоставляют разные контракты. Один может использовать строгий формат ответа схемы JSON, другой может использовать схемы ввода инструментов, а третий может потребовать резервного варианта проверки и повтора.
  • Даже выходные данные, соответствующие схеме, могут быть семантически неправильными, прежде чем они достигнут базы данных, рабочего процесса или платного действия.
  • Смысл архитектуры прост: API, совместимый с OpenAI, может стандартизировать клиентский интерфейс, но уровень надежности по-прежнему должен понимать возможности поставщика и проверять выходные данные после генерации.

    Рекомендуемая архитектура: адаптер структурированного вывода

    Используйте адаптер на стороне шлюза между кодом приложения и API-интерфейсами поставщика. Приложение отправляет одно намерение схемы. Шлюз сопоставляет это намерение с самым сильным поддерживаемым механизмом поставщика.

    1. Принять один нормализованный запрос от приложения

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

    {
      "модель": "авто:точный",
      "сообщения": [
        {"role": "system", "content": "Извлечь поля счета. Не делать вывод о пропущенных значениях."},
        {"role": "user", "content": "Текст счета..."}
      ],
      "структурированный_выход": {
        "schema_id": "invoice_extraction",
        "schema_version": "01.08.2026",
        "режим": "json_schema",
        «строгий»: правда,
        "схема": {
          "тип": "объект",
          «дополнительные свойства»: ложь,
          "обязательно": ["номер_счета", "имя_вендора", "всего", "валюта", "дата_срока"],
          "свойства": {
            "invoice_number": {"type": "string"},
            "vendor_name": {"type": "string"},
            "всего": {"тип": "число", "минимум": 0},
            "currency": {"type": "string", "enum": ["USD", "EUR", "GBP"]},
            "due_date": {"type": "строка", "format": "date"},
            "доверие": {"тип": "число", "минимум": 0, "максимум": 1}
          }
        }
      },
      "метаданные": {
        "рабочий процесс": "accounts_payable",
        "risk_level": "средний"
      }
    

    Этот контракт предоставляет шлюзу достаточно информации для выбора собственной реализации поставщика, запуска проверки и регистрации значимых данных об ошибках.

    2. Ведение матрицы возможностей поставщика

    Шлюз должен иметь машиночитаемую матрицу возможностей, а не полагаться на такие предположения, как «все модели, совместимые с OpenAI, поддерживают одно и то же поведение схемы». Полезная матрица включает в себя:

    <ул>
  • Название поставщика и модели.
  • Поддерживает режим JSON.
  • Поддерживает формат ответа схемы JSON.
  • Поддерживает вызовы инструментов.
  • Поддерживает режим строгой схемы.
  • Известные ограничения подмножества схемы JSON.
  • Совместимы ли параллельные вызовы инструментов с режимом строгой схемы.
  • Аварийное поведение, когда запрошенный режим не поддерживается.
  • Пример записи о возможностях:

    {
      "провайдер": "провайдер_а",
      "модель": "model_x",
      «json_mode»: правда,
      «json_schema_response»: правда,
      «tool_calls»: правда,
      "strict_schema": правда,
      "schema_limitations": ["nooneOf", "ограниченная проверка формата"],
      "fallback": "reject_or_route_to_совместимая_модель"
    

    Эта матрица должна быть версионирована и протестирована. Когда поставщик меняет поведение или добавляет новую модель, совместимость структурированного вывода следует проверять перед маршрутизацией производства.

    3. Переведите на самый сильный собственный контракт поставщика

    Адаптер должен следовать четкому порядку предпочтений:

    <ол>
  • Использовать строгие структурированные выходные данные поставщика, если это поддерживается выбранной моделью и схемой.
  • Использовать собственный инструмент поставщика, вызывающий действия и задачи, подобные функциям.
  • Использовать нестрогий структурированный вывод или режим JSON с проверкой и повторными попытками, когда строгий режим недоступен.
  • Отклонить запрос, перейти к совместимой резервной модели или вернуть ответ о бездействии для рабочих процессов с высоким риском.
  • Не переводите молча операцию с высоким уровнем риска из режима строгой схемы в режим «лучшего JSON». Если приложение запрашивает строгое поведение, а выбранный поставщик не может его поддержать, шлюз должен сделать это видимым через ошибку, решение о маршрутизации или явный флаг перехода на более раннюю версию.

    Три уровня проверки перед выполнением

    Уровень 1: проверка синтаксического анализа

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

    function parseStructuredResponse(raw) {
      попробуй {
        return { ок: правда, значение: JSON.parse(raw)};
      } поймать (ошибка) {
        return { ok: false, error_type: "parse_failure", ошибка: String (ошибка)};
      }
    

    Вызовы собственных инструментов поставщика могут не требовать анализа необработанного текстового объекта, но они все равно требуют проверки конверта: выбрала ли модель известный инструмент, предоставила ли она аргументы и остановилась ли она для выполнения инструмента, как ожидалось?

    Уровень 2: проверка схемы JSON

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

    const validate = SchemaValidator.compile(schema);
    const действительный = проверить (объект);
    если (!действительно) {
      вернуть {
        ок: ложь,
        error_type: "schema_failure",
        ошибки: validate.errors
      };
    

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

    <ул>
  • Предпочитайте явные type, required, properties, enum и additionalProperties: false.
  • Избегайте сложных комбинаций, таких как глубоко вложенные oneOf, anyOf и условные схемы, если вы не уверены, что целевой поставщик их поддерживает.
  • Аргументы действий должны быть небольшими и конкретными.
  • Используйте строки для идентификаторов, дат и кодов, если нижестоящим системам не требуется другой тип.
  • Явное представление неопределенности с помощью таких полей, как уверенность, missing_fields или requires_human_review.
  • Уровень 3: семантическая и бизнес-проверка

    Наконец, проверьте, соответствует ли структурированный результат задаче. Этот уровень зависит от домена и не может быть передан на аутсорсинг только схеме JSON.

    Для извлечения счетов семантические проверки могут включать:

    <ул>
  • Итоговая сумма не является отрицательной и соответствует позициям в пределах допуска.
  • Валюта отображается в исходном документе.
  • Срок сдачи не может быть слишком далёким в прошлом или будущем.
  • Поставщик присутствует в списке одобренных поставщиков.
  • Достоверность достаточно высока для автоматического ввода.
  • Проверки квалификации потенциальных клиентов могут включать в себя:

    <ул>
  • Выбранный сегмент является одним из активных сегментов отдела продаж.
  • Запрошенный бюджет не был изобретен, поскольку пользователь его не предоставил.
  • Действие «Демонстрация книги» не выполняется, если пользователь явно не запросил об этом.
  • Для автоматизации Partner API проверки могут включать в себя:

    <ул>
  • Учетная запись реселлера имеет право создавать запрошенного клиента или ключ.
  • Запрошенный лимит расходов соответствует политике партнера.
  • Операция имеет ключ идемпотентности.
  • Действие записывается в журнал аудита перед выполнением.
  • Вызовы инструментов: рассматривайте выходные данные модели как запрос, а не как выполнение

    Вызов инструмента — правильный шаблон, когда модели нужно попросить приложение что-то сделать: создать заявку, отправить команду боту Telegram, узнать цены, обновить запись о клиенте или запустить рабочий процесс.

    Безопасный цикл инструментов выглядит так:

    <ол>
  • Приложение объявляет доступные инструменты и их схемы ввода.
  • Модель возвращает вызов инструмента со структурированными аргументами.
  • Шлюз проверяет имя и аргументы инструмента.
  • Приложение проверяет требования к авторизации, политике, идемпотентности и подтверждению пользователя.
  • Только после этого приложение запускает инструмент.
  • Результат инструмента отправляется обратно в модель, если диалог необходимо продолжить.
  • Никогда не рассматривайте вызов инструмента как доказательство того, что действие должно произойти. Относитесь к этому как к структурированному предложению. Приложение остается источником побочных эффектов.

    Безопасная резервная лестница для рабочих процессов с несколькими моделями

    Шлюз должен определить резервное поведение до возникновения инцидентов. Практичная лестница – это:

    <ол>
  • Основной: строго структурированный вывод по предпочтительной модели.
  • Совместимый резерв: другая модель, поддерживающая те же строгие требования к схеме.
  • Проверка и повтор: поставщик без строгой поддержки, используемый только тогда, когда это позволяет риск.
  • Проверка человеком: поставьте структурированный результат и исходный контент в очередь на утверждение.
  • Реакция бездействия: объясните, что система не может безопасно завершить операцию.
  • Повторные попытки полезны при форматировании или незначительных сбоях схемы, но они не являются стратегией безопасности. Если объект семантически небезопасен, повторный запрос может превратить правильный отказ в опасный исполняемый объект. В случае действий с высоким риском отдавайте предпочтение рассмотрению или отказу, а не повторным попыткам добиться успеха.

    Наблюдаемость: регистрируйте каждое решение, полученное на структурированных выходных данных

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

    Рекомендуемые поля:

    <ул>
  • schema_id и schema_version.
  • Поставщик и модель.
  • Запрошенный режим и фактический используемый режим.
  • Состояние ошибки анализа.
  • Состояние сбоя схемы и ошибки проверки.
  • Причина сбоя семантической проверки.
  • Количество повторов.
  • Задержка.
  • Использование и стоимость токена.
  • Окончательный статус действия: выполнено, поставлено в очередь, отклонено или возвращено пользователю.
  • Идентификатор команды, проекта, ключа API или партнерской учетной записи, если это необходимо.
  • Эти журналы поддерживают отладку, анализ затрат, сравнение поставщиков и управление командным API. Они также помогают ответить на такие вопросы, как: «Какая версия схемы вызывает наибольшее количество повторных попыток?» и «Какая резервная модель соответствует синтаксису, но не проходит бизнес-проверку?»

    Правила управления версиями схемы

    Схемы — это рабочие интерфейсы. Относитесь к ним как к контрактам API.

    <ул>
  • Включить schema_id и schema_version в метаданные и журналы запроса.
  • Не меняйте автоматически обязательные поля для существующих средств автоматизации.
  • Сохраняйте старые схемы доступными во время миграции клиентов.
  • Добавляйте новые необязательные поля, прежде чем делать их обязательными.
  • Протестируйте схемы для каждого поставщика и резервной модели в пуле маршрутизации.
  • Запишите, какая версия схемы использовалась для каждого побочного действия.
  • Управление версиями становится особенно важным для агентств, реселлеров и средств автоматизации Partner API, где многие последующие клиенты могут зависеть от стабильного структурированного контракта.

    Когда не следует выполнять структурированный результат

    Используйте жесткую остановку при возникновении любого из следующих условий:

    <ул>
  • Ответ не поддается анализу.
  • Объект не прошел проверку схемы JSON.
  • Значение перечисления не поддерживается или придумано.
  • Невозможно указать количество, цену, дату или валюту.
  • Результат противоречит заявленному намерению пользователя.
  • Модель демонстрирует низкую достоверность или отсутствие доказательств.
  • Инструкция пользователя неоднозначна.
  • Действие имеет побочные эффекты и не имеет подтверждения.
  • Аккаунт, команда или ключ API не авторизованы.
  • Ответ поставщика включает отказ или отсутствие ответа по соображениям безопасности.
  • Рекомендации и прогнозы

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

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

    Контрольный список практических действий

    <ол>
  • Определите формат запроса нормализованного структурированного вывода для своих приложений.
  • Создайте матрицу возможностей поставщика для каждой модели в вашем пуле маршрутизации.
  • Разрабатывайте схемы с использованием переносимого подмножества схем JSON.
  • Перевести запросы в строгие механизмы, встроенные в поставщика, если они поддерживаются.
  • Проверка синтаксического анализа, соответствия схемы и бизнес-корректности после создания.
  • Используйте вызовы инструментов для побочных эффектов.
  • Требовать авторизацию, идемпотентность и подтверждение вне модели.
  • Версия схемы журнала, поставщик, ошибки проверки, повторные попытки, задержка, стоимость и статус действия.
  • Определите резервное поведение в зависимости от уровня риска рабочего процесса.
  • Сохраняйте старые схемы доступными до тех пор, пока не будут перенесены зависимые средства автоматизации.
  • Практическая цель состоит не в том, чтобы заставить каждую модель вести себя одинаково. Цель заключается в том, чтобы предоставить разработчикам приложений один стабильный контракт, в то время как шлюз честно обрабатывает различия между поставщиками. Структурированные выходные данные — это необходимая инфраструктура для надежной автоматизации ИИ, но производственная граница — это валидатор и уровень политики, который решает, безопасно ли использовать объект.

    Связанное чтение

    FAQ

    Часто задаваемые вопросы

    Достаточно ли режима JSON для производства структурированных результатов?
    Режим JSON может уменьшить количество ошибок синтаксического анализа, но сам по себе он не гарантирует, что ответ соответствует вашей схеме или бизнес-правилам. Используйте проверку схемы и семантическую проверку перед принятием результата.
    Должны ли действия использовать структурированные ответы JSON или вызовы инструментов?
    По возможности используйте вызовы инструментов для действий. Вызов инструмента дает приложению структурированный запрос на проверку, авторизацию и выполнение. Модель не должна напрямую оказывать побочные эффекты.
    Что должен делать шлюз, если провайдер не поддерживает строго структурированные выходные данные?
    Он должен перенаправиться на совместимую модель, явно перейти на более раннюю версию только тогда, когда это позволяет риск, проверить и повторить попытку, если это необходимо, или отправить задачу на проверку человеком. Он не должен молча рассматривать слабые ограничения JSON как строгие гарантии схемы.
    Зачем нужна семантическая проверка, если схема JSON прошла успешно?
    Схема JSON может проверять форму, типы, обязательные поля и некоторые ограничения. Он не может надежно определить, соответствует ли объект намерениям пользователя, политике компании, правилам авторизации, правилам ценообразования или реальной осуществимости.