Essentiel du pattern
ReAct (Reasoning + Acting) est un pattern qui permet à un agent d'agir étape par étape, en prenant une décision après chaque action selon le résultat obtenu.
Quand l'utiliser : quand il est impossible de planifier de façon fiable tout le parcours à l'avance, et que l'étape suivante dépend du résultat précédent.
Chaque étape se compose de trois actions :
Think— décide quoi faire ensuiteAct— exécute une action ou appelle un outilObserve— analyse le résultat
Ensuite, l'agent décide à nouveau de l'étape suivante.

Problème
Imagine : tu es dans une nouvelle ville pour la première fois et tu cherches une pharmacie ouverte avec le médicament dont tu as besoin.
Tu ne sais pas à l'avance :
- quelles pharmacies sont à proximité
- si elles sont ouvertes maintenant
- si le médicament est disponible
Il est impossible de construire un plan complet immédiatement, parce que chaque étape dépend d'un nouveau résultat.
Donc tu agis en boucle :
- Tu trouves la pharmacie la plus proche
- Tu vérifies si elle est ouverte
- Si non, tu passes à la suivante
- Tu répètes jusqu'à trouver la bonne
Autrement dit en continu : information -> décision -> action -> nouvelle information.
Et si tu te forces à figer l'itinéraire tout de suite ("#1 -> #2 -> #3"), ce sera un plan au hasard.
Voilà le problème : dans beaucoup de tâches, il est impossible de planifier correctement toutes les étapes à l'avance.
Solution
ReAct résout cela avec des décisions pendant l'exécution, et non avec un plan rigide défini à l'avance.
Analogie : c'est comme un GPS sur la route. Tu construis la prochaine manœuvre après chaque nouveau virage ou route bloquée. L'itinéraire se précise en cours de route, il n'est pas figé une fois pour toutes.
Principe clé : un plan complet n'est pas possible immédiatement, donc l'agent doit s'adapter après chaque résultat.
Au lieu de plan complet d'abord -> exécution ensuite, l'agent fonctionne ainsi :
- Raisonnement (
Think) : prend une décision - Action (
Act) : exécute une action - Observation (
Observe) : analyse le résultat
Après cela, il définit l'étape suivante selon le nouveau contexte.
Si une pharmacie est fermée, l'agent ne "force" pas l'ancien plan, il ajuste les actions immédiatement.
Chaque nouveau résultat :
- est ajouté au contexte
- influence la décision suivante
- modifie l'itinéraire à venir
ReAct n'exécute pas un script prédéfini, il s'adapte à chaque étape.
Le modèle peut "vouloir" répéter des actions à l'infini, donc c'est la politique d'exécution (execution-policy) qui définit les conditions d'arrêt de la boucle.
Comment ça fonctionne
Important : l'agent n'exécute pas lui-même les actions
À l'étape raisonnement (Think), l'agent décide seulement de ce qu'il faut faire ensuite.
Mais il n'exécute pas l'action lui-même.
Il génère une décision sous forme de texte, par exemple :
« Il faut appeler l'outil
search_docsavec le paramètre X »
Après cela :
- le système autour de l'agent lit cette décision
- exécute l'action ou appelle l'outil
- renvoie le résultat
Ce résultat devient une nouvelle observation (Observe).
Description du flow complet : Think → Act → Observe
Raisonnement (Think)
L'agent décide de ce qu'il faut faire ensuite.
Action (Act)
Le système exécute l'action ou appelle un outil.
Observation (Observe)
L'environnement renvoie un résultat, qui devient le nouveau contexte.
L'agent prend seulement des décisions.
Toutes les actions sont exécutées par une couche d'exécution externe (execution layer).
Si cette couche n'a pas de limites, l'agent peut :
- appeler un outil des dizaines de fois
- répéter les mêmes actions
- consommer le budget en appels API
La boucle se répète jusqu'à ce que la tâche soit terminée ou que les conditions d'arrêt soient atteintes.
En code, cela ressemble à ça
max_steps = 8
for step_no in range(1, max_steps + 1):
thought = think(context)
action = act(thought)
result = observe(action)
context.append(result) # Observe -> nouveau context pour le Think suivant.
if is_done(result):
done = True
break
if not done:
return stop_with_reason("max_steps_reached")
À quoi cela ressemble pendant l'exécution
Goal: trouver la pharmacie ouverte la plus proche
Think: il faut trouver une pharmacie à proximité
Act: le système appelle find_nearby_pharmacies(user_location)
Observe: liste de pharmacies reçue, triée par distance
Entre les itérations : la liste des pharmacies est ajoutée au context
Think: vérifier la première pharmacie (la plus proche)
Act: le système appelle check_pharmacy("Pharmacie #1")
Observe: la pharmacie est fermée
Entre les itérations : le statut "fermée" est ajouté au context
Think: vérifier la pharmacie suivante
Act: le système appelle check_pharmacy("Pharmacie #2")
Observe: la pharmacie est ouverte
Think: c'est la pharmacie ouverte la plus proche
Act: le système renvoie l'adresse
Observe: l'utilisateur a reçu le résultat
Stop : condition atteinte, la boucle se termine
L'agent décide quoi faire, exécute une action et obtient un résultat.
Chaque résultat est ajouté au contexte et devient la base de l'étape suivante.
Exemple complet d'agent ReAct
Quand c'est adapté - et quand ça ne l'est pas
Adapté
| Situation | Pourquoi ReAct est adapté | |
|---|---|---|
| ✅ | Le chemin vers le résultat n'est pas évident | ReAct affine le plan à chaque étape selon de nouvelles observations. |
| ✅ | L'étape suivante dépend de la réponse d'un outil | La logique Think -> Act -> Observe est faite exactement pour cette boucle. |
| ✅ | Il faut travailler avec des API, des bases de données, la recherche, ou d'autres outils | L'agent appelle des outils pendant l'exécution et s'adapte. |
Non adapté
| Situation | Pourquoi ReAct n'est pas adapté | |
|---|---|---|
| ❌ | La tâche a un scénario fixe et prévisible | Un pipeline prédéfini est plus simple et moins coûteux. |
| ❌ | La vitesse de réponse est critique (latence minimale) | Chaque boucle ajoute du temps via des étapes de raisonnement et des appels supplémentaires. |
| ❌ | Chaque appel d'outil est coûteux ou strictement limité | Sans limites strictes, ReAct peut faire beaucoup d'itérations. |
Si tu choisis ReAct, fixe les limites dès le départ : max_steps, timeouts, conditions d'arrêt et budget des appels d'outils.
Quand utiliser ReAct (vs autres patterns)
Utilisez ReAct quand l'agent doit prendre des décisions étape par étape selon les résultats des actions précédentes.
Test rapide :
- si vous avez besoin de "j'ai vu le résultat -> j'ai décidé l'étape suivante" -> ReAct
- si vous avez besoin de "d'abord découper un grand objectif en sous-tâches" -> Task Decomposition Agent
Comparaison avec d'autres patterns et exemples
Aide-mémoire rapide :
| Si la tâche ressemble à ça... | Utilisez |
|---|---|
| Après chaque étape, il faut décider quoi faire ensuite | Agent ReAct |
| Il faut d'abord découper un grand objectif en tâches plus petites et exécutables | Task Decomposition Agent |
| Il faut exécuter du code, vérifier les résultats et itérer en sécurité | Code Execution Agent |
| Il faut analyser des données et rendre des conclusions basées sur cette analyse | Data Analysis Agent |
| Il faut faire de la recherche sur plusieurs sources avec des preuves structurées | Research Agent |
Exemples :
ReAct : "Trouve la cause d'une panne API : vérifie les logs -> regarde les erreurs -> lance la vérification suivante selon le résultat".
Task Decomposition : "Prépare le lancement d'une nouvelle offre : découpe la tâche en sous-tâches pour le contenu, la technique, la QA et le support".
Code Execution : "Calcule la rétention sur 12 mois en Python et vérifie la validité des formules sur des données réelles".
Data Analysis : "Analyse un CSV de ventes : trouve les tendances, les anomalies et donne des conclusions courtes".
Research : "Collecte des données sur 5 concurrents depuis plusieurs sources et fais un résumé comparatif".
Comment combiner avec d'autres patterns
ReAct est souvent utilisé avec d'autres patterns.
- ReAct + RAG — quand il manque des faits, l'agent les récupère d'abord depuis la base de connaissances, puis seulement avance.
- ReAct + Reflection — après chaque étape, l'agent s'auto-vérifie pour repérer et corriger vite les erreurs.
- ReAct + Supervisor — l'agent n'exécute pas lui-même les actions risquées ; il les transmet pour validation humaine.
ReAct ajoute une boucle de décision. Les autres patterns ajoutent du contrôle, de la mémoire ou de la coordination.
En bref
Agent ReAct :
- prend des décisions progressivement
- exécute une action
- analyse le résultat
Et répète la boucle jusqu'à ce que la tâche soit terminée.
Avantages et Inconvénients
Avantages
s'adapte vite aux nouvelles données
les erreurs sont visibles dès l'étape suivante
fonctionne bien quand les conditions changent pendant l'exécution
chaque étape est facile à expliquer
Inconvénients
peut être plus lent à cause d'un plus grand nombre d'étapes
sans limites, peut rester bloqué en boucle
il faut définir clairement les conditions d'arrêt
FAQ
Q : Est-ce que ReAct planifie toutes les étapes à l'avance ?
A : Non. Il prend une décision après chaque action.
Q : Est-ce que ReAct peut rester bloqué dans une boucle ?
A : Oui, si aucune condition d'arrêt n'est définie.
Q : Est-ce que ReAct fonctionne sans outils ?
A : Oui. L'agent peut utiliser la boucle Think -> Act -> Observe même sans appel d'outil, par exemple pour changer d'approche sur une tâche. Mais sans accès à des actions externes, il ne peut pas obtenir de nouvelles données et travaille uniquement avec ce qui est déjà dans le contexte.
Et ensuite
ReAct permet à un agent d'agir étape par étape.
Mais que faire si la tâche est complexe et composée de plusieurs sous-tâches ?