LangChain Multiagente
Cuando una tarea es demasiado compleja y un solo agente no puede manejarla, puedes crear múltiples agentes especializados para que colaboren como un equipo.
¿Por qué se necesitan múltiples agentes?
Problemas de un solo agente:
- Un system_prompt demasiado largo puede dispersar la atención del modelo
- Demasiadas herramientas aumentan la probabilidad de que el modelo se equivoque al elegir herramientas
- Diferentes tipos de tareas requieren diferentes conocimientos especializados y estilos de comportamiento
Solución multiagente: cada agente se especializa en un área y, mediante la colaboración, completan tareas complejas.
Método 1: Agente hijo como herramienta
Compila el agente como CompiledStateGraph y luego regístralo como una herramienta para el agente padre:
Ejemplo
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)
# Agente hijo 1: Experto en clima
@tool
def get_weather(city: str) -> str:
"""Consultar el clima"""
data = {"Hangzhou": "Despejado, 25°C", "Pekín": "Nublado, 18°C"}
return data.get(city, f"{city}: datos no disponibles")
weather_agent = create_agent(
model=model,
tools=[get_weather],
name="weather_expert", # El nombre se usa para identificación y registros
system_prompt="Eres un experto en clima, especializado en responder preguntas relacionadas con el clima. Sé conciso.",
)
# Agente hijo 2: Experto en cálculo
@tool
def calculate(expression: str) -> str:
"""Calcular expresiones matemáticas"""
result = eval(expression, {"__builtins__": {}}, {})
return f"{expression} = {result}"
math_agent = create_agent(
model=model,
tools=[calculate],
name="math_expert",
system_prompt="Eres un experto en matemáticas, especializado en realizar cálculos matemáticos. Sé conciso.",
)
# Agente padre: Coordinador
# Registrar el agente hijo como herramienta
@tool
def ask_weather_expert(question: str) -> str:
"""Consulta al experto en clima sobre preguntas relacionadas con el clima.
Args:
question: Pregunta sobre el clima
"""
result = weather_agent.invoke(
{"messages": [HumanMessage(content=question)]}
)
return result["messages"][-1].content
@tool
def ask_math_expert(question: str) -> str:
"""Consulta al experto en matemáticas sobre problemas de cálculo matemático.
Args:
question: Problema de cálculo matemático
"""
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="""Eres un asistente coordinador. Elige al experto adecuado según la pregunta del usuario:
- Preguntas relacionadas con el clima → usa ask_weather_expert
- Problemas de cálculo matemático → usa ask_math_expert
- Si involucra múltiples áreas a la vez, consulta a cada experto en orden""",
)
# Probar una pregunta compuesta
result = coordinator.invoke({
"messages": [HumanMessage(
content="¿Cómo está el clima hoy en Hangzhou? Si la temperatura es de 25 grados, ¿a cuánto equivale en Fahrenheit?"
"(Fórmula: Fahrenheit = Celsius × 9/5 + 32)"
)]
})
print(result["messages"][-1].content)
Resultado de la ejecución:
根据天气专家的查询,杭州今天晴天,气温25°C. 换算成华氏度:25 × 9/5 + 32 = 77°F. 所以杭州今天25°C,相当于77°F,天气晴好。
Método 2: Distinguir agentes con el parámetro name
Cuando incrustas un agente hijo como herramienta, configurar el parámetro name ayuda a rastrear el origen de los mensajes:
Ejemplo
# 1. Se usa este nombre en el grafo compilado
# 2. Se usa este nombre al incrustar el nodo del subgrafo en el grafo padre
# 3. Todos los mensajes de IA se etiquetan con este nombre
agent = create_agent(
model=model,
tools=[...],
name="customer_service", # Asignar un nombre al agente
)
Método 3: Middleware para implementar el enrutamiento de agentes
Los escenarios multiagente más complejos pueden implementar enrutamiento dinámico mediante Middleware:
Ejemplo
# Definir los conjuntos de herramientas utilizados por cada experto
general_tools = [tool_a, tool_b]
admin_tools = [tool_c, tool_d]
@before_model
def route_by_user_role(state, runtime):
"""Cambiar dinámicamente las herramientas disponibles según el rol del usuario"""
context = runtime.context
if context is None:
return None
user_role = context.get("user_role", "user")
# Diferentes roles ven diferentes herramientas
if user_role == "admin":
available_tools = general_tools + admin_tools
else:
available_tools = general_tools
# Nota: before_model no puede modificar directamente las tools,
# Debe combinarse con wrap_model_call o request.override para implementarlo
return None
Patrones de arquitectura multiagente
| Patrón | Estructura | Escenarios aplicables |
|---|---|---|
| Patrón de coordinador | Un agente padre → múltiples herramientas de agentes hijos | Tipos de tareas claramente clasificables |
| Patrón de relevo | Salida del Agente A → Entrada del Agente B | Procesamiento en pipeline (generar → revisar → pulir) |
| Patrón de debate | Múltiples agentes generan salidas en paralelo → decisión consolidada | Problemas que requieren análisis desde múltiples perspectivas |
Otras extensionesLos sistemas multiagente aumentan la complejidad y el consumo de tokens. No uses "multiagente" solo por usar "multiagente": primero resuelve el problema con un solo agente + un system_prompt bien diseñado y Middleware. Solo introduce múltiples agentes cuando realmente se necesite aislamiento de dominios o contextos independientes.