Agents LangChain : le guide technique complet pour 2026

Surya Pratap
By Surya Pratap

20 juin 2026

14 min de lecture

IA et technologie
Des agents LangChain en productionAgents LangChainHover to explore
Un agent n'est pas un prompt, c'est une boucle : observer, raisonner, agir, recommencer jusqu'à la fin.

Un LLM qui répond à des questions, c'est utile. Un LLM capable de faire des choses — interroger votre base de données, envoyer un message Slack, déclencher un remboursement puis vous en rendre compte — c'est un produit. Les agents LangChain sont la façon standard de câbler cette boucle en 2026. Ce guide couvre tout le parcours, du modèle mental au code de production : la boucle de l'agent, l'écriture des outils, la mémoire et l'état, la sortie structurée, le streaming, la gestion des erreurs, et ce qui marche vraiment selon r/LangChain, r/LocalLLaMA et la communauté X.

Ce guide s'appuie sur la documentation des agents LangChain v1, la documentation LangGraph et les discussions récurrentes sur r/LangChain et @LangChainAI sur X.

1. La boucle de l'agent : ce qui se passe réellement à l'exécution

Tous les agents LangChain exécutent la même boucle, quel que soit le modèle utilisé :

  1. Observer : le LLM reçoit l'historique de la conversation et la liste des outils disponibles (nom, description, schéma JSON des arguments).
  2. Raisonner : le modèle décide s'il appelle un outil ou produit la réponse finale. Les modèles actuels utilisent le tool calling natif plutôt que de parser du JSON noyé dans du texte libre.
  3. Agir : si un appel est demandé, LangChain l'exécute et ajoute le résultat à la conversation sous forme de ToolMessage.
  4. Recommencer : la boucle continue jusqu'à ce que le modèle renvoie une réponse sans appel d'outil, ou que la limite d'itérations configurée soit atteinte.

C'est tout. La sophistication tient aux outils que vous fournissez et à la façon dont vous contraignez la boucle, pas à une quelconque magie interne au framework.

2. Votre premier agent LangChain en 15 lignes

Avec create_agent de LangChain v1, le code répétitif se réduit au minimum :

from langchain.agents import create_agent
from langchain.tools import tool

@tool
def search_orders(order_id: str) -> str:
    """Look up an order by ID and return its current status."""
    # Replace with your real DB call
    return f"Order {order_id}: Shipped, arriving 2026-06-23."

@tool
def issue_refund(order_id: str, reason: str) -> str:
    """Issue a full refund for an order given a reason."""
    return f"Refund issued for order {order_id}. Reason: {reason}."

agent = create_agent(
    model="anthropic:claude-sonnet-4-6",
    tools=[search_orders, issue_refund],
    system_prompt=(
        "You are a helpful customer support agent. "
        "Always look up the order before issuing a refund."
    ),
)

result = agent.invoke({
    "messages": [{"role": "user", "content": "Refund order #4821 — it arrived broken."}]
})
print(result["messages"][-1].content)

En coulisses, l'agent appelle search_orders("4821"), lit le résultat, appelle issue_refund("4821", "arrived broken") puis renvoie une confirmation à l'utilisateur — le tout dans un seul invoke, sans orchestration manuelle.

3. Écrire de bons outils : là où la plupart des agents échouent

Le levier le plus déterminant sur la qualité d'un agent, c'est la conception des outils, pas le choix du modèle. Le modèle décide quel outil appeler uniquement à partir du nom de la fonction, du docstring et du schéma des arguments. Ratez cela et aucun prompt engineering ne vous sauvera.

Des règles qui tiennent en pratique :

  • Une action par outil. search_and_refund() est un piège : séparez-le. Le modèle doit pouvoir appeler chaque étape indépendamment.
  • Écrivez le docstring pour le modèle, pas pour un lecteur humain. Précisez quand appeler l'outil, ce qu'il renvoie et les préconditions strictes (« N'appelez ceci qu'après avoir confirmé que la commande existe »).
  • Renvoyez des chaînes ou du JSON simple. Le modèle lit la valeur de retour comme du texte. Un objet profondément imbriqué le perturbe ; un résumé d'une phrase fonctionne mieux.
  • Gérez les erreurs dans l'outil, pas à l'extérieur. Renvoyez "Error: order not found" plutôt que de lever une exception : l'agent peut alors réessayer ou expliquer l'échec au lieu de planter.
from langchain.tools import tool
from pydantic import BaseModel, Field

class SearchInput(BaseModel):
    order_id: str = Field(description="The numeric order ID, e.g. '4821'")
    include_history: bool = Field(
        default=False,
        description="Set True to include the full shipment history"
    )

@tool(args_schema=SearchInput)
def search_orders(order_id: str, include_history: bool = False) -> str:
    """
    Look up an order's current status by order ID.
    Call this FIRST before any action that modifies the order.
    Returns: status string, or an error message if not found.
    """
    try:
        order = db.get_order(order_id)
        if not order:
            return f"Error: order {order_id} not found."
        base = f"Order {order_id}: {order.status}, ETA {order.eta}."
        if include_history:
            base += f" History: {order.shipment_history}"
        return base
    except Exception as e:
        return f"Error fetching order: {str(e)}"

4. Mémoire et état persistant

Par défaut, chaque appel à agent.invoke() est sans état : l'agent oublie le tour précédent dès qu'il a répondu. Pour des conversations multi-tours, il faut transmettre l'état explicitement. LangChain propose deux approches :

Approche A — checkpointing par thread avec LangGraph (recommandé en production)

from langchain.agents import create_agent
from langgraph.checkpoint.memory import MemorySaver

# MemorySaver keeps state in RAM; swap for PostgresSaver in production
checkpointer = MemorySaver()

agent = create_agent(
    model="anthropic:claude-sonnet-4-6",
    tools=[search_orders, issue_refund],
    checkpointer=checkpointer,
)

# Same thread_id = same conversation memory
config = {"configurable": {"thread_id": "user-123-session-456"}}

# Turn 1
agent.invoke(
    {"messages": [{"role": "user", "content": "What is the status of order 4821?"}]},
    config=config,
)

# Turn 2 — agent remembers turn 1
agent.invoke(
    {"messages": [{"role": "user", "content": "Go ahead and refund it."}]},
    config=config,
)

Approche B — résumé automatique pour les contextes longs

Quand un thread dépasse la fenêtre de contexte du modèle, SummarizationMiddleware compresse automatiquement les anciens messages en un résumé cumulatif avant chaque appel. L'agent perd l'historique mot pour mot mais conserve le sens — suffisant pour la plupart des usages de support ou d'assistance.

Graphe d'état d'un agent LangGraphAvec état par défautHover to explore
Le système de checkpoints de LangGraph transforme n'importe quel agent en conversation multi-tours reprenable, même après un redémarrage du serveur.

5. Sortie structurée : récupérer des données typées

Souvent, vous voulez que l'agent collecte des informations et renvoie un objet validé, pas un résumé en texte libre. Passez un modèle Pydantic à response_format et l'agent produit un objet typé dans la même boucle, sans étape de parsing supplémentaire :

from pydantic import BaseModel
from langchain.agents import create_agent

class SupportTicket(BaseModel):
    order_id: str
    issue_type: str          # "refund" | "late_delivery" | "wrong_item"
    recommended_action: str
    confidence: float        # 0.0 – 1.0

agent = create_agent(
    model="anthropic:claude-sonnet-4-6",
    tools=[search_orders],
    response_format=SupportTicket,
    system_prompt=(
        "Classify the customer's issue and recommend an action. "
        "Always search the order before classifying."
    ),
)

result = agent.invoke({"messages": [
    {"role": "user", "content": "My order 4821 never arrived — it's been 3 weeks."}
]})

ticket: SupportTicket = result["structured_response"]
print(ticket.issue_type)           # "late_delivery"
print(ticket.recommended_action)   # "escalate to carrier"
print(ticket.confidence)           # 0.92

6. Streaming : donner à l'agent une impression de rapidité

Le principal problème d'expérience utilisateur avec un agent, c'est la latence : l'utilisateur ne voit rien tant que la boucle n'est pas terminée. Le streaming corrige cela en exposant les tokens et les événements d'outils au fil de l'eau. LangChain propose deux modes :

# Mode 1 — stream final output tokens only
for chunk in agent.stream(
    {"messages": [{"role": "user", "content": "Status of order 4821?"}]},
    stream_mode="messages",
):
    if chunk[1].get("langgraph_node") == "agent":
        print(chunk[0].content, end="", flush=True)

# Mode 2 — stream every event (tool calls, results, tokens)
for event in agent.stream(
    {"messages": [{"role": "user", "content": "Status of order 4821?"}]},
    stream_mode="updates",
):
    kind = list(event.keys())[0]
    if kind == "tools":
        print(f"[tool] {event['tools']['messages'][0].name}")
    elif kind == "agent":
        for msg in event["agent"]["messages"]:
            print(msg.content, end="", flush=True)

En pratique, utilisez stream_mode="updates" dans toute interface affichant un panneau « en cours de réflexion » : vous pouvez montrer quel outil l'agent appelle sans attendre la réponse finale.

7. Validation humaine : le garde-fou qu'on ne saute pas

Tout agent capable de dépenser de l'argent, d'envoyer un message ou d'écrire en base a besoin d'une validation humaine pour les actions irréversibles. LangChain v1 offre deux approches : un middleware pour les cas simples, les interruptions LangGraph pour un contrôle total.

# Simple approach — middleware
from langchain.agents.middleware import HumanInTheLoopMiddleware

agent = create_agent(
    model="anthropic:claude-sonnet-4-6",
    tools=[search_orders, issue_refund, send_email],
    middleware=[
        HumanInTheLoopMiddleware(
            interrupt_on={"issue_refund": True, "send_email": True}
        )
    ],
)

# Advanced approach — LangGraph interrupt node
from langgraph.types import interrupt

def human_approval_node(state):
    last_tool_call = state["messages"][-1]
    # Pause execution and surface the tool call to your UI
    decision = interrupt({
        "tool": last_tool_call.name,
        "args": last_tool_call.tool_input,
        "prompt": "Approve this action?",
    })
    if decision["approved"]:
        return state  # continue
    # Inject a rejection message back into the graph
    return {"messages": [ToolMessage(content="Action rejected by user.", ...)]}

Le middleware se met en place plus vite. L'interruption LangGraph est plus souple : elle permet de modifier les arguments, pas seulement d'approuver ou de refuser. Sur les projets clients, nous commençons presque toujours par le middleware et ne passons aux interruptions que lorsqu'il faut laisser l'utilisateur modifier un appel avant son exécution.

8. ReAct ou tool calling : lequel utilisez-vous vraiment

Cette distinction déroute beaucoup de monde. Dans le LangChain de 2022–2023, ReAct (Reason + Act) était le pattern principal : on demandait au modèle d'écrire un brouillon « Thought / Action / Observation » en texte brut, que LangChain parsait pour savoir quoi appeler. Cela fonctionnait, mais restait fragile : le moindre écart de format cassait le parser.

En 2026, create_agent utilise le tool calling natif : le modèle émet un appel structuré dans la réponse de l'API plutôt que dans du texte libre. C'est plus fiable, moins coûteux (pas de double prompt) et pris en charge par tous les grands fournisseurs. ReAct devient un repli pour les modèles sans tool calling natif, plus la voie par défaut.

CritèreReAct (historique)Tool calling natif (défaut v1)
FormatBrouillon en texte libreRéponse structurée de l'API
FiabilitéSensible au formatValidé par schéma
Appels d'outils parallèlesNonOui (là où c'est pris en charge)
Idéal pourModèles locaux sans tool callingTout le reste

9. Checklist de production avant la mise en ligne

  1. Intégrez LangSmith dès le premier jour. Définissez LANGSMITH_API_KEY et LANGSMITH_TRACING=true. Chaque invoke, chaque appel d'outil, chaque token est tracé automatiquement. Vous ne le regretterez pas à deux heures du matin, quand quelque chose cassera en production.
  2. Fixez max_iterations. Un agent sans limite peut boucler indéfiniment sur un outil mal décrit. Commencez à 10, puis ajustez à la baisse une fois votre profondeur habituelle connue.
  3. Protégez tous les outils destructeurs par une validation humaine. Sans exception. Un seul remboursement mal aiguillé en production coûte plus cher qu'une semaine d'ingénierie.
  4. Testez d'abord les outils isolément. Écrivez des tests unitaires de chaque fonction avec des entrées simulées. Le comportement d'un agent est difficile à prévoir ; la justesse d'un outil ne l'est pas.
  5. Constituez un jeu d'évaluation. LangSmith Datasets permet d'enregistrer des entrées réelles et les sorties attendues, puis de lancer des évaluations de régression à chaque montée de version du modèle. Sans cela, vous avancez à l'aveugle à chaque changement.
  6. Utilisez un checkpointer durable en production. MemorySaver convient au développement local, mais remplacez-le par PostgresSaver ou RedisSaver avant la mise en ligne : sinon, un redémarrage du serveur efface tout l'état conversationnel.

10. Ce qui se dit sur Reddit et X en 2026

Après des mois de lecture des fils r/LangChain, r/LocalLLaMA et des recoins ingénierie IA de X, l'avis de la communauté tient en quelques thèmes récurrents :

  • « La conception des outils, c'est 80 % du problème. » Les posts de débogage les plus votés sur r/LangChain portent presque toujours sur des outils mal nommés ou des docstrings vagues, pas sur des bugs du framework. Renommez l'outil et cela se met à fonctionner.
  • « Passer du debug par print à LangSmith a tout changé. » Un retour récurrent chez ceux qui sont passés de la démo au produit réel. La vue de trace montre exactement quel appel a échoué, et pourquoi.
  • « J'ai remplacé LangChain par des appels directs au SDK. » Toujours un type de post fréquent, surtout dans les équipes spécialisées sur un seul fournisseur ou visant moins de 100 ms de latence. Sur un pipeline simple de 1 à 3 étapes, le surcoût du framework est réel. Tous les cas d'usage n'en ont pas besoin.
  • « Le découpage des paquets (langchain / langchain-core / langgraph) perd encore les débutants. » L'équipe LangChain le reconnaît. Le modèle mental est plus clair en v1, mais l'installation fait toujours trébucher au premier essai.
  • « Les appels d'outils en parallèle rendent enfin les recherches complexes rapides. » Ceux qui enchaînaient auparavant des appels séquentiels constatent des gains de latence de 2 à 3 fois en laissant le modèle déclencher simultanément des outils indépendants.

« La question en 2026 n'est pas "dois-je utiliser LangChain ?" mais "ai-je besoin de checkpointing, d'observabilité et d'un tool calling portable entre fournisseurs — ou suis-je sur un seul fournisseur, trois étapes, et un appel direct suffit ?". Sachez quel problème vous avez avant de choisir un framework. »

11. Quand utiliser les agents LangChain, et quand s'en passer

Les agents LangChain sont le bon choix dès que vous avez besoin d'au moins deux de ces éléments :

  • Portabilité entre fournisseurs (le même agent sur Claude, GPT ou Gemini en changeant une ligne)
  • État multi-tours durable, avec pause et reprise
  • Validation humaine pour les actions destructrices
  • Traçage et évaluation intégrés, sans logging maison
  • Middlewares réutilisables (anonymisation des données personnelles, résumé, relances)

Préférez le SDK du fournisseur quand :

  • Vous êtes mono-fournisseur et la latence est la contrainte principale (descendre sous <100ms est difficile avec le surcoût du framework)
  • Votre « agent » n'est en réalité que 2 ou 3 étapes linéaires sans branchement : un pipeline est plus simple qu'un graphe
  • L'équipe a des convictions fortes sur les abstractions et préfère maîtriser toute la boucle

À retenir

En 2026, les agents LangChain ne sont plus un jouet de tutoriel. Avec create_agent, le tool calling natif, l'état avec checkpoints, la sortie structurée, le streaming et les middlewares, le framework couvre désormais tout ce dont un agent de production a besoin. La courbe d'apprentissage est réelle — surtout sur la conception des outils et le modèle de checkpoints de LangGraph — mais le résultat est un agent que vous pouvez observer, mettre en pause, confier à un humain et basculer sur un autre modèle sans réécrire votre code. Une base solide pour n'importe quel MVP en IA.

IdeaToMVP Academy

Want to build with AI — not just read about it?

4-week live cohort for founders. Learn to ship AI agents, scope MVPs, and automate your business — taught by the same team that writes these guides.

Explore the Academy →
Share this post :