Ga naar de hoofdinhoud
BVDNET
Arnhem · websites & automatiseringBVDNET
Praktische Toepassingen

Structured output

Met structured output vult een AI-model een vast formulier in, zoals leverancier, datum en bedrag, in plaats van vrije tekst, zodat software het antwoord kan lezen zonder overtypen.

Ook bekend als: structured outputs, JSON mode, JSON-modus, constrained decoding, guided generation, gestructureerde output, gestructureerde uitvoer

Structured output betekent dat een AI-model een vast formulier invult in plaats van vrije tekst te schrijven. Jij bepaalt de velden, bijvoorbeeld leverancier, factuurdatum en bedrag, en het model levert precies die velden terug in een vorm die software kan lezen, meestal JSON. Een boekhoudpakket kan een factuur dan verwerken zonder dat iemand bedragen overtypt. De vorm staat vast; de waarden moet je nog steeds controleren.

Hoe beschrijf je het formulier?

Met een JSON Schema, volgens de makers een declaratieve taal om de structuur en de regels van JSON-data vast te leggen (JSON Schema). Het noemt de velden, hun type (tekst, getal, waar of onwaar), welke verplicht zijn en waar nodig de toegestane waarden (een enum). Toegestane waarden voorkomen ook dat een model codes verzint, het probleem dat onder semantic training gap wordt beschreven. Aanbieders ondersteunen maar een deel van JSON Schema: de documentatie van Anthropic (september 2026) kent bijvoorbeeld geen minimum of maximum voor getallen en geen recursieve schema's.

Hoe werkt het?

Er zijn drie niveaus, van los naar streng:

  1. Erom vragen in de prompt ("antwoord in JSON met deze velden"). Niets dwingt het af.
  2. JSON-modus: de uitvoer is geldige JSON, maar niet per se volgens jouw schema. OpenAI introduceerde het in 2023; de handleiding (september 2026) noemt het een eenvoudigere versie van structured outputs (handleiding van OpenAI).
  3. Constrained decoding: de API zet het schema om in een grammatica en laat na elk token alleen de tokens toe die de uitvoer geldig houden.

In de tests van OpenAI met complexe schema's scoorde gpt-4o-2024-08-06 met structured outputs 100%, tegen minder dan 40% voor het oudere gpt-4-0613 (OpenAI, augustus 2024).

In september 2026 accepteren OpenAI (sinds augustus 2024), Anthropic (bèta in november 2025, algemeen beschikbaar sinds februari 2026) en de Gemini API van Google allemaal een JSON Schema. Dezelfde techniek werkt bij function calling: met strict: true volgen de argumenten van een tool-aanroep het schema.

Voor modellen die je zelf draait, blokkeren Outlines (Willard en Louf, 2023) en de GBNF-grammatica's van llama.cpp ongeldige tokens op dezelfde manier. Instructor werkt anders: het controleert het antwoord achteraf tegen een Pydantic-model en vraagt opnieuw als de controle faalt.

Waar gaat het mis?

  • Een geldig formulier kan foute waarden bevatten. Structured output voorkomt niet elke fout van het model, schrijft OpenAI, en Google raadt aan de waarden in je eigen applicatie te controleren.
  • Invoer die niet past. Het model probeert het schema altijd in te vullen, en dat kan verzonnen waarden opleveren als de invoer er niets mee te maken heeft (OpenAI). Geef het een uitweg, zoals een veld dat leeg mag blijven.
  • Uitzonderingen. Een weigering om veiligheidsredenen, of het bereiken van de tokenlimiet, kan nog steeds uitvoer opleveren die niet bij het schema past.
  • Snelheid en kosten. Het eerste verzoek met een nieuw schema is trager, omdat de grammatica wordt gecompileerd. In september 2026 bewaart Anthropic die grammatica 24 uur en voegt het een extra systeemprompt over het formaat toe, wat inputtokens kost.
  • Redeneren. Tam e.a. (2024) zagen dat strikte formaten de scores op redeneertaken verlaagden en op classificatie verhoogden; een oorzaak was dat het model zijn antwoord vóór zijn redenering gaf. Het team achter Outlines herhaalde drie van die tests en vond structured output iets beter, bijvoorbeeld 0,78 tegen 0,77 op de rekenset GSM8K (november 2024). Zet hoe dan ook een veld voor de redenering vóór het antwoordveld: volgens de handleiding van OpenAI komen de sleutels in de volgorde van het schema.

Voorbeeld

Stel: een accountantskantoor laat een model binnenkomende pdf's lezen, met dit schema:

JSON
1{
2 "type": "object",
3 "properties": {
4 "soort_document": {"type": "string", "enum": ["factuur", "anders"]},
5 "leverancier": {"type": ["string", "null"]},
6 "factuurdatum": {"type": ["string", "null"], "format": "date"},
7 "totaal_incl_btw": {"type": ["number", "null"]}
8 },
9 "required": ["soort_document", "leverancier", "factuurdatum", "totaal_incl_btw"],
10 "additionalProperties": false
11}

Bij een factuur geeft het model bijvoorbeeld {"soort_document": "factuur", "leverancier": "Drukkerij Jansen", "factuurdatum": "2026-09-01", "totaal_incl_btw": 1250.0} terug. Bij een pakbon kan het "anders" antwoorden en de velden leeg laten in plaats van een bedrag te verzinnen. De software van het kantoor controleert de waarden nog, bijvoorbeeld tegen de inkooporder, voordat er iets wordt geboekt.