Betrouwbare JSON en Structured Output uit LLM's Halen

Gepubliceerd op api.llmnet.nl — Best practices voor robuuste AI-pijplijnen

Het integreren van Large Language Models in software vereist voorspelbaarheid. Vrije tekst is ongeschikt voor API's; je hebt gestructureerde data nodig. Echter, LLM's zijn van nature geneigd om te converseren. Zonder strikte kaders krijg je antwoorden zoals: Hier is je JSON: { ... }, wat direct je parsing-logica breekt.

Waarom Vrije Tekst Faalt

Wanneer je een LLM simpelweg vraagt om "antwoord in JSON", loop je tegen drie structurele problemen aan:

De Oplossing: Structured Outputs en JSON-Mode

Moderne API's bieden ingebouwde functionaliteit om deze problemen te ondervangen. De meest effectieve methode is het afdwingen van Structured Outputs (ook wel strict decoding genoemd). Hierbij garandeert de API op neuraal niveau dat de output exact overeenkomt met een door jou aangeleverd JSON Schema.

Als volledige structured outputs niet beschikbaar zijn (zoals bij oudere modellen), gebruik dan altijd JSON-mode. Dit dwingt het model om valide JSON te produceren, al garandeert het niet dat jouw specifieke sleutels aanwezig zijn. Geef daarom in je system prompt een exact voorbeeld of schema mee.

Tip: Bouw je een bredere AI-applicatie? Bekijk dan ook de gids over schaalbare AI-integratie architecturen op ons leerplatform voor meer context over robuuste pijplijnen.

Validatie en Zelfherstel (Self-Healing)

Zelfs met JSON-mode kan data semantisch incorrect zijn. Gebruik altijd een datavalidatie-bibliotheek zoals Pydantic (Python) of Zod (TypeScript). Wanneer de validatie faalt, kun je de foutmelding van de validator direct terrugsturen naar het LLM in een nieuwe prompt om het probleem op te lossen (een retry loop).

Pseudocode Voorbeeld

Hier is een architecturaal voorbeeld van een robuuste aanroep met automatische reparatie:

function get_structured_data(prompt, schema, retries=3):
for poging in range(retries):
try:
# 1. Vraag JSON via de API met schema-afdwinging
response = llm_api.call(
prompt=prompt,
response_format={"type": "json_schema", "schema": schema}
)

# 2. Parseer en valideer (bijv. via Pydantic/Zod)
gevalideerde_data = validator.parse(response.content, schema)
return gevalideerde_data

except ValidationError as e:
# 3. Voed de error terug aan het model
prompt = f"Je vorige output was ongeldig. Fout: {e.message}. Herstel de JSON."

throw Exception("Max retries bereikt, onbetrouwbare output.")

Conclusie

Vertrouw nooit op hoop wanneer je LLM-outputs in productie gebruikt. Gebruik native Structured Outputs, definieer strikte schema's, implementeer harde validatie op de applicatielaag en bouw een fallback-mechanisme in dat het model de kans geeft zijn eigen syntaxisfouten te herstellen.