# ReAct-patronen ontleed: redeneren en actie

[Naar de inhoud](#lm-inhoud)Netwerk/NL[EN](/en/)[Hubhub.llmnet.nlModellen vergelijken op taak, taal, kosten en licentie.](https://hub.llmnet.nl/)[Communitycommunity.llmnet.nlPrompttechnieken, patronen en systeemprompts.](https://community.llmnet.nl/)[APIapi.llmnet.nlLLM's robuust in software: rate limits, routing, structured output.](https://api.llmnet.nl/)[Consultancyconsultancy.llmnet.nlAI invoeren in een organisatie, van pilot tot productie.](https://consultancy.llmnet.nl/)[Nieuwsnieuws.llmnet.nlOntwikkelingen in AI, geduid voor Nederland.](https://nieuws.llmnet.nl/)[Benchmarkbenchmark.llmnet.nlZelf meten wat AI-kwaliteit is, voor jouw taken.](https://benchmark.llmnet.nl/)[Vacaturesvacatures.llmnet.nlAI-rollen, salarissen en carrièrepaden in Nederland.](https://vacatures.llmnet.nl/)[Lerenleren.llmnet.nlAI-concepten in gewoon Nederlands, van beginner tot bouwer.](https://leren.llmnet.nl/)[Gidsgids.llmnet.nlAI privé draaien op eigen Mac, pc, NAS of thuisserver.](https://gids.llmnet.nl/)[Directorydirectory.llmnet.nlHet AI-ecosysteem in kaart: tools, modellen, bedrijven.](https://directory.llmnet.nl/)[Radarradar.llmnet.nlSignalen uit X, onderzoek en communities voor indie developers.](https://radar.llmnet.nl/)[Appsapps.llmnet.nlReviews van AI-apps en open-source repo's, met tips voor wie zelf bouwt.](https://apps.llmnet.nl/)[llmnet.nl — hoofdsite](https://llmnet.nl/)[](https://x.com/intent/post?url=https%3A%2F%2Fleren.llmnet.nl%2Freact-patronen-ontleed-hoe-redeneren-en-acties-samensmelten&text=ReAct-patronen%20ontleed%3A%20redeneren%20en%20actie)[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fleren.llmnet.nl%2Freact-patronen-ontleed-hoe-redeneren-en-acties-samensmelten)[](https://www.reddit.com/submit?url=https%3A%2F%2Fleren.llmnet.nl%2Freact-patronen-ontleed-hoe-redeneren-en-acties-samensmelten&title=ReAct-patronen%20ontleed%3A%20redeneren%20en%20actie)[](#)[](https://x.com/intent/post?url=https%3A%2F%2Fleren.llmnet.nl%2Freact-patronen-ontleed-hoe-redeneren-en-acties-samensmelten&text=ReAct-patronen%20ontleed%3A%20redeneren%20en%20actie)[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fleren.llmnet.nl%2Freact-patronen-ontleed-hoe-redeneren-en-acties-samensmelten)[](https://www.reddit.com/submit?url=https%3A%2F%2Fleren.llmnet.nl%2Freact-patronen-ontleed-hoe-redeneren-en-acties-samensmelten&title=ReAct-patronen%20ontleed%3A%20redeneren%20en%20actie)[](#)

 
# ReAct-patronen ontleed: hoe redeneren en acties samensmelten

 
 Door Ivo Donker — samengesteld met AI-ondersteuning (Claude & Gemini) · 23 augustus 2026
 

 
 
### Wat je hiervoor moet weten

 Dit artikel valt onder module 6 (Verantwoord & doorkijk). Om de mechanica van ReAct volledig te doorgronden, helpt het als de fundamenten van autonome systemen helder zijn. Lees vooraf [wat het verschil is tussen een agent en een chatbot](https://leren.llmnet.nl/wat-is-een-agent-vs-chatbot) om de overgang van eenrichtingsverkeer naar iteratieve verwerking te begrijpen. Daarnaast bouwt deze methodiek direct voort op gestructureerde prompting; bekijk de analyse over [redeneren in tussenstappen via chain-of-thought](https://leren.llmnet.nl/chain-of-thought) om te zien hoe denksporen intern worden opgebouwd.

 

 Taalmodellen blinken uit in taalbegrip en patroonherkenning, maar ze zijn van nature gesloten systemen. Zonder externe koppelingen hebben ze geen weet van actuele feiten, kunnen ze geen deterministische berekeningen garanderen en kunnen ze geen fysieke of digitale acties uitvoeren. Vroegtijdige pogingen om dit op te lossen splitsten zich in twee richtingen: enerzijds interne redeneersporen genereren en anderzijds directe API-aanroepen doen. Beide benaderingen op zichzelf bleken kwetsbaar voor hallucinaties of blindelings falen.

 Het ReAct-patroon (afgeleid van Reasoning en Acting) lost dit op door redeneren en handelen te vlechten in een doorlopende, dynamische feedbacklus. In plaats van een statisch plan vooraf op te stellen of direct een tool aan te roepen, formuleert het model eerst een gedachte over de huidige status, kiest het een gerichte actie, observeert het de feitelijke systeemoutput en past het zijn volgende gedachte daarop aan. In dit artikel ontleden we de interne anatomie van deze cyclus, analyseren we concrete implementaties en brengen we de structurele kwetsbaarheden in kaart.

 
## De anatomie van de ReAct-cyclus: Thought, Action, Observation

 De kern van het ReAct-paradigma bestaat uit drie fundamentele bouwstenen die elkaar continu opvolgen totdat een eindantwoord is bereikt. Het model draait in een gecontroleerde executieloop waarin elke stap de context voor de volgende stap verrijkt. Dit voorkomt dat een taalmodel moet 'gokken' naar tussenresultaten.

 De drie stappen manifesteren zich als volgt in de interactiegeschiedenis:

 
 
- Thought (Gedachte): Het model reflecteert op de taak en de huidige toestand. Het formuleert expliciet wat het weet, wat er ontbreekt en welke subvraag eerst beantwoord moet worden. Dit dwingt het model om aandachtsvectoren te richten op logische coherentie.
 
- Action (Actie): Het model selecteert een specifieke tool en formuleert de exacte aanroepparameters. Dit kan een zoekopdracht zijn, een database-query, een API-aanroep of een Python-executie.
 
- Observation (Observatie): De buitenwereld (de runtime-omgeving) voert de actie uit en voegt het ruwe resultaat toe aan de context. Het taalmodel genereert dit deel dus niet zelf; het fungeert als externe invoer.
 

 Door deze afwisseling ontstaat een zelfcorrigerend systeem. Wanneer een observatie een foutmelding of een onverwacht resultaat oplevert, constateert het model dat in de eerstvolgende Thought-stap en kan het een alternatieve actie formuleren in plaats van vast te lopen in een hallucinerende aanname.

 
## Waarom pure actie of pure redenering faalt

 Om de waarde van ReAct te begrijpen, kijken we naar de twee uitersten die aan dit patroon voorafgingen: pure Chain-of-Thought (CoT) en ongecoördineerde tool-executie (Action-only).

 Bij een pure CoT-benadering genereert het model een lange reeks tussenstappen zonder interactie met externe systemen. Dit werkt uitstekend voor gesloten wiskundige vraagstukken of logische raadsels waarvan alle variabelen in de prompt staan. Zodra de context echter externe feiten vereist (zoals wisselkoersen, actuele database-records of specifieke domeinkennis), leidt CoT tot samengestelde fouten: een kleine onnauwkeurigheid in stap twee muteert in een complete hallucinatie bij stap vijf.

 Bij een Action-only benadering slaat het model de redeneerstap over en genereert het direct API-aanroepen op basis van de initiële vraag. Hierdoor ontbreekt het vermogen om complexe doelen op te knippen in subdoelen. Het model mist de 'werkruimte' in tokens om te bepalen welke parameterkeuzes logisch zijn. Het resultaat is vaak een reeks inefficiënte, repetitieve of foutieve aanroepen omdat het systeem tussentijds niet evalueert of een actie dichter bij het doel heeft gebracht.

 
 
 
 
 Eigenschap | 
 Pure Chain-of-Thought | 
 Action-only (Directe API's) | 
 ReAct (Vloeiende integratie) | 
 

 
 
 
 Externe feitverificatie | 
 Geen (volledig afhankelijk van gewichten) | 
 Direct via tools, maar zonder synthese | 
 Continu via tussentijdse observaties | 
 

 
 Zelfcorrectie | 
 Zeer laag bij foutieve premissen | 
 Beperkt tot syntax-foutafhandeling | 
 Hoog: model herinterpreteert fouten | 
 

 
 Context-overhead | 
 Laag tot gemiddeld | 
 Laag | 
 Hoog door opstapelende geschiedenis | 
 

 
 Geschikt voor multi-hop taken | 
 Matig (fouten stapelen op) | 
 Slecht (geen planningscapaciteit) | 
 Uitstekend | 
 

 
 
 

 
## Constructie van de executieloop: van prompt naar tool-aanroep

 In de praktijk vereist het implementeren van een ReAct-systeem een strakke controlelaag buiten het model om. De runtime injecteert een systeemprompt die de beschikbare tools beschrijft en het gewenste uitvoerformaat afdwingt. Moderne implementaties leunen hiervoor sterk op native schema's; raadpleeg de analyse over [tool calling en gestructureerde uitvoer](https://leren.llmnet.nl/tool-calling-en-gestructureerde-uitvoer-hoe-een-model-een-functie-aanr) om te ontdekken hoe modellen tegenwoordig JSON-schema's parsen in plaats van platte tekst.

 Hieronder staat een conceptuele Python-lus die demonstreert hoe een ReAct-orkestrator de interactie tussen generatie, parsing en executie aanstuurt:

 def run_react_agent(user_query: str, max_steps: int = 5) -> str:
 context = f"Gebruikersvraag: {user_query}\n"
 
 for step in range(max_steps):
 # 1. Genereer Thought + Action
 response = llm.generate(
 prompt=context,
 stop_sequences=["Observation:"]
 )
 context += response.text
 
 # Controleer of het model klaar is
 if "Final Answer:" in response.text:
 return response.text.split("Final Answer:")[-1].strip()
 
 # 2. Parse de gewenste tool-aanroep
 action_name, action_input = parse_action(response.text)
 
 # 3. Voer de tool extern uit (niet door LLM gegenereerd)
 tool_result = execute_tool(action_name, action_input)
 
 # 4. Injecteer de observatie terug in de context
 observation_str = f"\nObservation: {tool_result}\n"
 context += observation_str
 
 return "Taak niet voltooid binnen het maximaal aantal stappen."

 Wanneer we dit productiewaardig opzetten binnen gedistribueerde architecturen, verschuift de implementatie vaak naar API-parameters die specifieke acties triggeren. Zie het overzicht over [function calling via de API](https://api.llmnet.nl/function-calling) voor de exacte payloadstructuren en statuscodes die nodig zijn om functies programmatic aan te sturen.

 
## Een praktijkvoorbeeld: Nederlandse vastgoedinformatie ophalen

 Laten we een concrete multi-hop vraag doorlopen: "Wat is het gemiddelde energielabel in de wijk van het stadhuis van Utrecht en hoeveel actieve monumenten staan daarin geregistreerd?"

 Een standaard model zou direct beginnen met hallucineren over wijkstatistieken. Een ReAct-agent lost dit stapsgewijs op:

 Thought: Ik moet eerst achterhalen in welke wijk het stadhuis van Utrecht ligt.
Action: bag_lookup(locatie="Stadhuis Utrecht")
Observation: {"adres": "Korte Minrebroederstraat 2", "wijk": "Binnenstad", "gemeente": "Utrecht"}

Thought: Het stadhuis ligt in wijk 'Binnenstad'. Nu moet ik twee datapunten verzamelen: het gemiddelde energielabel en het aantal monumenten in 'Binnenstad, Utrecht'. Ik begin met het energielabel.
Action: ep_online_query(wijk="Binnenstad", gemeente="Utrecht", metric="gemiddeld_label")
Observation: {"wijk": "Binnenstad", "gemiddeld_label": "C", "dekkingsgraad": "68%"}

Thought: Het energielabel is bekend (C). Nu moet ik het aantal actieve monumenten ophalen voor dezelfde wijk.
Action: monumenten_register_query(wijk="Binnenstad", gemeente="Utrecht", status="actief")
Observation: {"wijk": "Binnenstad", "totaal_monumenten": 1421}

Thought: Ik heb beide gegevens verzameld. Ik kan nu het volledige antwoord formuleren voor de gebruiker.
Action: finish()
Final Answer: Het stadhuis van Utrecht bevindt zich in de wijk Binnenstad. In deze wijk is het gemiddelde geregistreerde energielabel C (bij een dekkingsgraad van 68%) en staan er momenteel 1.421 actieve monumenten geregistreerd.

 In dit scenario fungeert elke observatie als een ankerpunt. Mocht de BAG-lookup geen resultaat geven (bijvoorbeeld door een typefout), dan zou de volgende Thought kunnen luiden: "De locatie werd niet herkend; laat ik zoeken op 'Korte Minrebroederstraat' als alternatief zoekargument."

 
## Valkuilen en faalmodi in ReAct-architecturen

 Hoewel ReAct aanzienlijk betrouwbaarder is dan statische prompts, introduceert de dynamiek nieuwe risico's die inherent zijn aan iteratieve contextopbouw.

 De belangrijkste faalmechanismen zijn:

 
 
- Oneindige lussen (Action Loops): Als een tool een leeg resultaat of een generieke foutmelding teruggeeft, vervalt het model regelmatig in herhaling. Het probeert exact dezelfde actie opnieuw met minimale variatie in spaties of hoofdletters. Een harde limiet op het aantal stappen en deduplicatie van acties zijn noodzakelijke voorzorgsmaatregelen.
 
- Context Window Exhaustion: Elke stap voegt een gedachte, toolparameters en de volledige payload van de observatie toe aan het contextvenster. Bij omvangrijke API-responses (zoals grote JSON-lijsten) raakt het venster snel vol, wat leidt tot verlies van de initiële instructies en exponentieel stijgende latency en kosten.
 
- Dwalende rationalisatie (Goal Drift): Na drie of vier tussenstappen kan de associatieve aard van het taalmodel ervoor zorgen dat de focus verschuift. Het model gaat dieper in op een detail uit een eerdere observatie dat niet relevant is voor de hoofdvraag van de gebruiker.
 
- Vroegtijdige convergentie: Het model besluit na één magere observatie al dat het voldoende weet, trekt voorbarige conclusies in de Thought-stap en genereert een onvolledig eindantwoord.
 

 
## ReAct versus Plan-and-Solve: architecturale afwegingen

 ReAct is niet het enige paradigma voor autonome agents. Een belangrijk alternatief is het Plan-and-Solve-patroon (waaronder benaderingen zoals BabyAGI en plan-gedreven decompositie vallen). Waar ReAct opportunistisch en reactief te werk gaat — stap voor stap beslissend wat nu handig is — maakt een Plan-and-Solve-architectuur eerst een complete graaf van alle benodigde subtaken en voert deze vervolgens sequentieel of parallel uit.

 
 
 
 
 Dimensie | 
 ReAct | 
 Plan-and-Solve | 
 

 
 
 
 Planningshorizon | 
 Kort (1 stap vooruit) | 
 Lang (volledige taakdecompositie vooraf) | 
 

 
 Flexibiliteit bij fouten | 
 Zeer hoog: kan direct van strategie wisselen | 
 Matig: vereist dynamische herplanning van de hele graaf | 
 

 
 Tokenverbruik | 
 Vaak hoger door herhaaldelijke contextaccumulatie | 
 Vaak lager per deeltaak, mits planning direct klopt | 
 

 
 Parallellisatie | 
 Moeilijk (elke stap hangt af van vorige observatie) | 
 Eenvoudig voor onafhankelijke subdoelen | 
 

 
 Ideale use case | 
 Exploratief onderzoek, vage data, debugging | 
 Gestructureerde workflows met voorspelbare stappen | 
 

 
 
 

 In moderne systemen zien we vaak hybride vormen: een planner op hoog niveau breekt een complexe opdracht op in drie deelprojecten, waarna binnen elk deelproject een ReAct-lus draait om de daadwerkelijke executie en foutoplossing af te handelen.

 
## Testen, evalueren en observeren van ReAct-agents

 Omdat een ReAct-agent niet-deterministisch door een zoekruimte navigeert, schieten klassieke softwaretests tekort. Een agent kan via drie verschillende routes met verschillende aantallen stappen alsnog tot hetzelfde correcte antwoord komen. Om de effectiviteit te meten, analyseren engineers zowel het eindresultaat als het gevolgde traject. Lees de richtlijnen over [evaluaties voor agents en teststrategieën](https://leren.llmnet.nl/evals-voor-agents-waarom-tests-essentieel-zijn) voor een methodische aanpak van unit- en integratietests.

 Op systeemniveau hanteren we specifieke metrieken om de betrouwbaarheid van de ReAct-loop te kwantificeren:

 
 
- Taaksuccesratio (Pass@k): Het percentage taken dat binnen de gestelde staplimiet succesvol wordt afgerond conform een validatieset.
 
- Traject-efficiëntie (Path Length): Het gemiddeld aantal stappen dat nodig is om tot de oplossing te komen. Een stijgende trend bij gelijkblijvende taken duidt op redundantie in de redeneerfase.
 
- Tool-aanroep Precisie: Het percentage acties dat valide parameters bevat en geen runtime-excepties veroorzaakt.
 
- Hallucinatiegraad in Gedachten: Hoe vaak bevat een Thought aannames die direct in tegenspraak zijn met de voorgaande Observation?
 

 Voor diepere benchmark-methodologieën en het geautomatiseerd beoordelen van multi-stap interacties biedt het artikel over [het evalueren van AI-agents via trajectanalyse](https://benchmark.llmnet.nl/agent-evaluatie) gedetailleerde protocollen en scoringsrubrieken.

 
 
### Hierna verder met

 Nu de dynamiek tussen redeneren en acties inzichtelijk is, kun je dieper duiken in de optimalisatie van het redeneerproces zelf. Bekijk hoe geavanceerde zoekstructuren worden opgezet in [tree-of-thoughts en graph-reasoning structuren](https://leren.llmnet.nl/tree-of-thoughts-en-graph-reasoning-zoekbomen-in-promptstructuren). Werk je met modellen die zelfstandig lange redeneertraces produceren vóór de output? Lees dan de analyse over [ingebouwde test-time compute bij moderne redeneermodellen](https://leren.llmnet.nl/redeneermodellen-wat-er-verandert-als-denken-een-aparte-stap-wordt).
