Das Problem
Die Anfrage wirkt normal: einen Kundenfall prĂŒfen und eine kurze Antwort vorbereiten.
In Traces sieht man etwas anderes: Der Orchestrator startete 5 Agenten,
drei davon bearbeiteten fast dieselbe Subtask,
die Zahl der handoffs zwischen Agenten stieg auf 14 in einem Run,
und die finale Antwort wurde bis zum timeout nicht gebildet.
Das System stĂŒrzt nicht sofort ab.
Es beginnt zu rauschen: Duplikate, handoffs, queue und latency wachsen.
Analogie: Stell dir eine Restaurant-Schicht vor, in der die Kellner die Tische nicht aufgeteilt haben. Drei Personen nehmen dieselbe Bestellung auf, wĂ€hrend andere Tische warten. Es gibt mehr AktivitĂ€t, aber ein schlechteres Ergebnis. Multi-Agent-Chaos in AI-Systemen funktioniert genauso: mehr Aktionen, aber weniger nĂŒtzlicher Fortschritt.
Warum das passiert
Multi-Agent-Chaos entsteht nicht durch die reine Anzahl an Agenten, sondern durch fehlende strikte Koordination zwischen ihnen.
In production ist es typischerweise so:
- Rollen der Agenten ĂŒberlappen, und eine Subtask hat mehrere Owner;
- Delegation lĂ€uft ohne klare Grenzen fĂŒr Tiefe und Anzahl der Ăbergaben;
- es gibt keine einheitliche Regel fĂŒr arbitration, wer final entscheidet;
- duplizierte
tool_callvon verschiedenen Agenten vervielfachen Last; - ohne stop reasons und budget gates konvergiert der Run zu lange nicht.
Das Problem liegt nicht im Multi-Agent-Ansatz selbst.
Mehrere Agenten handeln ohne gemeinsamen Kontrollkreis.
Welche AusfÀlle am hÀufigsten auftreten
In production sieht man am hÀufigsten vier Muster von Multi-Agent-Chaos.
RollenĂŒberlappung (Role overlap)
Zwei oder mehr Agenten ĂŒbernehmen dieselbe Subtask und liefern unterschiedliche Zwischenresultate.
Typische Ursache: keine role map und kein expliziter Owner der Subtask.
Delegationsschleife (Delegation loop)
Agent A delegiert an B, B delegiert an C, C delegiert zurĂŒck an A. Von auĂen wirkt der Run "aktiv", aber es gibt keinen Fortschritt.
Typische Ursache: kein Limit fĂŒr Delegationstiefe und Handoff-Budget.
Duplizierte Arbeit zwischen Agenten (Cross-agent duplicate work)
Verschiedene Agenten rufen dasselbe tool mit identischen oder fast identischen Argumenten auf.
Das wird schnell zu tool spam.
Typische Ursache: dedupe fehlt auf Run-Ebene, nicht nur pro einzelner Agent.
Unbegrenzter Fan-out (Unbounded fan-out)
Ein Agent erzeugt viele Child-Tasks, und das System verbraucht Ressourcen schneller, als es nĂŒtzliche Arbeit abschlieĂt.
Typische Ursache: keine Caps fĂŒr aktive Agenten und parallele Tasks.
Wie man diese Probleme erkennt
Multi-Agent-Chaos ist gut sichtbar ĂŒber die Kombination aus orchestration- und runtime-Metriken.
| Metrik | Signal fĂŒr Multi-Agent-Chaos | Was tun |
|---|---|---|
agent_handoffs_per_run | viele Ăbergaben ohne Abschluss | max_handoffs und stop reason einfĂŒhren |
delegation_depth_p95 | Delegationsketten werden zu tief | Tiefe begrenzen und RĂŒckgabe an orchestrator erzwingen |
duplicate_subtask_rate | mehrere Agenten bearbeiten dieselbe Subtask | Owner-Lock + dedupe signatures |
cross_agent_tool_overlap_rate | Wachstum identischer tool_call zwischen Agenten | shared cache, per-run dedupe, bounded fan-out |
multi_agent_chaos_stop_rate | hĂ€ufige multi_agent_chaos:* stop reasons | Agent-Rollen und arbitration policy prĂŒfen |
Wie man Multi-Agent-Chaos von nĂŒtzlicher Spezialisierung unterscheidet
Nicht jeder lange Multi-Agent-Run bedeutet Chaos. Die Kernfrage: liefert jeder Agent einen einzigartigen Beitrag zum finalen Ergebnis.
Normal, wenn:
- eine Subtask genau einen Owner und klare Verantwortung hat;
- ein handoff den Task-Zustand Àndert und nicht nur weiterreicht;
- Zahl von Agenten und Aufrufen zusammen mit AntwortqualitÀt steigt.
GefÀhrlich, wenn:
- eine Subtask mehrere Owner hat;
- Agenten Aufgaben ohne neues Signal hin- und herschieben;
- Kosten und latency steigen, wÀhrend der Run nicht zu
final_answerkonvergiert.
Wie man solche AusfÀlle stoppt
Praktisch bedeutet das:
- eine role map definieren: wer was tut und wer jede Subtask besitzt;
- Limits fĂŒr aktive Agenten, Anzahl Ăbergaben und Delegationstiefe setzen;
- vor jeder neuen Delegation einen arbitration step einfĂŒhren;
- bei Konflikten oder BudgetĂŒberschreitung auf fallback umschalten (single-agent oder partielle Antwort).
Minimaler Guard fĂŒr Multi-Agent-Koordination:
from dataclasses import dataclass
import json
def task_signature(task: dict) -> str:
return json.dumps(task, sort_keys=True, ensure_ascii=False)
@dataclass(frozen=True)
class MultiAgentLimits:
max_agents_per_run: int = 4
max_handoffs: int = 8
max_delegation_depth: int = 3
max_parallel_subtasks: int = 6
max_duplicate_signature: int = 2
class MultiAgentChaosGuard:
def __init__(self, limits: MultiAgentLimits = MultiAgentLimits()):
self.limits = limits
self.seen_agents: set[str] = set()
self.handoffs = 0
self.in_flight_signatures: set[str] = set()
self.signature_claims: dict[str, int] = {}
self.owner_by_signature: dict[str, str] = {}
def register_agent(self, agent_id: str) -> str | None:
self.seen_agents.add(agent_id)
if len(self.seen_agents) > self.limits.max_agents_per_run:
return "multi_agent_chaos:agent_fanout"
return None
def on_handoff(self, _from_agent: str, to_agent: str, depth: int) -> str | None:
self.handoffs += 1
if self.handoffs > self.limits.max_handoffs:
return "multi_agent_chaos:handoff_budget"
if depth > self.limits.max_delegation_depth:
return "multi_agent_chaos:delegation_depth"
return self.register_agent(to_agent)
def claim_subtask(self, agent_id: str, task: dict) -> str | None:
sig = task_signature(task)
owner = self.owner_by_signature.get(sig)
if owner is not None and owner != agent_id:
return "multi_agent_chaos:ownership_conflict"
self.owner_by_signature.setdefault(sig, agent_id)
self.signature_claims[sig] = self.signature_claims.get(sig, 0) + 1
if self.signature_claims[sig] > self.limits.max_duplicate_signature:
return "multi_agent_chaos:duplicate_subtask"
if sig not in self.in_flight_signatures:
if len(self.in_flight_signatures) >= self.limits.max_parallel_subtasks:
return "multi_agent_chaos:parallel_fanout"
self.in_flight_signatures.add(sig)
return None
def finish_subtask(self, task: dict) -> None:
self.in_flight_signatures.discard(task_signature(task))
Das ist ein Basis-Guard.
In dieser Version zÀhlt seen_agents auch Versuche, den fan-out zu erweitern,
nicht nur bereits zugelassene Agenten.
max_agents_per_run begrenzt hier die Anzahl einzigartiger Agenten innerhalb eines Runs.
In production ergÀnzt man das meist durch shared state store,
priority queue fĂŒr Subtasks und expliziten fallback in single-agent mode.
on_handoff(...) wird vor Ăbergabe an einen anderen Agenten aufgerufen,
claim_subtask(...) vor Start der Arbeit, damit Chaos bereits am Eingang gestoppt wird.
Wo das in der Architektur umgesetzt wird
In production ist die Kontrolle von Multi-Agent-Chaos ĂŒblicherweise auf drei Systemschichten verteilt.
Orchestration Topologies definiert, wie Agenten interagieren, wer den Zustand besitzt und wo arbitration stattfindet. Ohne diese Schicht ist Chaos zwischen Agenten fast unvermeidlich.
Agent Runtime steuert execution limits,
stop reasons (multi_agent_chaos:*) und fallback-ĂbergĂ€nge.
Genau hier setzt man handoff/depth budgets und Bedingungen fĂŒr erzwungenes Stoppen.
Tool Execution Layer begrenzt duplizierte Tool-Aufrufe zwischen Agenten: dedupe, retries, timeout und shared caching innerhalb des Runs.
Checkliste
Bevor du ein Multi-Agent-Szenario in production shipst:
- [ ] role map und Owner fĂŒr jede Subtask sind explizit definiert;
- [ ]
max_agents_per_run,max_handoffs,max_delegation_depthsind gesetzt; - [ ] Owner-Lock und per-run dedupe signatures sind vorhanden;
- [ ] bounded fan-out fĂŒr parallele Subtasks ist aktiviert;
- [ ] stop reasons decken
multi_agent_chaos:*ab; - [ ] es gibt fallback: single-agent mode oder partielle Antwort;
- [ ] Alerts auf
agent_handoffs_per_run,duplicate_subtask_rate,queue_backlog; - [ ] Runbook beschreibt, wie Rollenkonflikte im Incident eingegrenzt werden.
FAQ
Q: Bedeutet mehr Agenten immer bessere QualitÀt?
A: Nein. Ohne Koordination fĂŒhren mehr Agenten oft zu mehr Duplikaten und Konflikten statt besseren Ergebnissen.
Q: Kann man Chaos nur durch Prompt-Ănderung entfernen?
A: Nein. Prompt hilft, aber die Ursache liegt in orchestration-Kontrolle: Rollen, Task-Ownership, budgets und arbitration.
Q: Was tun, wenn Chaos schon in production gestartet ist?
A: VorĂŒbergehend fan-out begrenzen, aktive Agenten reduzieren, single-agent fallback einschalten und stop reasons in Traces prĂŒfen.
Q: Wer sollte in einem Multi-Agent-System final entscheiden?
A: Ăblicherweise ein orchestrator oder ein arbitration step. Ohne einen Owner der finalen Entscheidung gerĂ€t das System schnell in Konflikte oder Duplikate.
Multi-Agent-Chaos sieht fast nie wie ein einzelner groĂer Defekt aus. Meist ist es eine AnhĂ€ufung kleiner Konflikte zwischen Agenten. Darum brauchen production-Systeme nicht nur "smarte" Agenten, sondern auch strikte orchestration-Disziplin.
Verwandte Seiten
Wenn dieses Problem in production auftritt, helfen auch diese Seiten:
- Warum AI-Agenten scheitern â allgemeine Karte von AusfĂ€llen in production.
- Deadlocks â wie zyklisches Warten zwischen Agenten den workflow blockiert.
- Cascading failures â wie sich lokaler Fehler im System ausbreitet.
- Tool spam â wie duplizierte Tool-Aufrufe Budget verbrauchen.
- Agent Runtime â wo budgets, stop reasons und fallback gesetzt werden.
- Orchestration Topologies â wie kontrollierte Agent-Interaktion entworfen wird.
- Tool Execution Layer â wo retries, dedupe und timeout zentralisiert werden.