- Dans la plupart des équipes qui construisent des systèmes basés sur des LLM, tout le monde essaie de commencer par des agents, mais la plupart de ces projets s’effondrent rapidement à cause de la complexité, du manque de contrôle et de la difficulté du débogage
- Les véritables patterns d’agents, qui nécessitent mémoire, RAG, usage d’outils et contrôle du workflow, sont en réalité rares, et la plupart des problèmes se résolvent plus efficacement avec des workflows simples (chaining, parallélisation, routing, etc.)
- Il est recommandé d’appliquer d’abord 5 patterns de workflow LLM réellement utiles en pratique, et de n’utiliser des agents qu’avec prudence lorsque c’est vraiment nécessaire
- Prompt chaining, parallélisation, routing, orchestrator-worker, evaluator-optimizer
- Même lorsqu’un agent est nécessaire, l’essentiel reste l’intervention humaine, un contrôle explicite et l’observabilité (Observability)
Les agents IA sont-ils vraiment nécessaires ?
- Les réflexions de Hugo Bowne-Anderson, qui fournit du conseil et de la formation sur la construction de systèmes LLM à divers ingénieurs et équipes, notamment chez Netflix, Meta et l’US Air Force
Un mauvais point de départ : pourquoi tout le monde s’obsède avec les agents
- De nombreuses équipes, au démarrage d’un projet LLM, introduisent d’abord des structures complexes comme les agents, la mémoire, le routing, l’usage d’outils et les personas
- En pratique, une fois le système mis en place, des comportements anormaux et des échecs récurrents apparaissent fréquemment dans la collaboration entre agents, le choix des outils ou la mémoire long terme
- Exemple : sur un projet d’agent de recherche basé sur CrewAI, chaque rôle (chercheur, résumeur, coordinateur) n’a pas coopéré comme prévu et l’ensemble s’est effondré sans recours
Qu’est-ce qu’un agent ?
- Les 4 caractéristiques d’un système LLM : mémoire, recherche d’information (RAG), usage d’outils et contrôle du workflow
- Le dernier point, le contrôle du workflow (le fait que le LLM décide lui-même de l’étape suivante ou de l’usage d’un outil), est appelé une caractéristique agentique
- Dans la plupart des tâches réelles, des workflows simples (chaining, routing, etc.) offrent une meilleure stabilité
Les patterns de workflow LLM à utiliser à la place des agents, vraiment utiles en pratique
1. Prompt Chaining
- Description : découper plusieurs tâches en une série d’étapes (une chaîne), afin que le LLM traite chaque étape séquentiellement
- Exemple : extraire le nom, le poste et l’entreprise depuis un profil LinkedIn → ajouter des informations complémentaires sur l’entreprise (mission, recrutement, etc.) → rédiger un e-mail personnalisé à partir du profil + des informations sur l’entreprise
- Avantages : chaque étape étant clairement séparée, il est facile d’identifier et de corriger la cause d’un bug ; c’est favorable au débogage et à la maintenance
- Lignes directrices :
- adapté aux tâches reliées de manière séquentielle
- si une seule étape échoue, toute la chaîne peut s’effondrer
- en divisant en petites unités de travail, on obtient des résultats plus prévisibles et un débogage plus simple
2. Parallélisation (Parallelization)
- Description : exécuter simultanément plusieurs tâches indépendantes pour accélérer l’ensemble du processus
- Exemple : extraire en parallèle, depuis plusieurs profils, différents éléments comme la formation, l’expérience ou les compétences afin de réduire le temps total de traitement
- Avantages : efficace à grande échelle pour l’extraction ou le traitement de données indépendantes, et bien adapté aux environnements de traitement distribué
- Lignes directrices :
- lorsque les tâches sont mutuellement indépendantes, l’exécution simultanée améliore fortement la vitesse globale
- attention aux cas d’exception comme les race conditions ou les timeouts pendant l’exécution parallèle
- adapté au traitement de gros volumes de données et à l’analyse simultanée de plusieurs sources
3. Routing
- Description : le LLM classe les données d’entrée pour les diriger automatiquement vers le workflow approprié
- Exemple : dans un outil de support client, classer le contenu entrant entre demande produit, problème de paiement ou demande de remboursement, puis l’acheminer automatiquement vers le bon workflow ; si le type est ambigu, transmettre à un handler par défaut
- Avantages : appliquer une logique de traitement spécialisée selon le type d’entrée et séparer proprement les différents cas
- Lignes directrices :
- utile lorsqu’un traitement distinct est nécessaire selon les types d’entrée ou les situations
- sur les cas limites ou exceptionnels, le routing peut échouer ou omettre certains cas
- il faut impérativement concevoir un handler catch-all pour les cas non classés ou exceptionnels
4. Orchestrator-Worker
- Description : un LLM jouant le rôle d’orchestrateur décompose la tâche et prend les décisions, puis délègue les sous-tâches à des workers (LLM d’exécution) tout en contrôlant directement le flux global et son ordre
- Exemple : classer un profil cible en tech/non-tech → s’il est tech, déléguer la génération d’e-mail à un worker spécialisé ; s’il est non-tech, déléguer à un autre worker
- Avantages : sépare la prise de décision (classification/jugement) de l’exécution (traitement individuel), ce qui facilite le contrôle dynamique du flux et l’extension
- Lignes directrices :
- adapté quand chaque tâche nécessite un traitement spécialisé, avec des branchements complexes et une coordination étape par étape
- si l’orchestrateur décompose mal la tâche ou délègue incorrectement, des erreurs apparaissent dans tout le flux
- garder une logique explicitement simple, et définir clairement les règles de délégation, l’ordre et les conditions d’arrêt
5. Evaluator-Optimizer
- Description : le LLM évalue le résultat (score/feedback) et, s’il n’atteint pas le seuil attendu, le corrige et l’améliore de façon itérative
- Exemple : générer un brouillon d’e-mail → l’évaluateur fournit un score de qualité et un feedback → arrêt si un certain seuil est atteint ou si le nombre maximal d’itérations est dépassé, sinon nouvelle révision
- Avantages : permet d’améliorer itérativement la qualité du livrable final jusqu’au niveau visé, et se prête bien à l’usage de critères quantitatifs
- Lignes directrices :
- adapté aux situations où la qualité prime sur la vitesse, et aux workflows nécessitant une optimisation itérative
- sans condition d’arrêt, on peut tomber dans une boucle infinie
- il est indispensable de définir des critères de qualité clairs et une limite d’itérations
Les cas où un agent est vraiment nécessaire
- Les agents révèlent toute leur valeur dans des environnements où l’intervention humaine en temps réel (Human-in-the-loop) est garantie
- Exemple 1 : assistance en data science — requêtes SQL, visualisation, recommandations d’analyse de données, etc. ; le LLM tente des approches créatives, puis l’humain évalue et corrige le résultat
- Exemple 2 : partenaire créatif — idées de copywriting, propositions de titres, recommandations de structure de texte, etc. ; l’ajustement de direction et la validation qualité par un humain sont essentiels
- Exemple 3 : assistant de refactoring de code — propositions de design patterns, détection d’edge cases, optimisation de code, etc. ; le développeur approuve et complète
- Caractéristique : l’agent ne fait pas « tout tout seul » ; il est surtout efficace dans un environnement où un humain corrige les erreurs et ajuste la direction en temps réel
Les cas où les agents ne conviennent pas
- Systèmes enterprise et mission-critical (finance, santé, droit, etc.) :
- la fiabilité de l’automatisation et le comportement déterministe étant essentiels, une architecture où un agent LLM prend les décisions est risquée
- il faut utiliser des patterns de contrôle explicites comme l’orchestrateur ou le routing
- Toutes les situations où la stabilité et la prévisibilité sont cruciales
- cas typiques : l’agent choisit de façon répétée les mauvais outils sans contexte ni mémoire, ou bien la division du travail et la coordination échouent, ce qui fait s’effondrer tout le flux
- Facteurs d’échec fréquents des systèmes d’agents en production
- absence de conception explicite d’un système de mémoire, provoquant des pertes de contexte
- contraintes insuffisantes sur le choix des outils (usage d’outils inutiles ou erronés)
- dépendance à une structure de délégation trop libre, entraînant un échec de coordination entre agents
Enseignements pour la conception en pratique
- Même en introduisant des agents, il faut impérativement mettre en place une conception, une observabilité et des mécanismes de contrôle dignes d’un système logiciel abouti
- Plutôt qu’un framework d’agents complexe, il est plus rapide et plus sûr de concevoir avec de l’observabilité (Observability), des boucles d’évaluation claires et une structure directement contrôlable
Conclusion (TL;DR)
- Les agents sont souvent surévalués et surutilisés
- Pour la plupart des cas d’usage réels, des patterns de workflow simples sont plus adaptés
- Les agents révèlent leur vraie valeur dans des environnements où l’humain intervient directement
- Dans les systèmes stables, ils peuvent au contraire devenir un facteur de risque
- Concevoir avec de l’observabilité, un contrôle explicite et une structure d’évaluation itérative
- Plutôt qu’un framework d’agents complexe, le vrai secret pour développer des services LLM plus vite et plus sûrement consiste à concevoir avec de l’observabilité, des boucles d’évaluation claires et une structure directement contrôlable
6 commentaires
Il y a un mois, pour apprendre ce qu’était le codage avec l’IA en utilisant CURSOR, j’ai lancé le développement d’un framework de développement.
Pendant environ trois semaines, j’ai enchaîné les réussites puis les moments où du code source pourtant validé par l’AI Agent se retrouvait cassé, et j’ai tenté par tous les moyens de contrôler l’AI Agent, sans succès.
J’ai alors compris qu’avant de développer ce framework, la priorité était de développer le code source permettant de contrôler l’AI Agent.
Au final, exactement un mois après avoir commencé à vouloir comprendre ce qu’était vraiment l’IA, j’ai réussi à achever le développement d’un logiciel pouvant être implémenté à 100 % et exploité à 100 % par l’IA, avec un contrôle parfait de l’AI Agent — ou, plus précisément, sans avoir besoin de LLM externes ni d’AI Agent.
En ce moment, cela fait 14 jours que je poursuis le processus d’amélioration supplémentaire en réentraînant cette META AI et en élaborant des règles d’exploitation qu’elle doit respecter. En parallèle, je mène simultanément la migration, l’amélioration et la standardisation de trois systèmes MES que des humains avaient auparavant conçus de manière incomplète, et j’en suis désormais à la phase finale.
Et je prépare maintenant une autre évolution.
Mais alors, dans le prompt chaining, n’est-il pas acceptable d’appeler chacun d’eux un agent — le LLM qui exécute les prompts individuels, le worker d’exécution, le worker orchestrateur, le LLM évaluateur, etc. ?
Ah, il y a donc cette idée que « le contrôle final du workflow (le fait que le LLM décide lui-même de l’étape suivante ou de l’utilisation d’un outil) est qualifié de caractéristique agentique ». J’ai compris. C’était donc un texte qui visait les autonomous agents. Je ne connais pas encore très bien les agents, donc...
Avis Hacker News
https://github.com/astronomer/airflow-ai-sdk
J’utilise moi aussi actuellement UseDesktop
https://youtu.be/aBkbsvMxP_A?si=uaugxKQEu4ZEz7jq
usedesktop.com
pour créer un agent de type Computer-use, et je suis d’accord sur la plupart des points.
Cet article traite davantage d’une vue d’ensemble que d’astuces vraiment pratiques, donc si je devais ajouter quelques conseils pour développer des agents / workflows agentiques basés sur des LLM : au final, les LLM reposent sur les transformers (c.-à-d. un raisonnement probabiliste ; à partir du token / état actuel, ils ne « comprennent » pas sémantiquement le mot suivant dans le contexte avant de le produire, ils génèrent une sortie de manière probabiliste). Donc, même avec un très bon
sys prompt, il arrive souvent qu’ils ne donnent pas la réponse voulue (par ex. on leur demande une réponse au format JSON, mais il leur arrive d’oublier un}), d’où la nécessité d’ajouter systématiquement plusieurs fonctions de repli basées sur des regex.Et lorsqu’on écrit un
sys promptpour obtenir une sortie structurée, on utilise généralement un modèle non reasoning ; plus le contexte est long, plus les hallucinations surviennent fréquemment, donc il vaut souvent mieux créer plusieurssys promptet les chaîner.Quand on développe un service, divers types d’erreurs peuvent survenir ; l’essentiel est donc de concevoir l’architecture du service de façon modulaire et fault tolerant (par ex. un supervisor agent en async et les autres agents en sync), surtout pour les systèmes agentiques / agents où les sorties inattendues sont fréquentes.
C’est pourquoi, dès le départ, il vaut mieux écrire le code en respectant autant que possible le SRP et de façon déclarative ; je dirais qu’une approche fonctionnelle est préférable (= pas d’effets de bord et un flux intuitif).
Ensuite, selon que vous utilisez les LLM via API ou que vous servez directement le modèle, l’approche diffère. Mais si vous allez servir directement un SLM ou un LLM, il vaut mieux ne pas faire tourner le model serving sur le même serveur que celui qui héberge le backend ; il est préférable, pour la tolérance aux pannes, de séparer les tâches IO bound et les CPU bound tasks (c.-à-d. les tâches nécessitant un GPU, des multiplications matricielles, etc.) sur des serveurs différents (par ex. héberger les CPU bound task sur Runpod).
Il y a encore pas mal d’autres conseils de dev, mais je vais m’arrêter là pour éviter que ce soit trop long.
J’espère que cela pourra être utile à quelqu’un.
Merci beaucoup d’avoir partagé votre précieuse expérience et votre point de vue. L’avis de quelqu’un qui travaille sur le terrain est vraiment d’une grande aide.