LangChain Multi-agent

Lorsqu'une tâche est trop complexe pour qu'un seul Agent puisse la gérer, vous pouvez créer plusieurs Agents avec des responsabilités distinctes et les laisser collaborer comme une équipe.


Pourquoi avez-vous besoin du multi-agent

Problèmes avec un seul Agent :

  • Un system_prompt trop long peut disperser l'attention du modèle
  • Trop d'outils augmentent la probabilité que le modèle choisisse le mauvais outil
  • Différents types de tâches nécessitent des expertises et des styles comportementaux différents

L'approche multi-agent : chaque Agent se concentre sur un domaine, et les tâches complexes sont accomplies grâce à la collaboration.


Méthode 1 : sous-agent comme outil

Compilez l'Agent dans un CompiledStateGraph, puis enregistrez-le comme outil auprès de l'Agent parent :

Exemple

from dotenv import load_dotenv
load_dotenv()

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

model = init_chat_model("deepseek:deepseek-v4-flash", temperature=0)

# Sous-agent 1 : Expert météo
@tool
def get_weather(city: str) -> str:
    """Interroger la météo"""
    data = {"Hangzhou": "Ensoleillé, 25°C", "Pékin": "Nuageux, 18°C"}
    return data.get(city, f"{city}: données temporairement indisponibles")

weather_agent = create_agent(
    model=model,
    tools=[get_weather],
    name="weather_expert",  # Le nom est utilisé pour l'identification et la journalisation
    system_prompt="Vous êtes un expert météo, spécialisé dans les questions liées à la météo. Gardez des réponses concises.",
)

# Sous-agent 2 : Expert en calcul
@tool
def calculate(expression: str) -> str:
    """Calculer des expressions mathématiques"""
    result = eval(expression, {"__builtins__": {}}, {})
    return f"{expression} = {result}"

math_agent = create_agent(
    model=model,
    tools=[calculate],
    name="math_expert",
    system_prompt="Vous êtes un expert en mathématiques, spécialisé dans les calculs mathématiques. Gardez des réponses concises.",
)

# Agent parent : Coordinateur
# Enregistrer les sous-agents comme outils
@tool
def ask_weather_expert(question: str) -> str:
    """Consultez l'expert météo pour les questions liées à la météo.

    Arguments :
question: Questions sur la météo
    """

    result = weather_agent.invoke(
        {"messages": [HumanMessage(content=question)]}
    )
    return result["messages"][-1].content


@tool
def ask_math_expert(question: str) -> str:
    """Consultez l'expert en mathématiques au sujet des problèmes de calcul mathématique.

    Arguments :
question: Problèmes de calcul mathématique
    """

    result = math_agent.invoke(
        {"messages": [HumanMessage(content=question)]}
    )
    return result["messages"][-1].content


coordinator = create_agent(
    model=model,
    tools=[ask_weather_expert, ask_math_expert],
    system_prompt="""Vous êtes l'assistant de coordination. Choisissez l'expert approprié en fonction de la question de l'utilisateur :
- Questions liées à la météo → utilisez ask_weather_expert
- Problèmes de calcul mathématique → utilisez ask_math_expert
- Si plusieurs domaines sont concernés en même temps, consultez chaque expert dans l'ordre"""
,
)

# Question composée de test
result = coordinator.invoke({
    "messages": [HumanMessage(
        content="Quel temps fait-il à Hangzhou aujourd'hui ? Si la température est de 25 degrés, combien cela fait-il en Fahrenheit ?"
        "(Formule : Fahrenheit = Celsius × 9/5 + 32)"
    )]
})
print(result["messages"][-1].content)

Résultat de l'exécution :

根据天气专家的查询,杭州今天晴天,气温25°C.
换算成华氏度:25 × 9/5 + 32 = 77°F.
所以杭州今天25°C,相当于77°F,天气晴好。

Méthode 2 : Distinguer les agents avec le paramètre name

Lors de l'intégration d'un sous-agent comme outil, définir le paramètre name aide à suivre la source des messages :

Exemple

# Le rôle du paramètre name :
# 1. Le nom est utilisé dans le graphe compilé
# 2. Le nom est utilisé lors de l'intégration comme nœud de sous-graphe dans le graphe parent
# 3. Tous les messages AI sont étiquetés avec ce nom

agent = create_agent(
    model=model,
    tools=[...],
    name="customer_service",  # Nommer l'agent
)

Méthode 3 : Routage d'agents avec Middleware

Des scénarios multi-agents plus complexes peuvent réaliser un routage dynamique via Middleware :

Exemple

from langchain.agents.middleware import before_model


# Définir les ensembles d'outils utilisés par différents experts
general_tools = [tool_a, tool_b]
admin_tools = [tool_c, tool_d]


@before_model
def route_by_user_role(state, runtime):
    """Basculer dynamiquement les outils disponibles selon le rôle de l'utilisateur"""
    context = runtime.context
    if context is None:
        return None

    user_role = context.get("user_role", "user")

    # Les différents rôles voient des outils différents
    if user_role == "admin":
        available_tools = general_tools + admin_tools
    else:
        available_tools = general_tools

    # Remarque : before_model ne peut pas modifier directement les outils,
    # Il doit être implémenté conjointement avec wrap_model_call ou request.override
    return None

Modèles d'architecture multi-agents

ModèleStructureScénario applicable
Modèle CoordinateurUn Agent parent → plusieurs outils de sous-agentsTâches clairement classifiables par type
Modèle de relaisSortie de l'Agent A → entrée de l'Agent BTraitement de type pipeline (générer → réviser → peaufiner)
Modèle de débatPlusieurs Agents produisent en parallèle → synthétiser et prendre des décisionsProblèmes nécessitant une analyse multiperspective

Un système multi-agents augmente la complexité et la consommation de Token. N'utilisez pas le multi-agents juste pour le plaisir du « multi-agents » — essayez d'abord de résoudre le problème avec un seul Agent + un system_prompt et un Middleware bien conçus. N'introduisez le multi-agents que lorsque vous avez vraiment besoin d'une isolation de domaine ou d'un contexte indépendant.

Autres extensions