Le graph engineering fiabilise les agents IA en rendant l’exécution explicite, contrôlable et récupérable. Au lieu de laisser un agent tout gérer dans une boucle opaque, je découpe le workflow en nœuds, routes, états, validations et checkpoints. C’est moins magique, mais beaucoup plus exploitable.
Qu’est-ce que le graph engineering ?
Le graph engineering consiste à représenter une application IA comme un graphe exécutable. Dit autrement, au lieu d’avoir un agent qui fait tout dans une grande boucle un peu floue, je découpe l’application en morceaux visibles, contrôlables, testables.
Ce graphe contient des nœuds, c’est-à-dire des étapes de travail. Un nœud peut analyser une demande, appeler une API, interroger une base, générer une réponse ou vérifier un résultat. Il contient aussi des arêtes, donc les chemins possibles entre ces étapes. On y ajoute un état partagé, c’est la mémoire structurée de l’exécution, des règles de validation, des points de contrôle, et parfois des décisions humaines quand le risque est trop élevé pour laisser l’IA trancher seule.
Avec un agent unique, le problème arrive vite. Beaucoup de transitions restent cachées dans le contexte du modèle, dans le prompt ou dans l’historique de conversation. On croit avoir un système simple parce qu’il n’y a qu’un agent. En réalité, toute la logique est compressée dans une boîte noire. Quand ça rate, on ne sait pas toujours si le problème vient du prompt, de l’outil appelé, de la donnée récupérée, du raisonnement du modèle ou d’une instruction oubliée trois messages plus haut.
Dans une approche graph engineering, les responsabilités sont séparées. Un nœud fait une chose. Une route décide de la suite. Un validateur contrôle si le résultat est acceptable. Un checkpoint permet de reprendre sans tout relancer. Ce n’est pas juste un joli schéma pour rassurer en réunion. C’est une façon de concevoir une application IA qui doit tourner vraiment, avec des erreurs, des cas limites, des reprises, des logs et des humains qui veulent comprendre ce qui s’est passé.
Concrètement, je dois concevoir plusieurs éléments dès le départ :
- Les nœuds, pour isoler les tâches importantes.
- Les dépendances, pour savoir quelle étape attend quelle donnée.
- Les transitions d’état, pour garder une mémoire propre de l’exécution.
- Les routes d’exécution, pour choisir le bon chemin selon le contexte.
- Les portes de validation, pour bloquer les sorties douteuses.
- Les chemins de récupération, pour repartir après une erreur.
- Les frontières de contrôle, pour savoir où l’humain doit reprendre la main.
Quand je vois un projet IA devenir difficile à débugger, c’est souvent parce que toute la logique a été poussée dans un seul prompt ou un seul agent. Ça marche en démo. Puis ça devient fragile dès qu’on ajoute des cas réels.
| Visibilité | Agent unique : logique souvent cachée dans le prompt et l’historique. | Graph engineering : étapes explicites, lisibles et traçables. |
| Contrôle | Agent unique : décisions difficiles à isoler. | Graph engineering : validateurs, routes et règles séparés. |
| Reprise après erreur | Agent unique : on relance souvent toute la boucle. | Graph engineering : checkpoints et chemins de récupération prévus. |
Quels sont les composants clés ?
Les composants clés sont les nœuds, les arêtes, l’état partagé, les réducteurs d’état, les routes, les conditions de garde et les checkpoints. C’est ça qui transforme un agent IA un peu flou en système pilotable, observable, et surtout moins fragile.
Les nœuds sont des unités bornées d’exécution. Un nœud fait une chose claire, avec une entrée et une sortie. Ça peut être un appel LLM, un agent complet, une fonction Python, une recherche documentaire, une requête base de données, un appel API, un contrôle de politique, une suite de tests, une approbation humaine ou même un sous-graphe.
Je garde une règle très simple chez mes clients : je garde les LLM pour les tâches sémantiques ou ambiguës, et je laisse les règles métier déterministes dans du code. Une règle métier ne doit pas dépendre de l’humeur du modèle. Si une facture dépasse 10 000 euros et doit partir en validation, ce n’est pas au LLM de “sentir” quoi faire.
Les arêtes sont les liens qui définissent l’ordre d’exécution. Elles disent quel nœud vient après quel autre. On peut avoir des arêtes directes, conditionnelles, parallèles, en boucle, d’erreur, contrôlées par humain, ou déclenchées par événement. Les conditions de routage peuvent venir d’une logique déterministe ou d’un classifieur LLM, c’est-à-dire un modèle qui classe une situation. Mais les contraintes dures restent dans le code de routage.
L’état partagé est l’enregistrement qui traverse le graphe. Il peut contenir user_request, task_plan, retrieved_evidence, draft, validation_result, retry_count, approval_status. Un état typé évite de repasser tout le transcript de conversation au modèle. Et surtout, on voit beaucoup mieux ce que chaque nœud reçoit et produit.
Les réducteurs d’état définissent comment on fusionne les mises à jour. Ça peut être une concaténation de listes, une fusion de dictionnaires, la conservation de la valeur la plus récente, ou une politique personnalisée en cas de conflit. Sans réducteur clair, deux branches parallèles peuvent écraser ou corrompre l’état.
Une logique de routage ressemble souvent à ça :
IF grounding_score < 0.8:
ROUTE TO "recherche_supplémentaire"
ELSE IF risk_level == "élevé":
ROUTE TO "revue_humaine"
ELSE:
ROUTE TO "continuer"
Les conditions de garde bloquent une action si les prérequis ne sont pas remplis. Les checkpoints sauvegardent l’état à des moments clés, pour reprendre, auditer ou rejouer une exécution sans repartir de zéro.
| Composant | Rôle |
| Nœuds | Exécutent une tâche bornée |
| Arêtes | Définissent l’ordre d’exécution |
| État partagé | Transporte les données utiles |
| Réducteurs | Fusionnent les mises à jour proprement |
| Routes | Choisissent le prochain chemin |
| Conditions de garde | Empêchent les actions invalides |
| Checkpoints | Sauvegardent et rendent le graphe rejouable |
Pourquoi l’état change tout ?
L’état change tout parce qu’il transforme une conversation floue en exécution observable. Dans un agent classique, on empile souvent des messages, des consignes, des résultats intermédiaires, des décisions, parfois même des erreurs, dans un gros contexte qui finit par ressembler à une boîte noire. Ça marche en démo. Ça devient fragile dès qu’on veut comprendre pourquoi l’agent a fait tel choix.
Avec un état structuré, chaque nœud du graphe lit certaines données, écrit certaines données, puis la suite peut décider proprement. On n’est plus dans “Le modèle a vu plein de texte et il s’est débrouillé”. On est dans “Ce nœud a reçu ça, il a produit ça, et la transition suivante s’est basée sur cette valeur”. C’est beaucoup plus sain.
| Champ d’état | Rôle |
| user_request | La demande initiale de l’utilisateur. |
| retrieved_evidence | Les éléments de preuve récupérés dans une base, un outil ou une recherche. |
| draft | Une première réponse ou un résultat provisoire. |
| validation_result | Le verdict d’un contrôle automatique ou humain. |
Cette séparation paraît simple, mais elle change tout au debug. Je peux rejouer une étape, tester un nœud seul, vérifier ce qu’il consomme vraiment, et éviter les dépendances invisibles. Un nœud qui dépend discrètement d’un vieux message dans le contexte, c’est le genre de truc qui vous explose au visage trois semaines plus tard.
Les réducteurs jouent aussi un rôle clé. Un réducteur, c’est la règle qui dit comment plusieurs écritures dans l’état doivent être combinées. Imaginez trois recherches lancées en parallèle. Chacune produit des éléments de preuve. Est-ce qu’on concatène les résultats ? Est-ce qu’on déduplique ? Est-ce qu’on garde la source la plus fiable ? Est-ce qu’on résout un conflit avec un score ? Il faut une règle claire. Honnêtement, c’est souvent négligé au prototype, puis ça fait mal dès qu’on passe en production.
L’état rend aussi les checkpoints naturels. Un checkpoint, c’est un snapshot de l’état du graphe à un moment donné. Il permet de reprendre après une interruption, récupérer après une erreur, attendre une validation humaine, inspecter un état précédent, rejouer un workflow ou auditer une décision. La valeur opérationnelle est énorme. On ne repart pas de zéro à chaque incident.
- Moins de contexte inutile envoyé au modèle.
- Meilleure traçabilité des décisions.
- Reprise plus simple après erreur ou interruption.
- Debug plus rapide, parce que chaque étape est isolable.
- Contrôle plus fin des décisions sensibles.
Comment contrôler les décisions sensibles ?
Je contrôle les décisions sensibles en sortant les contraintes critiques du prompt et en les mettant dans des routes, des conditions de garde et des validations explicites. Demander à un LLM de respecter une règle dans un prompt, ça aide. Mais ce n’est pas suffisant quand la contrainte est dure, surtout si elle touche à la conformité, au risque, à une validation métier ou à une action irréversible.
Dans un graphe, une route est une fonction qui choisit la prochaine arête à exécuter. Dit autrement, elle décide où le workflow va ensuite. Pas parce que le modèle “a compris l’intention”, mais parce qu’une règle visible dit quoi faire selon l’état courant.
Les routes peuvent rester très simples, et c’est souvent ça qui les rend fiables :
- Si grounding_score est inférieur à 0.8, je renvoie l’agent vers une recherche supplémentaire.
- Si risk_level est élevé, je force un passage par une revue humaine.
- Si tout est conforme, je laisse le workflow continuer.
Le grounding_score mesure à quel point la réponse est appuyée par des sources ou des données vérifiables. Si le score est bas, je ne veux pas que l’agent improvise. Je veux qu’il retourne chercher de l’information. Même logique pour risk_level, qui représente le niveau de risque estimé d’une décision ou d’une action.
Quand la règle est claire, la route peut être déterministe. Une condition, un seuil, une sortie. Quand le signal est plus ambigu, je peux utiliser un classifieur LLM. Un classifieur LLM, c’est simplement un modèle qui ne rédige pas une réponse finale, mais qui classe une situation. Par exemple : faible risque, risque moyen, risque élevé. La nuance est importante, parce que le modèle aide à interpréter, mais la décision de routage reste encadrée.
Les conditions de garde sont les barrières du système. Elles vérifient qu’un workflow ne prend pas un chemin dangereux, incomplet ou non conforme. C’est basique, presque ennuyeux, mais c’est là que la fiabilité se joue.
- Validation d’un résultat avant de l’utiliser dans une action suivante.
- Contrôle de politique avant d’envoyer une réponse ou de déclencher un outil.
- Approbation humaine si le niveau de risque dépasse un seuil.
- Chemin d’erreur si une donnée obligatoire manque.
- Boucle de correction si la sortie ne respecte pas le format attendu.
Dans des projets d’automatisation, j’ai souvent vu des équipes vouloir tout confier au modèle. Au début, ça va vite. Puis arrive le moment où il faut expliquer pourquoi une décision a été prise, ou gérer une exception proprement. Là, elles reviennent à une architecture plus explicite. Ce n’est pas un recul. C’est souvent le passage du prototype à un vrai système.
| Critère | Contrainte dans le prompt | Contrainte dans le graphe |
| Visibilité | La règle est noyée dans du texte. | La règle est visible dans une route ou une garde. |
| Testabilité | Difficile à tester de façon stable. | Facile à tester avec des cas précis. |
| Audit | On doit relire le prompt et la sortie. | On voit quel chemin a été pris et pourquoi. |
| Reprise | Le modèle doit souvent tout régénérer. | Le workflow peut repartir depuis le bon nœud. |
Quand faut-il utiliser cette approche ?
J’utilise le graph engineering dès qu’un agent IA doit être fiable, auditable, récupérable ou connecté à des règles business. Si c’est une petite démo, un assistant très simple, ou un prototype qui répond à une question sans conséquence, ce n’est pas toujours nécessaire. Mais dès qu’on ajoute plusieurs outils, des validations, des sources de données, ou un humain dans la boucle, le graphe devient vite une base saine.
Le vrai signal, c’est quand l’agent ne doit plus juste “répondre”, mais suivre un chemin contrôlé. On veut savoir ce qu’il a fait, pourquoi il l’a fait, où il s’est arrêté, et comment reprendre sans tout relancer. J’ai vu ce problème plusieurs fois chez des clients : au début, tout tient dans un prompt. Puis on ajoute une API, une règle métier, une validation humaine, une base de données… et là, le prompt devient une espèce de sac à dos trop plein.
Cette approche prend tout son sens dans ces cas-là :
- Les workflows de recherche, avec plusieurs sources à consulter et comparer.
- La génération contrôlée, quand le contenu doit respecter des règles précises.
- Les processus avec approbation humaine, avant publication, paiement, décision ou action sensible.
- Les appels à des API, c’est-à-dire des services externes qu’il faut appeler proprement.
- Les requêtes en base de données, avec contrôle des accès et traçabilité.
- Les tests, validations de politiques, contrôles qualité et garde-fous.
- La gestion d’erreurs, les étapes parallèles et la reprise après interruption.
Le gros intérêt, c’est de combiner des étapes déterministes et des étapes génératives. Une étape déterministe, c’est une fonction, une règle ou une validation qui donne un résultat prévisible. Le LLM, lui, intervient là où il est fort : comprendre une demande, résumer, classer, rédiger, gérer l’ambiguïté. Cette séparation change tout. L’agent n’improvise plus toute la procédure, il suit une architecture où chaque étape a un rôle clair.
Ma grille de lecture est simple. Si je ne peux pas expliquer le chemin pris par l’agent, si je ne peux pas reprendre après erreur, si je ne sais pas quel état a été modifié, ou si une règle critique vit seulement dans un prompt, alors le graphe devient une meilleure option.
Le graph engineering ne rend pas l’IA moins puissante. Il la rend plus gouvernable.
| Signal observé | Risque | Réponse graph engineering |
| L’agent utilise plusieurs outils ou sources. | Le chemin devient difficile à comprendre. | Le graphe rend les étapes explicites et traçables. |
| Une règle critique est cachée dans un prompt. | La règle peut être oubliée ou mal appliquée. | La règle devient une validation déterministe. |
| Une erreur oblige à tout relancer. | Le workflow perd du temps et de la fiabilité. | L’état permet de reprendre à la bonne étape. |
| Un humain doit approuver une action. | La décision devient floue ou non auditée. | Le graphe ajoute un point de contrôle clair. |
Et si le vrai sujet, c’était de rendre l’IA gouvernable ?
Le graph engineering remet un peu d’ordre dans les agents IA. Au lieu de laisser un modèle piloter seul une boucle difficile à comprendre, je rends les étapes visibles : nœuds, arêtes, état, routes, validateurs, checkpoints. Les LLM restent utiles, mais ils ne portent plus toutes les règles business sur leurs épaules. Les décisions sensibles passent par du routage explicite, les erreurs peuvent être récupérées, les workflows peuvent être audités. Pour moi, c’est souvent la différence entre une démo qui impressionne et une application IA qui tient en production. Le bénéfice pour vous est simple : plus de contrôle, moins d’opacité, et des agents IA vraiment exploitables.
FAQ
- Qu’est-ce que le graph engineering pour les agents IA ?
Le graph engineering consiste à concevoir une application IA comme un graphe exécutable. Chaque partie du workflow devient visible : les agents, les outils, les fonctions, les règles, les validations, l’état partagé et les points de reprise. C’est une façon plus contrôlable de construire des agents IA. - Pourquoi éviter une architecture avec un seul agent IA ?
Un agent unique peut fonctionner pour un prototype, mais il masque souvent les transitions internes dans le prompt, le contexte ou l’historique de conversation. Quand il faut débugger, auditer ou reprendre après erreur, ça devient vite compliqué. Un graphe rend les responsabilités et les routes beaucoup plus explicites. - À quoi sert l’état partagé dans un graphe IA ?
L’état partagé transporte les informations importantes entre les nœuds du graphe. Par exemple la demande utilisateur, le plan de tâche, les preuves retrouvées, le brouillon, le résultat de validation ou le statut d’approbation. Ça évite de tout cacher dans le transcript et ça rend l’exécution plus lisible. - Pourquoi les checkpoints sont importants ?
Les checkpoints enregistrent des snapshots de l’état du graphe. Ils permettent de reprendre après une interruption, de récupérer après une erreur, d’attendre une validation humaine, d’inspecter une étape précédente ou de rejouer un workflow. Pour une application IA sérieuse, c’est un vrai filet de sécurité. - Quand faut-il passer au graph engineering ?
Je le conseille dès qu’un agent IA doit gérer plusieurs outils, des règles business, des validations, des erreurs, des étapes parallèles ou une approbation humaine. Si vous devez expliquer ce que l’agent a fait et pourquoi il l’a fait, le graph engineering devient beaucoup plus adapté qu’une simple boucle agent.
A propos de l’auteur
Je suis Franck Scandolera, responsable de l’agence webAnalyste et de l’organisme Formations Analytics. J’accompagne les entreprises sur le tracking avancé server-side, l’Analytics Engineering, l’automatisation No/Low Code avec n8n, l’intégration de l’IA dans les processus métier et le SEO/GEO. J’ai travaillé avec des équipes chez Logis Hôtel, Yelloh Village, BazarChic, la Fédération Française de Football ou Texdecor. Si vous voulez structurer des workflows IA plus fiables, plus traçables et plus utiles pour votre business, contactez-moi.
⭐ Analytics engineer, Data Analyst et Automatisation IA indépendant ⭐
- Ref clients : Logis Hôtel, Yelloh Village, BazarChic, Fédération Football Français, Texdecor…
Mon terrain de jeu :
- Data Analyst & Analytics engineering : tracking avancé (GTM server, e-commerce, CAPI, RGPD), entrepôt de données (BigQuery, Snowflake, PostgreSQL, ClickHouse), modèles (Airflow, dbt, Dataform), dashboards décisionnels (Looker, Power BI, Metabase, SQL, Python).
- Automatisation IA des taches Data, Marketing, RH, compta etc : conception de workflows intelligents robustes (n8n, App Script, scraping) connectés aux API de vos outils et LLM (OpenAI, Mistral, Claude…).
- Engineering IA pour créer des applications et agent IA sur mesure : intégration de LLM (OpenAI, Mistral…), RAG, assistants métier, génération de documents complexes, APIs, backends Node.js/Python.






