Repository navigation
02Reactloop
Dans cette partie, vous allez implémenter une boucle ReAct (Reasoning + Acting), un schéma central en IA agentique.
La boucle ReAct consiste à itérer les étapes suivantes :
- raisonnement. Le modèle analyse l’état courant, interprète la requête de l’utilisateur et détermine la prochaine action à effectuer. Cette étape est entièrement déléguée au LLM ;
- action. Le système appelle un outil externe (appel d’API, exécution de code, etc.) en lui fournissant les paramètres appropriés ;
- observation. Le résultat de l’action est récupéré puis injecté dans le contexte, afin d’enrichir la prochaine phase de raisonnement.
Ce cycle est répété de manière itérative jusqu’à ce que le modèle
produise une réponse finale explicite, généralement sous la forme
Final Answer.
Tout d’abord, vous devez spécifier les actions qui peuvent être
réalisées par un agent dans l’environnement durant la phase action.
Ces opérations, appelées des outils (tools), sont implémentées dans
le fichier
tools.py. Elles
permettent de réaliser une recherche web (search_web), d’obtenir un
article Wikipédia (fetch_wikipedia) ou de réaliser un calcul
(calculate). Le fichier contient également un outil
execute_python, qui ne sera utilisé que dans la dernière partie du
tutoriel.
Testez les trois premiers outils à l’aide du script test_tools.py pour répondre aux questions suivantes :
- Quelle est la taille de population du Japon en 2024 ?
- Dans quel établissement Alan Turing a-t-il obtenu son doctorat ?
- Combien vaut 294 / 7 ?
Afin de définir la boucle ReAct, les instructions prompt.md (prompt) transmises au LLM pour la phase de raisonnement précisent :
- le format des réponses attendues, afin d’analyser ces réponses et d’appeler les outils ;
- les règles à suivre dans la construction de la chaîne de pensée (thought).
Dans le fichier agent.py,
- la fonction
parse_thought(text: str)extrait la chaîne de pensée de la réponse du LLM ; - la fonction
parse_action(text: str)extrait le nom de l’outil et l’argument de la réponse.
Dans le fichier agent.py,
la fonction react_agent(question: str, max_steps: int = 6) implémente la boucle
ReAct en alternant, à chaque étape, un appel au LLM pour raisonner sur la
question et un appel à un outil externe pour collecter une observation, jusqu’à
obtenir une réponse finale ou atteindre le nombre maximum d’étapes.
En exécutant le script test_react_Tokyo.py testez votre agent avec la question suivante : What is the population of Tokyo in 2024 and how many times bigger is it compared to the population of Paris?
Les systèmes agentiques sont non déterministes. Même à température nulle, le modèle peut produire des réponses différentes d’une exécution à l’autre en raison du parallélisme matériel et de la phase de réflexion interne. De plus, les outils externes tels que la recherche web ne garantissent pas des résultats identiques dans le temps.
En exécutant le script test_react_NewYork.py testez votre agent avec la question suivante : What is the average height of the tallest 10 buildings in New York City?
La plupart des LLM modernes ont internalisé le pattern ReAct durant la phase de fine-tuning et tendent naturellement à enchaîner plusieurs Thought-Action en une seule génération. C’est pourquoi le prompt doit explicitement leur interdire de produire plus d’une paire Thought-Action par réponse.
Les LLM peuvent aussi court-circuiter certains outils. Par exemple, un
modèle capable d’arithmétique peut calculer directement sans appeler
calculate. C’est pourquoi la règle 6 du prompt impose le passage par
l’outil : You must never compute numerical results yourself — any
arithmetic (…) MUST be delegated to the calculate tool via an
Action. Retirez temporairement cette règle et observez la différence.
En exécutant le script test_react_weather.py testez votre agent avec la question suivante : What are the top 3 most visited cities in the world according to recent rankings, and what is the current temperature in each of them?
Aucun outil météorologique n’est fourni à l’agent : observez comment
il s’adapte. Selon les exécutions, il contourne la limite en
cherchant les températures sur le web avec search_web (au risque de
relever des valeurs obsolètes), ou il reconnaît qu’il ne peut pas
répondre à cette partie de la question. Ce test illustre que les
capacités d’un agent sont bornées par les outils mis à sa
disposition.
De même, fetch_wikipedia attend un titre d’article exact (e.g. “Alan
Turing”) et non une phrase. Le prompt doit préciser ce format
attendu. Au lieu de décrire les outils dans le prompt en texte libre,
les architectures modernes utilisent des serveurs MCP (Model Context Protocol),
qui exposent les outils sous un schéma JSON structuré que
le LLM peut invoquer directement via le protocole.
© 2026 Maxime MORGE, Wassila OUERDANE, Nicolas SABOURET