Formatowanie wyników narzędzi i structured output — kontekst, który agent rozumie

przez Łukasz | cze 5, 2026

Surowy dump z API to nie kontekst.

To materiał, z którego dopiero trzeba kontekst zrobić.

Cztery poprzednie wpisy odpowiadały na pytanie „co i ile” wrzucić do okna. Został ostatni wymiar: w jakiej formie. Bo nawet trafnie dobrany fragment, podany w złym kształcie, model wykorzysta gorzej — albo wcale.

To pytanie pojawia się na dwóch brzegach pętli agenta. Agent woła narzędzie i coś z niego wraca do okna — to brzeg wejścia. Agent produkuje odpowiedź, którą przejmuje kolejny krok albo kolejne narzędzie — to brzeg wyjścia. Oba brzegi rządzą się tą samą zasadą: forma jest częścią kontekstu. Ten wpis jest o obu.

Mechanikę wywoływania narzędzi w pętli rozkłada artykuł serii o tym, jak agent myśli i działa. Tu zajmujemy się tym, co przepływa przez te brzegi — i jak to ukształtować.

Brzeg wejścia: co wraca z narzędzia

Gdy agent odpyta bazę albo uderzy w API, wynik wraca do okna, żeby model oparł na nim następny krok. I tu pojawia się błąd, który widać u każdego początkującego: surowy wynik trafia do okna w całości. Pełny JSON z pięćdziesięcioma polami, gdzie istotne są trzy. Cała odpowiedź API z metadanymi, nagłówkami, paginacją.

To dokładnie to, przed czym ostrzegał wpis o warstwach okna: surowy wynik narzędzia to nie kontekst, to materiał na kontekst. Zanim wróci do modelu, warto go obrobić.

Trzy ruchy, które zamieniają dump w kontekst.

Wytnij nieistotne. Z pięćdziesięciu pól zostaw te, których krok faktycznie potrzebuje. Reszta to budżet okna spalony na metadane i context rot dosypany za darmo.

Opisz, co to jest. Goły ciąg wartości mówi modelowi mniej niż ten sam ciąg z czytelnymi etykietami. Wynik ma być samoopisujący się — żeby model nie musiał zgadywać, czym jest 0.92 ani co znaczy trzecia kolumna.

Streszczaj długie wyniki. Jeśli narzędzie zwraca listę stu rekordów, a krok potrzebuje wniosku z nich — daj wniosek, nie sto rekordów. To ten sam ruch co kompakcja, tylko zastosowany do wyniku narzędzia, nie do historii.

Zasada brzegu wejścia: do okna wraca wynik gotowy do użycia, nie surowiec do przekopania.

Brzeg wyjścia: co model oddaje

Druga strona jest równie ważna, a często pomijana. To, co model produkuje, bardzo często staje się wejściem następnego kroku — innego węzła, innego narzędzia, kolejnej iteracji pętli. Jeśli model oddaje to jako swobodny tekst, następny krok musi ten tekst rozumieć, parsować, zgadywać. A swobodny tekst jest nieprzewidywalny.

Tu wchodzi structured output: zmuszenie modelu, żeby oddawał wynik w ustalonej, sztywnej formie — najczęściej jako JSON o zdefiniowanej strukturze — zamiast jako prozę. Zamiast „Znalazłem trzy hotele, najtańszy to…” model oddaje strukturę z polami nazwa, cena, odległość, którą następny krok przejmuje bez zgadywania.

To rozwiązuje problem, który inaczej rozwiązuje się brzydko: parsowanie prozy regexami. Każdy, kto próbował wyłuskać liczbę ze swobodnej odpowiedzi modelu i trafił raz na „380 zł”, raz na „trzysta osiemdziesiąt złotych”, a raz na „około 380″ — wie, dlaczego struktura wygrywa.

Structured output a namiastka determinizmu

Jest w tym głębszy wątek. LLM jest z natury niedeterministyczny — to samo wejście potrafi dać różne wyjścia. W przepływie, który ma działać powtarzalnie, to problem. Structured output nie usuwa tej niedeterministyczności, ale ją okiełznuje: treść może się wahać, ale kształt jest stały. Pole cena zawsze jest liczbą, zawsze w tym samym miejscu. To jedna z głównych dźwigni budowania powtarzalnych przepływów na nieprzewidywalnym modelu — namiastka determinizmu, o której więcej w eksperymentach na promptujemy.pl.

I jest tu drugi zysk, który spina się z wpisem serii o ewaluacji: strukturę da się sprawdzić. Walidacja, czy cena jest liczbą dodatnią, jest trywialna. Walidacja, czy proza „zawiera sensowną cenę”, jest sama w sobie zadaniem dla modelu. Structured output zamienia kontrolę jakości z domysłu w prosty test.

Kiedy nie przesadzić ze strukturą

Structured output nie jest darmowy i nie jest zawsze właściwy. Dwie sytuacje, w których warto się powstrzymać.

Gdy reasoning ma wartość. Jeśli krok wymaga, żeby model „pomyślał na głos” — przeszedł rozumowanie zanim da wynik — wymuszenie samego JSON-a obcina to myślenie i pogarsza decyzję. Częste rozwiązanie: pozwól na reasoning ipoproś o strukturę na końcu, zamiast zabijać jedno dla drugiego.

Gdy schemat jest zbyt sztywny. Schemat, który nie przewiduje przypadku „nie znaleziono” albo „niepewne”, zmusza model do wciskania rzeczywistości w pola, które do niej nie pasują. Dobry schemat ma miejsce na brak wyniku i na niepewność — inaczej kupujesz przewidywalny kształt za cenę zmyślonej treści.

Struktura jest narzędziem, nie religią. Stosuj ją tam, gdzie wyjście modelu ma być przejęte maszynowo. Odpuść tam, gdzie liczy się rozumowanie albo gdzie wynik czyta człowiek.

Jak to wygląda w n8n

Oba brzegi widać w przepływie wprost. Brzeg wejścia: węzeł narzędzia zwraca surową odpowiedź API, a Ty — zamiast podpinać ją do modelu w całości — wstawiasz krok, który wyciąga i opisuje istotne pola, zanim trafią do węzła z modelem. Brzeg wyjścia: zamiast brać swobodną odpowiedź modelu i parsować ją w kolejnych węzłach, wymuszasz structured output, dzięki czemu następne węzły dostają przewidywalne pola i przepływ przestaje się wykrzaczać na nietypowym sformułowaniu.

Moment, w którym zaczynasz formatować to, co wchodzi, i wymuszać kształt tego, co wychodzi — to moment, w którym przepływ przestaje być „połączonymi węzłami z modelem w środku”, a staje się układem, który działa powtarzalnie.

Co z tego wynika — i co domyka klaster

Forma jest częścią kontekstu. Najtrafniej dobrany fragment, podany jako surowy dump, model wykorzysta gorzej niż mniejszy fragment podany czytelnie. A wyjście modelu bez nałożonej struktury staje się chaotycznym wejściem dla następnego kroku. Oba brzegi okna chcą tego samego: przewidywalnego kształtu.

Tym domykamy bazę context engineeringu. Mamy już komplet: dlaczego prompt to za mało (pillar), okno jako budżet (C1), pięć warstw i decyzja co wpuścić (C2), retrieval just-in-time (C3), kompakcja przy długich przebiegach (C4), dobór przykładów (C5) i — tu — forma na obu brzegach. Razem to jeden zestaw umiejętności: agent jest tak dobry, jak kontekst, który mu składasz — co do treści, ilości i formy.

Zostaje jeszcze jeden wątek, którego dotąd nie ruszaliśmy: co, jeśli to, co wpada do okna, jest atakiem. Gdy kontekst staje się wektorem — zatruty dokument, spreparowany wynik narzędzia, instrukcja ukryta w pobranych danych. To bonusowy wpis tej kategorii i most do bezpieczeństwa agentów.


Pojęcia ze słownika: Structured output · Okno kontekstu · Context rot · Grounding · Budżet tokenów

Agent kończy, ale zadania nie wykonał

Agent kończy, ale zadania nie wykonał

Objawy Agent odpowiada: „Przygotowałem i wysłałem potwierdzenie do klienta." Potwierdzenie nie zostało wysłane. Albo: „Zaktualizowałem wszystkie rekordy" — zaktualizował trzy z dwunastu. Albo: „Nie znalazłem żadnych zamówień" — bo narzędzie zwróciło błąd, którego nikt...

Agent zrobił coś, o co nikt nie prosił

Agent zrobił coś, o co nikt nie prosił

Objawy Operacja, której nikt nie zlecił. Dane wysłane pod adres, którego nie ma w żadnej konfiguracji. Rekord zmieniony poza zakresem zadania. Odpowiedź, z której wynika, że agent dostał instrukcje od kogoś innego niż ty. Cecha wspólna: technicznie wszystko zadziałało...

Agent zrobił to samo dwa razy

Agent zrobił to samo dwa razy

Objawy Ten syndrom różni się od pozostałych jedną rzeczą: objaw widzi klient, nie ty. Trzy identyczne wiadomości w skrzynce. Dwa zamówienia zamiast jednego. Podwójne obciążenie. Duplikaty rekordów, które ktoś zauważa tydzień później. W twoim dzienniku wszystko wygląda...

Agent gubi wątek w długim zadaniu

Agent gubi wątek w długim zadaniu

Objawy Pierwsze kroki idą wzorowo. Po kilkunastu agent zaczyna się rozjeżdżać. Przestaje przestrzegać reguły z promptu systemowego, której trzymał się na początku. Zmienia format odpowiedzi w połowie zadania. Wraca do czegoś, co już ustalił, i ustala to inaczej....

Agent podaje dane, których nie ma

Agent podaje dane, których nie ma

Objawy Numer zamówienia w idealnym formacie, którego nie ma w bazie. Kwota, której w dokumencie nie ma. Nazwa pola API, które nigdy nie istniało. Cytat z regulaminu, brzmiący dokładnie jak reszta regulaminu i w nim nieobecny. Cecha wspólna wszystkich tych przypadków:...

Działał wczoraj, dziś nie działa

Działał wczoraj, dziś nie działa

Objawy Nic się nie wywala. Nie ma wyjątków, nie ma timeoutów, dziennik wygląda tak samo jak zawsze. Po prostu odpowiedzi są gorsze. Postacie, w jakich to się objawia: Jakość. Agent zaczyna pomijać kroki, które wcześniej wykonywał, albo odpowiada ogólniej. Format....

Agent wybiera złe narzędzie

Agent wybiera złe narzędzie

Objawy Agent odpowiada nie na to pytanie. Pobiera listę zamówień, gdy pytano o jedno konkretne. Odpowiada z pamięci, choć miał sprawdzić w bazie. Albo sięga po właściwe narzędzie i wpisuje w argumenty coś, czego nie da się użyć. Sygnał, który odróżnia ten syndrom od...

Agent kręci się w kółko

Agent kręci się w kółko

Objawy Agent wykonuje kolejne obroty pętli, nie zbliżając się do zakończenia zadania. W dzienniku widać jedną z trzech postaci. Powtórzenie. To samo narzędzie, te same argumenty, raz za razem — czasem dziesiątki razy pod rząd. Oscylacja. Agent wywołuje na przemian dwa...