Constrained Decoding
Beim eingeschränkten Decoding werden bei jedem Generierungsschritt ungültige Tokens maskiert. Dadurch kann ein LLM nur zulässige Bezeichnungen, Treffer für reguläre Ausdrücke oder JSON ausgeben, das einem Schema entspricht.
Constrained Decoding ist eine Technik zur Textgenerierung, die einschränkt, welche Tokens ein Sprachmodell in jedem Schritt erzeugen darf. Dadurch entspricht die fertige Ausgabe garantiert einem vorgegebenen Format: einer festen Auswahl an Bezeichnungen, einem regulären Ausdruck, einer Grammatik oder einem JSON-Schema. Das Modell bewertet weiterhin jedes Token in seinem Wortschatz. Bevor ein Token ausgewählt wird, entfernt der Decoder alle Optionen, die das Format verletzen würden. Anwendungen, die Modellausgaben verarbeiten, etwa API-Backends, KI-Agenten und Datenextraktions-Pipelines, nutzen dieses Verfahren, damit jede Antwort gleich beim ersten Versuch geparst werden kann.
Ungültige Tokens maskieren#
Ein großes Sprachmodell erzeugt Text Token für Token. In jedem Schritt berechnet es für jedes Token in seinem Wortschatz einen Wert, den sogenannten Logit, und eine Softmax-Funktion wandelt diese Werte in Wahrscheinlichkeiten um. Constrained Decoding fügt vor dem Sampling einen Schritt hinzu: Tokens, die nicht zu einer gültigen Ausgabe führen können, erhalten einen Logit von minus unendlich und damit eine Wahrscheinlichkeit von null. Die verbleibenden Wahrscheinlichkeiten werden anschließend über die gültigen Tokens neu normiert.
import torch
# Raw next-token scores from a model over a toy vocabulary
vocab = ["approved", "rejected", "review", "maybe", "{", "}"]
logits = torch.tensor([1.2, 0.4, 0.9, 2.5, 0.1, 0.3])
# The schema allows only the three status labels at this position
allowed = torch.tensor([True, True, True, False, False, False])
masked_logits = logits.masked_fill(~allowed, float("-inf"))
# Softmax renormalizes probability over the valid tokens only
for name, raw, masked in zip(vocab, logits.softmax(-1), masked_logits.softmax(-1)):
print(f"{name:>9}: {raw:.2f} -> {masked:.2f}")Das Modell ohne Einschränkungen weist „maybe“ 56 % seiner Wahrscheinlichkeit zu. Mit angewendeter Maske sinkt der Wert für „maybe“ auf null, und die drei erlaubten Bezeichnungen teilen die Wahrscheinlichkeit proportional zu ihren ursprünglichen Werten untereinander auf. So steigt „approved“ von 15 % auf 46 %.
Produktionsreife Inferenz-Engines verfolgen während der Generierung den Zustand der Einschränkungen. Eine feste Auswahlliste oder ein regulärer Ausdruck wird in einen endlichen Automaten kompiliert. Für JSON und andere verschachtelte Formate ist eine Grammatik mit einem Stapel erforderlich, denn eine schließende Klammer ist erst nach der passenden öffnenden Klammer gültig. Nach jedem Token aktualisiert der Decoder den Zustand und berechnet die zulässige Menge neu. Die Tokenisierung erzeugt Teilwortstücke unterschiedlicher Länge. Daher kann ein einzelnes Token wie "}, mehrere Grammatikschritte auf einmal abdecken. Bibliotheken berechnen deshalb vorab, welche Einträge im Wortschatz in jedem Zustand zulässig sind. So bleiben die Kosten pro Token auch bei Wortschätzen mit mehr als 100.000 Tokens gering. Brandon Willard und Rémi Louf beschrieben diese Indizierung für reguläre Ausdrücke und kontextfreie Grammatiken 2023 in Efficient Guided Generation for Large Language Models, der Arbeit hinter der Outlines-Bibliothek.
Die passende Einschränkung wählen#
Die passende Einschränkung richtet sich nach der Ausgabe, die die Anwendung tatsächlich verarbeitet. Eine Auswahlliste eignet sich für Klassifizierung und Routing, wenn die Antwort eine von wenigen Zeichenfolgen sein muss. Reguläre Ausdrücke decken kurze strukturierte Werte wie Datumsangaben, IDs und Telefonnummern ab. Kontextfreie Grammatiken beschreiben SQL, Code und domänenspezifische Sprachen. Das GBNF-Grammatikformat von llama.cpp ist ein weit verbreitetes Beispiel. Für Datensätze mit benannten Feldern legt ein JSON-Schema erforderliche Schlüssel, Typen, Aufzählungen und Verschachtelungen fest. Gehostete APIs wie OpenAI Structured Outputs akzeptieren ein Schema und setzen es während der Generierung durch. Üblicherweise unterstützen sie dabei eine dokumentierte Teilmenge der vollständigen JSON-Schema-Spezifikation.
Eingeschränkte Dekodierung wird oft mit verwandten Verfahren verwechselt:
- Strukturierte Ausgaben: Das übergeordnete Ziel sind maschinenlesbare Antworten. Es lässt sich entweder durch Constrained Decoding während der Generierung erreichen oder indem die Ausgabe anschließend validiert und bei einem Fehler erneut angefordert wird.
- JSON-Modus: Beschränkt die Ausgabe auf syntaktisch gültiges JSON beliebiger Form. Schlüssel, Typen und Werte müssen daher weiterhin geprüft werden.
- Prompt Engineering: Fordert in den Anweisungen ein bestimmtes Format an, das Modelle meistens einhalten. Bei schema-beschränkten Anfragen werden die Felder üblicherweise ebenfalls im Prompt beschrieben, damit das Modell weiß, was die einzelnen Felder bedeuten.
- Funktionsaufrufe: Werkzeugnamen und Argumente sind häufige Ziele für Schemaeinschränkungen, da der aufrufende Code genaue Feldnamen erwartet.
Abwägungen in der Praxis#
Ein garantiertes Format garantiert nichts über den Inhalt. Ein Schema kann erzwingen, dass {"total": 1290.00} eine Zahl ist, aber die Zahl kann trotzdem falsch sein. Ein eingeschränktes Modell kann außerdem innerhalb gültiger Felder überzeugend halluzinieren. Anwendungen müssen Geschäftsregeln auch nach der Generierung validieren.
Einschränkungen können auch die Antwortqualität mindern, wenn sie ein Modell von dem Text abbringen, den es normalerweise schreiben würde. Ein Schema, das die endgültige Antwort als erstes Feld verlangt, lässt keinen Raum für Zwischenschritte der Schlussfolgerung. Deshalb platzieren Schemata häufig ein Freitextfeld für Schlussfolgerungen oder Notizen vor dem Antwortfeld. Auch die Ausgabelänge muss berücksichtigt werden: Wird das Token-Limit mitten in einem Objekt erreicht, ist das Ergebnis unabhängig von den Einschränkungen ungültig. Deshalb legen strukturierte Anfragen maximale Längen fest, die genügend Spielraum für die vollständige Struktur lassen. Sehr große oder tief rekursive Schemata benötigen mehr Zeit zum Kompilieren. Das ist für Systeme relevant, die für jede Anfrage ein neues Schema erstellen.
Anwendungen der Bildverarbeitung verwenden denselben Mechanismus, wenn ein multimodales Modell Felder zu einem Bild zurückgeben muss. Die LLM-Schnittstelle von Ultralytics leitet Anfrageargumente unverändert an OpenAI-kompatible APIs weiter. Ein JSON-Schema, das zusammen mit einer Bildanfrage übergeben wird, beschränkt die Antwort eines Vision-Language-Modells daher auf Felder wie hazard und severity, die sich mit YOLO26-Erkennungen aus demselben Einzelbild kombinieren lassen.










