ReAct vs Plan-and-Execute vs LATS : 3 patterns, 1 bench
Trois patterns d'agents dominent le paysage des agents LLM depuis 2024 : ReAct, Plan-and-Execute et LATS (Language Agent Tree Search). Chaque pattern a ses fans, ses benchmarks officiels, et ses haters. Moi, je voulais savoir lequel tient vraiment la route quand on les pose sur les mêmes 4 tâches avec le même modèle sous-jacent. Verdict après 80 runs et 37 $ de facture : le résultat est beaucoup moins clair que les tutoriels veulent bien le dire. Voici mon benchmark complet.
Les 3 patterns en 30 secondes chacun
Soutenez mon travail sur Patreon
Accès anticipé aux articles, contenu exclusif, et la satisfaction de soutenir un auteur indépendant.
Rejoindre — à partir de 3€/moisReAct (Reason + Act) : l'agent alterne « réfléchis » / « agis ». Pattern le plus simple, le plus ancien, le plus utilisé. Chaque tour = une pensée + une action + une observation. Boucle jusqu'à stop.
Plan-and-Execute : l'agent commence par produire un plan complet (5-10 étapes) avant d'agir. Puis il exécute chaque étape. Si une étape échoue, il replanifie.
LATS : variation tree search sur ReAct. L'agent explore plusieurs branches d'actions en parallèle, évalue chaque branche avec un scoring, et choisit la meilleure. Théoriquement supérieur, pratiquement coûteux.
Les 4 tâches test
| Tâche | Type | Tool calls attendus | Complexité |
|---|---|---|---|
| T1 — Debug un test qui échoue | Coding | 4-8 | Faible |
| T2 — Ajouter un endpoint REST complet | Coding | 8-15 | Moyenne |
| T3 — Analyser un CSV et produire un rapport | Data | 6-12 | Moyenne |
| T4 — Refactorer un module de 500 lignes | Coding | 15-30 | Élevée |
Chaque tâche est lancée 20 fois par pattern avec le même modèle (Claude Sonnet 4.5, température 0,3). Budget max 3 $ par run.
Les résultats bruts
Taux de succès (task complete + tests verts)
| Tâche | ReAct | Plan-and-Execute | LATS |
|---|---|---|---|
| T1 — Debug test | 95% | 85% | 90% |
| T2 — Endpoint REST | 70% | 85% | 75% |
| T3 — Analyse CSV | 80% | 90% | 85% |
| T4 — Refactor module | 55% | 70% | 80% |
| Moyenne | 75% | 82,5% | 82,5% |
Coût moyen par run (USD)
| Tâche | ReAct | Plan-and-Execute | LATS |
|---|---|---|---|
| T1 | 0,14 | 0,19 | 0,38 |
| T2 | 0,42 | 0,51 | 1,24 |
| T3 | 0,31 | 0,38 | 0,96 |
| T4 | 1,18 | 0,95 | 2,87 |
| Moyenne | 0,51 | 0,51 | 1,36 |
Latence moyenne (secondes)
| Pattern | T1 | T2 | T3 | T4 | Moyenne |
|---|---|---|---|---|---|
| ReAct | 18 | 52 | 34 | 148 | 63 |
| Plan-and-Execute | 24 | 61 | 42 | 118 | 61 |
| LATS | 47 | 134 | 88 | 312 | 145 |
Les 3 enseignements contre-intuitifs
Enseignement 1 : ReAct gagne sur les tâches simples
Sur T1 (debug test), ReAct a un taux de succès de 95% — meilleur que les deux autres. Pourquoi ? Parce qu'un debug simple est un aller-retour rapide avec l'environnement : lance le test, lis l'erreur, fix, relance. Plan-and-Execute perd du temps à produire un plan que le premier tool call rend obsolète. LATS perd du temps à explorer des branches inutiles.
Leçon : sur les tâches courtes (< 10 tool calls), la simplicité de ReAct bat les patterns plus sophistiqués.
Enseignement 2 : Plan-and-Execute brille sur les tâches cadrées
Sur T2 (endpoint REST) et T3 (CSV), Plan-and-Execute gagne. Ces deux tâches ont une structure claire : il y a un « bon » plan qu'on peut produire à l'avance, puis il suffit de l'exécuter. ReAct, qui improvise, rate souvent une étape (oublie d'ajouter la validation, oublie de tester les cas d'erreur). LATS explore trop.
Leçon : sur les tâches structurées où un plan est devinable à l'avance, Plan-and-Execute bat ReAct de 10-15 points.
Enseignement 3 : LATS ne vaut le coup que sur les tâches très dures
Sur T4 (refactor d'un module complexe), LATS gagne nettement — 80% vs 70% (PaE) vs 55% (ReAct). Mais au prix de 2,87 $ par run contre 0,95-1,18 $ pour les autres. Soit un surcoût de 2,4× pour +10 points de succès.
Leçon : LATS ne se justifie que si tu es prêt à payer 3× pour gagner 10 points, et seulement sur des tâches très complexes (>15 tool calls).
Ma matrice de décision
Après 80 runs, voici ma règle simple :
| Complexité tâche | Pattern recommandé | Raison |
|---|---|---|
| Triviale (1-5 tool calls) | ReAct | Overhead des autres > gain |
| Standard (5-15 tool calls) | Plan-and-Execute | Structure + exécution = sweet spot |
| Complexe et critique (>15 tool calls) | LATS | Le surcoût vaut le taux de succès |
| Exploratoire / vague | ReAct | Improvisation > plan rigide |
Un pattern hybride qui marche encore mieux
Pendant mes tests, j'ai essayé une combinaison : produire un plan rapide (3 étapes max, via Plan-and-Execute), puis exécuter chaque étape en mode ReAct. Sur mes 4 tâches, ce hybride a donné un taux de succès moyen de 87%, meilleur que n'importe quel pattern seul, pour un coût équivalent à Plan-and-Execute.
def hybrid_agent(task):
plan = produce_plan(task, max_steps=3) # une seule fois
for step in plan:
react_loop(step, max_iterations=10)C'est devenu mon défaut depuis 2 mois.
Ce qu'il faut retenir
- 1.Aucun pattern n'est universellement meilleur — chaque tâche a son sweet spot.
- 2.ReAct gagne sur les tâches courtes, Plan-and-Execute sur les tâches structurées, LATS sur les tâches complexes critiques.
- 3.LATS coûte 2-3× plus cher pour des gains marginaux sauf sur les tâches très longues.
- 4.Un hybride Plan (court) + ReAct est souvent meilleur que n'importe lequel des 3 purs.
Pour aller plus loin sur l'architecture de chacun de ces patterns et leur implémentation en Python avec LangGraph, j'ai écrit un guide complet :
Soutenez mon travail sur Patreon
Accès anticipé aux articles, contenu exclusif, et la satisfaction de soutenir un auteur indépendant.
Rejoindre — à partir de 3€/mois