Le Planning Pattern (ReAct) : donner une stratégie aux agents
Dans les leçons précédentes, nous avons appris comment les agents peuvent réfléchir et utiliser des outils pour interagir avec le monde extérieur. Mais qu’en est-il de la planification ? Comment les agents peuvent-ils déterminer la séquence d’étapes nécessaire pour atteindre un objectif plus large ?
C’est là qu’intervient le Planning Pattern. Il permet à un LLM de décomposer une tâche complexe en sous-objectifs plus petits et gérables sans perdre de vue l’objectif global.
La technique ReAct — contraction de Reason + Act (Raisonner + Agir) — est un exemple paradigmatique de ce pattern. Dans cette leçon, vous apprendrez comment cette technique fonctionne et implémenterez un Agent ReAct de zéro en utilisant Python et les LLM de Groq.
C’est parti ! 👇
Ceci est la troisième leçon du cours Agentic Patterns from Scratch. Cette leçon s’appuie sur la théorie et le code abordés dans les précédentes, alors n’oubliez pas de les consulter si ce n’est pas déjà fait !
Le System Prompt ReAct
Tout comme pour le pattern d’utilisation d’outils, la technique ReAct nécessite un System Prompt. Ce prompt est assez similaire, mais il décrit également la boucle ReAct pour s’assurer que le LLM comprend les trois opérations qu’il est autorisé à effectuer :
- Thought (Pensée) : Le LLM va réfléchir à l’action à entreprendre.
- Action : Le LLM va utiliser un Outil pour interagir avec l’environnement et passer à l’action.
- Observation : Le LLM va observer la sortie de l’outil et réfléchir à la prochaine étape.
Une autre différence clé par rapport au pattern d’utilisation d’outils est que nous allons encadrer tous les messages dans des balises, comme ceci : < >. Bien qu’il soit possible d’implémenter la logique ReAct sans ces balises, j’ai trouvé qu’elles facilitaient le respect des instructions par le LLM.
Assez de théorie ! Voici le prompt 👇
Si vous regardez le prompt, vous remarquerez que nous avons besoin d’un ensemble d’outils, qui sont encadrés par les balises <tools></tools>. L’exemple que nous allons construire implique l’utilisation de trois outils, comme le montre l’extrait de code ci-dessous.
Rappelez-vous que le décorateur d’outil — implémenté dans la leçon précédente — nous permet de convertir automatiquement n’importe quelle fonction Python en un Outil. Ensuite, nous concaténons simplement les signatures des outils et les ajoutons au System Prompt.
Avec le System Prompt complet, il est temps de commencer la première itération de la boucle ReAct !
Boucle ReAct : Choisir le premier outil
La question à laquelle nous allons répondre est la suivante :
Je veux calculer la somme de 1234 et 5678 et multiplier le résultat par 5. Ensuite, je veux prendre le logarithme de ce résultat.
Comme vous pouvez le voir, la question est facilement résolue en utilisant les outils fournis dans le bon ordre, mais l’agent peut-il faire de même ? Générons la première complétion pour le découvrir.
La sortie générée est un
Boucle ReAct : Exécuter le premier outil
Puisque nous avons le
Le résultat de l’outil est simplement la somme de 1234 et 5678, soit 6912.
Boucle ReAct : Choisir le deuxième outil
Si vous regardez de près le contenu que nous avons ajouté au chat_history, vous remarquerez qu’on inclut le résultat de l’outil (6912) comme une
En lançant une complétion comme précédemment, nous devrions obtenir quelque chose comme ceci, où le LLM sélectionne correctement l’outil de multiplication pour multiplier le résultat précédent par 5.
On procède exactement de la même manière pour l’exécution. Le résultat de l’outil dans ce cas est 34560.
Boucle ReAct : Choisir le troisième outil
Après avoir lancé la complétion suivante, nous obtenons la sortie suivante :
Après avoir calculé la somme et la multiplication, la seule opération restante est le logarithme, implémenté dans l’outil compute_log.
Boucle ReAct : Résultat final
Après avoir exécuté l’outil de logarithme et ajouté le résultat au chat_history, il est temps de lancer la dernière complétion. La sortie générée contiendra une balise
Notre LLM affiche 10.45. Et c’est… correct ! — si vous ne me croyez pas, n’hésitez pas à vérifier avec votre calculatrice 😂
L’Agent ReAct
Comme dans les posts précédents, vous pouvez obtenir les mêmes résultats en utilisant ma bibliothèque agentic_patterns, qui implémente le code ci-dessus de “la bonne manière”.
J’ai créé une classe ReactAgent qui encapsule la boucle ReAct, acceptant une liste d’outils disponibles. Découvrez-la ici !
Pourquoi ça marche si bien ?
- Décomposition des tâches : L’agent ne s’attaque pas au problème global d’un coup, il avance étape par étape.
- Auto-réflexion continue : À chaque étape, l’agent observe le résultat et ajuste sa pensée.
- Modularité : La boucle ReAct peut intégrer n’importe quel nombre d’outils pour des workflows complexes.
Prochaines étapes
La prochaine leçon nous parlerons du MultiAgent Pattern.
Ressources
- Article original : Building a ReAct Agent from Scratch
- Vidéo YouTube couvrant le Planning Pattern
- GitHub de la série










