Structured Output
Structured Output heißt: Ein Modell antwortet in einer typisierten Form, die Code validieren kann, statt in Freitext, den Code parsen muss. Eine Schema-first-Schicht deklariert die Form als typisiertes Modell, prüft jede Antwort dagegen und fragt das Modell erneut, wenn die Validierung scheitert.
Verfasst von
-
Benedikt Stemmildt Gründer & Co-CEO
Aktualisiert:
Tools 4
Unsere Position. Deterministische Operationen legen wir in Skripte, damit der Agent sie nicht improvisiert. Im Post dazu heißt es: the script owns the order, and the agents do the work inside each stage (öffnet in einem neuen Tab).
Sobald ein Agent ein Formular ausfüllt, eine API aufruft oder ein Ergebnis an den nächsten Schritt übergibt, wird seine Ausgabe zur Eingabe für Code. An Freitext scheitert diese Übergabe bei jedem Formatierungsfehler. Verlässlich wird sie erst mit einem Schema zwischen dem Modell und dem Code, der seine Antwort verarbeitet.
Wie funktioniert eine Schema-first-Extraktionsschicht?
Ihr deklariert die gewünschte Form als typisierte Klasse, und die Bibliothek lässt das Modell sie füllen. Instructor baut auf Pydantic auf. Ein Aufruf bekommt ein BaseModel als response_model, und Instructor gibt ein typisiertes Objekt statt eines Strings zurück (Instructor (öffnet in einem neuen Tab)). Field-Validatoren prüfen jede Antwort. Scheitert einer, fragt Instructor das Modell automatisch erneut, und die Retry-Schleife steckt in der Bibliothek statt in jedem Aufrufer. Dieselbe API streamt Teilobjekte, während das Modell noch generiert, und liefert die Objekte einer Liste einzeln aus (Instructor (öffnet in einem neuen Tab)).
Welche Provider und Sprachen deckt Instructor ab?
Nach eigener Angabe hat Instructor über drei Millionen Downloads im Monat und unterstützt 15+ Provider, darunter OpenAI, Anthropic, Google Gemini, Mistral und DeepSeek. Dazu kommen offene Modelle, die über Ollama, vLLM oder llama.cpp laufen. Ports gibt es für Python, TypeScript, Go, Ruby, Elixir und Rust. Für Agent-Workloads mit Quality Gates, Observability oder typisierten Tools verweist die eigene Dokumentation stattdessen auf PydanticAI (Instructor (öffnet in einem neuen Tab)).
Wann schlägt eine eigene Sprache eine Bibliothek?
Mit BAML schreibt ihr LLM-Funktionen in einer eigenen Sprache statt in der Host-Sprache. BoundaryML beschreibt BAML als Open-Source-Programmiersprache für Agenten, mit TypeScript-ähnlicher Syntax und Typen, die auch zur Laufzeit erhalten bleiben. Dazu kommen typisierte Fehler und native LLM-Funktionen mit Tests und Evaluationen (BoundaryML (öffnet in einem neuen Tab)). Über generierte SDKs für Python und TypeScript kann ein Team BAML schrittweise einführen. BAML steht noch vor 1.0, und sein Hersteller warnt, dass sich APIs und Tooling noch ändern können (BoundaryML (öffnet in einem neuen Tab)).
Der Trade-off folgt aus den beiden Designs. Instructor legt sich um das SDK, das ihr ohnehin aufruft, und fügt einen Parameter hinzu. BAML verlangt, dass ihr eure LLM-Funktionen in einer neuen Sprache schreibt. Dafür unterstützt BAML Typen, Tests und Evaluationen über die ganze Pipeline hinweg.
Verwandte Seiten
- Modellauswahl: welches Modell welche Rolle übernimmt, auch Modelle, die nur in typisierten Auswahlen antworten.
- Der Agent Loop: wo die Antwort eines Modells zum nächsten Tool-Call wird.
- Nicht-deterministische Systeme evaluieren: Ausgaben testen, die sich von Lauf zu Lauf unterscheiden.
- Effiziente Agent-Interfaces gestalten: die andere Seite des Vertrags, die Tools, die ein Agent aufruft.
Quellen
Posts
- The script owns the order, and the agents do the work inside each stage (öffnet in einem neuen Tab) - LinkedIn-Post darüber, deterministische Operationen in Skripte zu legen, damit Agenten innerhalb der Stufen arbeiten, statt die Reihenfolge zu improvisieren.
Tools und Repositories
- BoundaryML (öffnet in einem neuen Tab) - Die Website von BoundaryML zu BAML, einer Open-Source-Programmiersprache vor 1.0 für typisierte LLM-Funktionen mit Tests und Evaluationen.
- Instructor (öffnet in einem neuen Tab) - Dokumentation zu Instructor, einer Pydantic-basierten Bibliothek, die aus LLM-Aufrufen typisierte Objekte zurückgibt und das Modell erneut fragt, wenn die Validierung scheitert.