LangGraph représente une application agentique comme un graphe. Des nœuds lisent un état partagé, produisent des mises à jour et déterminent la transition suivante. Cette structure convient aux processus qui bouclent, appellent des outils, attendent une validation ou doivent reprendre après une interruption.
Concevoir l’état avant le graphe
L’état doit contenir uniquement ce qui sert à décider ou poursuivre : messages, objectif, résultats d’outils, compteur d’étapes et statut de validation. Définissez un schéma typé et des règles de fusion pour les champs mis à jour plusieurs fois. Ne transformez pas l’état en journal illimité ; conservez les traces détaillées ailleurs.
Nœuds et transitions
Un nœud réalise une responsabilité claire : appeler un modèle, exécuter un outil, vérifier une sortie ou demander une approbation. Les arêtes simples imposent l’ordre ; les arêtes conditionnelles choisissent la suite à partir de l’état. Rendez les conditions visibles et déterministes. Le modèle peut proposer une action, mais le code doit appliquer les règles métier.
Boucles et conditions d’arrêt
Une boucle d’outils doit toujours posséder un nombre maximal d’étapes, un délai, un budget et un chemin d’échec. Détectez les appels identiques répétés. Si une opération produit un effet externe, ajoutez idempotence et confirmation plutôt que de compter sur le modèle pour ne pas la répéter.
Checkpoints et intervention humaine
Un checkpointer persiste l’état à des points identifiés et permet de reprendre un fil d’exécution. Associez chaque conversation à un identifiant stable et protégez l’accès à ses checkpoints. Les interruptions permettent de suspendre avant une décision sensible, de présenter le contexte à un humain puis de reprendre avec sa réponse.
Streaming et observabilité
Le graphe peut diffuser les mises à jour d’état, les valeurs complètes ou les messages générés. Choisissez le flux selon l’interface et filtrez les événements internes. En production, corrélez chaque nœud avec durée, tokens, erreurs et transitions, sans enregistrer aveuglément les données sensibles.
Checklist
- État minimal, typé et versionnable.
- Un rôle précis par nœud.
- Transitions et fins explicites.
- Limites sur toutes les boucles.
- Checkpoints isolés par utilisateur ou tenant.
- Reprise et outils idempotents testés.
FAQ
LangGraph est-il nécessaire pour un seul appel LLM ?
Non. Une fonction simple sera plus lisible.
L’état remplace-t-il une base métier ?
Non. Il orchestre l’exécution ; les données de référence doivent garder leur propre stockage.
Comment tester un graphe ?
Testez chaque nœud, chaque condition et des parcours complets avec modèles et outils simulés.
Exemple minimal d’un graphe typé
~~~python from typing import TypedDict from langgraph.graph import StateGraph, START, END
class State(TypedDict): question: str answer: str approved: bool
def draft(state: State): return {"answer": f"Brouillon pour : {state['question']}"}
def review(state: State): return {"approved": len(state["answer"]) < 500}
def route(state: State): return END if state["approved"] else "draft"
graph = StateGraph(State) graph.add_node("draft", draft) graph.add_node("review", review) graph.add_edge(START, "draft") graph.add_edge("draft", "review") graph.add_conditional_edges("review", route) app = graph.compile()
print(app.invoke({"question": "Explique le RAG", "answer": "", "approved": False})) ~~~
Chaque nœud doit produire une mise à jour explicite de l’état. Ajoutez un nombre maximal de boucles pour éviter qu’une correction se répète indéfiniment. En production, utilisez un checkpointer avec un identifiant de conversation stable et ne placez pas de secret dans l’état persisté.