Robocikowo>ROBOCIKOWO
Wnioskowanie

Structured Outputs

2023AktywnyOpublikowano: 10 września 2026Aktualizacja: 10 września 2026Opublikowany
Technika ograniczania dekodowania LLM tak, aby generowane wyjście gwarantowanie spełniało zadany schemat JSON.
Kluczowa innowacja
Wymusza zgodność wyjścia modelu z zadanym schematem JSON już na etapie dekodowania (constrained decoding), zamiast liczyć na to, że model „poprawnie" sformatuje odpowiedź i weryfikować ją dopiero po fakcie.
Kategoria
Wnioskowanie
Poziom abstrakcji
Wzorzec
Poziom operacji
InferencjaToolingAplikacja
Zastosowania
Ekstrakcja danych ze swobodnego tekstuKlasyfikacja z ustalonym zbiorem kategoriiGenerowanie odpowiedzi gotowych do APIWywoływanie narzędzi i funkcji (tool/function calling)Przepływy agentowe wymagające niezawodnych wyjśćZasilanie pipeline’ów ETL i baz danych

Jak działa

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.

Rozwiązany problem

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.

Komponenty

Schemat JSONKontrakt wejściowy definiujący dozwolony format wyjścia.

Deklaratywny opis pożądanej struktury wyjścia (typy, pola wymagane, enum, zagnieżdżenia).

INStandardowy JSON Schema z ograniczonym podzbiorem cech.
OUTWejście do kompilatora gramatyki.
Kompilator gramatykiTworzy artefakt sterujący dekodowaniem; wynik jest cache’owany.

Przekształca schemat JSON w gramatykę bezkontekstową lub automat skończony wraz z indeksem nad słownikiem modelu.

INSchemat wejściowy.
OUTSkompilowana gramatyka używana do maskowania.

Oficjalna

Dekoder z ograniczeniamiEgzekwuje zgodność wyjścia ze schematem w trakcie próbkowania.

Na każdym kroku generacji nakłada maskę na logity, zerując tokeny naruszające gramatykę.

INRozkład nad słownikiem i bieżący stan automatu.
OUTWybrany token zgodny ze schematem.
Walidator / parserWarstwa bezpieczeństwa i mapowanie na typy aplikacji (np. Pydantic, Zod).

Po stronie SDK deserializuje wyjście i weryfikuje je względem oryginalnego schematu, także dla ograniczeń nieobsługiwanych przez gramatykę.

INTekstowe wyjście modelu.
OUTZwalidowany obiekt gotowy do użycia.

Oficjalna

Implementacja

Pułapki implementacyjne
Halucynacje wymuszane przez schematŚrednia

Gdy wejście nie pasuje do schematu, model może zmyślać wartości, aby wypełnić wymagane pola.

Rozwiązanie:Dodać pola opcjonalne lub pole „nieznane"/refusal; walidować sens danych po stronie aplikacji.
Ucięcie przy limicie tokenówWysoka

Osiągnięcie max_tokens przerywa generację, dając niekompletny (mimo ograniczeń) JSON.

Rozwiązanie:Ustawić odpowiednio wysoki limit tokenów i obsłużyć przypadek zakończenia z powodu długości.
Nieobsługiwane cechy schematuŚrednia

Ograniczenia liczbowe (minimum/maximum), długości łańcuchów, wzorce regex, schematy rekurencyjne czy zewnętrzne $ref są zwykle pomijane lub odrzucane.

Rozwiązanie:Egzekwować te ograniczenia w walidacji po stronie klienta (SDK robią to automatycznie).
Opóźnienie kompilacji gramatykiNiska

Pierwsze żądanie z nowym schematem ponosi dodatkowy koszt kompilacji gramatyki.

Rozwiązanie:Korzystać z cache gramatyki (np. 24 h w Claude) i utrzymywać stabilne schematy.
Unieważnienie cache promptuNiska

Zmiana formatu wyjścia może unieważnić cache promptu dla danego wątku, zwiększając koszt.

Rozwiązanie:Nie zmieniać formatu w obrębie tego samego wątku bez potrzeby.
Nadmierne ograniczanie a jakość rozumowaniaŚrednia

Zbyt sztywny schemat może pogorszyć jakość odpowiedzi, odbierając modelowi miejsce na rozumowanie krok po kroku.

Rozwiązanie:Dodać pole na rozumowanie/uzasadnienie albo rozdzielić etap rozumowania od etapu formatowania.

Ewolucja

Oryginalny paper · 2023 · arXiv 2023 · Brandon T. Willard
Efficient Guided Generation for Large Language Models
Brandon T. Willard, Rémi Louf
2023
Gramatyki GBNF w llama.cpp

Otwarta implementacja próbkowania sterowanego gramatyką dla modeli o otwartych wagach.

2023
Publikacja pracy o sterowanym generowaniu (Outlines)
Punkt przełomowy

Willard i Louf formalizują sterowane generowanie jako przejścia automatu skończonego z indeksem nad słownikiem, umożliwiając wydajne ograniczone dekodowanie.

2024
OpenAI wprowadza Structured Outputs w API
Punkt przełomowy

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.

2025
Anthropic dodaje Structured Outputs w Claude

Claude udostępnia JSON outputs (output_config.format) oraz strict tool use z kompilacją gramatyki cache’owaną na 24 godziny.

Hiperparametry (konfigurowalne osie)

Tryb ścisły (strict)Krytyczna

Włącza gwarantowaną walidację schematu (np. dla wywołań narzędzi).

trueEgzekwuje zgodność ze schematem.
falseZachowanie best-effort bez gwarancji.
Dodatkowe właściwościWysoka

Musi być ustawione na false, aby zakazać pól spoza schematu.

falseWymagane przez większość implementacji.
Pola wymaganeWysoka

Lista pól, których obecność jest gwarantowana w wyjściu.

["name","email"]Wszystkie wymienione pola pojawią się w wyniku.
Typ formatu wyjściaŚrednia

Wybór trybu wyjścia strukturalnego (np. json_schema).

json_schemaWyjście zgodne z podanym schematem JSON.

Złożoność obliczeniowa

Złożoność czasowa: O(1) na token (amortyzowane, z prekompilowanym indeksem FSM). Złożoność przestrzenna: O(|Q| · |V|).

Wąskie gardło obliczeniowe

Kompilacja gramatyki i maskowanie logitów

Pierwsze żądanie ponosi koszt kompilacji gramatyki; w każdym kroku dekodowania dochodzi wyznaczanie i nakładanie maski na logity.

Zależy od
Złożoność schematuRozmiar słownika

Paradygmat wykonania

Tryb główny
Warunkowy

Technika dekodowania nakładana na istniejący model; nie zmienia wag ani architektury modelu.

Wzorzec aktywacji
Zależne od wejścia
Tryby dodatkowe
Gęsty
Mechanizm routingu

Brak routingu ekspertów; „warunkowość" dotyczy maskowania tokenów zależnego od schematu i prefiksu.

Równoległość

Poziom równoległości
Sekwencyjny

Sama kompilacja gramatyki i budowa indeksu mogą być zrównoleglone offline.

Zakres
InferencjaPomiędzy tokenami
Ograniczenia
!Maska tokenu zależy od dotychczas wygenerowanego prefiksu, więc kroki dekodowania są z natury sekwencyjne.

Wymagania sprzętowe

Podstawowe

Ograniczone dekodowanie to warstwa nad dowolnym silnikiem inferencyjnym; działa niezależnie od typu akceleratora.

Dobry fit

W praktyce współpracuje z inferencją LLM na GPU; wydajne backendy (np. XGrammar) minimalizują narzut maskowania.