
LLM Structured Outputs: Valides JSON ist kein Qualitätsnachweis
Der Artikel von Benjamin Nweke schildert einen konkreten Produktionsfehler in einer Zahlungsverarbeitungs-Pipeline: Drei Wochen nach Aktivierung von Structured Outputs fiel auf, dass 2–3 % der wöchentlichen Transaktionen fehlerhafte Datumsangaben enthielten. Die Ursache war nicht ein Bug im Code, sondern das Verhalten des LLM bei fehlenden Quelldaten: Nachrichten ohne Datumsangabe – etwa „Payment received from Chinedu, ₦45,000, ref TXN-82K91" – wurden trotzdem mit einem transaction_date befüllt, meist dem Zeitpunkt des Extraktionsjobs. Das Pydantic-Schema deklarierte das Feld als required, was dem Modell keine Möglichkeit ließ, einen Nullwert zurückzugeben. Nweke beschreibt zwei Lösungsebenen: Erstens machen nullable Felder (`date | None`) den Unterschied zwischen Extraktion und Inferenz explizit und geben dem nachgelagerten Code die Kontrolle zurück. Zweitens führt er ein generisches `Extracted`-Wrapper-Modell ein, das neben dem eigentlichen Wert ein `evidence`-Feld mit dem exakten Quelltextzitat mitliefert – so lässt sich nachvollziehen, ob ein Wert tatsächlich im Dokument stand oder vom Modell erschlossen wurde. Der Beitrag nutzt das OpenAI Python SDK mit `client.beta.chat.completions.parse` und `response_format=Transaction`. Ein Praxishinweis im Code-Kommentar belegt, dass `gpt-4o-mini` bei ungewöhnlich formatierten Nachrichten Betrag und Referenz zusammenführte und das vollständige Modell deshalb trotz höherer Kosten beibehalten wurde.
- Pipeline-Kontext: Nweke extrahierte Payment-Confirmation-Nachrichten in strukturierte Transaktionsdatensätze; Fehler wurden erst durch den Reconciliation-Job sichtbar, nie durch Exceptions.
- Halluzinations-Muster: Das Modell füllte transaction_date fast immer mit dem Zeitpunkt des Extraktionsjobs — Abweichung laut Bericht unter einer Stunde.
- Provenance-Pattern: Das generische Pydantic-Modell Extracted kapselt value (float | date | str | None) und evidence (exaktes Quelltextzitat) in einem wiederverwendbaren Wrapper.
- Modellwahl: gpt-4o-mini fusionierte bei ungewöhnlichem Format Betrag und Referenz-ID; deshalb bleibt die Pipeline laut Code-Kommentar vorerst auf gpt-4o.
- Konzeptuelle Kernunterscheidung: 'Extraction' (was steht wörtlich im Text?) vs. 'Inference' (was impliziert der Text?) — Structured Outputs erzwingen implizit Inferenz, wenn Pflichtfelder fehlen.
„I'd been treating "the JSON is valid" as the finish line for this pipeline, and for weeks it looked like one. It isn't.“
Frag die KI zum Artikel
Folgefragen zu Headline, Quelle und Volltext — Antwort streamt in wenigen Sekunden.
Verwandte Beiträge

LLM Structured Outputs: Valides JSON ist kein Qualitätsnachweis
Der Artikel von Benjamin Nweke schildert einen konkreten Produktionsfehler in einer Zahlungsverarbeitungs-Pipeline: Drei Wochen nach Aktivierung von Structured Outputs fiel auf, dass 2–3 % der wöchentlichen Transaktionen fehlerhafte Datumsangaben enthielten. Die Ursache war nicht ein Bug im Code, sondern das Verhalten des LLM bei fehlenden Quelldaten: Nachrichten ohne Datumsangabe – etwa „Payment received from Chinedu, ₦45,000, ref TXN-82K91" – wurden trotzdem mit einem transaction_date befüllt, meist dem Zeitpunkt des Extraktionsjobs. Das Pydantic-Schema deklarierte das Feld als required, was dem Modell keine Möglichkeit ließ, einen Nullwert zurückzugeben. Nweke beschreibt zwei Lösungsebenen: Erstens machen nullable Felder (`date | None`) den Unterschied zwischen Extraktion und Inferenz explizit und geben dem nachgelagerten Code die Kontrolle zurück. Zweitens führt er ein generisches `Extracted`-Wrapper-Modell ein, das neben dem eigentlichen Wert ein `evidence`-Feld mit dem exakten Quelltextzitat mitliefert – so lässt sich nachvollziehen, ob ein Wert tatsächlich im Dokument stand oder vom Modell erschlossen wurde. Der Beitrag nutzt das OpenAI Python SDK mit `client.beta.chat.completions.parse` und `response_format=Transaction`. Ein Praxishinweis im Code-Kommentar belegt, dass `gpt-4o-mini` bei ungewöhnlich formatierten Nachrichten Betrag und Referenz zusammenführte und das vollständige Modell deshalb trotz höherer Kosten beibehalten wurde.
- Pipeline-Kontext: Nweke extrahierte Payment-Confirmation-Nachrichten in strukturierte Transaktionsdatensätze; Fehler wurden erst durch den Reconciliation-Job sichtbar, nie durch Exceptions.
- Halluzinations-Muster: Das Modell füllte transaction_date fast immer mit dem Zeitpunkt des Extraktionsjobs — Abweichung laut Bericht unter einer Stunde.
- Provenance-Pattern: Das generische Pydantic-Modell Extracted kapselt value (float | date | str | None) und evidence (exaktes Quelltextzitat) in einem wiederverwendbaren Wrapper.
- Modellwahl: gpt-4o-mini fusionierte bei ungewöhnlichem Format Betrag und Referenz-ID; deshalb bleibt die Pipeline laut Code-Kommentar vorerst auf gpt-4o.
- Konzeptuelle Kernunterscheidung: 'Extraction' (was steht wörtlich im Text?) vs. 'Inference' (was impliziert der Text?) — Structured Outputs erzwingen implizit Inferenz, wenn Pflichtfelder fehlen.
„I'd been treating "the JSON is valid" as the finish line for this pipeline, and for weeks it looked like one. It isn't.“
Frag die KI zum Artikel
Folgefragen zu Headline, Quelle und Volltext — Antwort streamt in wenigen Sekunden.