Start KI-Lösungen Fertige Lösungen Peers & Simulation RAG & Retrieval Use Cases Frameworks Blog English Kontakt
Zurück zum Blog

Structured Output: Vom Prosa-Parsing zum Schema-Vertrag

JSON Mode vom OpenAI DevDay 2023, Function Calling als Schema-Vertrag, grammatikbeschränktes Decoding mit Outlines und llama.cpp sowie Validation-First-Pipelines auf Basis von Pydantic v2. Ein Überblick über Structured-Output-Techniken im Januar 2024: was jede Methode garantiert, was keine von ihnen garantiert und warum Struktur das Parsen von Prosa schlägt.

Warum das Parsen von Prosa scheitert

Sprachmodelle erzeugen Text. Anwendungen verarbeiten Daten. Über weite Teile des Jahres 2023 haben Teams diese Lücke mit Zeichenkettenoperationen überbrückt: reguläre Ausdrücke über die Modellausgabe, das Entfernen von Markdown-Codeblöcken, Prompts mit dem Zusatz "Antworte ausschließlich mit JSON". Der Ansatz übersteht eine Demo. Eine Pipeline übersteht er nicht.

Die Fehlerbilder sind banal. Ein nachgestellter Satz hinter der schließenden Klammer. Einfache statt doppelte Anführungszeichen. Ein nicht maskierter Zeilenumbruch in einem String. Wenn 2 Prozent der Antworten nicht parsbar sind, erzeugt ein nächtlicher Batch über 10.000 Dokumente 200 unbehandelte Fehler. Prosa-Parsing macht aus einem probabilistischen Modell eine probabilistische Systemgrenze. Genau dieses Problem adressiert Structured Output.

Die instinktive Reaktion — mehr Prompt Engineering — konvergiert nicht. Jedes Modell-Update verschiebt die Fehlerverteilung. Jeder neue Grenzfall ergänzt einen weiteren Regex-Zweig. Ende 2023 hat das Tooling das Problem endlich dorthin verlagert, wo es hingehört: in die API-Oberfläche und in die Sampling-Schleife selbst.

Aufgabeziel Agentplanen · entscheiden Toolapi · mcp Ergebnisgeprüft
Eine Aufgabe kommt an — der Agent plant den nächsten Schritt. 1/4

JSON Mode seit dem DevDay 2023

Am 6. November 2023 hat OpenAI auf dem ersten DevDay den JSON Mode vorgestellt. Der neue Parameter response_format mit dem Wert json_object weist gpt-4-1106-preview und gpt-3.5-turbo-1106 an, syntaktisch valides JSON zu erzeugen. Für das neue GPT-3.5 Turbo meldete OpenAI in internen Evals eine Verbesserung von 38 Prozent bei Formataufgaben mit JSON, XML und YAML.

Der Geltungsbereich ist eng und dokumentiert. JSON Mode garantiert Syntax, nicht Form: Das Modell liefert ein valides JSON-Objekt beliebiger Struktur. Der Prompt muss JSON weiterhin explizit verlangen. Und eine durch max_tokens abgeschnittene Antwort endet mitten im Objekt und ist nicht mehr parsbar. JSON Mode beseitigt genau eine Fehlerklasse. Einen Vertrag definiert er nicht.

Function Calling als Schema-Vertrag

Das stärkere Primitiv ist älter. Am 13. Juni 2023 hat OpenAI Function Calling mit gpt-4-0613 und gpt-3.5-turbo-0613 ausgeliefert. Entwickler beschreiben Funktionen als JSON Schema über den Parameter functions; das Modell antwortet mit einem JSON-Objekt, dessen Argumente der Signatur entsprechen. Die Modelle wurden genau auf diese Abbildung feinjustiert.

In der Praxis dient Function Calling als Extraktions-API. Definieren Sie eine einzelne Funktion, deren Parameter das Zielschema bilden, erzwingen Sie deren Auswahl über function_call, und der arguments-String ist Ihr strukturierter Datensatz. Das liefert schemaförmige Ausgaben deutlich zuverlässiger als freies Prompting. Erzwungen ist es dennoch nicht: Pflichtfelder können fehlen, Enum-Werte erfunden sein, und der arguments-String selbst kann gelegentlich fehlerhaftes JSON enthalten.

Constrained Decoding auf Token-Ebene

Ein dritter Ansatz garantiert Struktur per Konstruktion. Grammatikbeschränktes Decoding maskiert vor jedem Sampling-Schritt alle Token, die das Zielformat verletzen würden. llama.cpp hat grammatikbasiertes Sampling mit dem GBNF-Format im Juli 2023 gemergt. Willard und Louf haben die Technik in "Efficient Guided Generation for Large Language Models" (arXiv:2307.09702, Juli 2023) formalisiert: Die Kompilierung eines regulären Ausdrucks oder einer kontextfreien Grammatik in einen Finite-State-Machine-Index über das Vokabular senkt die Kosten pro Token auf durchschnittlich O(1). Die Open-Source-Bibliothek Outlines implementiert das Verfahren.

Der Preis ist der Zugriff. Constrained Decoding benötigt die Logits und funktioniert deshalb mit selbst gehosteten Open-Weight-Modellen, nicht hinter gehosteten APIs. Stand Januar 2024 erhalten API-Kunden JSON Mode und Function Calling; harte Grammatikgarantien bleiben ein Privileg des Selbsthostings.

MethodeStrukturgarantieVerfügbar seitWesentliche Einschränkung
Nur Prompt-AnweisungenKeineScheitert leise und sporadisch
JSON Mode (OpenAI API)Valide JSON-Syntax6. Nov. 2023Kein Schema; Trunkierung zerstört das Objekt
Function Calling (OpenAI API)Schemaförmig durch Fine-Tuning13. Juni 2023Nicht erzwungen; Felder können fehlen
Grammatikbeschränktes DecodingKonformität per KonstruktionJuli 2023 (llama.cpp, Outlines)Benötigt Logit-Zugriff (Selbsthosting)

Validation First mit Pydantic

Keiner dieser API-Mechanismen ersetzt Validierung. Wir behandeln jede Modellantwort als nicht vertrauenswürdige Eingabe — genauso wie einen Request-Body aus dem öffentlichen Internet. Pydantic v2, veröffentlicht am 30. Juni 2023 mit einem in Rust neu geschriebenen Validierungskern, validiert 5- bis 50-mal schneller als v1. Das ist schnell genug für jeden Request-Pfad ohne messbare Kosten.

Das Muster ist symmetrisch. Das Pydantic-Modell ist die einzige Quelle der Wahrheit: model_json_schema() erzeugt das Schema für die Funktionsdefinition oder den Prompt; model_validate_json() prüft die Antwort an der Systemgrenze. Bibliotheken wie Instructor verpacken genau diesen Rundweg über OpenAI Function Calling. Eine Typdefinition, beide Richtungen.

Die Reparaturschleife als Pipeline-Baustein

Ein Validierungsfehler ist keine Exception für das Log. Er ist ein Signal für die Rückkopplung. Der ValidationError benennt das betroffene Feld und die verletzte Bedingung; an die Konversation angehängt und erneut angefragt, korrigiert das Modell die meisten Fehler im ersten Versuch. Wir begrenzen diese Schleife auf ein bis zwei Wiederholungen und leiten den Datensatz danach in eine Dead-Letter-Queue zur Inspektion.

Dieses Design macht Ausgabequalität messbar. Die First-Pass-Validitätsrate pro Prompt- und Modellversion wird zu einer Zahl, die Sie loggen, überwachen und über Releases hinweg vergleichen können. Fällt die Rate nach einem Modellwechsel von 97 auf 89 Prozent, sehen Sie es noch am selben Tag. Prosa-Parsing kennt keine vergleichbare Metrik — nur Anekdoten.

Was Struktur nicht garantiert

Struktur ist Syntax. Korrektheit ist Semantik. Eine schemakonforme Antwort kann eine erfundene Rechnungsnummer enthalten, die zum Muster passt, ein plausibles aber falsches Datum oder eine willkürlich gewählte Enum-Kategorie. Validierung fängt Typfehler ab; selbstbewussten Unsinn fängt sie nicht ab. Die inhaltliche Evaluation bleibt eine eigene, weitgehend ungelöste Disziplin.

Constrained Decoding trägt einen eigenen Vorbehalt: Das Erzwingen von Token verändert die Ausgabeverteilung. Ein Modell, das mitten in der Generierung in ein starres Format gepresst wird, kann degenerierte Vervollständigungen erzeugen, die es unbeschränkt nicht gewählt hätte. Struktur eliminiert Parse-Fehler. Tests eliminiert sie nicht.

Ausblick auf 2024

Unsere Erwartung für 2024: Schemakonformität wird ein erstklassiger API-Parameter. Die Lücke zwischen JSON Mode, der nur Syntax garantiert, und grammatikbeschränktem Decoding, das Konformität garantiert aber Selbsthosting verlangt, ist zu sichtbar, um Bestand zu haben. Wir erwarten gehostete APIs, die ein JSON Schema entgegennehmen und garantieren, dass die Antwort dagegen validiert — durchgesetzt beim Decoding, nicht allein durch Fine-Tuning.

Die tiefere Verschiebung ist architektonisch. Wenn das typisierte Modell Schema, Prompt-Gerüst und Validierung erzeugt, wird die Typdefinition zur Schnittstelle zwischen Anwendung und Sprachmodell — und der Prompt zu einem Implementierungsdetail dahinter. Zehn Jahre API-Tooling haben uns Contract-First gelehrt. 2024 erreicht diese Disziplin die LLM-Integration.

Quellen