Resilienz & Testen agentischer Systeme
Agentische Systeme sind von Natur aus nicht-deterministisch. Wie testet, ueberwacht und vertraut man etwas, das jedes Mal andere Antworten gibt?
Das Determinismus-Problem
Traditionelle Software ist deterministisch:
f(x) = y (immer dasselbe Ergebnis)
sort([3,1,2]) = [1,2,3] (jedes Mal, fuer immer)
Agentische Systeme sind nicht-deterministisch:
agent("fix this bug") = ergebnis_1 (Montag)
agent("fix this bug") = ergebnis_2 (Dienstag, anderer Ansatz)
agent("fix this bug") = ergebnis_3 (Mittwoch, noch ein anderer Weg)
Alle drei Ergebnisse koennten korrekt sein, aber sie sind unterschiedlich. Das bricht traditionelles Testen:
// Traditioneller Test -- funktioniert prima
expect(sort([3,1,2])).toEqual([1,2,3]);
// Agent-Test -- dieser Ansatz scheitert
expect(agent("fix the bug")).toEqual(exactExpectedCode);
// Agent produziert jedes Mal gueltigen, aber anderen Code
Die fundamentale Herausforderung: Sie koennen nicht auf spezifische Ausgaben testen. Sie muessen auf korrektes Verhalten testen.
Das Modell-Update-Problem
Was passiert, wenn das zugrunde liegende Modell aktualisiert wird?
Szenario: Sie deployen einen Agenten mit Claude Sonnet 3.5. Er funktioniert perfekt. Dann veroeffentlicht Anthropic Sonnet 4.0.
Was sich aendern kann:
- Antwortformat koennte sich leicht verschieben
- Reasoning-Muster koennen abweichen
- Tool-Call-Muster koennten sich aendern
- Behandlung von Randfaellen kann sich verbessern oder verschlechtern
- Token-Nutzung (und Kosten) koennen sich aendern
Was sich nicht aendert:
- Der API-Vertrag (Ein-/Ausgabeformat)
- Tool-Definitionen und Faehigkeiten
- Ihr System-Prompt und Ihre Leitplanken
Strategien zur Abschwachung:
- Modellversionen in Produktion pinnen (
claude-sonnet-3.5-20241022) - Neue Versionen im Staging testen, bevor sie deployed werden
- Semantische Validierung nutzen (funktioniert es?) statt syntaktischer Validierung (ist es identisch?)
- Eine Testsuite mit repraesentativen Szenarien pflegen
Funktionales Testen fuer Agenten
Verhalten testen, nicht spezifische Ausgaben:
Stufe 1 -- Ausgabevalidierung:
// Produziert der Agent gueltige Ausgabe?
const result = await agent("Create a user API endpoint");
expect(result.files).toContain('routes/users.js');
expect(result.code).toContain('router.get');
expect(result.code).not.toContain('require('); // Sollte ESM nutzen
Stufe 2 -- Verhaltenstests:
// Behandelt der Agent Randfaelle korrekt?
const result = await agent("What's the status of order #999999");
// Bestellung existiert nicht -- Agent sollte elegant reagieren
expect(result.response).toContain("not found");
expect(result.actions).not.toContain("delete");
Stufe 3 -- Integrationstests:
// Funktioniert die gesamte Pipeline End-to-End?
await agent("Add pagination to /api/users");
const response = await fetch('/api/users?page=2&limit=10');
expect(response.status).toBe(200);
const data = await response.json();
expect(data.items.length).toBeLessThanOrEqual(10);
Das 100.000-identische-Anfragen-Experiment
Ein Gedankenexperiment, das die Zuverlaessigkeit von Agenten aufzeigt:
Was passiert, wenn Sie exakt dieselbe Anfrage 100.000 Mal an einen Agenten senden?
Erwartete Ergebnisse:
- 95.000 (95%) -- korrekte, gut formatierte Antwort
- 3.000 (3%) -- korrekt, aber ungewoehnliches Format
- 1.500 (1,5%) -- teilweise korrekt, fehlende Details
- 400 (0,4%) -- falsche, aber plausible Antwort
- 100 (0,1%) -- voellig daneben oder halluziniert
Was das fuer die Produktion bedeutet:
- Bei 1.000 Anfragen/Tag: ~1 schlechte Antwort pro Tag
- Bei 10.000 Anfragen/Tag: ~10 schlechte Antworten pro Tag
- Bei 100.000 Anfragen/Tag: ~100 schlechte Antworten pro Tag
Abschwachung:
- Ausgabevalidierung (strukturelle Probleme abfangen)
- Konfidenz-Scoring (Antworten mit niedriger Konfidenz markieren)
- Menschliche Review-Queue (unsichere Antworten an Menschen weiterleiten)
- Retry mit anderer Temperature/anderem Modell (Zufaelligkeit reduzieren)
Agentische Systeme ueberwachen
Was man nicht sehen kann, kann man nicht debuggen:
Zentrale Metriken zur Verfolgung:
| Metrik | Was sie aussagt | Alarm-Schwelle |
|---|---|---|
| Erfolgsrate | % der Anfragen mit gueltigem Output | < 95% |
| Latenz (p95) | Wie lange Aktionen dauern | > 30 Sekunden |
| Kosten pro Anfrage | Budget-Gesundheit | > $0,50 |
| Tool-Call-Anzahl | Effizienz (schleifen Agenten?) | > 20 pro Anfrage |
| Retry-Rate | Wie oft Agenten sich selbst korrigieren | > 30% |
| Halluzinationsrate | Ausgabequalitaet | > 2% |
| Eskalationsrate | Wie oft Menschen eingreifen | Aufwaertstrend |
Jeden Agent-Schritt protokollieren:
{
"request_id": "abc123",
"step": 3,
"action": "tool_call",
"tool": "read_file",
"args": { "path": "src/routes/users.js" },
"result": "success",
"tokens_used": 450,
"duration_ms": 230
}
Dieser Trace laesst Sie exakt rekonstruieren, was der Agent getan hat und wo er falsch lag.
Resilienz aufbauen
Muster fuer zuverlaessige agentische Systeme:
1. Circuit Breaker
Wenn Agent 3 Mal in 5 Minuten fehlschlaegt:
-> Anfragen an diesen Agenten stoppen
-> Fallback auf einfacheren (nicht-agentischen) Pfad
-> Bereitschaftsteam alarmieren
-> Nach Abkuehlphase erneut versuchen
2. Leitplanken
Vor der Ausfuehrung jedes Tool-Calls:
-> Ist dieses Tool fuer diesen Nutzer/Tenant erlaubt?
-> Ueberschreitet diese Aktion Kostenlimits?
-> Ist dies eine destruktive Aktion? (loeschen, ueberschreiben)
-> Wenn destruktiv: Bestaetigung oder menschliche Genehmigung verlangen
3. Idempotenz
Agent-Aktionen sollten sicher wiederholbar sein:
-> Upsert statt Insert verwenden
-> Zustand vor Aenderung pruefen
-> Alle Aktionen fuer Rollback protokollieren
4. Graceful Degradation
Wenn Frontier-Modell ausfaellt:
-> Auf ein kleineres Modell zurueckfallen
-> Wenn alle Modelle ausfallen: gecachte Antwort oder Fehler zurueckgeben
-> Nie stillschweigend abstuerzen
Die Testpyramide fuer Agenten
Adaptiert vom traditionellen Software-Testing:
/\
/ \ Menschliches Review
/ 5% \ (Produktion, stichprobenartig)
/------\
/ \ End-to-End-Szenarien
/ 15% \ (Staging, volle Pipeline)
/------------\
/ \ Verhaltenstests
/ 30% \ (automatisiert, Kernverhalten)
/------------------\
/ \ Unit-Tests fuer Tools & Prompts
/ 50% \ (schnell, umfassend)
/----------------------\
Untere Schicht (50%): Individuelle Tools, Prompt-Vorlagen und Parsing-Logik testen. Diese sind deterministisch und schnell.
Mittlere Schichten (45%): Agent-Verhalten gegen Szenarien testen. "Bei dieser Eingabe sollte die Ausgabe X enthalten und Y nicht enthalten."
Obere Schicht (5%): Produktionstraffic stichprobenartig fuer menschliches Review. Probleme fangen, die automatisierte Tests uebersehen.
---quiz question: Warum koennen Sie traditionelle Unit-Tests nicht fuer agentische Systeme verwenden? options:
- { text: "Weil Agenten zu schnell zum Testen sind", correct: false }
- { text: "Weil Agenten nicht-deterministisch sind -- sie produzieren jedes Mal gueltige, aber unterschiedliche Ausgaben", correct: true }
- { text: "Weil Agenten keine Funktionen zum Testen haben", correct: false } feedback: Agenten produzieren unterschiedliche, aber gueltige Ausgaben fuer dieselbe Eingabe. Traditionelle Tests vergleichen mit exakt erwarteten Werten, was bei nicht-deterministischen Systemen scheitert. Stattdessen testen Sie auf korrektes Verhalten (funktioniert es?) statt auf spezifische Ausgaben (ist es identisch?).
---quiz question: Was passiert, wenn Sie 100.000 identische Anfragen an einen gut gebauten Agenten senden? options:
- { text: "Alle 100.000 Antworten werden identisch sein", correct: false }
- { text: "Etwa 95% werden korrekt sein, mit ~0,1% voellig daneben -- was Monitoring und Validierung erfordert", correct: true }
- { text: "Die meisten werden wegen Rate Limiting fehlschlagen", correct: false } feedback: Selbst gut gebaute Agenten haben eine kleine Fehlerrate (~0,1% voellig falsch, ~1,5% teilweise korrekt). Im grossen Massstab bedeutet das, dass Sie Ausgabevalidierung, Konfidenz-Scoring und menschliche Review-Queues brauchen, um die unvermeidlichen schlechten Antworten abzufangen.
---quiz question: Was ist die wichtigste Monitoring-Metrik fuer ein agentisches System? options:
- { text: "Die Anzahl der API-Aufrufe", correct: false }
- { text: "Die Kombination aus Erfolgsrate, Latenz, Kosten und Tool-Call-Anzahl", correct: true }
- { text: "Die verwendete Modellversion", correct: false } feedback: Keine einzelne Metrik erzaehlt die ganze Geschichte. Die Erfolgsrate fuer Qualitaetsprobleme, Latenz fuer Performance-Probleme, Kosten fuer Budgetueberschreitungen und Tool-Call-Anzahl fuer Agenten in Endlosschleifen. Ueberwachen Sie alle zusammen.