Structured Outputs
Bei strukturierten Ausgaben wird die Antwort eines KI-Modells während der Decodierung auf ein Schema wie JSON Schema beschränkt. So können Anwendungen jede Antwort zuverlässig verarbeiten.
Strukturierte Ausgaben sind Modellantworten, die einem vorgegebenen Format folgen müssen, üblicherweise einem JSON-Schema, das Pflichtfelder, deren Typen und zulässige Werte festlegt. So kann Software jede Antwort ohne Nachbearbeitung verarbeiten. Bittet man ein großes Sprachmodell (LLM) höflich um JSON, hält es sich normalerweise daran. Es kann trotzdem einen Satz Fließtext hinzufügen, einen Schlüssel falsch schreiben oder mitten in einem Objekt abbrechen – jeder dieser Fehler bringt das Programm zum Scheitern, das die Antwort verarbeitet. Strukturierte Ausgaben beseitigen dieses Risiko mit beschränktem Decoding: Bei jedem Generierungsschritt lässt die Inferenz-Engine nur Tokens zu, die das Ergebnis gemäß Schema gültig halten. Als OpenAI die Funktion im August 2024 in seine API aufnahm, berichtete das Unternehmen, gpt-4o-2024-08-06 habe mit strukturierten Ausgaben bei der Bewertung der Einhaltung komplexer JSON-Schemata 100 % erzielt. Ohne die Funktion lag GPT-4 (gpt-4-0613) unter 40 %.
JSON-Modus und strukturierte Ausgaben im Vergleich#
Anbieter-APIs bieten zwei Stufen der Garantie. Der JSON-Modus, den OpenAI im November 2023 einführte, garantiert lediglich, dass die Antwort syntaktisch gültiges JSON ist. Schlüssel können weiterhin fehlen oder falsch benannt sein. Strukturierte Ausgaben garantieren, dass die Antwort dem vorgegebenen Schema entspricht. In OpenAIs Structured Outputs API definieren Entwickler das Schema als Pydantic-Modell in Python oder als Zod-Objekt in JavaScript. Eine Ablehnung wird in einem separaten Feld ausgegeben, statt das Format zu verletzen. Anthropics strukturierte Ausgaben mit Claude übersetzen jedes Schema in eine Grammatik. Das erhöht die Latenz bei der ersten Verwendung, und die kompilierte Grammatik wird 24 Stunden lang zwischengespeichert. Beide Anbieter unterstützen nur eine Teilmenge von JSON Schema. Anthropics Implementierung unterstützt zum Beispiel weder rekursive Schemata noch numerische Grenzwerte wie minimum.
Funktionsweise der Dekodierung mit Einschränkungen#
Bei jedem Schritt erzeugt ein LLM für jedes Token seines Vokabulars einen Wert, ein sogenanntes Logit. Beim Decoding wird aus der daraus entstehenden Softmax-Verteilung ausgewählt. Beim beschränkten Decoding wird zunächst der Wert jedes Tokens, das gegen das Format verstoßen würde, auf minus unendlich gesetzt. Diese Tokens können dann nicht ausgewählt werden. Brandon Willard und Rémi Louf zeigten in Efficient Guided Generation for Large Language Models, wie sich das effizient umsetzen lässt: Ein regulärer Ausdruck oder JSON Schema wird in einen endlichen Automaten übersetzt. Ein einmalig erstellter Index über dem Vokabular listet die gültigen Tokens für jeden Zustand auf, sodass jeder Schritt nur eine Abfrage erfordert. Ihre quelloffene Bibliothek Outlines implementiert das Verfahren. Bereitstellungs-Engines wie vLLM bieten grammatikgesteuerte Generierung für offene Modelle.
Das folgende Beispiel setzt die Idee von Hand mit GPT-2 aus Hugging Face Transformers um. Der festgelegte Text des Schemas – geschweifte Klammern, Schlüssel und Anführungszeichen – wird vom Code geschrieben. An jeder Wertstelle darf das Modell nur aus den vom Schema zugelassenen Tokens wählen:
import json
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("gpt2")
model = AutoModelForCausalLM.from_pretrained("gpt2")
prompt = "Review: The battery died after two days and support never replied.\nJSON:"
# Unbeschränktes gieriges Decoding: Nichts zwingt die Antwort in ein Schema.
ids = tokenizer(prompt, return_tensors="pt").input_ids
free = model.generate(ids, max_new_tokens=16, do_sample=False, pad_token_id=tokenizer.eos_token_id)
print("free:", repr(tokenizer.decode(free[0, ids.shape[1] :])))
def choose(text, options):
"""Return the option GPT-2 scores highest after text, with every other token masked out."""
logits = model(tokenizer(text, return_tensors="pt").input_ids).logits[0, -1]
allowed = torch.tensor([tokenizer.encode(option)[0] for option in options])
masked = torch.full_like(logits, float("-inf"))
masked[allowed] = logits[allowed]
return tokenizer.decode(masked.argmax())
# Beschränktes Decoding: Das Schema gibt die Schlüssel vor, und das Modell darf nur zulässige Werte auswählen.
with torch.no_grad():
text = prompt + ' {"sentiment": "'
text += choose(text, ["positive", "negative"]) + '", "stars": '
text += choose(text, ["1", "2", "3", "4", "5"]) + "}"
print("constrained:", json.loads(text[len(prompt) :]))Das Beispiel gibt free: ' The battery died after two days and support never replied.\n\nJSON: The' und constrained: {'sentiment': 'positive', 'stars': 1} aus. Ohne Einschränkungen wiederholt GPT-2 die Rezension, statt JSON zu schreiben. Die beschränkte Version lässt sich dagegen immer einlesen. Das eingelesene Ergebnis zeigt auch die Grenzen des Verfahrens: Das Modell mit 124 Millionen Parametern bewertete eine leere Batterie und einen nicht reagierenden Support positiv mit einem Stern. Das Schema legte das Format fest, doch die darin enthaltenen Werte stammten weiterhin aus der eigenen Einschätzung des Modells.
Anwendungsbereiche und Zielkonflikte#
- Datenextraktion: Namen, Daten, Summen und Einzelposten aus Rechnungen, Verträgen oder E-Mails direkt in Datenbankzeilen übernehmen.
- Funktionsaufrufe: Ein Tool-Aufruf ist eine strukturierte Ausgabe, deren Schema die Parameter des Tools festlegt. Die strikte Tool-Nutzung in den APIs von OpenAI und Anthropic bietet dieselbe Garantie für Tool-Argumente.
- Agentische Arbeitsabläufe: Weiterleitungsentscheidungen als Enum-Werte abbilden und Zwischenergebnisse als typisierte Objekte zwischen den Schritten einer Prompt-Kette übergeben.
- Bild-Sprach-Modelle: Erkennungen als Listen von Labels und Begrenzungsrahmenkoordinaten zurückgeben, die Zeichen- oder Auswertungscode direkt verarbeiten kann.
Die klassenbasierte intelligente Annotation in der Ultralytics Platform ist auf diese letzte Art der Ausgabe angewiesen. Sie fordert Vision-Modelle von Anbietern wie OpenAI, Anthropic und Google auf, die Klassen eines Datensatzes zu erkennen, und fügt jedes zurückgegebene Objekt als bearbeitbare Begrenzungsbox hinzu. Daher muss jede Antwort eine Klasse nennen und Koordinaten in einem maschinenlesbaren Format angeben. Diese Modelle geben keine Konfidenzwerte zurück. Deshalb blendet die Platform die Einstellungen für Konfidenz und IoU aus, solange ein solches Modell ausgewählt ist. Die VLM-Bestenliste vergleicht, wie genau diese Modelle Objekte in realen Datensätzen erkennen, indem sie die Boxen jedes Modells nach ihrer Ausgabereihenfolge bewertet.
Strenge Formate können die Genauigkeit bei Schlussfolgerungsaufgaben verringern. In Let Me Speak Freely? stellten Zhi Rui Tam und Kollegen fest, dass Formatbeschränkungen die Schlussfolgerungsfähigkeit von LLMs erheblich beeinträchtigen. Strengere Einschränkungen führten zu stärkeren Einbußen. OpenAIs API erzeugt Schlüssel in der Reihenfolge, in der sie im Schema stehen. Eine gängige Abhilfe ist daher ein Freitextfeld für die Überlegungen vor dem Antwortfeld, damit das Modell seine Gedankenkette formuliert, bevor es sich auf die beschränkte Antwort festlegt.










