Multi-Agenten-Muster: Orchestratoren, Worker und Pipelines
Einzelne Agenten eignen sich gut für klar abgegrenzte Aufgaben. In dem Moment, in dem eine Aufgabe spezialisiertes Wissen über Bereiche hinweg erfordert, parallele Arbeit über große Eingaben oder Entscheidungen, die vor der Ausführung validiert werden sollten, benötigt man mehrere Agenten.
Multi-Agenten-Systeme sind nicht von Natur aus komplexer — sie sind nur anders strukturiert. Drei Muster decken die meisten Anwendungsfälle ab: Orchestrator-Worker, Pipeline und paralleles Fan-Out.
Warum mehrere Agenten
Spezialisierung. Ein einzelner Agent mit 50 Werkzeugen im Kontext wird verwirrt. Ein spezialisierter Agent mit 5 fokussierten Werkzeugen erzielt bessere Ergebnisse.
Parallelismus. Manche Aufgaben lassen sich in unabhängige Teilaufgaben zerlegen. 20 Dokumente sequentiell zu analysieren ist langsam; sie gleichzeitig mit parallelen Agenten zu analysieren ist schnell.
Verifikation. Wenn ein Agent eine Ausgabe produziert und ein zweiter Agent sie unabhängig kritisiert, werden Fehler aufgedeckt, die eine Selbstüberprüfung verfehlen würde.
Muster 1: Orchestrator-Worker
Ein Orchestrator-Agent plant und delegiert. Worker-Agenten führen spezifische Aufgaben aus und geben Ergebnisse zurück. Der Orchestrator stellt die endgültige Ausgabe zusammen.
import anthropicimport json
client = anthropic.Anthropic()
def run_worker(system_prompt: str, task: str) -> str: response = client.messages.create( model="claude-sonnet-4-6", max_tokens=2048, system=system_prompt, messages=[{"role": "user", "content": task}] ) return response.content[0].text
def orchestrator(user_request: str) -> str: # Step 1: plan the work plan_response = client.messages.create( model="claude-opus-4-6", max_tokens=1024, system="""You are a planning agent. Given a user request, break it into2-4 specific subtasks. Return a JSON array of task descriptions only.Example: ["Research X", "Analyze Y", "Synthesize findings"]""", messages=[{"role": "user", "content": user_request}] )
tasks = json.loads(plan_response.content[0].text)
# Step 2: run each task with a specialized worker results = [] for task in tasks: result = run_worker( system_prompt="You are a focused execution agent. Complete the assigned task thoroughly.", task=task ) results.append({"task": task, "result": result})
# Step 3: synthesize synthesis_prompt = f"""Original request: {user_request}
Worker results:{json.dumps(results, indent=2)}
Synthesize these results into a cohesive final response."""
final = client.messages.create( model="claude-opus-4-6", max_tokens=2048, messages=[{"role": "user", "content": synthesis_prompt}] ) return final.content[0].textDas Orchestrator-Muster funktioniert am besten, wenn die Aufgabenstruktur nicht im Voraus bekannt ist. Ein Fallstrick: Orchestratoren können unsinnige Teilaufgaben halluzinieren. Beschränken Sie das Ausgabeformat und validieren Sie es, bevor Sie Worker ausführen.
Muster 2: Pipeline
Agenten bilden eine sequentielle Kette. Jeder Agent transformiert die Eingabe und übergibt seine Ausgabe an den nächsten.
def run_pipeline(input_text: str) -> str: stages = [ { "name": "Researcher", "system": "Extract and organize all key facts from the input. " "Format as a structured list with sources noted where available.", }, { "name": "Writer", "system": "Transform the research notes into clear, readable prose. " "Maintain all factual content. Target a technical audience.", }, { "name": "Editor", "system": "Improve clarity and concision. Remove redundancy. " "Do not change facts. Return only the improved text.", }, { "name": "Fact Checker", "system": "Review for internal consistency. Flag any claims that " "contradict each other or seem unsupported. " "If no issues, return 'VERIFIED: ' followed by the original text.", }, ]
current = input_text for stage in stages: response = client.messages.create( model="claude-sonnet-4-6", max_tokens=2048, system=stage["system"], messages=[{"role": "user", "content": current}] ) current = response.content[0].text print(f"[{stage['name']}] complete ({len(current)} chars)")
return currentPipelines akkumulieren Fehler. Wenn der Rechercheur etwas verpasst, kann der Autor es nicht hinzufügen. Gestalten Sie Ihre Phasen so, dass sie additiv statt verlustbehaftet sind.
Muster 3: Paralleles Fan-Out
Teilen Sie eine große Eingabe in unabhängige Teile auf, verarbeiten Sie jeden gleichzeitig mit separaten Agenten und aggregieren Sie dann die Ergebnisse.
import asyncio
async def analyze_document(doc: str, index: int) -> dict: """Analyze a single document asynchronously.""" system = """Analyze this document and return a JSON object with:- "sentiment": positive/negative/neutral- "key_topics": list of 3-5 main topics- "summary": 2-3 sentence summary- "flags": list of any concerns (empty list if none)"""
# asyncio.to_thread lets you call synchronous code in a thread pool result = await asyncio.to_thread( lambda: client.messages.create( model="claude-haiku-4-5-20251001", max_tokens=512, system=system, messages=[{"role": "user", "content": doc}] ).content[0].text ) return {"index": index, **json.loads(result)}
async def parallel_analysis(documents: list[str]) -> dict: # Fan out: analyze all documents concurrently tasks = [analyze_document(doc, i) for i, doc in enumerate(documents)] analyses = await asyncio.gather(*tasks)
# Aggregate with a dedicated synthesis agent synthesis_input = json.dumps({ "document_count": len(documents), "analyses": analyses })
aggregate_result = await asyncio.to_thread( lambda: client.messages.create( model="claude-sonnet-4-6", max_tokens=1024, system="Synthesize document analyses into: overall sentiment distribution, " "top themes across all documents, and notable patterns in flags. " "Return as JSON.", messages=[{"role": "user", "content": synthesis_input}] ).content[0].text )
return { "individual": analyses, "aggregate": json.loads(aggregate_result) }Der Aggregationsschritt ist der Ort, an dem die meisten Implementierungen Abstriche machen. Verketten Sie keine Ergebnisse — übergeben Sie sie an einen Agenten, der die Aggregationsaufgabe versteht.
Das richtige Muster auswählen
| Situation | Muster |
|---|---|
| Aufgabenstruktur erst nach Analyse bekannt | Orchestrator-Worker |
| Klar definierte Transformationsphasen | Pipeline |
| Große Eingabe, unabhängige Teile | Paralleles Fan-Out |
| Unabhängige Verifikation erforderlich | Orchestrator oder Pipeline mit Prüfphase |
| Latenz bei großen Eingaben minimieren | Paralleles Fan-Out |
Diese Muster kombinieren sich. Ein echtes System könnte einen Orchestrator verwenden, der einige Aufgaben parallel auffächert, während er andere durch eine Pipeline führt.
Praktische Überlegungen
Kosten. Multi-Agenten-Systeme multiplizieren API-Aufrufe. Verwenden Sie Opus für Orchestrierung und Planung, Haiku für hochvolumige Ausführungsaufgaben.
Fehlerausbreitung. Entscheiden Sie im Voraus, wie jeder Agent mit Fehlern umgeht. Für die meisten Produktionssysteme ist die Rückgabe strukturierter Fehlerobjekte und die Entscheidung durch den Orchestrator der richtige Standard.
Tracing. Protokollieren Sie jeden Agentenaufruf mit: Eingabe, Ausgabe, Modell, Latenz und Token-Anzahl.
Kontextübertragung. Seien Sie bewusst, welchen Kontext jeder Agent erhält. Die Übergabe des gesamten Konversationsverlaufs an jeden Agenten ist teuer und oft verwirrend.
Was als nächstes zu bauen ist
- Werkzeugnutzung zu Workern hinzufügen
- Menschliche Kontrollpunkte hinzufügen
- Gedächtnis durch Persistierung von Agentenausgaben in einem Vektorspeicher hinzufügen
- Evaluierung durch Weiterleitung von Ausgaben durch einen Richter-Agenten hinzufügen
Multi-Agenten-Systeme sind der Ort, an dem das interessante Engineering in der KI gerade stattfindet.
Verwandte Artikel
- Tool-Nutzungsmuster: Zuverlässige Agent-Tool-Schnittstellen entwickeln
- Agent-Fehlerbehandlung: 5 Muster für Produktionszuverlässigkeit
- Agenten-Gedächtnissysteme: Persistenter Kontext für Ihre KI
- Debugging und Observability in Autonomen Agentensystemen