Un agent IA en production qui n'a pas le droit d'inventer
Comment nous avons transformé une corvée de plusieurs heures en un agent qui collecte, agrège et rédige nos rapports de TMA Drupal / Next.js en quelques minutes — sans jamais laisser le LLM halluciner un chiffre. Retour d'expérience sur la mise en production d'un modèle de langage là où l'erreur coûte cher.
Du rapport manuel à l'agent IA
Sur la plupart des projets que VOID héberge et maintient, chaque cycle de maintenance se termine par un rapport envoyé au client : composants mis à jour, failles de sécurité corrigées, performance du site, parcours critiques re-testés. C'est la preuve visible du travail réalisé — et la base de la confiance du client.
Le problème : ce rapport était écrit à la main. Un ingénieur collectait les changements de version, allait chercher chaque advisory de sécurité, lançait les contrôles SSL et performance, copiait les résultats, puis réécrivait l'ensemble en français lisible. Deux à quatre heures par projet et par période, pour un résultat dont la qualité variait d'un auteur à l'autre.
Pendant mon PFE chez VOID, j'ai conçu un agent IA de reporting de TMA pour absorber cette corvée : un système qui collecte seul les informations, les agrège, les fait raisonner par un modèle de langage, puis produit un document propre en quelques minutes.
Mais le vrai sujet de ce retour d'expérience n'est pas l'outil. C'est la question que pose toute mise en production d'un LLM dès qu'on sort de la démo : comment faire écrire un modèle de langage quand on ne peut pas se permettre qu'il invente ?
La fausse bonne idée : laisser le LLM écrire le rapport
Depuis GPT-3, l'intuition dominante est simple : on rassemble les données, on les colle dans un prompt, et on demande au modèle de rédiger le rapport complet. Avec un bon modèle frontier, la démo est bluffante — quelques secondes, et un texte fluide, structuré, convaincant.
C'est exactement ce qu'il ne faut pas faire ici.
Un rapport de maintenance est un document factuel : numéros de version (Drupal 10.4.6 → 10.5.6), identifiants de CVE, scores de performance, dates de certificat. Or un LLM en génération libre produit un texte qui sonne juste mais qui est parfois faux — c'est l'hallucination, le risque le mieux documenté de ces modèles. Et plus le modèle est capable, plus il est convaincant quand il se trompe : une hallucination à haute confiance.
Le raccourci à éviter. « L'IA écrit le rapport » est une lecture trompeuse. Dans cet agent, le LLM n'écrit aucun fait : il met en mots une matière déjà collectée et vérifiée. Tout ce qui est vérifiable — versions, CVE, scores — vient du code, pas du modèle.
Dans un rapport client orienté sécurité, une version erronée ou une CVE inventée n'est pas une coquille — c'est une perte de confiance, voire un risque contractuel. Le modèle écrira « cette mise à jour corrige une vulnérabilité critique d'injection SQL » avec le même aplomb, que la faille existe ou non. Pour un livrable que personne ne recoupe ligne par ligne, c'est rédhibitoire.
Le principe : ancrer le modèle (grounding)
La partie difficile d'un rapport n'a jamais été la rédaction. C'est d'obtenir des données correctes. L'architecture en découle directement : on sépare les faits de la formulation.
Chaque chiffre est collecté de manière déterministe, depuis des sources officielles. Le modèle n'intervient qu'à la fin, et uniquement pour transformer cette matière vérifiée en français lisible. Le LLM n'est jamais une source de faits : c'est une couche de reformulation contrôlée posée au-dessus de données déjà collectées et validées.
C'est, mot pour mot, le principe du grounding popularisé par le RAG (retrieval-augmented generation) : on n'interroge pas la mémoire du modèle, on lui fournit le contexte vérifié et on lui demande seulement de le mettre en forme. La recherche appelle aussi cela la génération « data-to-text » : un texte dont chaque phrase est traçable jusqu'à une donnée structurée.
Ce qui passe par le code (déterministe)
Comparaison de versions — entre la baseline et la configuration actuelle, pour ne garder que les composants qui ont changé.
Agrégation des changelogs — de six runtimes (Drupal, Next.js, Node.js, PHP, Nginx, MariaDB/MySQL), chacun depuis sa source officielle.
Résolution des CVE — via l'API du NVD, avec un filtre de sévérité (High et Critical par défaut).
Sondes externes — certificat SSL, audit de performance (PageSpeed Insights), scan de vulnérabilités, tests fonctionnels Playwright.
Ce qui passe par le LLM (quatre tâches de mise en mots)
Synthétiser le contexte du projet
Reformuler en français clair les descriptions brutes de CVE / GHSA
Rédiger le narratif sécurité de l'audit
Rédiger le narratif « effets des changements » à partir des résultats Playwright
Aucune ne lui demande de produire un chiffre. On lui demande des phrases, à partir de valeurs qu'il n'a pas le droit de modifier.
L'agent en deux temps : un pipeline orchestré
L'agent fonctionne comme un pipeline orchestré. La validation de l'entrée arrive d'abord (schéma strict via Zod) : une entrée malformée échoue avant le moindre appel réseau. Suivent deux phases.
Pipeline en deux temps
Phase 1 — Collecte parallèle
Phase 2 — Rédaction LLM (concurrence bridée)
Phase 1 — Collecte, en parallèle
La plupart des étapes attendent un service distant : le contrôle SSL pilote un navigateur headless, l'audit performance est délégué à l'infrastructure de Google, le scan appelle notre web-scanner, l'agrégation interroge le NVD et les advisories GitHub et Drupal. Ces appels sont indépendants et dominés par la latence réseau ; lancés ensemble plutôt qu'en série, le temps mort de l'un recouvre le travail de l'autre, et la phase ne dure que le temps de sa sonde la plus lente.
La barrière de fusion
La Phase 2 ne démarre qu'une fois toutes les tâches de la Phase 1 terminées. Les narratifs raisonnent sur les faits collectés (sauts de version, CVE filtrées, scores, findings) et ne doivent jamais s'exécuter en avance sur eux. Cette barrière est précisément ce qui empêche le modèle de décrire des valeurs encore en cours de récupération — un garde-fou d'orchestration autant que de correction.
Phase 2 — Rédaction, en parallèle mais bridée
Les narratifs sont générés en concurrence, mais avec un nombre borné d'appels simultanés : inutile de saturer un serveur d'inférence, et la concurrence se paie en tokens. L'assemblage HTML puis le rendu PDF (headless Chrome) sont, eux, strictement séquentiels.
Les garde-fous : évaluation et validation humaine
Donner la parole à un LLM en production, c'est accepter qu'il puisse mal répondre. La réponse n'est pas de mieux « prompter » — c'est d'entourer le modèle de garde-fous, exactement comme les modèles frontier grand public sont aujourd'hui livrés avec leurs safety classifiers.
Le modèle est un service faillible
Une réponse vide ou trop courte compte comme un échec ; après plusieurs tentatives, on conserve le texte saisi manuellement plutôt qu'un texte douteux. Le LLM n'a aucun statut privilégié dans la chaîne.
Une passe d'évaluation
Avant d'être considéré comme livrable, le rapport est confronté à une check-list de cohérence et reçoit un score de fiabilité global ; en dessous du seuil, il n'est pas envoyé — il est signalé pour relecture manuelle.
L'humain garde le dernier mot
Aucun rapport ne part chez un client sans validation par un administrateur, via un circuit de revue tracé en base. Le LLM accélère la mise en forme ; l'humain garde le dernier mot sur ce qui sort.
Sur un livrable critique, la validation humaine n'est pas négociable. Le circuit de revue est tracé : relecture, décision, correction en cas de refus, puis envoi du PDF au client une fois le rapport validé.
Tenir en production : résilience, coûts, multi-modèles
Dès qu'un agent repose sur une dizaine de services externes, la vraie question n'est plus « est-ce que ça marche ? » mais « que se passe-t-il quand l'un d'eux tombe ? ». Et il y en a toujours un qui tombe : une API rate-limitée, un checker SSL qui met quatre minutes à répondre, un quota dépassé.
Deux exigences opposées
Un plafond — une génération complète doit tenir en moins de dix minutes.
Un plancher — le rapport doit toujours sortir, même service distant en panne.
Le premier justifie le pipeline parallèle ; le second, une couche de résilience uniforme : une primitive de retry (trois tentatives, backoff aléatoire, erreurs transitoires seulement), des wrappers best-effort (un échec renvoie des données vides plutôt que d'arrêter le pipeline) et des chaînes de fallback (SSL ×3, PageSpeed ↔ GTmetrix, scan repris du cache).
Coûts d'inférence et portabilité
Un agent qui appelle un LLM sur chaque rapport, plusieurs fois, peut voir sa facture s'envoler. Trois leviers le contiennent : la concurrence bornée en Phase 2, le caractère strictement optionnel de l'enrichissement (sans endpoint configuré, l'agent saute la rédaction et garde le texte manuel — le rapport sort quand même), et un découpage des tâches qui n'envoie au modèle que le strict nécessaire.
Enfin, la portabilité. L'agent vise un endpoint compatible OpenAI, défini par configuration. On peut donc router vers un modèle auto-hébergé open-weight — un Qwen sur notre propre infrastructure, pour les données sensibles — ou vers une API commerciale comme Claude quand sa puissance fait la différence, et basculer de l'un à l'autre sans toucher au code. C'est la même logique d'architecture multi-modèles et de souveraineté des données que VOID applique à ses projets IA : le bon modèle pour le bon usage, selon le rapport coût / capacité / sensibilité.
Cinq leçons pour mettre un LLM en production
Ne demandez pas des faits au modèle, demandez-lui des mots
Tout ce qui est vérifiable doit venir d'un code déterministe.
Ancrez tout (grounding / RAG)
Le modèle reformule une matière vérifiée, il ne la génère pas.
Traitez l'appel au LLM comme un appel réseau faillible
Retry, dégradation propre, et un plan B qui reste correct.
Entourez le modèle de garde-fous
Évaluation automatique du livrable et validation humaine sur tout ce qui part au client.
Restez multi-modèles et neutre côté fournisseur
Un endpoint configurable, c'est la liberté de changer de modèle — ou de rapatrier les données sensibles sur un open-weight souverain.
Notre conviction. Un LLM en production n'a pas besoin d'être brillant pour être utile ; il a besoin d'être cadré. Le travail d'ingénierie ne consiste pas à faire confiance au modèle, mais à construire autour de lui ce qui lui retire toute occasion de se tromper là où ça compte. L'IA générative déplace le goulot : produire du texte n'est plus le problème, la fiabilité l'est.
Questions fréquentes
Pourquoi ne pas tout confier au LLM ?
Quel modèle utilisez-vous ?
L'agent remplace-t-il l'ingénieur ?
Comment gérez-vous les hallucinations ?
Besoin d'un agent IA fiable pour vos workflows ?
Architecture multi-modèles, grounding, garde-fous, validation humaine — nous concevons des agents IA qui produisent des résultats vérifiables, pas des hallucinations convaincantes.
À propos de l’auteur
Abdelkarim Sadiki
Stagiaire PFE — Master Big Data & IoT, ENSAM Casablanca
Étudiant en Master Big Data & IoT à l'ENSAM Casablanca, Abdelkarim a conçu pendant son PFE chez VOID un agent IA de reporting de TMA qui collecte, agrège et rédige des rapports de maintenance Drupal / Next.js — sans jamais laisser le LLM halluciner un chiffre.
Cet article vous a été utile ?
Partagez-le à votre réseau — en particulier aux équipes qui s'apprêtent à déployer un agent IA en production.
Aller plus loin
Expertise IA & Automatisation
Agents IA, LLM, RAG et automatisation à forte valeur ajoutée.
Harness Engineering : agents IA fiables
La discipline qui rend les agents IA fiables en production.
Claude Fable 5 : impact pour les entreprises
Ce que le premier modèle Mythos-class change pour les DSI.
Parler de votre projet IA
Audit, architecture multi-modèles, intégration et gouvernance.