Krok po kroku: 1) Aplikacja przekazuje schemat JSON opisujący pożądaną strukturę wyjścia. 2) Schemat jest kompilowany do gramatyki formalnej (gramatyka bezkontekstowa / automat skończony); kompilacja jest zwykle jednorazowa i cache’owana (w Claude na 24 godziny). 3) Podczas autoregresyjnego dekodowania, na każdym kroku generacji wyznaczana jest maska logitów: dozwolone są wyłącznie tokeny prowadzące do stanu zgodnego z gramatyką, pozostałe otrzymują prawdopodobieństwo zero. 4) Model próbkuje kolejny token wyłącznie z dozwolonego zbioru, dzięki czemu każda kolejna cząstka wyjścia pozostaje zgodna ze schematem. 5) Gotowe wyjście jest deterministycznie parsowalne; biblioteki SDK dodatkowo walidują je względem oryginalnego schematu (w tym ograniczeń nieobsługiwanych natywnie przez gramatykę). Ten sam mechanizm stosuje się do argumentów wywołań narzędzi (strict tool use), gwarantując poprawność nazw i pól wejściowych.
Swobodnie generowany tekst LLM bywa niezgodny z oczekiwanym formatem: brakuje pól, typy są błędne, pojawiają się wartości spoza dozwolonego zbioru albo JSON jest składniowo niepoprawny. Wymusza to kosztowne parsowanie z obsługą błędów, ponawianie zapytań i walidację po stronie aplikacji. Structured Outputs eliminuje ten problem, gwarantując, że wyjście spełnia schemat, co upraszcza integracje maszyna-maszyna, wywołania narzędzi i przepływy agentowe.
Deklaratywny opis pożądanej struktury wyjścia (typy, pola wymagane, enum, zagnieżdżenia).
Przekształca schemat JSON w gramatykę bezkontekstową lub automat skończony wraz z indeksem nad słownikiem modelu.
Oficjalna
Na każdym kroku generacji nakłada maskę na logity, zerując tokeny naruszające gramatykę.
Po stronie SDK deserializuje wyjście i weryfikuje je względem oryginalnego schematu, także dla ograniczeń nieobsługiwanych przez gramatykę.
Oficjalna
Gdy wejście nie pasuje do schematu, model może zmyślać wartości, aby wypełnić wymagane pola.
Osiągnięcie max_tokens przerywa generację, dając niekompletny (mimo ograniczeń) JSON.
Ograniczenia liczbowe (minimum/maximum), długości łańcuchów, wzorce regex, schematy rekurencyjne czy zewnętrzne $ref są zwykle pomijane lub odrzucane.
Pierwsze żądanie z nowym schematem ponosi dodatkowy koszt kompilacji gramatyki.
Zmiana formatu wyjścia może unieważnić cache promptu dla danego wątku, zwiększając koszt.
Zbyt sztywny schemat może pogorszyć jakość odpowiedzi, odbierając modelowi miejsce na rozumowanie krok po kroku.
Otwarta implementacja próbkowania sterowanego gramatyką dla modeli o otwartych wagach.
Willard i Louf formalizują sterowane generowanie jako przejścia automatu skończonego z indeksem nad słownikiem, umożliwiając wydajne ograniczone dekodowanie.
6 sierpnia 2024 OpenAI udostępnia Structured Outputs dla modelu gpt-4o-2024-08-06 z opcją strict: true oraz formatem json_schema, gwarantując zgodność ze schematem.
Claude udostępnia JSON outputs (output_config.format) oraz strict tool use z kompilacją gramatyki cache’owaną na 24 godziny.
Złożoność czasowa: O(1) na token (amortyzowane, z prekompilowanym indeksem FSM). Złożoność przestrzenna: O(|Q| · |V|).
Pierwsze żądanie ponosi koszt kompilacji gramatyki; w każdym kroku dekodowania dochodzi wyznaczanie i nakładanie maski na logity.
Włącza gwarantowaną walidację schematu (np. dla wywołań narzędzi).
Musi być ustawione na false, aby zakazać pól spoza schematu.
Lista pól, których obecność jest gwarantowana w wyjściu.
Wybór trybu wyjścia strukturalnego (np. json_schema).
Technika dekodowania nakładana na istniejący model; nie zmienia wag ani architektury modelu.
Brak routingu ekspertów; „warunkowość" dotyczy maskowania tokenów zależnego od schematu i prefiksu.
Sama kompilacja gramatyki i budowa indeksu mogą być zrównoleglone offline.
Ograniczone dekodowanie to warstwa nad dowolnym silnikiem inferencyjnym; działa niezależnie od typu akceleratora.
W praktyce współpracuje z inferencją LLM na GPU; wydajne backendy (np. XGrammar) minimalizują narzut maskowania.