Vejledning og indsigt

Strukturerede udgange i en multi-model API-gateway: JSON-skema, værktøjskald og semantiske beskyttelseslister

Et praktisk adaptermønster til pålidelige strukturerede output på tværs af flere LLM-udbydere: normaliser skemaer, valider svar, håndter værktøjsopkald, logfejl og bloker usikre handlinger, før de når produktionsarbejdsgange.

At bede en model om at "returnere JSON" er ikke en produktionskontrakt. Det kan producere gyldig JSON med den forkerte enum, udelade en påkrævet forretningsregel eller trygt anmode om en handling, som brugeren aldrig har godkendt. I en arbejdsgang med flere udbydere bliver problemet sværere: hver udbyder afslører forskellige strukturerede output- og værktøjsbrugsmekanismer, og hver enkelt understøtter kun en del af JSON Schema-universet.

Den praktiske løsning er ikke én magisk prompt. Det er et lagdelt gateway-mønster: normaliser udviklerens ønskede skema, oversæt det til udbyder-native strukturerede output- eller tool-call-formater, hvor det er muligt, valider det returnerede objekt, og anvend semantiske autoværn før enhver bivirkning.

Denne vejledning adskiller tre forskellige mål, der ofte blandes sammen:

  • Syntaksvaliditet: svaret er parseable JSON.
  • Skemavaliditet: JSON matcher påkrævede felter, typer, opregninger og strukturelle regler.
  • Forretningsmæssig korrekthed: Objektet er sikkert, trofast over for brugerens hensigt og gyldigt for downstream-handlingen.

Produktionsfejlen: gyldig JSON, forkert handling

Overvej en supportautomatisering, der dirigerer indgående billetter:

{ "ticket_id": "t_481", "category": "fakturering", "priority": "haster", "action": "refund_customer", "amount_usd": 499 }

Dette objekt er syntaktisk gyldigt. Det kan endda sende et simpelt skema, hvis handling er en streng og amount_usd er et tal. Men det kan stadig være forkert. Måske bad kunden kun om en fakturakopi. Måske kræver refusion over 100 USD managerens godkendelse. Måske er brugeren slet ikke autoriseret til at udløse refusioner.

Strukturerede output reducerer parse-fejl. De erstatter ikke autorisation, politikkontrol, lagerkontrol, priskontrol, idempotens eller menneskelig bekræftelse for risikable operationer.

Fakta: hvad udbyderens strukturerede output-tilstande gør og ikke lover

Udbyderlandskabet ændrer sig hurtigt, men flere stabile fakta har betydning for arkitekturen:

  • JSON-tilstand kan hjælpe med at producere gyldig JSON, men gyldig JSON er ikke det samme som overensstemmelse med et specifikt skema.
  • Provider-native strukturerede output-tilstande er designet til at forbedre skemaoverholdelse, men de understøtter normalt kun et undersæt af JSON-skema.
  • Værktøjsopkald passer normalt bedre til handlinger end JSON i frit format, fordi modellen vælger et erklæret værktøj og returnerer strukturerede argumenter, mens applikationen forbliver ansvarlig for udførelse.
  • Forskellige udbydere afslører forskellige kontrakter. Én kan bruge et strengt JSON-skema-svarformat, en anden kan bruge værktøjsinputskemaer, og en anden kan kræve en validering-og-forsøg igen.
  • Selv skema-gyldigt output kan være semantisk forkert, før det når en database, workflow eller betalt handling.

Den arkitektoniske implikation er enkel: en OpenAI-kompatibel API kan standardisere klientgrænsefladen, men pålidelighedslaget skal stadig forstå udbyderens muligheder og validere output efter generering.

Anbefalet arkitektur: den strukturerede output-adapter

Brug en adapter på gateway-siden mellem applikationskode og udbyder-API'er. Applikationen sender én skemahensigt. Gatewayen kortlægger den hensigt til den stærkest understøttede udbydermekanisme.

1. Accepter en normaliseret anmodning fra applikationen

Klienten bør ikke have brug for separate kodestier for hver udbyder. En praktisk anmodningskonvolut inkluderer modelpræference, opgaveinput, skema, skemametadata og risikoniveau:

{ "model": "auto:præcis", "beskeder": [ {"role": "system", "content": "Udtræk fakturafelter. Udled ikke manglende værdier."}, {"role": "user", "content": "Fakturatekst..."} ], "struktureret_output": { "schema_id": "invoice_extraction", "schema_version": "2026-08-01", "mode": "json_schema", "streng": sandt, "skema": { "type": "objekt", "additionalProperties": falsk, "required": ["fakturanummer", "leverandørnavn", "total", "valuta", "forfaldsdato"], "egenskaber": { "invoice_number": {"type": "streng"}, "vendor_name": {"type": "streng"}, "total": {"type": "antal", "minimum": 0}, "currency": {"type": "string", "enum": ["USD", "EUR", "GBP"]}, "due_date": {"type": "streng", "format": "dato"}, "confidence": {"type": "antal", "minimum": 0, "maksimum": 1} } } }, "metadata": { "workflow": "kreditorer", "risk_level": "medium" } }

Denne kontrakt giver gatewayen nok information til at vælge en udbyderindbygget implementering, køre validering og logge meningsfulde fejldata.

2. Vedligehold en matrix for udbyderkapacitet

Gatewayen skal have en maskinlæsbar kapacitetsmatrix, ikke stole på antagelser som "alle OpenAI-kompatible modeller understøtter den samme skemaadfærd." En nyttig matrix omfatter:

  • Udbyder og modelnavn.
  • Understøtter JSON-tilstand.
  • Understøtter JSON Schema-svarformat.
  • Understøtter værktøjsopkald.
  • Understøtter streng skematilstand.
  • Kendte JSON Schema undersæt begrænsninger.
  • Om parallelle værktøjskald er kompatible med streng skematilstand.
  • Tilbagegangsadfærd, når den anmodede tilstand ikke understøttes.

Eksempel på kapacitetsregistrering:

{ "udbyder": "udbyder_a", "model": "model_x", "json_mode": sand, "json_schema_response": sandt, "tool_calls": sandt, "strict_schema": sandt, "schema_limitations": ["no oneOf", "begrænset formatvalidering"], "fallback": "afvis_eller_rute_til_kompatibel_model" }

Denne matrix skal være versioneret og testet. Når en udbyder ændrer adfærd, eller en ny model tilføjes, skal struktureret output-kompatibilitet verificeres før produktionsdirigering.

3. Oversæt til den stærkeste udbyder-native kontrakt

Adapteren skal følge en klar præferencerækkefølge:

  1. Brug strenge udbyder-native strukturerede output, når det understøttes af den valgte model og skema.
  2. Brug udbyder-native værktøj, der kræver handlinger og funktionslignende opgaver.
  3. Brug ikke-streng struktureret output eller JSON-tilstand med validering og forsøg igen, når streng tilstand ikke er tilgængelig.
  4. Afvis anmodningen, diriger til en kompatibel reservemodel, eller returner et ikke-handlingssvar for højrisiko-arbejdsgange.

Undgå stille og roligt at nedgradere en højrisiko-operation fra streng skematilstand til "best effort JSON". Hvis applikationen anmodede om streng adfærd, og den valgte udbyder ikke kan understøtte det, bør gatewayen gøre det synligt gennem en fejl, routingbeslutning eller eksplicit nedgraderingsflag.

Tre valideringslag før udførelse

Laag 1: parse validering

Først skal du bestemme, om svaret kan parses i den forventede konvolut. Mislykkes hurtigt på forkert udformet JSON, manglende værktøjsopkaldsblokke, trunkerede svar eller blandet naturligt sprog og JSON, når kontrakten forbyder det.

funktion parseStructuredResponse(rå) {
  prøv {
    return { ok: sand, værdi: JSON.parse(rå) };
  } fange (fejl) {
    return { ok: false, failure_type: "parse_failure", fejl: String(error) };
  }
}

Udbyder-native værktøjskald kræver muligvis ikke parsing af en rå tekst-blob, men de kræver stadig kuvertvalidering: valgte modellen et kendt værktøj, gav den argumenter, og stoppede den for værktøjsudførelse som forventet?

Lag 2: JSON-skemavalidering

Næste, valider objektet mod det erklærede skema ved hjælp af en server-side validator. Gør dette, selv når udbyderen hævder streng skemaunderstøttelse. Gateway-sidevalidering giver dig konsekvent fejllogning, beskytter mod integrationsfejl og fanger downstream-inkompatibiliteter.

const validate = schemaValidator.compile(schema);
const valid = valider(objekt);
if (!valid) {
  returnere {
    ok: falsk,
    fejltype: "skema_fejl",
    fejl: valider.fejl
  };
}

For portabilitet skal du designe skemaer med den fælles undergruppe i tankerne:

  • Foretrækker eksplicit type, påkrævet, egenskaber, enum og additionalProperties: false.
  • Undgå komplekse kombinationer såsom dybt indlejrede oneOf, anyOf og betingede skemaer, medmindre du ved, at måludbyderen understøtter dem.
  • Hold handlingsargumenter små og konkrete.
  • Brug strenge til id'er, datoer og koder, medmindre downstream-systemer kræver en anden type.
  • Repræsenter usikkerhed eksplicit med felter såsom tillid, missing_fields eller requires_human_review.

Lag 3: semantisk og forretningsvalidering

Valider endelig, om det strukturerede resultat er korrekt for opgaven. Dette lag er domænespecifikt og kan ikke outsources til JSON Schema alene.

For fakturaudtræk kan semantiske kontroller omfatte:

  • Totalen er ikke-negativ og matcher linjeposter inden for tolerance.
  • Valutaen vises i kildedokumentet.
  • Forfaldsdatoen ligger ikke umuligt langt i fortiden eller fremtiden.
  • Sælgeren findes på en godkendt leverandørliste.
  • Konfidensen er høj nok til automatisk indtastning.

For leadkvalificering kan kontroller omfatte:

  • Det valgte segment er et af salgsteamets aktive segmenter.
  • Det anmodede budget er ikke opfundet, når brugeren ikke har angivet et.
  • En "bogdemo"-handling udføres ikke, medmindre brugeren udtrykkeligt har bedt om det.

For Partner API-automatisering kan kontroller omfatte:

  • Forhandlerkontoen er autoriseret til at oprette den ønskede kunde eller nøgle.
  • Den anmodede forbrugsgrænse er inden for partnerpolitikken.
  • Handlingen har en idempotensnøgle.
  • Handlingen registreres i en revisionslog før udførelse.

Værktøjskald: Behandl modeloutput som en anmodning, ikke en udførelse

Værktøjsopkald er det rigtige mønster, når modellen skal bede applikationen om at gøre noget: oprette en billet, sende en Telegram-botkommando, slå priser op, opdatere en kunderegistrering eller starte en arbejdsgang.

En sikker værktøjsløkke ser sådan ud:

  1. Applikationen erklærer tilgængelige værktøjer og deres inputskemaer.
  2. Modellen returnerer et værktøjskald med strukturerede argumenter.
  3. Gatewayen validerer værktøjets navn og argumenter.
  4. Applikationen kontrollerer krav til godkendelse, politik, idempotens og brugerbekræftelse.
  5. Kun derefter udfører applikationen værktøjet.
  6. Værktøjsresultatet sendes tilbage til modellen, hvis samtalen skal fortsætte.

Behandl aldrig et værktøjskald som et bevis på, at handlingen skulle ske. Behandl det som et struktureret forslag. Ansøgningen forbliver autoriteten for bivirkninger.

Sikker reservestige til arbejdsgange med flere modeller

En gateway bør definere fallback-adfærd, før der opstår hændelser. En praktisk stige er:

  1. Primær: strengt struktureret output på den foretrukne model.
  2. Kompatibel reserve: en anden model, der understøtter de samme strenge skemakrav.
  3. Validering og prøv igen: en udbyder uden streng support, der kun bruges, når risikoen tillader det.
  4. Menneskelig gennemgang: Sæt det strukturerede resultat og kildeindhold i kø for godkendelse.
  5. Ikke-handling: forklar, at systemet ikke kan fuldføre handlingen sikkert.

Gentageforsøg er nyttige til formatering eller mindre skemafejl, men de er ikke en sikkerhedsstrategi. Hvis objektet er semantisk usikkert, kan gentagne prompter gøre en korrekt afvisning til et farligt eksekverbart objekt. For højrisikohandlinger skal du foretrække anmeldelse eller afvisning frem for gentagne forsøg på at fremtvinge succes.

Observabilitet: Log hver beslutning om struktureret output

Strukturerede outputfejl er operationelle signaler. Log dem med nok detaljer til at forbedre routing, skemaer og prompter uden at afsløre unødvendigt følsomt indhold.

Anbefalede felter:

  • schema_id og schema_version.
  • Udbyder og model.
  • Anmodet tilstand og faktisk anvendt tilstand.
  • Status for Analysefejl.
  • Skemafejlstatus og valideringsfejl.
  • Årsag til fejl ved semantisk validering.
  • Prøv at tælle igen.
  • Latens.
  • Tokenbrug og pris.
  • Endelig handlingsstatus: udført, sat i kø, afvist eller returneret til bruger.
  • Team-, projekt-, API-nøgle eller partnerkonto-id, hvor det er relevant.

Disse logfiler understøtter fejlfinding, omkostningsanalyse, udbydersammenligning og team-API-styring. De hjælper også med at besvare spørgsmål som: "Hvilken skemaversion forårsager flest genforsøg?" og "Hvilken reservemodel passerer syntaks, men fejler forretningsvalidering?"

Regler for skemaversionering

Skemaer er produktionsgrænseflader. Behandl dem som API-kontrakter.

  • Inkluder schema_id og schema_version i anmodningens metadata og logfiler.
  • Rediger ikke de obligatoriske felter for eksisterende automatiseringer uden lyd.
  • Hold gamle skemaer tilgængelige, mens klienter migrerer.
  • Tilføj nye valgfrie felter, før du gør dem obligatoriske.
  • Test skemaer mod alle udbydere og reservemodeller i routingpuljen.
  • Registrer, hvilken skemaversion der blev brugt til hver bivirkning.

Versionering bliver især vigtigt for bureauer, forhandlere og Partner API-automatisering, hvor mange downstream-kunder kan være afhængige af en stabil struktureret kontrakt.

Hvornår skal et struktureret resultat ikke udføres

Brug et hårdt stop, når en af følgende forhold opstår:

  • Svaret kan ikke parses.
  • Objektet mislykkes i JSON-skemavalidering.
  • En enum-værdi er ikke understøttet eller opfundet.
  • En mængde, pris, dato eller valuta er umulig.
  • Resultatet er i konflikt med brugerens erklærede hensigt.
  • Modellen udtrykker lav tillid eller manglende beviser.
  • Brugervejledningen er tvetydig.
  • Handlingen har bivirkninger og mangler bekræftelse.
  • Kontoen, teamet eller API-nøglen er ikke autoriseret.
  • Udbyderens svar inkluderer et afslag eller sikkerhedsrelateret ikke-svar.

Anbefalinger vs. forudsigelser

Anbefalinger: brug udbyder-native strukturerede output, hvor de er tilgængelige, valider hver responsgateway-side, foretræk værktøjsopkald til handlinger, vedligehold en kapacitetsmatrix, versionsskemaer og bloker for bivirkninger, indtil semantiske kontroller bestået.

Forudsigelser: Udbyderstøtte til strukturerede output vil sandsynligvis blive stærkere og mere konsistent, men portabilitet vil forblive et gatewayproblem, fordi modelfamilier, skemaundersæt og værktøjsopkaldsløkker ikke bliver identiske fra den ene dag til den anden. Teams, der bygger validering, observerbarhed og skemaversionering nu, vil være bedre positioneret til at indføre nye udbyderfunktioner uden at omskrive hver arbejdsgang.

Tjekliste for handlingsegnet implementering

  1. Definer et normaliseret struktureret output-anmodningsformat for dine applikationer.
  2. Opret en matrix for udbyderegenskaber for hver model i din routingpulje.
  3. Design skemaer ved hjælp af et bærbart JSON Schema-undersæt.
  4. Oversæt anmodninger til strenge udbyderindbyggede mekanismer, når de understøttes.
  5. Valider parsebarhed, skemaoverensstemmelse og forretningskorrekthed efter generation.
  6. Brug værktøjsopkald til bivirkninger.
  7. Kræv autorisation, idempotens og bekræftelse uden for modellen.
  8. Logskemaversion, udbyder, valideringsfejl, genforsøg, forsinkelse, omkostninger og handlingsstatus.
  9. Definer fallback-adfærd efter risikoniveau for arbejdsgange.
  10. Hold gamle skemaer tilgængelige, indtil afhængige automatiseringer migrerer.

Det praktiske mål er ikke at få alle modeller til at opføre sig identisk. Det er at give applikationsudviklere én stabil kontrakt, mens gatewayen håndterer udbyderforskelle ærligt. Strukturerede output er nødvendig infrastruktur for pålidelig AI-automatisering, men produktionsgrænsen er validatoren og politiklaget, der afgør, om et objekt er sikkert at bruge.

Relateret læsning

FAQ

Ofte stillede spørgsmål

Er JSON-tilstand nok til produktionsstrukturerede output?
JSON-tilstand kan reducere parse-fejl, men den garanterer ikke i sig selv, at svaret er i overensstemmelse med dit skema eller forretningsregler. Brug skemavalidering og semantisk validering, før du accepterer resultatet.
Skal handlinger bruge strukturerede JSON-svar eller værktøjskald?
Brug værktøjsopfordringer til handlinger, når det er muligt. Et værktøjskald giver applikationen en struktureret anmodning om at validere, autorisere og udføre. Modellen bør ikke direkte udføre bivirkninger.
Hvad skal en gateway gøre, når en udbyder ikke understøtter strenge strukturerede output?
Den bør dirigere til en kompatibel model, kun eksplicit nedgradere, når risikoen tillader det, validere og prøve igen, hvis det er relevant, eller sende opgaven til menneskelig gennemgang. Den bør ikke stille behandle svage JSON-begrænsninger som strenge skemagarantier.
Hvorfor er semantisk validering nødvendig, hvis JSON-skemaet består?
JSON Schema kan kontrollere form, typer, obligatoriske felter og nogle begrænsninger. Det kan ikke pålideligt afgøre, om objektet matcher brugerhensigt, virksomhedspolitik, autorisationsregler, prissætningsregler eller gennemførlighed i den virkelige verden.