Gestion des erreurs et débogage LangChain

Lors du développement d’Agent, diverses erreurs sont inévitables. Cet article répertorie les types d’erreurs courants, les méthodes de débogage et les bonnes pratiques.


Types d'erreurs courantes

Type d’erreurCause typiqueSolution
ImportErrorPaquet du fournisseur non installépip install langchain-deepseek, etc.
Erreur de clé API.env non configuré ou clé non valideVérifiez les variables d'environnement et la validité de la clé
Erreur de délai d'attenteProblèmes réseau ou réponse lente du modèleDéfinissez le paramètre timeout
Limite de jetons dépasséeL'historique des messages est trop longUtilisez trim_messages() pour tronquer
Erreur d'appel d'outilException à l'intérieur de l'outilUtilisez ToolException + handle_tool_errors
Erreur de format de retour du modèleLa sortie du modèle ne répond pas aux attentesUtiliser une sortie structurée + handle_errors

ModelRetryMiddleware - Réessai d'appel de modèle

LangChain fournit un middleware de réessai intégré :

Exemple

from langchain.agents.middleware import ModelRetryMiddleware
from langchain.agents import create_agent
from langchain.chat_models import init_chat_model

# Middleware intégré de réessai de modèle
# Réessayer automatiquement lorsque l'appel au modèle échoue
agent = create_agent(
    model=init_chat_model("deepseek:deepseek-v4-flash", timeout=30, max_retries=2),
    middleware=[
        ModelRetryMiddleware(
            max_retries=3,        # Réessayer jusqu'à 3 fois
            backoff_factor=2.0,   # Facteur de temporisation (2s, 4s, 8s)
        )
    ],
    system_prompt="Vous êtes l'assistant d'EXAMPLE.",
)

ToolRetryMiddleware - Nouvelle tentative d'appel d'outil

Exemple

from langchain.agents.middleware import ToolRetryMiddleware

agent = create_agent(
    model="deepseek:deepseek-v4-flash",
    tools=[my_tool],
    middleware=[
        ToolRetryMiddleware(
            max_retries=3,
            backoff_factor=1.5,
        )
    ],
)

Le RetryMiddleware intégré et les @wrap_model_call / @wrap_tool_call personnalisés peuvent coexister. Placez le middleware intégré au début de la liste des middlewares comme protection la plus externe.


debug=True - Journaux détaillés

Exemple

from langchain.agents import create_agent
from langchain.chat_models import init_chat_model
from langchain.messages import HumanMessage

# Activer le mode debug pour afficher des journaux d'exécution détaillés
agent = create_agent(
    model=init_chat_model("deepseek:deepseek-v4-flash"),
    debug=True,  # Activer la journalisation de débogage
    system_prompt="Vous êtes l'assistant d'EXAMPLE.",
)

# Lors de l'exécution, il imprimera :
# - État d'entrée de chaque nœud
# - État de sortie de chaque nœud
# - Décisions de saut d'arête
result = agent.invoke({
    "messages": [HumanMessage(content="Hello")]
})

Exemple de sortie avec debug=True :

[DEBUG] Starting graph execution
[DEBUG] Executing node: model
[DEBUG] Node 'model' input: {'messages': [HumanMessage(content='你好')]}
[DEBUG] Node 'model' output: {'messages': [AIMessage(content='你好!...')]}
[DEBUG] Edge 'model' -> '__end__': routing to __end__
[DEBUG] Graph execution complete

stream_mode="debug" - Informations de débogage les plus détaillées

Exemple

# Obtenir les informations les plus détaillées via stream_mode="debug"
for event in agent.stream(
    {"messages": [HumanMessage(content="Hello")]},
    stream_mode="debug",
):
    # event contient : nom du nœud, entrée, sortie, horodatage, informations de tâche, etc.
    print(f"[{event['type']}] {event.get('name', '')}")
    if 'input' in event:
        print(f" Entrée : {event['input']}")
    if 'output' in event:
        print(f" Output: [output]")

Dépannage courant

Le modèle continue d'appeler des outils sans s'arrêter

Cause possible : Les informations renvoyées, et le modèle ne peut pas déterminer si la tâche est terminée

  • Faire en sorte que l'outil renvoie des informations plus explicites (par ex., "Tâche terminée")
  • la condition d'arrêt dans system_prompt
  • Utiliser le compteur de boucles, et "end" après dépassement

Problème 2 : Le modèle a appelé le mauvais outil ou les mauvais paramètres

Cause possible : La description de l'outil n'est pas claire. Solutions :

  • Optimiser la docstring de la fonction d'outil
  • Utiliser args_schema pour restreindre les plages de paramètres
  • Utiliser un meilleur modèle (par ex., deepseek-v4-pro au lieu de deepseek-v4-flash)

Problème 3 : la mémoire de conversation ne fonctionne pas

Liste de vérification :

  • Avez-vous passé le paramètre checkpointer ?
  • Avez-vous utilisé le même thread_id à chaque fois ?
  • Si vous utilisez SqliteSaver, le fichier de base de données existe-t-il et est-il accessible en écriture ?
Autres extensions