Granice pojedynczego promptu: dlaczego rozumowanie nie gwarantuje precyzji
K
Kuba
Inżynieria AI w ASKEN
Im więcej model „myśli” przed odpowiedzią, tym większa szansa, że odpowiedź będzie poprawna — to założenie łatwo przyjąć bezkrytycznie. Sprawdziliśmy je empirycznie na trzech zadaniach wymagających mechanicznej, weryfikowalnej precyzji. Wynik jest bardziej złożony, niż mogłoby się wydawać.
Czym jest pojedynczy prompt?
Pojedynczy prompt to najprostszy możliwy sposób korzystania z modelu językowego — dokładnie ten, który większość z nas zna z codziennych rozmów z ChatGPT: piszemy pytanie lub polecenie, model generuje jedną odpowiedź i na tym koniec. Model nie ma możliwości sprawdzenia, czy to, co właśnie napisał, jest poprawne. Nie korzysta z kalkulatora, nie uruchamia kodu ani nie konsultuje się sam ze sobą. Po prostu przewiduje kolejne słowo, potem następne, aż skończy zdanie, a rezultat trafia do nas jako gotowa odpowiedź.
To podejście świetnie sprawdza się w rozmowach, pisaniu tekstów czy podsumowań, gdzie nie ma jednej „twardej”, poprawnej odpowiedzi. Zadaliśmy sobie pytanie: co się dzieje, gdy zadanie ma dokładnie jedną poprawną odpowiedź i wymaga mechanicznej precyzji, jak wynik mnożenia lub dokładna liczba znaków w tekście? Czy samo polecenie modelowi, by „myślał dłużej” — zwiększenie reasoning_effort — gwarantuje taką precyzję?
Testy przeprowadziliśmy przez Azure OpenAI na modelu z rodziny GPT-5.6. Parametr reasoning_effort określa, ile tokenów „myślenia” model zużywa przed wygenerowaniem odpowiedzi — od none do xhigh. Aby odróżnić problemy systemowe od losowych wahań próbkowania, każdą kombinację zadania i poziomu rozumowania powtórzyliśmy czterokrotnie.
Trzy zadania, jedna wspólna cecha
Wybraliśmy trzy zadania, których wyniki są jednoznacznie poprawne albo niepoprawne:
Mnożenie — iloczyn dwóch liczb 4-cyfrowych, dokładny wynik.
Znaki — tekst o dokładnie określonej liczbie znaków, nie słów.
Litery — zliczanie wystąpień wskazanej litery w losowym tekście o długości około 350 znaków.
Wyniki: skuteczność rośnie wraz z rozumowaniem, ale nie liniowo
Zadanie
none
low
medium
high
xhigh
Mnożenie
0%
100%
100%
100%
100%
Znaki
0%
0%
50%
50%
100%
Litery
0%
100%
100%
75%
100%
Przy effort=none wszystkie trzy zadania kończą się niepowodzeniem w 100% prób. Zaskakujące jest to, co dzieje się dalej. W zadaniu Litery poziom high (75%) wypada gorzej niż low i medium (100%), więc więcej rozumowania nie oznacza lepszego wyniku. Wyższy poziom zwiększa prawdopodobieństwo trafnej odpowiedzi, ale jej nie gwarantuje.
Dlaczego tak się dzieje?
Przy effort=none model miał obliczyć 3471 × 6305 = 21 884 655. Zwrócił „218637?” — liczbę nie tylko błędną, ale też niekompletną strukturalnie. To pokazuje mechanizm: model generuje odpowiedź token po tokenie, w jednym kierunku, bez sprawdzania własnego wyniku. Nie ma kroku „sprawdź, czy to się zgadza”. Poziom rozumowania daje modelowi więcej „przestrzeni” na rozłożenie problemu przed odpowiedzią, ale nie zmienia podstawowej architektury: to nadal generowanie w jednym kierunku, bez pętli informacji zwrotnej.
Koszt rośnie szybciej niż pewność
Wyższy poziom rozumowania oznacza większe koszty — płacimy za tokeny „myślenia”, nie tylko za odpowiedź.
Zadanie
none
low
medium
high
xhigh
Mnożenie
0,000075 USD
0,000382 USD
0,000425 USD
0,000584 USD
0,000473 USD
Znaki
0,000342 USD
0,010084 USD
0,010458 USD
0,014829 USD
0,014225 USD
Litery
0,000249 USD
0,003133 USD
0,004803 USD
0,005837 USD
0,006423 USD
W zadaniu Znaki koszt rośnie z 0,0003 USD (none) do 0,0142 USD (xhigh) — około 40-krotnie. Skuteczność przy xhigh rzeczywiście osiąga 100%, ale przy high wynosi tylko 50%. Płacimy więcej, nie zawsze zyskując większą pewność.
Litery: średni koszt pojedynczego promptu
Poziom rozumowania
Średni koszt (USD)
Skuteczność
none
0,000249 USD
0%
low
0,003133 USD
100%
medium
0,004803 USD
100%
high
0,005837 USD
75%
xhigh
0,006423 USD
100%
Średni koszt i skuteczność zadania Litery dla pięciu poziomów rozumowania. Każdą konfigurację przetestowano czterokrotnie.
Znaki: średni koszt pojedynczego promptu
Poziom rozumowania
Średni koszt (USD)
Skuteczność
none
0,000342 USD
0%
low
0,010084 USD
0%
medium
0,010458 USD
50%
high
0,014829 USD
50%
xhigh
0,014225 USD
100%
Średni koszt i skuteczność zadania Znaki dla pięciu poziomów rozumowania. Każdą konfigurację przetestowano czterokrotnie.
Co dalej?
Skoro problemem jest brak weryfikacji, naturalnym krokiem jest danie modelowi narzędzia, które sprawdzi wynik za niego. W kolejnym wpisie przyglądamy się temu, co daje wykonanie kodu i gdzie nadal nie wystarcza.
Granice pojedynczego promptu: dlaczego rozumowanie nie gwarantuje precyzji
Im więcej model „myśli” przed odpowiedzią, tym lepsza odpowiedź — to częste założenie. Sprawdziliśmy je empirycznie.
Kuba
Inżynieria AI
Wykonanie kodu: co rozwiązuje, a czego nie
Pojedynczy prompt zawodzi, ponieważ model generuje odpowiedzi token po tokenie, bez weryfikacji. Co, jeśli damy mu interpreter Pythona?
Kuba
Agenci AI
Pętla agenta: weryfikacja i korekta jako fundament niezawodności
Wykonanie kodu doskonale rozwiązuje zadania mechaniczne, ale zawodzi, gdy model musi ocenić własny wynik. Tu wkracza pętla agenta.
Kuba
Im więcej model „myśli” przed odpowiedzią, tym większa szansa, że odpowiedź będzie poprawna — to założenie łatwo przyjąć bezkrytycznie. Sprawdziliśmy je empirycznie na trzech zadaniach wymagających mechanicznej, weryfikowalnej precyzji. Wynik jest bardziej złożony, niż mogłoby się wydawać.
Czym jest pojedynczy prompt?
Pojedynczy prompt to najprostszy możliwy sposób korzystania z modelu językowego — dokładnie ten, który większość z nas zna z codziennych rozmów z ChatGPT: piszemy pytanie lub polecenie, model generuje jedną odpowiedź i na tym koniec. Model nie ma możliwości sprawdzenia, czy to, co właśnie napisał, jest poprawne. Nie korzysta z kalkulatora, nie uruchamia kodu ani nie konsultuje się sam ze sobą. Po prostu przewiduje kolejne słowo, potem następne, aż skończy zdanie, a rezultat trafia do nas jako gotowa odpowiedź.
To podejście świetnie sprawdza się w rozmowach, pisaniu tekstów czy podsumowań, gdzie nie ma jednej „twardej”, poprawnej odpowiedzi. Zadaliśmy sobie pytanie: co się dzieje, gdy zadanie ma dokładnie jedną poprawną odpowiedź i wymaga mechanicznej precyzji, jak wynik mnożenia lub dokładna liczba znaków w tekście? Czy samo polecenie modelowi, by „myślał dłużej” — zwiększenie reasoning_effort — gwarantuje taką precyzję?
Testy przeprowadziliśmy przez Azure OpenAI na modelu z rodziny GPT-5.6. Parametr reasoning_effort określa, ile tokenów „myślenia” model zużywa przed wygenerowaniem odpowiedzi — od none do xhigh. Aby odróżnić problemy systemowe od losowych wahań próbkowania, każdą kombinację zadania i poziomu rozumowania powtórzyliśmy czterokrotnie.
Trzy zadania, jedna wspólna cecha
Wybraliśmy trzy zadania, których wyniki są jednoznacznie poprawne albo niepoprawne:
Mnożenie — iloczyn dwóch liczb 4-cyfrowych, dokładny wynik.
Znaki — tekst o dokładnie określonej liczbie znaków, nie słów.
Litery — zliczanie wystąpień wskazanej litery w losowym tekście o długości około 350 znaków.
Wyniki: skuteczność rośnie wraz z rozumowaniem, ale nie liniowo
Zadanie
none
low
medium
high
xhigh
Mnożenie
0%
100%
100%
100%
100%
Znaki
0%
0%
50%
50%
100%
Litery
0%
100%
100%
75%
100%
Przy effort=none wszystkie trzy zadania kończą się niepowodzeniem w 100% prób. Zaskakujące jest to, co dzieje się dalej. W zadaniu Litery poziom high (75%) wypada gorzej niż low i medium (100%), więc więcej rozumowania nie oznacza lepszego wyniku. Wyższy poziom zwiększa prawdopodobieństwo trafnej odpowiedzi, ale jej nie gwarantuje.
Dlaczego tak się dzieje?
Przy effort=none model miał obliczyć 3471 × 6305 = 21 884 655. Zwrócił „218637?” — liczbę nie tylko błędną, ale też niekompletną strukturalnie. To pokazuje mechanizm: model generuje odpowiedź token po tokenie, w jednym kierunku, bez sprawdzania własnego wyniku. Nie ma kroku „sprawdź, czy to się zgadza”. Poziom rozumowania daje modelowi więcej „przestrzeni” na rozłożenie problemu przed odpowiedzią, ale nie zmienia podstawowej architektury: to nadal generowanie w jednym kierunku, bez pętli informacji zwrotnej.
Koszt rośnie szybciej niż pewność
Wyższy poziom rozumowania oznacza większe koszty — płacimy za tokeny „myślenia”, nie tylko za odpowiedź.
Zadanie
none
low
medium
high
xhigh
Mnożenie
0,000075 USD
0,000382 USD
0,000425 USD
0,000584 USD
0,000473 USD
Znaki
0,000342 USD
0,010084 USD
0,010458 USD
0,014829 USD
0,014225 USD
Litery
0,000249 USD
0,003133 USD
0,004803 USD
0,005837 USD
0,006423 USD
W zadaniu Znaki koszt rośnie z 0,0003 USD (none) do 0,0142 USD (xhigh) — około 40-krotnie. Skuteczność przy xhigh rzeczywiście osiąga 100%, ale przy high wynosi tylko 50%. Płacimy więcej, nie zawsze zyskując większą pewność.
Litery: średni koszt pojedynczego promptu
Poziom rozumowania
Średni koszt (USD)
Skuteczność
none
0,000249 USD
0%
low
0,003133 USD
100%
medium
0,004803 USD
100%
high
0,005837 USD
75%
xhigh
0,006423 USD
100%
Średni koszt i skuteczność zadania Litery dla pięciu poziomów rozumowania. Każdą konfigurację przetestowano czterokrotnie.
Znaki: średni koszt pojedynczego promptu
Poziom rozumowania
Średni koszt (USD)
Skuteczność
none
0,000342 USD
0%
low
0,010084 USD
0%
medium
0,010458 USD
50%
high
0,014829 USD
50%
xhigh
0,014225 USD
100%
Średni koszt i skuteczność zadania Znaki dla pięciu poziomów rozumowania. Każdą konfigurację przetestowano czterokrotnie.
Co dalej?
Skoro problemem jest brak weryfikacji, naturalnym krokiem jest danie modelowi narzędzia, które sprawdzi wynik za niego. W kolejnym wpisie przyglądamy się temu, co daje wykonanie kodu i gdzie nadal nie wystarcza.
W poprzednim wpisie pokazaliśmy, że pojedynczy prompt zawodzi, ponieważ model generuje odpowiedź token po tokenie, bez sprawdzania tego, co właśnie napisał. Naturalnym krokiem jest danie mu narzędzia, które wykona tę weryfikację za niego: interpretera Pythona. Model pisze skrypt, my go uruchamiamy, a to, co skrypt wypisze na stdout, traktujemy jako odpowiedź. To pierwszy z dwóch wariantów agentowych w naszej serii.
Czym jest wykonanie kodu?
Wyobraź sobie, że zamiast prosić kogoś o pomnożenie w pamięci dwóch dużych liczb, dajemy mu kalkulator. Dokładnie tak działa wykonanie kodu. Zamiast prosić model o bezpośrednią odpowiedź, prosimy go o napisanie krótkiego programu w Pythonie, który ją obliczy, a następnie sami uruchamiamy ten program.
Różnica względem pojedynczego promptu jest fundamentalna. Model przestaje „liczyć” lub „literować” w głowie, a przekazuje tę pracę interpreterowi Pythona — narzędziu, które w przeciwieństwie do modelu nigdy nie myli się w prostej arytmetyce czy zliczaniu znaków. Model skupia się na tym, w czym jest dobry: zrozumieniu zadania i napisaniu odpowiedniego kodu. Mechaniczne wykonanie pozostawia maszynie stworzonej właśnie do tego.
Przetestowaliśmy to na tym samym zestawie zadań co wcześniej: Mnożenie, Znaki i Litery, na pięciu poziomach rozumowania. Każdą konfigurację powtórzyliśmy czterokrotnie.
Wyniki: dwa zadania rozwiązane, jedno nadal zawodzi
Zadanie
none
low
medium
high
xhigh
Mnożenie
100%
100%
100%
100%
100%
Litery
75%
100%
100%
100%
100%
Znaki
0%
25%
0%
25%
75%
W przypadku mnożenia skuteczność od razu rośnie do 100%, nawet przy effort=none. Model nie musi już liczyć w pamięci: generuje po prostu print(6305 * 3471), a interpreter wykonuje mnożenie za niego. To dokładnie ta klasa problemów, którą wykonanie kodu rozwiązuje w pełni — zadania, w których mechaniczne wykonanie zastępuje „myślenie” modelu. Litery również szybko osiągają 100%, choć bez rozumowania (75%) model nadal czasem popełnia błędy w samej logice zliczania.
Znaki to zupełnie inny przypadek, ponieważ wykonanie kodu nie rozwiązuje tego problemu. Model nadal musi ocenić długość tekstu, który sam napisał, i nadal się myli. Jedyna różnica polega na tym, że robi to teraz za pomocą asercji, która po prostu przerywa działanie skryptu, zamiast zwrócić błędną odpowiedź.
Gdy własny test agenta obraca się przeciwko niemu
Przy effort=none model miał napisać akapit o programowaniu o długości dokładnie 320 znaków. Napisał kod, który sam się sprawdza:
text = ("Programming turns ideas into instructions that computers can "
"execute. It rewards curiosity, patience, and precise thinking, while "
"offering creative ways to solve problems...")
assert len(text) == 320
print(text)
Tekst napisany przez model w rzeczywistości nie miał 320 znaków, więc asercja zgłosiła wyjątek, skrypt zakończył się błędem, a stdout pozostało puste. To najlepszy przykład ograniczeń tego podejścia. Model nie tylko błędnie ocenił liczbę znaków, ale też napisał test, który to wykrył — i mimo to pozostawił niedziałający kod, zamiast poprawić tekst. Nie miał mechanizmu, który by mu to umożliwił: dostał jedną szansę i ją stracił.
Koszt: narzędzie nie zawsze jest tańsze
W zadaniu Mnożenie koszty są zbliżone do pojedynczego promptu, a przy effort=none nawet nieco niższe. Krótki kod jest tańszy niż długie obliczenie opisane tekstem. W zadaniu Znaki jest jednak odwrotnie: wykonanie kodu jest wyraźnie droższe niż zwykły prompt przy tym samym poziomie rozumowania, a mimo to nie gwarantuje sukcesu.
Mnożenie: pojedynczy prompt i wykonanie kodu
Poziom rozumowania
Pojedynczy prompt
Wykonanie kodu
none
0%
100%
low
100%
100%
medium
100%
100%
high
100%
100%
xhigh
100%
100%
Skuteczność zadania Mnożenie. W tych testach wykonanie kodu osiąga 100% już od effort=none.
Litery: pojedynczy prompt i wykonanie kodu
Poziom rozumowania
Pojedynczy prompt
Wykonanie kodu
none
0%
75%
low
100%
100%
medium
100%
100%
high
75%
100%
xhigh
100%
100%
Skuteczność zadania Litery. Bez rozumowania model nadal czasami myli się przy liczeniu z użyciem kodu.
Znaki: pojedynczy prompt i wykonanie kodu
Poziom rozumowania
Pojedynczy prompt
Wykonanie kodu
none
0%
0%
low
0%
25%
medium
50%
0%
high
50%
25%
xhigh
100%
75%
Skuteczność zadania Znaki. Nawet przy wysokim poziomie rozumowania jednorazowe wykonanie kodu nie zawsze kończy się sukcesem.
Co dalej?
Wykonanie kodu rozwiązuje zadania mechaniczne w 100%, ale tam, gdzie model musi ocenić jakość własnego wyniku, jedna szansa na skrypt nie wystarcza. Brakuje mechanizmu, który poinformuje model o błędzie i pozwoli mu się poprawić. W kolejnym, ostatnim wpisie serii zamykamy tę pętlę.
W poprzednim wpisie pokazaliśmy, że danie modelowi interpretera Pythona rozwiązuje zadania mechaniczne w 100%, ale nie pomaga tam, gdzie model musi ocenić jakość własnego wyniku. Agent dostał jedną szansę na skrypt, a gdy jego asercja zawiodła, po prostu kończył z pustą odpowiedzią. Brakowało mechanizmu przekazania informacji o błędzie i dania mu kolejnej szansy.
Czym jest pętla agenta?
Wyobraź sobie ucznia, który oddaje pracę domową, dostaje ją z powrotem z zaznaczonym błędem, poprawia go i oddaje ponownie — aż zadanie zostanie wykonane prawidłowo. Dokładnie tak działa pętla agenta. W poprzednim wariancie, czyli wykonaniu kodu, model pisał skrypt i dostawał tylko jedną szansę. Jeśli kod zawiódł, agent kończył z pustą odpowiedzią i bez informacji zwrotnej. W pętli agenta dodajemy brakujący element: informację o błędzie, która wraca do modelu, oraz możliwość ponownej próby.
W praktyce wygląda to tak: model pisze skrypt, my go uruchamiamy, a jeśli wynik jest nieprawidłowy lub skrypt zgłasza błąd, przekazujemy modelowi dokładnie to, co poszło nie tak — komunikat błędu oraz oczekiwany i otrzymany wynik — jako następną wiadomość w tej samej rozmowie. Model widzi swój błąd i może napisać poprawioną wersję kodu. Cykl:
napisz → uruchom → sprawdź → popraw
powtarza się, aż zadanie zostanie wykonane poprawnie albo wyczerpie się limit prób. W naszym przypadku wynosi on pięć tur. To właśnie informacja zwrotna połączona z możliwością poprawy odróżnia pętlę agenta od prostego wykonania kodu i daje ogromną różnicę w niezawodności.
Trzy podejścia, jeden wykres
Przetestowaliśmy to na zadaniu Znaki, które w obu poprzednich podejściach wypadało najsłabiej.
Poziom rozumowania
Pojedynczy prompt
Wykonanie kodu
Pętla agenta
none
0%
0%
50%
low
0%
25%
100%
medium
50%
0%
100%
high
50%
25%
100%
xhigh
100%
75%
100%
Znaki: porównanie wszystkich trzech podejść
Poziom rozumowania
Pojedynczy prompt
Wykonanie kodu
Pętla agenta
none
0%
0%
50%
low
0%
25%
100%
medium
50%
0%
100%
high
50%
25%
100%
xhigh
100%
75%
100%
Skuteczność zadania Znaki: pojedynczy prompt, wykonanie kodu i pętla agenta dla pięciu poziomów rozumowania.
Od poziomu low wzwyż pętla agenta daje 100% skuteczności — dokładnie tam, gdzie pojedynczy prompt i jednorazowe wykonanie kodu zawodziły najczęściej. Weryfikacja połączona z korektą okazała się skuteczniejsza niż samo zwiększanie poziomu rozumowania: nawet na najtańszym, najniższym poziomie rozumowania (low) pętla kończy zadanie poprawnie w 100% przypadków, podczas gdy pojedynczy prompt na tym samym poziomie nie radzi sobie w ogóle.
Warto zwrócić uwagę na effort=none: tam pętla daje tylko 50% skuteczności. Sama informacja zwrotna nie pomaga, jeśli model nie ma dość „mocy obliczeniowej”, by sensownie wykorzystać informację o błędzie w następnej turze. Pętla agenta sama w sobie nie jest rozwiązaniem uniwersalnym — potrzebuje minimalnego poziomu rozumowania, aby informacja zwrotna miała sens.
Ile to kosztuje w praktyce?
Więcej tur oznacza więcej wywołań modelu, a więc wyższy koszt, ale wyższy poziom rozumowania skraca pętlę. Model lepiej wykorzystuje informację zwrotną z poprzedniej próby, więc do sukcesu potrzebuje mniej tur.
Poziom rozumowania
none
low
medium
high
xhigh
Średnia liczba tur
3,50
2,50
1,75
1,75
1,50
Pętla agenta jest najdroższa na każdym poziomie rozumowania, co ma sens: płacimy za wiele tur zamiast jednej. Pełny obraz wyłania się jednak dopiero z tabeli skuteczności. Pojedynczy prompt i wykonanie kodu „oszczędzają” na kosztach, ale w zamian niosą ryzyko niepowodzenia sięgające 100% przy niskich poziomach rozumowania. Pętla agenta od low wzwyż kosztuje więcej, ale daje pewność. W zadaniach, w których błędna odpowiedź rzeczywiście kosztuje — bo na przykład trafia bezpośrednio do klienta — różnica kilku centów za próbę to niewielka cena za gwarancję poprawności.
Podsumowanie całego eksperymentu
Pojedynczy prompt generuje odpowiedź bez weryfikacji, więc nawet wysoki poziom rozumowania nie gwarantuje precyzji. Wykonanie kodu wprowadza obiektywnego „sędziego” w postaci interpretera, ale bez informacji zwrotnej agent dostaje tylko jedną szansę. Dopiero połączenie tych dwóch elementów — weryfikacji i korekty w pętli — zapewnia rzeczywistą niezawodność. To podejście nie ogranicza się do trzech zadań testowych: wszędzie tam, gdzie poprawność wyniku można sprawdzić automatycznie — przez testy, walidację formatu lub zgodność ze schematem — ten sam wzorzec: wykonaj, zweryfikuj, popraw, powinien działać równie skutecznie.