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:
- Conversational Filler: Introductie- en afsluitingsteksten rondom de payload.
- Hallucinaties in keys: Het model verzint nieuwe properties of wijzigt de casing (bijv.
firstNamein plaats vanfirst_name). - Ongeldige syntaxis: Ontbrekende komma's of niet-afgesloten strings, vooral bij langere outputs.
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.
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.