LangChain Agents en Pratique

tl;dr: LangChain simplifie la création d'agents avec 6 types pré-construits (ReAct, OpenAI Functions, Structured Chat, Self-Ask, Plan-and-Execute, OpenAI Assistants). Écosystème de 500+ outils, debugging avec LangSmith, mémoire flexible. Production-ready.

Schéma illustrant LangChain pour la création d’agents IA dans les systèmes d’agents d’intelligence artificielle

Pourquoi LangChain pour les Agents ?

LangChain est le framework le plus populaire pour créer des agents IA, avec :

  • 🎯 6 types d’agents pré-construits (ReAct, OpenAI Functions, etc.)
  • 🛠️ 500+ outils intégrés (Google Search, Wikipedia, SQL, APIs)
  • 🧠 Gestion de mémoire out-of-the-box
  • 🔍 Debugging avancé avec LangSmith
  • 🚀 Production-ready (rate limiting, fallbacks, retries)
💡 Pour approfondir LangChain : Consultez notre série complète sur LangChain qui couvre en détail tous les aspects du framework (15 articles, de l’introduction au déploiement production).

Installation

pip install langchain langchain-openai langchain-community
pip install wikipedia tavily-python  # Outils optionnels

Les 6 Types d’Agents LangChain

ReAct Agent (Recommandé)

Usage général, le plus flexible.

from langchain.agents import create_react_agent, AgentExecutor
from langchain_openai import ChatOpenAI
from langchain.tools import Tool
from langchain import hub
import wikipedia

# Définir les outils
def search_wikipedia_tool(query: str) -> str:
    """Recherche sur Wikipédia."""
    try:
        return wikipedia.summary(query, sentences=3)
    except:
        return "Aucun résultat trouvé"

def calculator_tool(expression: str) -> str:
    """Calcule une expression mathématique."""
    try:
        return str(eval(expression))
    except:
        return "Erreur de calcul"

tools = [
    Tool(
        name="Wikipedia",
        func=search_wikipedia_tool,
        description="Utile pour rechercher des informations factuelles sur Wikipédia. Input: une requête de recherche."
    ),
    Tool(
        name="Calculator",
        func=calculator_tool,
        description="Utile pour effectuer des calculs mathématiques. Input: une expression mathématique comme '2+2' ou '15*7'."
    )
]

# Créer le LLM
llm = ChatOpenAI(model="gpt-4", temperature=0)

# Récupérer le prompt ReAct depuis le hub
prompt = hub.pull("hwchase17/react")

# Créer l'agent
agent = create_react_agent(llm, tools, prompt)

# Créer l'executor (qui gère la boucle d'exécution)
agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    verbose=True,  # Affiche les étapes
    max_iterations=10,
    handle_parsing_errors=True
)

# Exécuter
result = agent_executor.invoke({
    "input": "Qui a inventé le téléphone ? En quelle année ? Combien d'années se sont écoulées depuis ?"
})

print(f"\n🎯 Résultat final : {result['output']}")

Sortie

> Entering new AgentExecutor chain...

I need to find out who invented the telephone and when.

Action: Wikipedia
Action Input: "invention téléphone"

Observation: Le téléphone a été inventé par Alexander Graham Bell en 1876...

Thought: Now I need to calculate how many years have passed since 1876.

Action: Calculator
Action Input: 2024 - 1876

Observation: 148

Thought: I now know the final answer.

Final Answer: Alexander Graham Bell a inventé le téléphone en 1876. 148 années se sont écoulées depuis.

> Finished chain.

🎯 Résultat final : Alexander Graham Bell a inventé le téléphone en 1876. 148 années se sont écoulées depuis.

OpenAI Functions Agent

Le plus rapide et fiable avec GPT-3.5/4.

🔎 Tip
Production recommandé : Si vous utilisez OpenAI, préférez OpenAI Functions Agent à ReAct. Il est 30% plus rapide, plus fiable et utilise le function calling natif d’OpenAI.
from langchain.agents import create_openai_functions_agent

# Même configuration des outils et LLM

# Récupérer le prompt OpenAI Functions
prompt = hub.pull("hwchase17/openai-functions-agent")

# Créer l'agent
agent = create_openai_functions_agent(llm, tools, prompt)

agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    verbose=True
)

result = agent_executor.invoke({"input": "Quelle est la population du Japon ? Divisée par 2 ?"})

Avantages :

  • ✅ Utilise le function calling natif d’OpenAI
  • ✅ Plus fiable que ReAct (moins d’erreurs de parsing)
  • ✅ 30% plus rapide
  • ✅ Supporte les outils structurés complexes

Inconvénients :

  • ❌ Limité à OpenAI (GPT-3.5+, GPT-4)
  • ❌ Pas compatible avec d’autres LLM

Structured Chat Agent

Pour conversations complexes avec historique.

from langchain.agents import create_structured_chat_agent
from langchain.memory import ConversationBufferMemory

# Mémoire pour garder l'historique
memory = ConversationBufferMemory(
    memory_key="chat_history",
    return_messages=True
)

prompt = hub.pull("hwchase17/structured-chat-agent")

agent = create_structured_chat_agent(llm, tools, prompt)

agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    memory=memory,
    verbose=True
)

# Conversation multi-tours
agent_executor.invoke({"input": "Cherche la population de Paris"})
agent_executor.invoke({"input": "Et celle de Lyon ?"})  # Comprend le contexte
agent_executor.invoke({"input": "Quelle est la différence ?"})  # Utilise les deux résultats précédents

Avantages :

  • ✅ Gère l’historique de conversation
  • ✅ Supporte inputs/outputs structurés (JSON)
  • ✅ Compatible avec la plupart des LLM

Pour questions nécessitant recherches successives.

from langchain.agents import create_self_ask_with_search_agent
from langchain.tools import TavilySearchResults

# Outil de recherche (Tavily est une API de recherche web)
search = TavilySearchResults(max_results=3)

tools = [search]

prompt = hub.pull("hwchase17/self-ask-with-search")

agent = create_self_ask_with_search_agent(llm, tools, prompt)

agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

result = agent_executor.invoke({
    "input": "Quel âge a le président actuel de la France ?"
})

Processus :

Question: Quel âge a le président actuel de la France ?
Are follow up questions needed: Yes
Follow up: Qui est le président actuel de la France ?
Intermediate answer: Emmanuel Macron
Follow up: Quel âge a Emmanuel Macron ?
Intermediate answer: 46 ans (né en 1977)
Final answer: 46 ans

Plan-and-Execute Agent

Pour tâches complexes nécessitant planification.

from langchain.agents import PlanAndExecute
from langchain_experimental.plan_and_execute import (
    PlanAndExecute,
    load_agent_executor,
    load_chat_planner
)

# Créer le planificateur
planner = load_chat_planner(llm)

# Créer l'exécuteur
executor = load_agent_executor(llm, tools, verbose=True)

# Créer l'agent Plan-and-Execute
agent = PlanAndExecute(planner=planner, executor=executor, verbose=True)

result = agent.run("""
Analyse le marché des voitures électriques :
1. Les 3 principaux constructeurs
2. Parts de marché
3. Évolution des ventes en 2024
""")

OpenAI Assistants

Hébergé par OpenAI, avec mémoire incluse.

from langchain.agents import AgentType
from langchain_community.agent_toolkits import create_openai_assistant_agent

# Créer l'assistant (côté OpenAI)
assistant = openai.beta.assistants.create(
    name="Data Analyst",
    instructions="Tu es un analyste de données expert.",
    tools=[{"type": "code_interpreter"}],
    model="gpt-4"
)

# Créer l'agent LangChain
agent = create_openai_assistant_agent(
    assistant_id=assistant.id,
    tools=tools
)

# Utilisation
result = agent.invoke({"input": "Analyse ce CSV..."})

Avantages :

  • ✅ Mémoire persistante incluse
  • ✅ Code Interpreter intégré
  • ✅ Pas besoin de gérer l’infrastructure

Inconvénients :

  • ❌ Vendor lock-in (OpenAI uniquement)
  • ❌ Moins de contrôle
  • ❌ Coûts imprévisibles

Comparaison des Types d’Agents

💡 Choix de l’agent : OpenAI Functions pour production avec OpenAI, ReAct pour multi-LLM, Structured Chat pour chatbots avec mémoire, Plan-and-Execute pour workflows complexes.
TypeLLMVitesseFiabilitéMémoireCas d’Usage
ReActTous⚡⚡⭐⭐⭐ManuelUsage général
OpenAI FunctionsOpenAI⚡⚡⚡⭐⭐⭐⭐⭐ManuelProduction OpenAI
Structured ChatTous⚡⚡⭐⭐⭐⭐InclusChatbots
Self-AskTous⭐⭐⭐ManuelRecherche web
Plan-and-ExecuteTous⭐⭐⭐⭐ManuelTâches complexes
OpenAI AssistantsOpenAI⚡⚡⭐⭐⭐⭐InclusPrototypage rapide

Recommandation :

  • Production avec OpenAI : OpenAI Functions Agent
  • Multi-LLM : ReAct Agent
  • Chatbot : Structured Chat Agent
  • Tâches complexes : Plan-and-Execute

Outils LangChain

Outils Intégrés

LangChain fournit 500+ outils pré-construits :

from langchain.tools import (
    WikipediaQueryRun,
    DuckDuckGoSearchRun,
    YouTubeSearchTool,
    ArxivQueryRun,
    ShellTool,
    PythonREPLTool
)
from langchain_community.tools import (
    GoogleSerperAPIWrapper,
    TavilySearchResults,
    BraveSearch
)
from langchain_community.utilities import (
    SQLDatabase,
    SerpAPIWrapper
)

# Exemple : Recherche web avec Tavily
search = TavilySearchResults(
    max_results=5,
    search_depth="advanced",  # "basic" ou "advanced"
    include_answer=True,
    include_raw_content=False
)

# Exemple : Requêtes SQL
db = SQLDatabase.from_uri("sqlite:///my_database.db")

from langchain_community.tools.sql_database.tool import (
    QuerySQLDataBaseTool,
    InfoSQLDatabaseTool,
    ListSQLDatabaseTool
)

sql_tools = [
    QuerySQLDataBaseTool(db=db),
    InfoSQLDatabaseTool(db=db),
    ListSQLDatabaseTool(db=db)
]

# Créer un agent SQL
agent = create_openai_functions_agent(llm, sql_tools, prompt)

Créer des Outils Personnalisés

Fonction Simple

from langchain.tools import tool

@tool
def get_exchange_rate(from_currency: str, to_currency: str) -> str:
    """Obtient le taux de change entre deux devises.

    Args:
        from_currency: Code de la devise source (ex: "USD")
        to_currency: Code de la devise cible (ex: "EUR")
    """
    # Appel API réel ici
    return f"1 {from_currency} = 0.92 {to_currency}"

# Utilisation
tools = [get_exchange_rate]

Classe Tool

from langchain.tools import BaseTool
from pydantic import Field
from typing import Optional, Type
from pydantic import BaseModel

class ExchangeRateInput(BaseModel):
    """Input pour l'outil ExchangeRate"""
    from_currency: str = Field(description="Code de la devise source (ex: USD)")
    to_currency: str = Field(description="Code de la devise cible (ex: EUR)")

class ExchangeRateTool(BaseTool):
    name = "exchange_rate"
    description = "Obtient le taux de change entre deux devises"
    args_schema: Type[BaseModel] = ExchangeRateInput

    def _run(self, from_currency: str, to_currency: str) -> str:
        """Exécution synchrone"""
        # Logique ici
        return f"1 {from_currency} = 0.92 {to_currency}"

    async def _arun(self, from_currency: str, to_currency: str) -> str:
        """Exécution asynchrone"""
        # Logique async ici
        return await self._run(from_currency, to_currency)

# Utilisation
tool = ExchangeRateTool()

Outil Structuré Complexe

from langchain.tools import StructuredTool
from pydantic import BaseModel, Field

class EmailInput(BaseModel):
    to: str = Field(description="Adresse email du destinataire")
    subject: str = Field(description="Sujet de l'email")
    body: str = Field(description="Corps de l'email")
    cc: Optional[list[str]] = Field(default=None, description="Personnes en copie")

def send_email(to: str, subject: str, body: str, cc: Optional[list] = None) -> str:
    """Envoie un email via SMTP"""
    # Logique d'envoi
    return f"Email envoyé à {to}"

email_tool = StructuredTool.from_function(
    func=send_email,
    name="SendEmail",
    description="Envoie un email. Utilise ce tool uniquement si l'utilisateur demande explicitement d'envoyer un email.",
    args_schema=EmailInput
)

Toolkits : Collections d’Outils

from langchain_community.agent_toolkits import (
    SQLDatabaseToolkit,
    FileManagementToolkit,
    GmailToolkit,
    JiraToolkit,
    SlackToolkit
)

# Exemple : Toolkit SQL
db = SQLDatabase.from_uri("postgresql://user:pass@localhost/db")
toolkit = SQLDatabaseToolkit(db=db, llm=llm)

tools = toolkit.get_tools()
# Retourne : QuerySQLTool, InfoSQLTool, ListTablesTool, etc.

agent = create_openai_functions_agent(llm, tools, prompt)

Gestion de la Mémoire

🔎 Tip
Article dédié : Pour une exploration complète des stratégies de mémoire avec LangChain, consultez notre guide Mémoire et Contexte dans LangChain.

Types de Mémoire LangChain

ConversationBufferMemory

Garde tout l’historique en mémoire.

from langchain.memory import ConversationBufferMemory

memory = ConversationBufferMemory(
    memory_key="chat_history",
    return_messages=True
)

agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    memory=memory
)

# Conversation
agent_executor.invoke({"input": "Je m'appelle Alice"})
agent_executor.invoke({"input": "Comment je m'appelle ?"})
# → "Tu t'appelles Alice"

Avantages : Simple, rien n’est perdu Inconvénients : Consomme rapidement le context window

ConversationBufferWindowMemory

Garde seulement les N derniers messages.

from langchain.memory import ConversationBufferWindowMemory

memory = ConversationBufferWindowMemory(
    k=5,  # Garder les 5 derniers échanges
    memory_key="chat_history",
    return_messages=True
)

ConversationSummaryMemory

Résume l’historique au fur et à mesure.

from langchain.memory import ConversationSummaryMemory

memory = ConversationSummaryMemory(
    llm=llm,
    memory_key="chat_history",
    return_messages=True
)

Exemple :

  • Au lieu de garder 50 messages complets
  • Garde : “L’utilisateur s’appelle Alice, travaille chez TechCorp, cherche des solutions IA…”

VectorStoreRetrieverMemory

Mémoire vectorielle : récupère les informations par similarité sémantique.

from langchain.memory import VectorStoreRetrieverMemory
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS

# Créer le vector store
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_texts([], embeddings)

memory = VectorStoreRetrieverMemory(
    retriever=vectorstore.as_retriever(search_kwargs={"k": 3})
)

# L'agent récupère automatiquement les 3 souvenirs les plus pertinents

Mémoire Hybride

Combiner plusieurs types :

from langchain.memory import CombinedMemory

# Court-terme : derniers 5 messages
short_term = ConversationBufferWindowMemory(k=5, memory_key="recent_history")

# Long-terme : recherche vectorielle
long_term = VectorStoreRetrieverMemory(
    retriever=vectorstore.as_retriever(),
    memory_key="relevant_history"
)

# Combiner
memory = CombinedMemory(memories=[short_term, long_term])

Debugging et Observabilité

Mode Verbose

agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    verbose=True,  # Affiche chaque étape
    return_intermediate_steps=True  # Retourne les étapes dans la réponse
)

result = agent_executor.invoke({"input": "Question"})

# Accéder aux étapes intermédiaires
for step in result["intermediate_steps"]:
    action, observation = step
    print(f"Action: {action.tool} - {action.tool_input}")
    print(f"Observation: {observation}\n")

Callbacks

from langchain.callbacks import StdOutCallbackHandler
from langchain.callbacks.base import BaseCallbackHandler

class CustomCallbackHandler(BaseCallbackHandler):
    """Callback personnalisé pour logger"""

    def on_llm_start(self, serialized, prompts, **kwargs):
        print(f"🔵 LLM Start: {len(prompts)} prompts")

    def on_llm_end(self, response, **kwargs):
        print(f"🟢 LLM End: {response.generations[0][0].text[:50]}...")

    def on_tool_start(self, serialized, input_str, **kwargs):
        print(f"🔧 Tool Start: {serialized['name']} - {input_str}")

    def on_tool_end(self, output, **kwargs):
        print(f"✅ Tool End: {output[:50]}...")

    def on_agent_action(self, action, **kwargs):
        print(f"🤖 Agent Action: {action.tool}")

# Utilisation
handler = CustomCallbackHandler()

agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    callbacks=[handler]
)

LangSmith (Recommandé)

Plateforme officielle de debugging LangChain.

# Installation
pip install langsmith

# Configuration
export LANGCHAIN_TRACING_V2=true
export LANGCHAIN_API_KEY=your_api_key
export LANGCHAIN_PROJECT=your_project_name
# Le code reste inchangé
agent_executor.invoke({"input": "Question"})

# Automatiquement tracé dans LangSmith

Fonctionnalités LangSmith :

  • 📊 Visualisation de chaque étape
  • ⏱️ Temps d’exécution par composant
  • 💰 Coûts par appel
  • 🔍 Inspection des prompts
  • 🐛 Replay des erreurs
  • 📈 Analytics sur plusieurs runs
🔎 Tip
Guide complet LangSmith : Découvrez comment utiliser LangSmith pour le debugging, l’évaluation et l’optimisation dans notre guide LangSmith : Observabilité LangChain.

Logging Structuré

import logging
import json
from datetime import datetime

# Configurer le logger
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

class LoggingCallbackHandler(BaseCallbackHandler):
    """Logger structuré pour production"""

    def on_agent_finish(self, finish, **kwargs):
        log_entry = {
            "timestamp": datetime.now().isoformat(),
            "type": "agent_finish",
            "output": finish.return_values,
            "log": finish.log
        }
        logger.info(json.dumps(log_entry))

    def on_tool_error(self, error, **kwargs):
        log_entry = {
            "timestamp": datetime.now().isoformat(),
            "type": "tool_error",
            "error": str(error)
        }
        logger.error(json.dumps(log_entry))

Optimisations de Performance

Streaming des Résultats

from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler

llm = ChatOpenAI(
    model="gpt-4",
    streaming=True,
    callbacks=[StreamingStdOutCallbackHandler()]
)

# L'agent streame maintenant sa réponse token par token

Caching des Appels LLM

from langchain.cache import InMemoryCache, SQLiteCache
from langchain.globals import set_llm_cache

# Option 1 : Cache en mémoire
set_llm_cache(InMemoryCache())

# Option 2 : Cache persistant (SQLite)
set_llm_cache(SQLiteCache(database_path=".langchain.db"))

# Les appels identiques sont maintenant cachés
🔎 Tip
Réduire vos coûts de 60-80% : Découvrez toutes les stratégies d’optimisation des coûts (caching, routing, compression) dans notre guide Gestion des Coûts avec LangChain.

Exécution Parallèle d’Outils

from langchain.agents import AgentExecutor

agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    max_concurrent_operations=3  # Exécute jusqu'à 3 outils en parallèle
)

Rate Limiting

from langchain.llms.base import BaseLLM
from langchain.callbacks import get_openai_callback
import time

class RateLimitedLLM(BaseLLM):
    """LLM avec rate limiting"""

    def __init__(self, llm, requests_per_minute=20):
        self.llm = llm
        self.requests_per_minute = requests_per_minute
        self.last_request_time = 0

    def _call(self, prompt, stop=None):
        # Attendre si nécessaire
        time_since_last = time.time() - self.last_request_time
        min_interval = 60.0 / self.requests_per_minute

        if time_since_last < min_interval:
            time.sleep(min_interval - time_since_last)

        self.last_request_time = time.time()
        return self.llm._call(prompt, stop)

# Utilisation
llm = RateLimitedLLM(ChatOpenAI(model="gpt-4"), requests_per_minute=20)

Gestion des Erreurs

⚠️ Warning
Production-ready : Pour des stratégies avancées de gestion d’erreurs et de résilience, consultez Gestion des Erreurs et Résilience dans LangChain.

Retry sur Erreur

from langchain.agents import AgentExecutor

agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    max_iterations=10,
    handle_parsing_errors=True,  # Retry sur erreurs de parsing
    early_stopping_method="generate"  # Méthode de fallback
)

Fallback sur Erreur d’Outil

from langchain.tools import Tool

def safe_tool_wrapper(tool_func):
    """Wrapper qui gère les erreurs"""
    def wrapper(*args, **kwargs):
        try:
            return tool_func(*args, **kwargs)
        except Exception as e:
            return f"Erreur lors de l'exécution : {str(e)}"
    return wrapper

# Appliquer à tous les outils
safe_tools = [
    Tool(
        name=tool.name,
        func=safe_tool_wrapper(tool.func),
        description=tool.description
    )
    for tool in tools
]

Timeout Global

import signal
from contextlib import contextmanager

@contextmanager
def timeout(seconds):
    """Context manager pour timeout"""
    def handler(signum, frame):
        raise TimeoutError(f"Timeout après {seconds}s")

    signal.signal(signal.SIGALRM, handler)
    signal.alarm(seconds)
    try:
        yield
    finally:
        signal.alarm(0)

# Utilisation
try:
    with timeout(30):  # 30 secondes max
        result = agent_executor.invoke({"input": "Question complexe"})
except TimeoutError:
    result = "Timeout : la requête a pris trop de temps"

Exemple Complet : Agent de Support Client

from langchain.agents import create_openai_functions_agent, AgentExecutor
from langchain_openai import ChatOpenAI
from langchain.memory import ConversationBufferMemory
from langchain.tools import tool
from langchain import hub

# ========== OUTILS ==========

@tool
def check_order_status(order_id: str) -> str:
    """Vérifie le statut d'une commande. Input: order_id (ex: 'CMD-12345')"""
    # Simuler un appel BDD/API
    orders = {
        "CMD-12345": "En cours de livraison",
        "CMD-67890": "Livrée",
        "CMD-11111": "En préparation"
    }
    return orders.get(order_id, "Commande introuvable")

@tool
def initiate_refund(order_id: str, reason: str) -> str:
    """Initie un remboursement. Inputs: order_id, reason"""
    # Logique de remboursement
    return f"Remboursement initié pour {order_id}. Raison: {reason}. Délai: 3-5 jours."

@tool
def search_knowledge_base(query: str) -> str:
    """Recherche dans la base de connaissances. Input: query"""
    kb = {
        "retour": "Politique de retour : 30 jours, article non utilisé",
        "livraison": "Livraison gratuite >50€, 2-5 jours ouvrés",
        "paiement": "Cartes acceptées : Visa, MasterCard, PayPal"
    }
    for key, value in kb.items():
        if key in query.lower():
            return value
    return "Aucune information trouvée"

tools = [check_order_status, initiate_refund, search_knowledge_base]

# ========== AGENT ==========

llm = ChatOpenAI(model="gpt-4", temperature=0)

prompt = hub.pull("hwchase17/openai-functions-agent")

# Personnaliser le prompt système
prompt.messages[0].prompt.template = """Tu es un agent de support client bienveillant et efficace.

Règles :
1. Toujours commencer par identifier le numéro de commande si pertinent
2. Utiliser les outils disponibles pour obtenir des informations précises
3. Si le problème ne peut être résolu, proposer de l'escalader à un humain
4. Être empathique et professionnel

Outils disponibles : {tools}"""

memory = ConversationBufferMemory(
    memory_key="chat_history",
    return_messages=True
)

agent = create_openai_functions_agent(llm, tools, prompt)

agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    memory=memory,
    verbose=True,
    max_iterations=5,
    handle_parsing_errors=True
)

# ========== BOUCLE DE CONVERSATION ==========

print("🤖 Support Client IA - Tapez 'exit' pour quitter\n")

while True:
    user_input = input("👤 Vous : ")

    if user_input.lower() in ['exit', 'quit', 'bye']:
        print("🤖 Agent : Au revoir ! N'hésitez pas à revenir.")
        break

    try:
        response = agent_executor.invoke({"input": user_input})
        print(f"🤖 Agent : {response['output']}\n")
    except Exception as e:
        print(f"❌ Erreur : {str(e)}\n")

Conversation Exemple

🤖 Support Client IA - Tapez 'exit' pour quitter

👤 Vous : Bonjour, ma commande CMD-12345 n'est pas arrivée

> Entering new AgentExecutor chain...

[Agent utilise check_order_status]

🤖 Agent : Bonjour ! J'ai vérifié votre commande CMD-12345. Elle est actuellement en cours de livraison. Vous devriez la recevoir dans les prochains jours. Puis-je vous aider avec autre chose ?

👤 Vous : C'était prévu pour hier, je voudrais un remboursement

[Agent utilise initiate_refund]

🤖 Agent : Je comprends votre frustration. J'ai initié un remboursement pour votre commande CMD-12345 en raison du retard de livraison. Vous recevrez les fonds sous 3 à 5 jours ouvrés. Toutes nos excuses pour ce désagrément.

👤 Vous : Merci !

🤖 Agent : Je vous en prie ! N'hésitez pas à nous contacter si vous avez d'autres questions.

Exercices Pratiques

Agent de Recherche

Créez un agent capable de :

  1. Rechercher sur Wikipédia
  2. Rechercher sur le web (Tavily ou DuckDuckGo)
  3. Synthétiser les résultats de plusieurs sources

Agent SQL

Créez un agent capable d’interroger une base SQL et de répondre à des questions en langage naturel.

Agent avec Mémoire

Créez un agent qui se souvient des préférences utilisateur d’une session à l’autre (utiliser VectorStoreRetrieverMemory).

Ressources

Documentation Officielle

Série LangChain Complète (15 Articles)

Pour maîtriser LangChain de A à Z, consultez notre série complète :

Fondamentaux :

Composants Avancés :

Outils et Écosystème :

  • LangSmith : Observabilité, debugging, évaluation
  • LangServe : Déployer des applications LangChain en API
  • LangGraph : Orchestration de workflows complexes
  • Langfuse : Alternative open-source pour l’observabilité

Production :

Prochaines Étapes

Dans le prochain article, nous explorerons en détail le Function Calling :

  • OpenAI Functions vs Anthropic Tools
  • Google Function Calling
  • Créer des outils complexes avec validation
  • Patterns avancés (parallel calling, sequential chaining)

Points clés à retenir :

  • LangChain simplifie drastiquement la création d’agents
  • OpenAI Functions Agent est le plus fiable pour production
  • La mémoire doit être choisie selon le cas d’usage
  • LangSmith est essentiel pour le debugging
  • 500+ outils disponibles out-of-the-box

Retour à la série Agents IA | Module suivant : Function Calling et Outils →