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

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)

# 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

# Función del parámetro name:
# 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

from langchain.agents.middleware import before_model


# 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ónEstructuraEscenarios aplicables
Patrón de coordinadorUn agente padre → múltiples herramientas de agentes hijosTipos de tareas claramente clasificables
Patrón de relevoSalida del Agente A → Entrada del Agente BProcesamiento en pipeline (generar → revisar → pulir)
Patrón de debateMúltiples agentes generan salidas en paralelo → decisión consolidadaProblemas que requieren análisis desde múltiples perspectivas

Los 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.

Otras extensiones