ReAct
Jak działa
1. Konstrukcja promptu: instrukcja systemowa opisująca dostępne narzędzia (z nazwą, opisem i schematem argumentów) + kilka demonstracji w formacie ReAct (Thought/Action/Observation/Finish) + zapytanie użytkownika. 2. Pętla agenta: a. Model generuje token „Thought:" + rozumowanie po wszystkim, co dotychczas widział (zapytanie + historia akcji/obserwacji). b. Model generuje „Action:" + nazwę narzędzia i argumenty (zazwyczaj w formacie JSON lub function-call). c. Generacja jest zatrzymywana na separatorze (np. „Observation:"). Orkiestrator parsuje akcję, wykonuje narzędzie i wkleja wynik jako „Observation: <wynik>". d. Pętla wraca do (a) — model widzi nową obserwację i decyduje o kolejnym kroku. 3. Warunek stopu: model generuje „Action: Finish[<answer>]" lub przekroczy limit kroków (typowo 5–15). 4. Walidacja: orkiestrator może parsować odpowiedź końcową, sprawdzać format i ewentualnie wymusić ponowną iterację. 5. Wariant function calling: w nowoczesnych API (OpenAI, Anthropic) Action jest tokenem strukturalnym (function call), nie tekstem — model API zwraca obiekt, którego nie trzeba parsować z tekstu.
Rozwiązany problem
Czysty Chain-of-Thought halucynuje fakty, których nie ma w wagach modelu — szczególnie na zadaniach wymagających aktualnej wiedzy lub multi-hop reasoning. Czyste tool-using LLM bez jawnego rozumowania wybiera akcje impulsywnie, bez planu, i nie potrafi się skorygować po nieoczekiwanej obserwacji. ReAct adresuje oba problemy jednocześnie: rozumowanie zapewnia plan i kontekst, akcje weryfikują fakty w świecie, obserwacje korygują plan.
Komponenty
Token w języku naturalnym poprzedzający akcję; służy do planowania, dekompozycji problemu, oceny obserwacji i decyzji o kolejnym kroku. Mechanicznie jest to fragment Chain-of-Thought reasoning generowany w pętli agenta.
Token zawierający nazwę narzędzia i jego argumenty. W oryginalnym ReAct format tekstowy: 'Action: search[Apple Remote]'. W nowoczesnych implementacjach format strukturalny (function call JSON). Specjalna akcja 'Finish[<answer>]' kończy pętlę.
Oficjalna
Wynik wykonania akcji wstrzyknięty z powrotem do kontekstu modelu. Może być fragmentem strony Wikipedia, wynikiem zapytania SQL, JSON-em z API, treścią pliku itp. Format zależy od narzędzia.
Komponent zewnętrzny względem LLM, który: (1) parsuje wygenerowane Action, (2) wywołuje fizyczne narzędzia, (3) wstrzykuje Observation do kontekstu, (4) wykrywa Finish lub limit kroków. Implementowany przez frameworki: LangChain AgentExecutor, LlamaIndex ReActAgent, OpenAI Assistants Runner.
Oficjalna
Zdefiniowana z góry przestrzeń akcji: lista narzędzi z opisem i schematem argumentów. W oryginalnym ReAct dla HotpotQA: search[entity], lookup[keyword], finish[answer]. W nowoczesnych agentach: dziesiątki/setki narzędzi z function calling.
Oficjalna
Implementacja
Bez twardego limitu kroków agent może wywoływać narzędzia w nieskończoność (np. powtarzać tę samą akcję, oczekując innego wyniku). To jeden z najczęstszych trybów awarii ReAct.
Model może generować fragment Observation jako część własnej generacji zamiast czekać na rzeczywisty wynik. Skutkiem są decyzje oparte na fałszywych „faktach".
W oryginalnym tekstowym ReAct model może wygenerować źle sformułowane Action (np. brak nawiasów, nieznane narzędzie, niepoprawne argumenty). Każdy taki błąd przerywa pętlę lub wymaga retry.
Każda Observation (zwłaszcza wyniki wyszukiwania, treść stron) dokłada setki/tysiące tokenów. Po kilku iteracjach kontekst może przekroczyć okno modelu lub powodować eksplozję kosztu.
Przy dużym zbiorze narzędzi (≥30) model często wybiera nie najlepsze narzędzie do zadania, mylony przez podobne nazwy lub niejednoznaczne opisy.
Gdy narzędzie zwraca błąd (timeout, 500, nieoczekiwany format), agent może wpaść w pętlę powtarzania tej samej akcji lub poddać się.
Ewolucja
Wei i in. wykazują, że jawne kroki rozumowania w prompcie poprawiają zdolność LLM do rozwiązywania złożonych zadań. ReAct buduje na CoT, dodając akcje i obserwacje.
WebGPT (OpenAI 2022) i Toolformer (Schick i in. 2023) pokazują, że LLM mogą wywoływać narzędzia, ale bez przeplatanego rozumowania. ReAct adresuje brakującą warstwę planowania.
Yao i in. (Princeton + Google Brain) wprowadzają wzorzec Thought/Action/Observation, demonstrując poprawę nad CoT i tool-only baseline na HotpotQA, FEVER, ALFWorld i WebShop.
LangChain (uruchomiony w październiku 2022) populeryzuje ReAct jako standardowy wzorzec agenta. Wzorzec staje się de facto standardem dla aplikacji agentowych w 2023 roku.
Reflexion rozszerza ReAct o pętlę zewnętrzną: po nieudanym epizodzie agent generuje samokrytykę zapisywaną w pamięci, która warunkuje kolejną próbę. Poprawia HumanEval z 80% (GPT-4 + ReAct) do 91%.
OpenAI wprowadza function calling w czerwcu 2023, przekształcając Action z tekstu w strukturalny obiekt JSON. Eliminuje potrzebę parsowania tekstu Action — Anthropic i Google idą tą samą drogą.
Anthropic publikuje MCP w listopadzie 2024 — otwarty standard komunikacji LLM↔narzędzia, uogólniający warstwę Action z ReAct na cały ekosystem dostawców.
Modele rozumujące (o1, o3, DeepSeek-R1) generują rozszerzone wewnętrzne rozumowanie wytrenowane przez RL. ReAct ewoluuje: warstwa Thought zostaje wchłonięta przez sam model, zewnętrzny orkiestrator skupia się na akcjach i pamięci.
Szczegóły techniczne
Hiperparametry (konfigurowalne osie)
Limit iteracji Thought→Action→Observation, który chroni przed nieskończonymi pętlami. Po jego przekroczeniu agent jest wymuszany do udzielenia odpowiedzi lub kończy z błędem.
Wielkość przestrzeni akcji. Większa liczba narzędzi zwiększa elastyczność, ale obciąża okno kontekstowe i utrudnia poprawny wybór akcji.
Sposób kodowania wywołań narzędzi: tekstowy (oryginalny ReAct) vs strukturalny (JSON function call) vs MCP.
Few-shot demonstracje pełnych trajektorii Thought/Action/Observation/Finish. Krytyczne dla mniejszych modeli; dla GPT-4/Claude często wystarcza 0–2.
Złożoność obliczeniowa
Złożoność czasowa: O(N · (L_ctx · d + T_tool)). Złożoność przestrzenna: O(N · L_step + N_tools · L_tool_def).
Wąskie gardło obliczeniowe
Każdy krok pętli wymaga pełnego prefill LLM nad całą dotychczasową historią + autoregresywnej generacji nowego Thought i Action. Przy braku KV-cache koszt kwadratowy w liczbie kroków.
Paradygmat wykonania
Sam LLM działa w trybie dense (każdy forward pass aktywuje wszystkie parametry), ale cała aplikacja ReAct ma charakter conditional/stage-dependent: każdy etap pętli ma inny stan kontekstu i inny cel generacji.
Orkiestrator (agent executor) decyduje o ponownym wywołaniu modelu po wstrzyknięciu obserwacji. To nie routing wewnątrz modelu, lecz zewnętrzna pętla sterująca.
Równoległość
Wiele niezależnych trajektorii ReAct (np. dla różnych zapytań lub w drzewiastym przeszukiwaniu Tree of Thoughts) można uruchamiać równolegle batch-em. Sama pojedyncza trajektoria pozostaje sekwencyjna.
Wymagania sprzętowe
ReAct to wzorzec stosowany do standardowego LLM, który działa najefektywniej na GPU z tensor cores. Wymagania sprzętowe pochodzą wyłącznie od bazowego modelu.
Sam wzorzec ReAct nie ma specyficznych wymagań sprzętowych — może być realizowany przez dowolny LLM, lokalnie (Ollama, vLLM) lub przez API.