LangChain Multi-Agenten

Wenn eine Aufgabe zu komplex für einen einzelnen Agenten ist, kannst du mehrere Agenten mit unterschiedlichen Zuständigkeiten erstellen und sie wie ein Team zusammenarbeiten lassen.


Warum benötigst du Multi-Agent

Probleme mit einem einzelnen Agenten:

  • Ein übermäßig langer system_prompt kann dazu führen, dass sich die Aufmerksamkeit des Modells zerstreut
  • Zu viele Tools erhöhen die Wahrscheinlichkeit, dass das Modell das falsche Tool auswählt
  • Verschiedene Arten von Aufgaben erfordern unterschiedliche Fachkenntnisse und Verhaltensstile

Der Multi-Agent-Ansatz: Jeder Agent konzentriert sich auf einen Bereich, und komplexe Aufgaben werden durch Zusammenarbeit erledigt.


Methode 1: Sub-Agent als Tool

Kompiliere den Agenten in einen CompiledStateGraph und registriere ihn dann als Tool beim übergeordneten Agenten:

Beispiel

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)

# Sub-Agent 1: Wetterexperte
@tool
def get_weather(city: str) -> str:
    """Das Wetter abfragen"""
    data = {"Hangzhou": "Sonnig, 25°C", "Beijing": "Bewölkt, 18°C"}
    return data.get(city, f"{city}: Daten vorübergehend nicht verfügbar")

weather_agent = create_agent(
    model=model,
    tools=[get_weather],
    name="weather_expert",  # Der Name wird zur Identifikation und Protokollierung verwendet
    system_prompt="Du bist ein Wetterexperte und spezialisiert darauf, wetterbezogene Fragen zu beantworten. Halte die Antworten kurz.",
)

# Sub-Agent 2: Berechnungsexperte
@tool
def calculate(expression: str) -> str:
    """Mathematische Ausdrücke berechnen"""
    result = eval(expression, {"__builtins__": {}}, {})
    return f"{expression} = {result}"

math_agent = create_agent(
    model=model,
    tools=[calculate],
    name="math_expert",
    system_prompt="Du bist ein Mathe-Experte, spezialisiert auf mathematische Berechnungen. Halte die Antworten prägnant.",
)

# Übergeordneter Agent: Koordinator
# Sub-Agenten als Tools registrieren
@tool
def ask_weather_expert(question: str) -> str:
    """Konsultiere den Wetterexperten bei wetterbezogenen Fragen.

    Argumente:
question: Fragen zum Wetter
    """

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


@tool
def ask_math_expert(question: str) -> str:
    """Frage den Mathe-Experten zu mathematischen Berechnungsproblemen.

    Argumente:
question: Mathematische Berechnungsprobleme
    """

    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="""Du bist der Koordinationsassistent. Wähle den passenden Experten basierend auf der Frage des Nutzers:
- Wetterbezogene Fragen → ask_weather_expert verwenden
- Mathematische Berechnungsprobleme → ask_math_expert verwenden
- Wenn mehrere Domänen gleichzeitig betroffen sind, konsultiere jeden Experten nacheinander"""
,
)

# Zusammengesetzte Testfrage
result = coordinator.invoke({
    "messages": [HumanMessage(
        content="Wie ist das Wetter heute in Hangzhou? Wenn die Temperatur 25 Grad beträgt, wie viel ist das in Fahrenheit?"
        "(注意:Fahrenheit = Celsius × 9/5 + 32)"
    )]
})
print(result["messages"][-1].content)

Ausführungsergebnis:

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

方法 2:使用 name 参数区分代理

将子代理作为工具嵌入时,name 参数有助于追踪消息来源:

Beispiel

# name 参数的作用
# 1. name 被用于编译后的图
# 2. 将子图节点嵌入父图时会用到 name
# 3. 所有 AI 消息都用这个 name 标记

agent = create_agent(
    model=model,
    tools=[...],
    name="customer_service",  # 为代理命名
)

方法 3:使用中间件进行代理路由

更复杂的多代理场景可以通过中间件实现动态路由:

Beispiel

from langchain.agents.middleware import before_model


# 定义不同专家使用的工具集
general_tools = [tool_a, tool_b]
admin_tools = [tool_c, tool_d]


@before_model
def route_by_user_role(state, runtime):
    """Verfügbare Tools dynamisch je nach Benutzerrolle umschalten"""
    context = runtime.context
    if context is None:
        return None

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

    # Unterschiedliche Rollen sehen unterschiedliche Tools
    if user_role == "admin":
        available_tools = general_tools + admin_tools
    else:
        available_tools = general_tools

    # Hinweis: before_model kann Tools nicht direkt ändern,
    # Es muss zusammen mit wrap_model_call oder request.override implementiert werden
    return None

Multi-Agent-Architekturmuster

MusterStrukturAnwendungsfall
Koordinator-MusterEin übergeordneter Agent → mehrere Sub-Agent-ToolsAufgaben, die sich eindeutig nach Typ klassifizieren lassen
Relay-MusterAusgabe von Agent A → Eingabe von Agent BPipeline-artige Verarbeitung (generieren → überprüfen → verfeinern)
Debatten-MusterMehrere Agenten geben parallel aus → zusammenfassen und Entscheidungen treffenProbleme, die eine multiperspektivische Analyse erfordern

Ein Multi-Agent-System erhöht die Komplexität und den Token-Verbrauch. Setzen Sie Multi-Agent nicht nur um des "Multi-Agent" willen ein — versuchen Sie zunächst, das Problem mit einem einzelnen Agenten + einem gut entworfenen system_prompt und Middleware zu lösen. Führen Sie Multi-Agent erst ein, wenn Sie wirklich Domänenisolation oder unabhängigen Kontext benötigen.

Andere Erweiterungen