Структурирани изходи в многомоделен API Gateway: JSON схема, извиквания на инструменти и семантични предпазни огради
Практичен модел на адаптер за надеждни структурирани изходи в множество доставчици на LLM: нормализиране на схеми, валидиране на отговорите, обработка на извиквания на инструменти, грешки в регистрационните файлове и блокиране на небезопасни действия, преди да достигнат производствените работни потоци.
Подканването на модел да „върне JSON“ не е производствен договор. Може да произведе валиден JSON с грешно enum, да пропусне изисквано бизнес правило или уверено да поиска действие, което потребителят никога не е упълномощил. В работен процес с множество доставчици проблемът става по-труден: всеки доставчик излага различни механизми за структуриран изход и използване на инструменти и всеки поддържа само част от вселената на JSON Schema.
Практическото решение не е една магическа подкана. Това е модел на слоест шлюз: нормализирайте желаната от програмиста схема, преведете я във формати за структуриран изход или извикване на инструменти, където е възможно, проверете върнатия обект и приложете семантични предпазни парапети преди някакъв страничен ефект.
Това ръководство разделя три различни цели, които често се смесват:
- Валидност на синтаксиса: отговорът е анализируем JSON.
- Валидност на схемата: JSON съответства на задължителните полета, типове, изброявания и структурни правила.
- Бизнес коректност: обектът е безопасен, верен на потребителските намерения и валиден за действие надолу по веригата.
Производствената грешка: валиден JSON, грешно действие
Помислете за автоматизирана поддръжка, която маршрутизира входящите билети:
<пре><код>{ "ticket_id": "t_481", "категория": "фактуриране", "приоритет": "спешно", "действие": "refund_customer", "сума_usd": 499 }Този обект е синтактично валиден. Може дори да предаде проста схема, ако action е низ, а amount_usd е число. Но все още може да е грешно. Може би клиентът е поискал само копие от фактура. Може би възстановяванията над $100 изискват одобрение от мениджъра. Може би потребителят изобщо не е упълномощен да задейства възстановяване на средства.
Структурираните изходи намаляват неуспешните анализи. Те не заместват оторизацията, проверките на правилата, проверките на инвентара, проверките на цените, идемпотентността или човешко потвърждение за рискови операции.
Факти: какво обещават и какво не обещават режимите на структуриран изход на доставчика
Пейзажът на доставчика се променя бързо, но няколко стабилни факта са от значение за архитектурата:
- Режимът JSON може да помогне за създаването на валиден JSON, но валидният JSON не е същото като съответствие с конкретна схема.
- Режимите на структурирани изходни данни на доставчика са предназначени да подобрят придържането към схемата, но обикновено поддържат само подмножество от JSON схема.
- Извикването на инструмент обикновено е по-подходящо за действия от JSON в свободна форма, тъй като моделът избира деклариран инструмент и връща структурирани аргументи, докато приложението остава отговорно за изпълнението.
- Различните доставчици излагат различни договори. Един може да използва строг формат на отговор на JSON схема, друг може да използва схеми за въвеждане на инструмент, а трети може да изисква резервен вариант за валидиране и повторен опит.
- Дори изходът, валиден за схема, може да бъде семантично грешен, преди да достигне до база данни, работен процес или платено действие.
Архитектурното значение е просто: API, съвместим с OpenAI може да стандартизира клиентския интерфейс, но нивото на надеждност все още трябва да разбира възможностите на доставчика и да валидира изходните данни след генерирането.
Препоръчителна архитектура: адаптерът за структуриран изход
Използвайте адаптер от страната на шлюза между кода на приложението и API на доставчика. Приложението изпраща едно намерение за схема. Шлюзът картографира това намерение към най-силния поддържан механизъм на доставчик.
1. Приемете една нормализирана заявка от приложението
Клиентът не трябва да се нуждае от отделни пътеки на код за всеки доставчик. Практическият плик за заявка включва предпочитанието за модела, въвеждането на задачата, схемата, метаданните на схемата и нивото на риск:
<пре><код>{ "модел": "автоматично:точно", "съобщения": [ {"role": "system", "content": "Извличане на полетата на фактурата. Не правете извод за липсващи стойности."}, {"role": "user", "content": "Текст на фактура..."} ], "структуриран_изход": { "schema_id": "извличане на фактура", "schema_version": "2026-08-01", "режим": "json_схема", "строг": вярно, "схема": { "тип": "обект", "additionalProperties": невярно, "задължително": ["номер_на_фактура", "име_доставчик", "общо", "валута", "срок_на_падеж"], "свойства": { "invoice_number": {"тип": "низ"}, "име_доставчик": {"тип": "низ"}, "общо": {"тип": "число", "минимум": 0}, "currency": {"type": "string", "enum": ["USD", "EUR", "GBP"]}, "due_date": {"тип": "низ", "формат": "дата"}, "confidence": {"type": "number", "minimum": 0, "maximum": 1} } } }, "метаданни": { "работен процес": "платими сметки", "ниво_на_риск": "средно" } }Този договор дава на шлюза достатъчно информация, за да избере внедряване на доставчика, да изпълни валидиране и да регистрира значими данни за грешки.
2. Поддържайте матрица на възможностите на доставчик
Шлюзът трябва да поддържа машинно четима матрица на възможностите, а не да разчита на предположения като „всички модели, съвместими с OpenAI, поддържат едно и също поведение на схемата“. Една полезна матрица включва:
- Име на доставчик и модел.
- Поддържа JSON режим.
- Поддържа формат на отговор JSON Schema.
- Поддържа извиквания на инструменти.
- Поддържа строг режим на схема.
- Ограничения на поднабора на известна JSON схема.
- Дали извикванията на паралелни инструменти са съвместими с режим на стриктна схема.
- Резервно поведение, когато заявеният режим не се поддържа.
Примерен запис на възможност:
<пре><код>{ "доставчик": "доставчик_a", "модел": "модел_x", "json_mode": вярно, "json_schema_response": вярно, "tool_calls": вярно, "строга_схема": вярно, "schema_limitations": ["no oneOf", "ограничено валидиране на формат"], "резервен": "отхвърляне_или_насочване_към_съвместим_модел" }Тази матрица трябва да бъде версияна и тествана. Когато доставчик промени поведението си или се добави нов модел, съвместимостта на структурирания изход трябва да бъде проверена преди производствения маршрут.
3. Превод на най-силния роден договор за доставчик
Адаптерът трябва да следва ясен ред на предпочитанията:
- Използване на строги структурирани изходи на доставчика, когато се поддържат от избрания модел и схема.
- Използване на извикване на инструмент за действия и подобни на функции задачи.
- Използвайте нестриктно структуриран изход или JSON режим с проверка и повторни опити, когато строг режим не е наличен.
- Отхвърлете заявката, насочете към съвместим резервен модел или върнете отговор без действие за високорискови работни потоци.
Не понижавайте безшумно високорискова операция от режим на стриктна схема до „най-добър JSON“. Ако приложението поиска стриктно поведение и избраният доставчик не може да го поддържа, шлюзът трябва да направи това видимо чрез грешка, решение за маршрутизиране или изричен флаг за понижаване.
Три слоя за валидиране преди изпълнение
Слой 1: проверка на анализа
Първо определете дали отговорът може да бъде анализиран в очакваната обвивка. Бърз отказ при неправилно образуван JSON, липсващи блокове за извикване на инструменти, съкратени отговори или смесен естествен език и JSON, когато договорът го забранява.
function parseStructuredResponse(raw) {
опитай {
return {ok: true, value: JSON.parse(raw)};
} улов (грешка) {
return {ok: false, failure_type: "parse_failure", error: String(error) };
}
}
Извикванията на собствения инструмент на доставчика може да не изискват анализиране на сурова текстова петна, но все пак изискват проверка на обвивката: моделът избра ли известен инструмент, предостави ли аргументи и спря ли за изпълнение на инструмента, както се очаква?
Слой 2: Проверка на JSON схема
След това проверете обекта спрямо декларираната схема, като използвате валидатор от страната на сървъра. Направете това дори когато доставчикът твърди, че поддържа стриктна схема. Валидирането от страна на шлюза ви дава последователно регистриране на грешки, предпазва от грешки при интегриране и улавя несъвместимости надолу по веригата.
const validate = schemaValidator.compile(schema);
const valid = валидиране (обект);
if (!valid) {
връщане {
добре: невярно,
error_type: "schema_failure",
грешки: validate.errors
};
}
За преносимост, проектирайте схеми, като имате предвид общото подмножество:
- Предпочитайте изричен
type,required,properties,enumиadditionalProperties: false. - Избягвайте сложни комбинации като дълбоко вложени
oneOf,anyOfи условни схеми, освен ако не знаете, че целевият доставчик ги поддържа. - Поддържайте аргументите за действие малки и конкретни.
- Използвайте низове за идентификатори, дати и кодове, освен ако системите надолу по веригата не изискват друг тип.
- Изрично представяне на несигурността с полета като
confidence,missing_fieldsилиrequires_human_review.
Слой 3: семантично и бизнес валидиране
Накрая проверете дали структурираният резултат е правилен за задачата. Този слой е специфичен за домейн и не може да бъде възложен само на JSON Schema.
За извличане на фактури семантичните проверки могат да включват:
- Общата сума е неотрицателна и съответства на договорените позиции в рамките на толеранс.
- Валутата се показва в изходния документ.
- Не е невъзможно крайният срок да е далеч в миналото или бъдещето.
- Доставчикът съществува в одобрен списък с доставчици.
- Доверието е достатъчно високо за автоматично въвеждане.
За квалификация на потенциален клиент проверките могат да включват:
- Избраният сегмент е един от активните сегменти на екипа по продажбите.
- Заявеният бюджет не е измислен, когато потребителят не е предоставил такъв.
- Действие „демонстрация на книга“ не се изпълнява, освен ако потребителят изрично не го поиска.
За автоматизацията на API за партньори проверките може да включват:
- Профилът на дистрибутора е упълномощен да създаде искания клиент или ключ.
- Заявеният лимит на разходите е в рамките на политиката на партньора.
- Операцията има ключ за идемпотентност.
- Действието се записва в журнал за проверка преди изпълнение.
Извиквания на инструмент: третирайте изхода на модела като заявка, а не като изпълнение
Извикването на инструмент е правилният модел, когато моделът трябва да поиска от приложението да направи нещо: създаване на билет, изпращане на команда на Telegram бот, търсене на цени, актуализиране на клиентски запис или стартиране на работен процес.
Безопасен цикъл на инструмента изглежда така:
- Приложението декларира наличните инструменти и техните входни схеми.
- Моделът връща извикване на инструмент със структурирани аргументи.
- Шлюзът проверява името и аргументите на инструмента.
- Приложението проверява изискванията за оторизация, политика, идемпотентност и потребителско потвърждение.
- Само тогава приложението изпълнява инструмента.
- Резултатът от инструмента се изпраща обратно към модела, ако разговорът трябва да продължи.
Никога не приемайте извикване на инструмент като доказателство, че действието трябва да се случи. Отнасяйте се към него като към структурирано предложение. Приложението остава органът за странични ефекти.
Безопасна резервна стълба за работни процеси с множество модели
Шлюзът трябва да дефинира резервно поведение, преди да възникнат инциденти. Една практична стълба е:
- Основно: строго структуриран изход на предпочитания модел.
- Съвместим резервен вариант: друг модел, който поддържа същите строги изисквания към схемата.
- Проверка и повторен опит: доставчик без стриктна поддръжка, използван само когато рискът го позволява.
- Човешки преглед: поставете структурирания резултат и изходното съдържание на опашка за одобрение.
- Отговор без действие: обяснете, че системата не може безопасно да завърши операцията.
Повторните опити са полезни за форматиране или незначителни грешки в схемата, но не са стратегия за безопасност. Ако обектът е семантично опасен, многократното подканване може да превърне правилното отхвърляне в опасен изпълним обект. За високорискови действия предпочитайте преразглеждане или отказ пред многократни опити за принудителен успех.
Наблюдаемост: регистрирайте всяко решение за структуриран изход
Повредите в структурирания изход са оперативни сигнали. Регистрирайте ги с достатъчно подробности, за да подобрите маршрутизирането, схемите и подканите, без да излагате ненужно чувствително съдържание.
Препоръчителни полета:
schema_idиschema_version.- Доставчик и модел.
- Заявен режим и действително използван режим.
- Състояние на неуспешен анализ.
- Състояние на грешка на схемата и грешки при валидиране.
- Причина за неуспешно семантично валидиране.
- Брой повторни опити.
- Закъснение.
- Използване на токени и цена.
- Състояние на крайно действие: изпълнено, на опашка, отхвърлено или върнато на потребителя.
- Екип, проект, API ключ или идентификатор на акаунт на партньор, където е подходящо.
Тези регистрационни файлове поддържат отстраняване на грешки, анализ на разходите, сравнение на доставчици и управление на API на екипа. Те също така помагат да се отговори на въпроси като: „Коя версия на схема причинява най-много повторни опити?“ и „Кой резервен модел предава синтаксиса, но не успява да премине валидирането на бизнеса?“
Правила за версия на схема
Схемите са производствени интерфейси. Третирайте ги като API договори.
- Включете
schema_idиschema_versionв метаданните и регистрационните файлове на заявката. - Не променяйте тихо задължителните полета за съществуващи автоматизации.
- Запазете старите схеми налични, докато клиентите мигрират.
- Добавете нови незадължителни полета, преди да ги направите задължителни.
- Тествайте схеми срещу всеки доставчик и резервен модел в групата за маршрутизиране.
- Запишете коя версия на схемата е използвана за всяко действие със страничен ефект.
Версионирането става особено важно за агенции, дистрибутори и автоматизация на API на партньори, където много клиенти надолу по веригата може да разчитат на стабилен структуриран договор.
Кога да не се изпълнява структуриран резултат
Използвайте твърдо спиране, когато се появи някое от следните условия:
- Отговорът не може да се анализира.
- Обектът не е преминал проверката на JSON Schema.
- Стойност enum не се поддържа или е измислена.
- Количество, цена, дата или валута са невъзможни.
- Резултатът противоречи на заявеното намерение на потребителя.
- Моделът изразява ниска увереност или липсващи доказателства.
- Потребителските инструкции са двусмислени.
- Действието има странични ефекти и липсва потвърждение.
- Акаунтът, екипът или ключът за API не са оторизирани.
- Отговорът на доставчика включва отказ или неотговор, свързан с безопасността.
Препоръки срещу прогнози
Препоръки: използвайте родни за доставчика структурирани изходи, когато има такива, проверете всеки отговор от страна на шлюза, предпочитайте извиквания на инструменти за действия, поддържайте матрица на възможностите, схеми на версиите и блокирайте странични ефекти, докато семантичните проверки не преминат.
Прогнози: поддръжката на доставчика за структурирани изходи вероятно ще стане по-силна и по-последователна, но преносимостта ще остане проблем за шлюза, тъй като семействата модели, подмножествата на схемите и циклите за извикване на инструменти няма да станат идентични за една нощ. Екипите, които изграждат валидиране, наблюдение и версия на схема сега, ще бъдат в по-добра позиция да приемат нови функции на доставчика, без да пренаписват всеки работен процес.
Контролен списък за приложимо внедряване
- Дефинирайте нормализиран формат на искане за структуриран изход за вашите приложения.
- Създайте матрица на възможностите на доставчика за всеки модел във вашия пул за маршрутизиране.
- Проектирайте схеми с помощта на преносим поднабор от JSON схеми.
- Превеждайте заявките към стриктни местни механизми на доставчика, когато се поддържат.
- Потвърдете анализируемостта, съответствието на схемата и бизнес коректността след генериране.
- Използвайте извиквания на инструменти за операции със страничен ефект.
- Изискване на оторизация, идемпотентност и потвърждение извън модела.
- Версия на схемата на регистрационния файл, доставчик, неуспешни проверки, повторни опити, забавяне, цена и състояние на действие.
- Дефинирайте резервното поведение според нивото на риск от работния процес.
- Запазете наличните стари схеми, докато зависимите автоматизации не мигрират.
Практическата цел не е всеки модел да се държи еднакво. Целта е да се даде на разработчиците на приложения един стабилен договор, докато шлюзът се справя честно с различията между доставчиците. Структурираните изходи са необходима инфраструктура за надеждна автоматизация на AI, но производствената граница е валидаторът и слоят на правилата, който решава дали даден обект е безопасен за използване.