Module 4 sur 10, leçon 1 sur 5
Boucles de raisonnement et architectures
Choisir entre ReAct et planification préalable, puis entre un agent et une organisation plus complexe.
Deux façons de raisonner
ReAct alterne pensée, action et observation. L’agent décide de chaque étape après avoir vu le résultat de la précédente. Il s’adapte bien aux imprévus, au prix de nombreux appels au modèle.
ReWOO planifie d’abord toute la démarche, exécute ensuite les outils, puis rédige la synthèse. Le plan peut être relu avant d’agir et la consommation de tokens baisse. En contrepartie, l’agent réagit moins bien si un résultat intermédiaire contredit le plan.
| ReAct | ReWOO | |
|---|---|---|
| Décision | À chaque étape | En amont |
| Coût | Plus élevé | Plus faible |
| Imprévus | Bien gérés | Moins bien gérés |
| Contrôle humain | Pendant l’exécution | Sur le plan, avant d’agir |
Quatre organisations
- Mono-agent : simple, peu coûteux, facile à déboguer. Il sature sur les tâches larges.
- Verticale : un agent dirige les autres. Les rôles sont clairs, mais le chef peut ralentir ou bloquer tout le système.
- Horizontale : des pairs sans autorité centrale. Bon pour le parallèle et l’exploration, coûteux en coordination.
- Hybride : la direction change selon la phase. Souple, mais difficile à concevoir et à contrôler.
Toujours borner la boucle
Un agent qui n’arrive pas à interpréter ses résultats peut répéter les mêmes actions sans fin. Fixez un nombre maximal d’étapes, un budget et une condition d’arrêt qui passe la main à un humain.
Commencez par un seul agent, et ne complexifiez que devant une limite mesurée.
Exemple : Repérer un agent bloqué
Une limite d’étapes arrête la boucle tard. Comparer les derniers appels l’arrête dès que l’agent se répète.
function isStuck(calls, window = 3) {
if (calls.length < window) return false;
const recent = calls.slice(-window).map((c) => JSON.stringify(c));
return new Set(recent).size === 1;
}
const lookup = { tool: 'get_order', input: { id: 4512 } };
isStuck([lookup, lookup, lookup]);
true
Trois appels identiques donnent trois fois le même résultat. L’agent n’a rien de neuf : passez la main à un humain plutôt que de payer d’autres étapes.
Essayez dans l’éditeur
const sameCall = (a, b) => a.name === b.name && a.input === b.input;async function runAgent({ model, tools, prompt, maxSteps = 20 }) { const messages = [{ role: 'user', content: prompt }]; let previous = null; let repeats = 0; for (let step = 0; step < maxSteps; step += 1) { const response = await model.create({ messages });