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
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
# 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
# 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èle | Structure | Scénario applicable |
|---|---|---|
| Modèle Coordinateur | Un Agent parent → plusieurs outils de sous-agents | Tâches clairement classifiables par type |
| Modèle de relais | Sortie de l'Agent A → entrée de l'Agent B | Traitement de type pipeline (générer → réviser → peaufiner) |
| Modèle de débat | Plusieurs Agents produisent en parallèle → synthétiser et prendre des décisions | Problèmes nécessitant une analyse multiperspective |
Autres extensionsUn 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.