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
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
# 1. name 被用于编译后的图
# 2. 将子图节点嵌入父图时会用到 name
# 3. 所有 AI 消息都用这个 name 标记
agent = create_agent(
model=model,
tools=[...],
name="customer_service", # 为代理命名
)
方法 3:使用中间件进行代理路由
更复杂的多代理场景可以通过中间件实现动态路由:
Beispiel
# 定义不同专家使用的工具集
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
| Muster | Struktur | Anwendungsfall |
|---|---|---|
| Koordinator-Muster | Ein übergeordneter Agent → mehrere Sub-Agent-Tools | Aufgaben, die sich eindeutig nach Typ klassifizieren lassen |
| Relay-Muster | Ausgabe von Agent A → Eingabe von Agent B | Pipeline-artige Verarbeitung (generieren → überprüfen → verfeinern) |
| Debatten-Muster | Mehrere Agenten geben parallel aus → zusammenfassen und Entscheidungen treffen | Probleme, die eine multiperspektivische Analyse erfordern |
Andere ErweiterungenEin 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.