Un POC d’agent tient en un prompt, la production est un autre métier
Brancher un LLM à une API prend 5% du temps et génère l’effet waouh. En revanche, l’évaluation et la mesure représentent 95% du travail. Une étude MIT 2025 constate que 95% des projets GenAI n’arrivent pas en production, et le facteur principal est l’absence de framework d’évaluation. Le vrai problème n’est pas de faire parler un modèle, c’est de savoir à quel pourcentage tu réponds correctement, dans quels cas tu réponds mal, et comment ce taux évolue dans le temps. C’est précisément là qu’un vérificateur IA bien placé dans l’architecture change tout.
La différence avec un workflow classique est structurelle. Un workflow classique plante ou réussit, tu le vois tout de suite. Un agent, lui, peut réussir son exécution et produire un résultat faux : il hallucine, il appelle le mauvais outil, il ignore une consigne. Ton monitoring affiche un uptime parfait pendant que l’agent répète la même mauvaise réponse à un client furieux. C’est le piège qui maintient la majorité des agents au stade de la démo.
Un POC tient en un prompt. La production demande 5 familles de contrôles. Je les appelle les 5 patterns de production : validation, error recovery, context management, governance et cost control. Chacune traite une cause d’échec distincte, et l’ordre compte : on intervient avant l’appel, pendant l’exécution, puis après.
Périmètre, parce que le vocabulaire prête à confusion. Ces 5 patterns traitent la fiabilité runtime. Ils sont distincts des 5 patterns de raisonnement (ReAct, Planning, Reflection, Multi-Agent, Tool Use), qui décrivent comment l’agent décide. Un agent peut très bien raisonner correctement et échouer en production parce qu’aucune couche ne l’empêche de rendre un résultat faux. Et pour couper court à un malentendu : un vérificateur IA ici n’est pas un détecteur de texte généré grand public. Un détecteur de ce genre note un texte que tu lui colles et rend un score. Dans un agent, la vérification porte sur une action et sur un état, pas sur un paragraphe.
Les 5 patterns de production en un coup d’oeil
| Pattern | Problème traité | Techniques |
|---|---|---|
| Validation | Sorties qui cassent le schéma JSON, champs manquants, hallucinations | Sorties structurées, vérification contre un schéma, étape de réflexion, retry borné ou routage vers humain |
| Error recovery | APIs qui timeout, rate limits, services offline | Retry logic, fallback models, fallback providers, escalade humaine |
| Context management | Trop de contexte (coût et distraction) ou trop peu | Systèmes de mémoire, retrieval, résumé, compaction, isolation |
| Governance | Agent qui accède aux systèmes métier | Approval workflows, audit logging, RBAC, human-in-the-loop |
| Cost control | Coûts qui explosent avec l’usage | Model cascading, token budgeting, caching, usage sélectif des modèles de raisonnement |
En production, tu ne choisis pas un pattern, tu en combines plusieurs. Un support automatisé retrouve dans une base de connaissance, valide contre un schéma, escalade les réponses peu confiantes et bascule sur un fallback si le provider primaire tombe : quatre patterns dans le même workflow, chacun sur une cause d’échec différente.
L’ordre d’implémentation n’est pas non plus négociable :
- Commencer par les bases : temperature basse, prompts structurés, output schemas.
- Tester chaque couche avant d’ajouter la suivante.
- Ajouter guardrails et routing seulement quand le cas se complexifie.
La performance réduite en amont diminue le coût d’évaluation et de monitoring en aval. C’est le même arbitrage à chaque étage : moins de bruit dans l’entrée, moins de travail de contrôle à la sortie.
Pattern 1 : validation, le rôle du vérificateur IA
Le problème est connu de quiconque a mis un agent en test : des sorties qui cassent le schéma JSON attendu, des champs obligatoires manquants, des valeurs inventées. L’agent a fonctionné, la sortie est fausse. Un grader ou un vérificateur IA sert exactement à détecter cet écart avant qu’il n’atteigne le client.
Les techniques se cumulent :
- Sorties structurées imposées par schéma.
- Vérification de la sortie contre ce schéma.
- Étape de réflexion : le modèle relit son propre travail.
- Retry borné, ou routage vers un humain si l’échec persiste.
Il existe trois familles de graders, et leur ordre de priorité suit le coût. D’abord le code déterministe : correspondance de chaîne, suite de tests, vérification en base. Rapide, gratuit, objectif, mais cassant sur une variation valide. Ensuite le grader modèle, le LLM-as-judge : flexible, scalable, capable de noter une sortie libre, mais non déterministe et à recalibrer régulièrement. Enfin la revue humaine : la référence, chère et lente, qui sert surtout à calibrer les juges modèle.
Le rôle du vérificateur IA se pose là : un second agent, ou un contrôle indépendant, relit la sortie du premier avec des critères de correction vérifiables. Stanford a utilisé exactement ce montage dans la Grounded Reasoning Cup, avec un second agent qui ré-extrait les valeurs intermédiaires et corrige les calculs sur discordance. Le résultat est instructif : la vérification achète de la justesse et coûte de la latence. L’équipe l’a retirée, a perdu 14 bonus de vitesse, puis l’a rallumée en manche finale pour corriger une réponse, ce qui a fait la victoire. C’est une décision de harness, et elle se prend par question, pas une fois pour toutes.
Un dernier point de méthode, mesuré sur la même compétition : l’écart entre la meilleure et la pire équipe utilisant le même modèle atteint 30,4 points. Ce que mesure une éval d’agent n’est donc pas le modèle, c’est le système complet. Et pour un agent en contact client, la constance compte plus que le coup d’éclat : à 75% de réussite par essai, 3 essais d’affilée ne donnent que 42% de chance de tout passer.
Sorties structurées : imposer un schéma plutôt que demander gentiment
Le mécanisme est simple et il règle beaucoup de cas. Un schéma JSON imposé garantit des valeurs consistantes : le modèle écrit « billing » et jamais « BILLING ». Tu n’as plus à écrire trois variantes de parsing, et la détection d’une sortie non conforme devient une comparaison mécanique.
Attention à ne pas sur-contraindre pour autant. Ne note pas la séquence exacte d’étapes, sauf si l’ordre importe réellement. Un agent peut prendre un autre chemin et produire le bon résultat. Note le résultat et le caractère raisonnable de l’approche, pas le parcours.
L’avertissement qui monte avec les modèles de frontière : l’agent peut découvrir une solution valide que personne n’avait anticipée en écrivant la tâche. Un grader trop rigide la marque à tort en échec alors que l’agent a mieux résolu le problème de l’utilisateur.
La boucle de réflexion : générer, critiquer, raffiner
La boucle tient en trois temps. Generate : une première réponse, tenue en état temporaire. Reflect : le même modèle ou un autre critique selon des critères prédéfinis, par exemple « ai-je considéré toutes les politiques ? ». Refine : le brouillon et la critique repartent au générateur.
Le point non négociable est le critère d’arrêt. Sans compteur d’itérations, l’agent brûle des tokens ou dépasse l’optimum et dégrade la réponse. En pratique, 2 à 3 tours maximum, puis fallback humain.
- Auto-réflexion mono-modèle : simple, mais limitée à ses propres connaissances, avec un risque de self-preference bias qui renforce les hallucinations.
- Réflexion multi-agents (peer review) : un raisonnement distinct attrape ce que l’original rate, au prix du coût.
- Réflexion augmentée d’outils : valide les faits, mais dépend de l’exactitude de l’outil.
Quand s’abstenir : tâche sensible au temps, premier jet déjà satisfaisant, volume élevé où le coût des appels multiples devient prohibitif. Chaque boucle ajoute une inférence et parfois des appels d’outils.
Le déclenchement intelligent, lui, passe par un seuil de confiance multiplicatif (planification x retrieval). La réflexion ne tourne pas systématiquement : elle tourne quand le score de confiance descend sous un seuil calibré. C’est ce qui évite de payer la vérification sur les cas faciles.
Pattern 2 : error recovery, survivre aux APIs qui tombent
Ton agent dépend de services qui tombent. Timeouts, rate limits, provider en incident : ce n’est pas une hypothèse, c’est le quotidien d’un système en production. Le pattern d’error recovery traite cette famille d’échecs.
Les techniques de base : retry logic, fallback models, fallback providers, escalade humaine. Ajoute une règle simple et souvent oubliée : un timeout explicite sur chaque appel, 30 secondes comme point de départ raisonnable. Un timeout explicite vaut mieux qu’une attente indéfinie, parce que rien en aval ne peut démarrer tant que l’appel est suspendu.
Deuxième brique : des réponses d’erreur structurées, du type success, error.type, fallback. Et l’isolation des domaines d’échec : l’échec du spécialiste billing ne doit pas cascader sur tout l’agent.
Enfin, la contrainte qui relie recovery et fiabilité : les retries ne sont sûrs que si l’aval est idempotent. Cette phrase est courte et elle évite des incidents très coûteux.
Retries, idempotence et exécution durable : ne pas créer de doublons
Le risque concret : un retry qui déclenche un second paiement ou un second envoi. Le runbook automatisé devient un thundering herd si rien ne borne les reprises.
Les garde-fous techniques :
- Clés d’idempotence sur chaque écriture.
- Déduplication des webhooks.
- Écritures conditionnelles.
- Upserts gardés à identifiants déterministes.
- Retries bornés, avec un nombre maximal de tentatives.
Pour les tâches longues, l’exécution durable apporte le reste : Event History rejouée, Activities enregistrées et réessayées, Signals pour les décisions humaines, attente sans worker mobilisé. Le run reprend après un crash de worker ou trois jours d’attente humaine, sans repartir de zéro.
Reste la forme de panne la plus invisible, et la pire : le succès silencieux. Un crash est agaçant, mais il donne une frontière, tu vois que ça s’est arrêté et tu peux rejouer. Le succès silencieux est un mensonge : le canal annonce un succès, l’utilisateur voit quelque chose se produire, et le système a perdu une partie de sa mémoire sans que personne n’ait de raison de douter.
Pattern 3 : context management, la fenêtre est le goulot
Le problème n’est jamais binaire. Trop de contexte coûte cher et distrait le modèle. Trop peu de contexte le fait deviner. Et beaucoup d’apparents échecs de raisonnement sont en réalité des échecs de contexte : soit le modèle n’a pas la bonne information, soit trop d’information non pertinente se dispute son attention.
C’est le context rot. Les instructions à forte valeur se retrouvent enterrées sous des données d’exécution à faible valeur, et le modèle rate des instructions, hallucine, choisit le mauvais outil, pendant que les coûts grimpent. Quatre sources se disputent la fenêtre et grossissent indépendamment : system prompt, état de conversation, connaissance retrouvée, définitions d’outils.
Quatre stratégies répondent, dans cet ordre : Write (system prompt discipliné, formats concis), Select (filtrer avant d’entrer dans le contexte), Compress (résumé, extraction de faits structurés), Isolate (sous-agents à fenêtre propre). L’ordre compte : compresser une donnée qu’on n’aurait pas dû sélectionner ne vaut pas l’effort.
Le renversement à comprendre est culturel avant d’être technique. Le prompt n’est pas l’entrepôt de la connaissance, c’est une carte. La connaissance vit dans des fichiers structurés à emplacements prévisibles, et l’agent ne charge que ce dont la tâche a besoin. Netflix l’a mesuré sur GenPage : enrichir le contexte apporte 6,9% de gain contre 1,3% pour scaler le modèle de 120M à 900M paramètres, soit cinq fois plus.
Mémoire, filesystem et compaction : trois techniques pour les tâches longues
La compaction résume une conversation qui approche la limite, puis relance avec le résumé et les fichiers les plus récents. L’art tient dans le choix de ce qu’on garde : sur-compacter perd un contexte subtil dont l’importance n’apparaît que plus tard.
La prise de notes structurée écrit des notes persistées hors de la fenêtre, réintégrées plus tard. C’est le pattern du fichier NOTES.md : l’agent tient ses jalons sur disque au lieu de tout porter en historique.
Les architectures multi-agents isolent la recherche. Des sous-agents à fenêtre propre explorent en profondeur, parfois des dizaines de milliers de tokens, et ne renvoient qu’un résumé condensé de 1000 à 2000 tokens à l’agent principal.
Les signaux concrets qui montrent que tu es sur la bonne voie :
- Le pattern scratch pad : écrire un gros résultat d’outil sur disque, puis faire un grep ciblé plutôt que garder tout en historique.
- Le tool call offloading : ne conserver que la tête et la queue des gros outputs, le reste va sur le filesystem.
- La progressive disclosure via skills : seul le front-matter est chargé au démarrage, le corps arrive à la demande.
Le principe directeur reste le budget d’attention : le plus petit ensemble de tokens à haut signal qui maximise la probabilité du résultat voulu. Le gain est dans la qualité du contexte, pas dans son volume.
Pattern 4 : governance, identité, permissions et human-in-the-loop
Jusqu’ici, l’agent produit une réponse. Dès qu’il accède aux systèmes métier, la question change de nature : query de données sensibles, écritures, workflows, code. Chaque appel d’outil élargit le rayon d’impact d’une erreur.
Les techniques : approval workflows, audit logging, RBAC, human-in-the-loop sur les actions à fort impact. Le tout sous un principe central, formulé de façon tranchée : une garantie de prompt n’est pas une garantie. Les chiffres le confirment. Les garde-fous d’un modèle ouvert se contournent à 64% par un prompt trompeur, 92% par préremplissage des tokens de réflexion, 100% par abliteration. Écrit dans le runtime, un garde-fou tombe à 0%. Tout ce qui n’existe que dans un prompt se contourne.
D’où le workflow déterministe comme contenant de privilège. Un workflow outil qui ajoute une note à un compte prend un identifiant et une note, et ne sait faire que ça. Sans ce workflow, journaliser une note signifierait donner à l’agent un accès en écriture au CRM et faire confiance à ses instructions pour qu’il se limite au champ notes. Avec le workflow, l’agent ne détient jamais le credential. Il détient un workflow qui fait une chose. Corollaire : un credential par outil, l’agent ne détient jamais les clés de l’instance.
Decision boundaries : AUTO, CONFIRM, ESCALATE au runtime
Définition : trois chemins pilotés par des seuils de confiance, des minima de qualité de preuve et la politique de l’organisation. AUTO passe, CONFIRM demande une validation, ESCALATE remonte à un humain.
Le point qui structure tout : ce n’est pas une instruction de prompt, c’est une architecture d’application au runtime. Une boucle de raisonnement sans decision boundaries produit de l’action autonome sans responsabilité.
Deuxième exigence, sur le même axe : garder chaque décision loggée avec sa trace de raisonnement, y compris les alertes rejetées. « Qui a écarté cette alerte, et pourquoi ? » doit avoir une réponse auditable. C’est le trou d’audit le plus courant : on trace ce que l’agent fait, pas ce qu’il décide de ne pas faire.
Sur le terrain, la revue humaine par action perd vite sa valeur. Anthropic rapporte que 93% des demandes de permission de Claude Code étaient approuvées en aveugle. Après ajout d’un sandbox OS qui autorise l’écriture dans le workspace et bloque le réseau par défaut, les demandes ont chuté de 84%. L’approbation à la chaîne n’est pas un contrôle. D’où la distinction HITL (pause avant l’action) et HOTL (revue après coup), et le palier partiellement autonome où vivent la plupart des déploiements réels.
Du RBAC au TBAC : la permission suit la tâche, pas le rôle
Les rôles statiques cassent à la couche agentique pour quatre raisons : des acteurs sur-permissionnés sans jugement, une explosion de la granularité des rôles, une amplification à vitesse machine, et surtout le trou du retrieval, où le contexte de permission de la donnée n’est pas préservé dans les vector stores et les APIs.
Le remplacement est un moteur de politique central qui évalue chaque action au runtime. Une identité et un but déclaré par agent. Et une application hors de l’agent : un agent qui applique ses propres règles est vulnérable à l’injection. Être demandable n’est pas être exécutable, offrir un outil au modèle revient à inclure son schéma dans ses options, et le système doit ensuite vérifier politique, identité, approbation, arguments et portée.
Règle d’autorisation qui en découle : lecture seule auto-approuvable, écriture ou modification de comportement, permission explicite. Et tout ce qui est en auto-approve doit obligatoirement tourner en sandbox.
Pattern 5 : cost control, garder la facture sous contrôle
Les coûts explosent avec l’usage, et le premier facteur est souvent l’architecture elle-même. Un multi-agents consomme 10 à 20 fois les tokens d’un mono-agent. Sans garde-fou, la facture suit la même pente que le trafic.
Les techniques : model cascading (petit modèle d’abord, escalade seulement si besoin), token budgeting, caching de réponses, usage sélectif des modèles de raisonnement. Le caching sémantique et la compaction sont deux leviers de coût directs, avec leur contrepartie à calibrer, comme le seuil de similarité d’un cache ou la perte de contexte d’une troncature.
Le raisonnement économique de fond mérite d’être archivé : ce qu’on pousse au déterministe est plus précis, plus sûr et moins cher. Un appel court sur un modèle de frontière coûte quelques centimes quand le travail de corrélation a été fait avant l’appel.
Quatre leviers opérationnels qui font vraiment la différence :
- Limiter les itérations.
- Minimiser les descriptions d’outils : 15 outils, c’est 15 descriptions dans chaque requête, donc mieux vaut découper en agents focalisés.
- Monitorer et budgéter les tokens par exécution.
- Choisir le bon modèle par tâche, léger pour la classification et le routing.
Un ordre de grandeur pour situer : un agent support documenté coûte 4,20 $ par mois pour trois personnes à 10 requêtes par jour avant optimisation du contexte. Le coût devient exponentiel à l’échelle si le contexte croît à chaque interaction, appels d’outils compris. Le context engineering n’est pas une fonctionnalité de décoration, c’est de l’architecture.
Comment combiner les 5 patterns dans un agent réel, avec un vérificateur IA
Prenons un cas filé : un support automatisé. L’agent retrouve la réponse dans une base de connaissance (context management), la valide contre un schéma (validation), escalade les réponses peu confiantes via un seuil de confiance (governance), et bascule sur un provider de secours si le primaire tombe (error recovery). Le tout avec un budget de tokens par exécution (cost control). Cinq patterns, un seul workflow, et un vérificateur IA qui relit avant livraison.
La règle des contrôles en couches : chaque couche traite une cause d’échec distincte, et tu testes chaque couche avant d’ajouter la suivante. Empiler des garde-fous non testés revient à ajouter de la complexité sans gagner en fiabilité.
Traite la complexité comme de l’architecture logicielle : frontières claires, interfaces explicites, domaines d’échec isolés, testabilité indépendante. Le premier agent marche, tu en ajoutes deux ou trois, tu les fais s’appeler, tu ajoutes de la mémoire et des branches, et le système devient indébuggable. Ce n’est pas une raison pour éviter la complexité, c’est une raison pour la structurer.
La règle de départ, donc : commencer flat, une séquence linéaire de 3 à 5 étapes, et refactorer quand la complexité l’exige. Résiste à démarrer par le pattern le plus complexe. La plupart des équipes qui abandonnent un système agentique l’ont sur-architecturé trop tôt.
Les 3 risques à cadrer avant de laisser un agent écrire
Avant d’accorder le droit d’écriture, trois risques doivent être cadrés :
- Boucles infinies et coûts incontrôlés : un agent peut boucler sur un endpoint qui renvoie une réponse inattendue, donc impose des limites d’itérations strictes.
- Mauvais usage d’outil : un modèle qui mal-interprète peut construire une requête valide mais destructrice, donc ajoute des gates d’approbation.
- Fuite de données : injecter des données entreprise brutes dans des loops d’agents externes fuit du code et des données sensibles vers des providers tiers.
À cela s’ajoute le prompt injection indirect, le plus dangereux. L’agent lit une source externe (page web, PDF, ticket) qui contient des instructions malveillantes cachées, il les traite comme légitimes et agit downstream. La mitigation est structurelle : séparer system prompt et input au niveau applicatif, wrapper tout input externe, et appliquer le least-privilege sur les outils appelables pour contenir les dégâts si ça passe.
Checklist : par où commencer quand ton agent passe en production
Ordre par rendement, du plus rentable au plus spécialisé :
- Un scorer déterministe par livrable, avant tout juge modèle.
- Des conditions d’arrêt et un saga explicites dans les skills.
- Un but déclaré vérifiable pour les rares agents qui écrivent.
- Un dossier de scénarios versionnés, alimenté par les échecs de production.
- Un budget de latence par étape, avec des timeouts durs.
Vérifie l’état, pas le texte. La phrase de l’agent ne prouve rien : « le produit a été retourné » ne veut rien dire, il faut regarder la base. Un agent de réservation peut annoncer un vol réservé, la seule preuve est que la ligne existe.
Ne jamais optimiser une seule métrique. +5 points de précision d’intention pour +133% de latence et -0,4 de CSAT, c’est une régression déguisée en progrès. La redondance des perspectives, juges LLM, règles déterministes, labels humains, métriques de prod, est une assurance, pas un gaspillage.
Chaque échec de production doit revenir dans le jeu de test. Sinon tu corriges les mêmes problèmes en boucle. Et assurez-vous d’une chose : sécuriser les secrets. L’agent ne détient jamais les clés de l’instance, il détient un outil scopé qui fait une chose et une seule.
Ce qu’il faut retenir
Les 5 patterns en une phrase chacun :
- Validation : empêcher l’agent de rendre une sortie fausse, par schéma et vérificateur.
- Error recovery : survivre aux APIs qui tombent, sans créer de doublons.
- Context management : garder la fenêtre focalisée, le prompt est une carte et non un entrepôt.
- Governance : appliquer l’autorité hors du prompt, au runtime, avec identité et decision boundaries.
- Cost control : cascader les modèles, budgéter les tokens, pousser le déterministe au maximum.
Le déplacement de contrainte est le vrai sujet. En 2024-2025, la contrainte était la capacité du modèle. En 2026, c’est l’assurance système. Un agent peut avoir un uptime parfait et échouer en boucle sur la qualité, parce que la réponse finale cache les erreurs internes.
La formulation canonique à retenir tient en une phrase : le modèle propose, le harness valide, le reçu le prouve. C’est ce qui sépare un POC qui impressionne d’un agent fiable qui tient en production, avec une vraie qualité de service et des outils qui ne dérapent pas.
Si tu veux suivre l’aventure, abonne-toi !