Hero Image full

Structured Outputs

7 min read
Content

Wat is Structured Outputs?

Structured outputs is een techniek die het antwoord van een taalmodel dwingt te voldoen aan een door de developer aangeleverd schema, typisch JSON Schema, zodat stroomafwaartse code het kan parsen zonder defensief gokken. In plaats van te hopen dat het model zijn antwoord correct formatteert, beperkt de API generatie zodat alleen schema-geldige output mogelijk is.

De belangrijkste punten

  • De garantie is syntactisch, afgedwongen op generatiemoment. Constrained decoding maskeert elk token dat het schema zou schenden, dus de output parset altijd en matcht altijd de gedeclareerde vorm.
  • Geldige structuur betekent geen correcte inhoud. Het model kan nog steeds een foute waarde in een perfect getypeerd veld zetten, dus evals en validatie van betekenis blijven jouw taak.
  • Structured outputs is wat LLM's composeerbaar maakt met gewone software. Pipelines, databases, en UI's consumeren modeloutput als data in plaats van proza te parsen.
  • Dezelfde machinerie drijft betrouwbare tool calling, want een tool-aanroep is zelf een schema-beperkt object.
  • Alle grote aanbieders leveren het in 2026, en accepteren over het algemeen JSON Schema direct of via getypeerde bindings zoals Pydantic en Zod in de SDK's.

Hoe het werkt

Een taalmodel genereert één token tegelijk door te samplen uit een waarschijnlijkheidsverdeling over zijn vocabulaire. Constrained decoding grijpt in die stap in. De aanbieder compileert je schema naar een grammatica, en op elke positie maskeert de engine elk token dat geen geldig vervolg kon beginnen. Als het schema zegt dat het volgende ding een sleutel genaamd "severity" moet zijn wiens waarde één van drie enum-strings is, zijn tokens die iets anders zouden produceren simpelweg niet beschikbaar om te samplen. Het model blijft kiezen uit wat overblijft, dus het resultaat is tegelijk vloeiend en schema-geldig.

Developers werken meestal een niveau hierboven. Je definieert een type in je taal, een Pydantic-model in Python of een Zod-schema in TypeScript, en de SDK zet het om naar JSON Schema, stuurt het mee met het verzoek, en deserialiseert het gegarandeerd-geldige antwoord terug naar een getypeerd object. Dat sluit de lus die vroeger het brosse deel van LLM-engineering was: geen regex-extractie uit markdown-fences, geen retry-lussen voor afgekapte JSON, geen try/except rond elke parse.

De praktische voetnoten gaan over semantiek en expressiviteit. Schemaconformiteit zegt niets over waarheid, dus kan een model een zelfverzekerd fout waarde teruggeven in het juiste veld, en een overbeperkt schema kan dat zelfs aanmoedigen door een antwoord te forceren waar "onbekend" eerlijk was. Goede schema's laten ruimte voor onzekerheid met optionele of nullable velden. Aanbiedersondersteuning voor JSON Schema is ook gedeeltelijk: bepaalde keywords en diep recursieve vormen kunnen afgewezen of genegeerd worden, dus zijn schema's het best plat en expliciet gehouden.

Voorbeeld

Een team bouwt een triage-pipeline die inkomende bugrapporten leest en tickets indient. Ze definiëren een schema: title (string, max 80 tekens), severity (enum: critical, major, minor), component (enum van twaalf services), reproduction_steps (array van strings), duplicate_of (nullable ticket-ID). Elk rapport gaat door het model met dat schema gekoppeld, en de output valt direct in de ticketing-API zonder parselaag. Voor structured outputs brak dezelfde pipeline wekelijks op markdown-verpakte JSON en verzonnen severity-labels zoals "high-ish". Erna verdween misvormde output als faalklasse, en de resterende fouten waren semantisch, zoals verkeerd beoordeelde ernst, die ze nu vangen met een kleine evalsuite.

Veelvoorkomende misvattingen

De terugkerende fout is "gegarandeerd geldig" lezen als "gegarandeerd juist". Structured outputs elimineert formatmislukkingen, en teams stoppen dan stilletjes met content controleren omdat de pipeline nooit meer crasht. Dat ruilt luide mislukkingen voor stille. Een gehallucineerde componentnaam is onmogelijk wanneer het veld een enum is, maar een foute keuze onder geldige enum-waarden niet, en die stroomt stroomafwaarts terwijl hij gezaghebbend oogt. Houd semantische validatie en evals in stand; het schema behandelt vorm, niets anders.

JSON-modus

JSON-modus is de voorganger en zwakkere neef van structured outputs, en veel API's bieden nog steeds beide. In JSON-modus is het model beperkt tot syntactisch geldige JSON afgeven, maar er wordt geen schema afgedwongen: sleutels kunnen ontbreken, hernoemd, of extra zijn, en types kunnen driften tussen aanroepen. Het loste het parse-fout-probleem op terwijl het vormprobleem openliet, wat betekende dat applicatiecode alles achteraf nog steeds valideerde. De kloof die het overplakt is reëel: een StructuredRAG-studie van 2024 mat een gemiddeld slagingspercentage van 82,55% over 24 experimenten die JSON-antwoordformattering testten, met per-taak-prestaties variërend van 0% tot 100% [1]. Structured outputs subsumeert het door je exacte schema af te dwingen tijdens decoding. In 2026 overleeft JSON-modus vooral voor snel verkennend werk waar een schema definiëren de moeite niet waard is, en aanbiedersdocumentatie stuurt productiegebruik richting schema-afgedwongen outputs. Als je een JSON-modus-antwoord tegen een schema valideert en opnieuw probeert bij mislukking, rol je met de hand wat structured outputs al doet.

FAQ

Schaadt het gebruik van structured outputs antwoordkwaliteit? Zware beperkingen kunnen interageren met redenering, want het model moet zich vastleggen op een rigide vorm terwijl het denkt. Een studie van 2024 naar formatbeperkingen vond dat de GSM8K-nauwkeurigheid van GPT-3.5-Turbo daalde van 76,60% in natuurlijke taal naar 49,25% wanneer geforceerd in JSON, een daling van 27 punten [2]. Een gangbare mitigatie is een vrije-tekst-veld opnemen voor redenering voor de antwoordvelden, of het model laten redeneren in een eerste doorgang en structuur extraheren in een tweede.

Kan ik structured outputs gebruiken voor streamende antwoorden? Ja. Aanbieders streamen schema-beperkte tokens zoals elke andere, en SDK's kunnen gedeeltelijk gevulde objecten tonen naarmate velden compleet raken. De consumerende code moet alleen onvolledige objecten tolereren tot de stream eindigt.

Wanneer moet ik tool calling gebruiken in plaats van structured outputs? Gebruik tool calling wanneer het model moet beslissen of en welke functie aan te roepen als deel van een agentlus. Gebruik structured outputs wanneer je altijd precies één antwoord in een bekende vorm wilt, zoals extractie, classificatie, of rapportgeneratie.

Bronnen

  1. arXiv. "StructuredRAG: JSON Response Formatting with Large Language Models, slagingspercentages over 24 experimenten." https://arxiv.org/abs/2408.11061. Geraadpleegd augustus 2026.
  2. arXiv. "Let Me Speak Freely? A Study on the Impact of Format Restrictions on Performance of Large Language Models, GSM8K-nauwkeurigheid onder JSON-formattering." https://arxiv.org/html/2408.02442v1. Geraadpleegd augustus 2026.
Let’s get in touch

Ready to build your product?

Book a consultation call to get a free No-Code assessment and scope estimation for your project.
Book a consultation call to get a free No-Code assessment and scope estimation for your project.