Merlin Mechler
Alle Artikel
16 Min Lesezeit

Multi-Agent Systeme mit Claude: Architektur-Entscheidungen, die über Erfolg oder Scheitern bestimmen

Orchestrator vs. Peer-to-Peer, wann Subagenten sinnvoll sind und welche Architektur-Entscheidungen über Erfolg oder Scheitern von Multi-Agent-Systemen bestimmen.

Multi-AgentKI-ArchitekturAgentic WorkflowsClaudePython

Definition

Multi-Agent Systeme mit Claude: Ein Multi-Agent-System ist eine KI-Architektur, in der mehrere spezialisierte Agenten kollaborieren: Ein Orchestrator koordiniert Worker Agents mit unterschiedlichen Expertise-Domains, um komplexe Aufgaben parallel und zuverlässig zu lösen.

Warum Multi-Agent? Die ehrliche Antwort.

Bevor wir Architektur diskutieren, müssen wir die Frage beantworten: Wann braucht man überhaupt mehrere Agenten?

Die Antwort ist nüchterner als die Hype-Literatur vermuten lässt:

Multi-Agent-Systeme sind sinnvoll wenn:

  • Die Aufgabe zu komplex für ein einziges Kontext-Fenster ist
  • Parallele, unabhängige Subtasks die Gesamtlaufzeit dominieren
  • Spezialisierung (verschiedene Tools, Prompts, Modelle) echten Qualitätsvorteil bringt
  • Checkpoints und Verifikation zwischen Schritten kritisch sind

Multi-Agent-Systeme sind übertrieben wenn:

  • Ein gut strukturierter Single-Agent-Prompt reicht
  • Die Koordinations-Komplexität den Nutzen übersteigt
  • Das Team nicht die Observability-Infrastruktur hat, Fehler zu debuggen

Mit dieser Grundlage: Hier sind die drei Architektur-Entscheidungen, die alles andere bestimmen.

Entscheidung 1: Orchestrator-Muster vs. Peer-to-Peer

Das Orchestrator-Muster

Ein zentraler Agent koordiniert alle anderen. Er kennt das Gesamtziel, delegiert Subtasks, aggregiert Ergebnisse.

import anthropic
from typing import Any

client = anthropic.Anthropic()

class OrchestratorAgent:
    """
    Zentraler Koordinator. Kennt das Ziel, nicht die Details.
    Subagenten kennen die Details, nicht das Ziel.
    """

    def __init__(self, subagents: dict[str, "SubAgent"]):
        self.subagents = subagents
        self.memory: list[dict] = []

    def run(self, task: str) -> str:
        # Schritt 1: Plan erstellen
        plan = self._create_plan(task)

        # Schritt 2: Schritte delegieren
        results = {}
        for step in plan["steps"]:
            agent_name = step["agent"]
            if agent_name in self.subagents:
                result = self.subagents[agent_name].execute(
                    task=step["task"],
                    context=results  # Vorherige Ergebnisse als Kontext
                )
                results[step["id"]] = result

        # Schritt 3: Synthese
        return self._synthesize(task, results)

    def _create_plan(self, task: str) -> dict:
        response = client.messages.create(
            model="claude-opus-4-6",
            max_tokens=1000,
            system="""Du bist ein Planungs-Assistent. Zerlege Aufgaben in
            Subtasks für spezialisierte Agenten. Antworte als JSON.""",
            messages=[{"role": "user", "content": task}]
        )
        import json
        return json.loads(response.content[0].text)

Stärken des Orchestrator-Musters:

  • Klare Accountability — ein Agent "weiß" was passiert
  • Einfacheres Debugging (zentrale Logs)
  • Natürliche Checkpoints nach jedem Subtask

Schwächen:

  • Single Point of Failure
  • Orchestrator-Kontext wird schnell groß
  • Bottleneck bei parallelen Tasks

Peer-to-Peer / Swarm

Agenten kommunizieren direkt miteinander, kein zentraler Koordinator.

Dieses Muster ist mächtiger, aber deutlich schwieriger zu debuggen. Für die meisten Enterprise-Anwendungen empfehle ich es nicht als Einstieg.

Meine Empfehlung: Starte mit Orchestrator. Wechsle nur zu Peer-to-Peer wenn du einen klaren, messbaren Engpass am Orchestrator hast.

Entscheidung 2: Wann bekommt ein Subagent sein eigenes Modell?

Nicht jeder Subagent braucht Claude Opus. Die Modellwahl ist eine Kosten-Qualitäts-Entscheidung:

Subagent-TypEmpfohlenes ModellBegründung
Orchestrator / Planerclaude-opus-4-6Braucht starkes Reasoning
Code-Generierungclaude-sonnet-4-6Ausreichend, deutlich günstiger
Datenextraktionclaude-haiku-4-5Strukturierte Tasks, kein Deep Reasoning nötig
Validierung / QAclaude-sonnet-4-6Balance aus Qualität und Kosten
Zusammenfassungclaude-haiku-4-5Straightforward, kein Reasoning nötig
class SubAgent:
    def __init__(self, name: str, model: str, system_prompt: str):
        self.name = name
        self.model = model
        self.system_prompt = system_prompt
        self.client = anthropic.Anthropic()

    def execute(self, task: str, context: dict = {}) -> str:
        context_str = "\n".join([f"{k}: {v}" for k, v in context.items()])

        response = self.client.messages.create(
            model=self.model,
            max_tokens=2000,
            system=self.system_prompt,
            messages=[{
                "role": "user",
                "content": f"Kontext aus vorherigen Schritten:\n{context_str}\n\nAufgabe: {task}"
            }]
        )
        return response.content[0].text

# Konfiguration
researcher = SubAgent(
    name="researcher",
    model="claude-sonnet-4-6",  # Nicht Opus für Recherche
    system_prompt="Du bist ein Recherche-Assistent..."
)

extractor = SubAgent(
    name="extractor",
    model="claude-haiku-4-5-20251001",  # Haiku reicht für strukturierte Extraktion
    system_prompt="Extrahiere strukturierte Daten aus Text..."
)

Entscheidung 3: Zustandsmanagement zwischen Agenten

Wie teilen Agenten Informationen? Das ist die Entscheidung, die am häufigsten unterschätzt wird.

Option A: Shared Context (einfach, begrenzt)

Alle Agenten bekommen den vollständigen bisherigen Kontext. Funktioniert bis ~20.000 Token.

Option B: Structured Handoff (empfohlen für Produktion)

Jeder Agent gibt einen definierten Output-Typ weiter:

from dataclasses import dataclass
from typing import Optional

@dataclass
class AgentHandoff:
    """Standardisierter Übergabe-Typ zwischen Agenten."""
    step_id: str
    agent_name: str
    output: str
    structured_data: Optional[dict]  # Für Downstream-Agenten die Struktur brauchen
    confidence: float  # 0.0 - 1.0
    requires_review: bool  # Flag für Human-in-the-Loop

# Orchestrator aggregiert:
results: list[AgentHandoff] = []

Option C: External Memory (für long-running Agents)

Bei Tasks die länger als ein paar Minuten laufen: Redis, SQLite oder Vector Store als externes Gedächtnis.

Das Anti-Pattern: Agent-Soup

Das häufigste Scheitern von Multi-Agent-Systemen: Zu viele Agenten, zu unklare Grenzen.

Symptome:

  • Kein klarer "Owner" einer Information
  • Agenten wiederholen Arbeit des anderen
  • Debugging erfordert das Nachverfolgen von 10+ Log-Streams
  • Kosten explodieren, Output verbessert sich kaum

Die Regel: Jeder Agent hat genau eine klar definierte Aufgabe. Wenn du die Aufgabe nicht in einem Satz beschreiben kannst, ist der Agent zu breit.

Observability: Nicht optional

In Produktion ohne Observability zu deployen ist fahrlässig. Minimum-Setup:

import time
import logging
from functools import wraps

def trace_agent(func):
    """Decorator für Agent-Tracing."""
    @wraps(func)
    def wrapper(self, *args, **kwargs):
        start = time.time()
        logger = logging.getLogger(f"agent.{self.name}")

        logger.info(f"START | task_length={len(str(args[0]))}")

        try:
            result = func(self, *args, **kwargs)
            duration = time.time() - start
            logger.info(f"SUCCESS | duration={duration:.2f}s | output_length={len(result)}")
            return result
        except Exception as e:
            duration = time.time() - start
            logger.error(f"FAILED | duration={duration:.2f}s | error={str(e)}")
            raise

    return wrapper

Fazit: Wann man Multi-Agent wirklich braucht

Multi-Agent-Systeme sind kein Fortschrittszeichen — sie sind ein Werkzeug für ein spezifisches Problem.

Faustregel: Wenn dein Single-Agent-System mit einem gut strukturierten Prompt + Tools funktioniert, spar dir die Komplexität. Wenn du echte Parallelisierung, Spezialisierung oder Context-Grenzen brauchst — dann ist Multi-Agent die richtige Antwort.

Und dann: Fang mit Orchestrator an. Halte Agenten-Grenzen scharf. Baue Observability von Tag 1 ein.

Newsletter

KI im Sales — ohne Buzzwords

Praxisartikel zu Automatisierung, Agentic Workflows und operativen Systemen. Kein Content-Marketing. Erscheint wenn es etwas zu sagen gibt.

Nächster Schritt

Wenn du willst, dass Deals wieder sauber Richtung Entscheidung laufen

Dann starten wir mit einem POC Sprint und machen eure Pipeline in 10 Tagen führbar — inklusive Templates, Playbooks und einem Rhythmus, der im Alltag hält.

Multi-Agent-Systeme in Claude: Architektur-Entscheidungen, die tatsächlich zählen | Merlin Mechler | Merlin Mechler