Structured Outputs: standard kontraktu odpowiedzi (JSON Schema)
Jak zbudować odpowiedzi, które są weryfikowalne maszynowo, wersjonowane i odporne na „ładny tekst, który nie przechodzi walidacji”.
Contract-first: kiedy JSON jest wymaganiem, a nie opcją
Structured Outputs to praktyka, w której wynik modelu jest traktowany jak interfejs. To oznacza: schema, walidację, wersjonowanie i obsługę błędów tak samo, jak w klasycznych systemach API.
Projektowanie schematu (praktyka)
- Minimalizm: tylko pola, które są naprawdę potrzebne do wykonania kolejnego kroku.
- Enumy zamiast dowolnych stringów (np. statusy, typy decyzji).
- Jawne błędy: osobny obiekt error z kodem i opisem.
- Wersja kontraktu w odpowiedzi (contract_version).
Walidacja i pętla naprawcza
Walidacja schematu nie jest „opcją”. Jeżeli wynik nie przechodzi walidacji, system powinien:
- zarejestrować błąd (trace + payload + reason),
- wykonać repair (krótką pętlę korekcyjną),
- a gdy to się nie uda – przejść do fallback lub HITL.
contract_response:
contract_version: "support.reply@3"
status: "OK" # OK | NEEDS_REVIEW | DENY
answer_md: "..."
citations: [{doc:"policy@2.1", span:"p3-p4"}]
error: null
Najczęstsze antywzorce
- „Luźny JSON” bez walidacji – pozorny porządek, realny chaos.
- Zbyt bogate schematy (dziesiątki pól) – rosną koszty i awaryjność.
- Brak wersjonowania – brak możliwości migracji i audytu.
Operacyjny skrót
Ten rozdział należy do rodziny Projektowanie interakcji i ma formę Standard. Poniższe dopowiedzenie ma jeden cel: przełożyć treść na działania, które da się wdrożyć, zmierzyć i utrzymać.
Checklista
- Ustal cel i kryteria poprawności (co znaczy „dobry wynik”).
- Zamknij format wyjścia (JSON / tabela / sekcje) i przygotuj walidację.
- Ogranicz przestrzeń odpowiedzi: instrukcje, słownik terminów, limity.
- Dodaj kontrolę jakości: self-check, sanity-checks, fallback, „no-answer”.
- Zapisz jako szablon (prompt_template) i wersjonuj jak kod.
- Wprowadź testy regresyjne (golden set) i przeglądy po zmianach.
Najczęstsze pułapki
- Mieszanie instrukcji z danymi wejściowymi (brak separacji „co” vs „na czym”).
- Format wynikowy „opisowy” bez kontraktu – brak automatycznej kontroli.
- Zbyt ogólne polecenia („napisz mądrze”) bez parametrów i ograniczeń.
- Brak strategii na niepewność: model zaczyna „zgadywać” zamiast eskalować.
Artefakty w Luage
Standard działa dopiero wtedy, gdy ma właściciela, wersję, ślad (trace) oraz test regresyjny.
Minimalny szablon promptu (do biblioteki)
prompt_template: support.reply@v3
intent: support.reply
inputs:
- user_message
- locale
constraints:
- "Jeśli brak źródła → powiedz, że nie wiesz i poproś o doprecyzowanie"
output:
format: markdown
sections: ["Odpowiedź", "Co dalej"]
Traktuj szablon jak kod: owner, wersja, testy i przegląd. Wtedy to działa powtarzalnie.
- po co structured outputs
- standard kontraktu odpowiedzi
- pętla walidacji i naprawy
- przykładowy schemat
- telemetria i regresje