\n\n\n\n Fehlerbehandlung von Agenten: Ein fortgeschrittener praktischer Leitfaden - AiDebug \n

Fehlerbehandlung von Agenten: Ein fortgeschrittener praktischer Leitfaden

📖 11 min read2,053 wordsUpdated Mar 28, 2026

Einführung : Die Unvermeidlichkeit von Agentenfehlern

In der Welt der KI-Agenten ist perfekte Ausführung ein Mythos. Egal, ob Ihr Agent durch eine komplexe Webanwendung navigiert, kreativen Inhalt generiert oder komplexe Workflows verwaltet, Fehler sind ein integraler Bestandteil des Prozesses. Netzwerkprobleme, API-Ratebeschränkungen, falsch formatierte Antworten, unerwartete Änderungen der Benutzeroberfläche und sogar subtile Interpretationen von Anweisungen können alle zu Misserfolgen führen. Während grundlegende try-catch-Blöcke ein guter Anfang sind, erfordert echte Solidität im Design von Agenten einen anspruchsvolleren Ansatz im Fehlermanagement. Dieser fortgeschrittene Leitfaden wird praktische Strategien und architektonische Modelle erkunden, um Agenten zu entwickeln, die nicht nur elegant wiederhergestellt werden, sondern auch aus ihren Fehlern lernen und sich anpassen.

Über grundlegende Wiederholungen hinaus : Verständnis der Fehlerarten und ihrer Schwere

Der erste Schritt zu einem fortgeschrittenen Fehlermanagement besteht darin, über ein generisches „alles erneut versuchen“ hinauszugehen. Nicht alle Fehler sind gleich. Die Unterscheidung zwischen verschiedenen Fehlerarten und ihrer Schwere ermöglicht intelligenteres und kontextbewussteres Wiederherstellen.

Fehlerkategorisierung :

  • Transiente Fehler : Temporäre Probleme, die sich wahrscheinlich von selbst mit einem kurzen Delay und einer Wiederholung lösen (z. B. Netzwerkfehler, vorübergehende API-Überlastungen, Datenbankblockaden).
  • Persistente Fehler : Probleme, die sich wahrscheinlich nicht mit einer einfachen Wiederholung lösen lassen und einen anderen Ansatz erfordern (z. B. ungültige API-Keys, falsche Eingabemuster, grundlegende logische Fehler, Zugriff verweigert).
  • Systemische Fehler : Tiefe Probleme, die auf einen grundsätzlichen Defekt im Design, der Ausbildung oder der Umgebung des Agenten hinweisen (z. B. wiederkehrende Halluzinationen, Unfähigkeit, eine kritische Komponente zu analysieren, ständige Misserfolge bei einer spezifischen Aufgabenart).
  • Externe Systemfehler : Fehler, die von Drittanbieterdiensten stammen, mit denen der Agent interagiert und die oft eine spezifische Behandlung gemäß der Dokumentation des externen Dienstes erfordern.

Schweregrade :

  • Informativ : Geringfügige Probleme, die den Abschluss der Aufgabe nicht hindern, aber auf unteroptimale Leistung hinweisen könnten.
  • Warnung : Probleme, die die Leistung beeinträchtigen oder auf ein potenzielles Problem hinweisen könnten, aber der Agent kann dennoch fortfahren.
  • Fehler : Ein signifikantes Problem, das das aktuelle Schritt oder die Teilaufgabe am Abschluss hindert.
  • Kritisch : Ein katastrophaler Fehler, der verhindert, dass der gesamte Agent sein Hauptziel erreicht.

Fortgeschrittene Wiederholungsmechanismen mit Verzögerung und Jitter

Einfache Wiederholungen können die Probleme häufig verschärfen, insbesondere bei transienten Fehlern wie API-Ratebeschränkungen. Fortgeschrittene Wiederholstrategien sind entscheidend.

Exponentielle Verzögerung :

Anstatt sofort wieder zu versuchen, warten Sie eine Zeitspanne, die zwischen den Wiederholungen exponentiell ansteigt. Das gibt dem System Zeit, sich zu erholen und verhindert, dass es weiter überlastet wird.


import time
import random

def call_api_with_exponential_backoff(func, *args, max_retries=5, initial_delay=1, max_delay=60):
 for i in range(max_retries):
 try:
 return func(*args)
 except Exception as e:
 print(f"Fehler bei Versuch {i+1} : {e}")
 if i == max_retries - 1:
 raise
 delay = min(initial_delay * (2 ** i), max_delay)
 jitter = random.uniform(0, delay * 0.1) # Fügen Sie bis zu 10% Jitter hinzu
 print(f"Neuer Versuch in {delay + jitter:.2f} Sekunden...")
 time.sleep(delay + jitter)

# Beispiel für die Verwendung :
def problematic_api_call():
 if random.random() < 0.7: # 70%ige Fehlerchance
 raise ConnectionError("Simuliertes Netzwerkproblem")
 return "Erfolg !"

try:
 result = call_api_with_exponential_backoff(problematic_api_call)
 print(result)
except Exception as e:
 print(f"Endgültiger Fehler nach mehreren Versuchen : {e}")

Jitter :

Das Hinzufügen eines leichten zufälligen Verzugs (Jitter) zur Wartezeit verhindert ein „herdendes Tonnen“-Problem, bei dem viele Agenten zu genauen exponentiellen Intervallen wieder versuchen, was einen Dienst, der sich gleichzeitig erholt, überlasten könnte.

Schaltkreis-Modell : Verhindern von Kaskadierenden Misserfolgen

Obwohl Wiederholungen bei transienten Problemen nützlich sind, führt ständiges Wiederholen bei einem persistenten Fehlerdienst zu Verschwendung und kann zu Kaskadierenden Misserfolgen führen. Das Schaltkreis-Modell wurde für dieses Szenario entwickelt.

Wie es funktioniert :

  1. Geschlossener Zustand : Der Schaltkreis ist normal. Die Aufrufe zum Dienst gehen weiter. Wenn eine bestimmte Anzahl von Fehlern innerhalb eines Schwellenwerts auftritt, wechselt der Schaltkreis in den Offenen Zustand.
  2. Offener Zustand : Die Aufrufe zum Dienst schlagen sofort fehl, ohne zu versuchen, den tatsächlichen Dienst zu erreichen. Nach einem konfigurierbaren Zeitraum wechselt der Schaltkreis in den Halboffenen Zustand.
  3. Halboffener Zustand : Eine begrenzte Anzahl von Aufrufen wird erlaubt, um den Dienst zu testen, ob er sich erholt hat. Wenn diese Testaufrufe erfolgreich sind, wechselt der Schaltkreis in den Geschlossenen Zustand. Wenn sie fehlschlagen, wechselt er wieder in den Offenen Zustand.

import time

class CircuitBreaker:
 def __init__(self, failure_threshold=3, recovery_timeout=10, half_open_test_count=1):
 self.failure_threshold = failure_threshold
 self.recovery_timeout = recovery_timeout
 self.half_open_test_count = half_open_test_count

 self.failures = 0
 self.last_failure_time = None
 self.state = "CLOSED" # GESCHLOSSEN, OFFEN, HALBOFFEN
 self.successes_in_half_open = 0

 def __call__(self, func, *args, **kwargs):
 if self.state == "OPEN":
 if time.time() - self.last_failure_time > self.recovery_timeout:
 self.state = "HALF_OPEN"
 self.successes_in_half_open = 0
 print("Schaltkreis : OFFEN -> HALBOFFEN")
 else:
 raise CircuitBreakerOpenError("Der Schaltkreis ist offen, kein Versuch unternommen.")

 try:
 result = func(*args, **kwargs)
 self._on_success()
 return result
 except Exception as e:
 self._on_failure(e)
 raise

 def _on_success(self):
 if self.state == "CLOSED":
 self.failures = 0
 elif self.state == "HALF_OPEN":
 self.successes_in_half_open += 1
 if self.successes_in_half_open >= self.half_open_test_count:
 self.state = "CLOSED"
 self.failures = 0
 print("Schaltkreis : HALBOFFEN -> GESCHLOSSEN")

 def _on_failure(self, error):
 if self.state == "CLOSED":
 self.failures += 1
 self.last_failure_time = time.time()
 if self.failures >= self.failure_threshold:
 self.state = "OPEN"
 print(f"Schaltkreis : GESCHLOSSEN -> OFFEN (Fehler : {self.failures})")
 elif self.state == "HALF_OPEN":
 self.state = "OPEN"
 self.last_failure_time = time.time()
 print("Schaltkreis : HALBOFFEN -> OFFEN (Test fehlgeschlagen)")

class CircuitBreakerOpenError(Exception):
 pass

# Beispiel für die Verwendung :
breaker = CircuitBreaker(failure_threshold=2, recovery_timeout=5)

def flaky_service():
 if random.random() < 0.8: # 80%ige Fehlerchance
 raise ValueError("Fehler im fehlerhaften Service")
 return "Service funktioniert !"

for i in range(10):
 try:
 print(f"Versuch {i+1} :")
 result = breaker(flaky_service)
 print(f" {result}")
 except (ValueError, CircuitBreakerOpenError) as e:
 print(f" Fehler : {e}")
 time.sleep(0.5)

Semantisches Fehlermanagement und kontextuelle Wiederherstellung

Für KI-Agenten sind Fehler oft nicht nur technische Ausnahmen; sie können auch falsche semantische Interpretationen oder das Versäumnis sein, ein gewünschtes Ziel zu erreichen. Fortgeschrittenes Fehlermanagement erfordert ein Verständnis der Bedeutung des Fehlers im operativen Kontext des Agenten.

Beispiel : Web Scraping Agent

Betrachten Sie einen Agenten, der entworfen wurde, um die Preise von Produkten von einer E-Commerce-Website zu extrahieren.

  • Technischer Fehler : requests.exceptions.ConnectionError (transitorisch, sofort mit Verzögerung wiederholen).
  • Semantischer Fehler 1 : XPath für den Preis nicht gefunden. Dies ist kein technischer Fehler; die Seite wurde geladen, aber das erwartete Element ist nicht vorhanden.
    • Wiederherstellungsstrategie : Alternativen XPaths versuchen, OCR auf einem Screenshot nutzen, zur menschlichen Überprüfung melden oder vermerken, dass der Preis nicht verfügbar ist.
  • Semantischer Fehler 2 : Der extrahierte Preis lautet „Nicht auf Lager“ oder „N/V“. Die Extraktion war erfolgreich, aber der Wert ist kein gültiger Preis.
    • Wiederherstellungsstrategie : Als nicht verfügbar markieren, versuchen, ein Nachlieferdatum zu finden, benachrichtigen, dass das Produkt ausverkauft ist.
  • Semantischer Fehler 3 : Der Agent wird auf eine Anmeldeseite umgeleitet, anstatt zur Produktseite.
    • Wiederherstellungsstrategie : Versuchen Sie, sich anzumelden (falls Anmeldeinformationen verfügbar), oder melden Sie, dass die Verarbeitung aufgrund einer Authentifizierungsanforderung nicht möglich ist.

Implementierung des semantischen Fehlermanagements :

Dies erfordert oft ein hierarchisches Fehlermanagementsystem :

  1. Niedrig-Ebene Fehlerbehandler (Technisch) : Fangen Sie spezifische Ausnahmen (z.B. requests.exceptions, JSON-Parsing-Fehler) ab und wenden Sie Wiederholungen, Wartezeiten oder Sicherungen an.
  2. Mittel-Ebene Fehlerbehandler (Komponenten-spezifisch) : In einer spezifischen Komponente (z.B. einer `Scraper`-Klasse, einem `APICaller`-Modul) mit Fehlern umgehen, die für den Betrieb dieser Komponente relevant sind. Dies kann das Parsen von Fehlercodes der API-Antworten (z.B. HTTP 404, 429) und deren Übersetzung in bedeutungsvollere interne Fehlertypen beinhalten.
  3. Hoch-Ebene Fehlerbehandler (Agenten-Ziel) : Auf der Orchestrierungsebene des Agenten bewerten, ob das übergeordnete Ziel erreicht wurde. Wenn nicht, die angesammelten Fehler analysieren und eine ganzheitliche Wiederherstellungsstrategie entscheiden (z.B. ein anderes Tool ausprobieren, die Eingabe umformulieren, um Klarstellungen bitten, an einen Menschen weiterleiten).

Selbstkorrektur und Lernen aus Fehlern

Die fortschrittlichsten Agenten beschränken sich nicht nur auf das Management von Fehlern; sie lernen aus ihnen.

Dynamische Anpassungen der Eingaben :

Wenn ein von einem LLM unterstützter Agent wiederholt einen Unterziel aufgrund einer Missinterpretation nicht erreicht, ändern Sie die Eingabe dynamisch. Zum Beispiel, wenn er häufig versucht, auf nicht existierende Werkzeuge zuzugreifen :

  • Ursprüngliche Eingabe : "Verwenden Sie die verfügbaren Werkzeuge, um die Anfrage des Benutzers zu beantworten."
  • Nach Fehler (ToolNotFound) : "Sie haben Zugriff auf die folgenden Werkzeuge: [Liste der tatsächlich verfügbaren Werkzeuge]. Verwenden Sie nur diese Werkzeuge, um die Anfrage des Benutzers zu beantworten."
  • Nach Fehler (IncorrectToolParameters) : "Bei der Verwendung des Werkzeugs 'search', denken Sie daran, dass der Parameter 'query' erforderlich ist und eine Zeichenkette sein muss."

Aktualisierungen der Wissensdatenbank :

Wenn ein Agent auf einen anhaltenden Fehler eines externen Systems stößt (z.B. eine bestimmte Website gibt immer einen 403 zurück), dokumentieren Sie dies in einer persistierenden Wissensdatenbank. Zukünftige Agenten können diese Wissensdatenbank abfragen, bevor sie versuchen, die gleiche Aktion auszuführen.


class ErrorKnowledgeBase:
 def __init__(self):
 self.problematic_endpoints = {}

 def record_failure(self, endpoint_url, error_type, timestamp, message):
 if endpoint_url not in self.problematic_endpoints:
 self.problematic_endpoints[endpoint_url] = []
 self.problematic_endpoints[endpoint_url].append({
 "error_type": error_type,
 "timestamp": timestamp,
 "message": message
 })
 # Einfache Logik: Wenn ein Endpoint wiederholt fehlschlägt, markieren Sie ihn als 'unzuverlässig'
 if len(self.problematic_endpoints[endpoint_url]) > 5 and \
 all(time.time() - f["timestamp"] < 3600 for f in self.problematic_endpoints[endpoint_url][-5:]):
 print(f"Warnung: {endpoint_url} scheint unzuverlässig zu sein. Ziehen Sie Alternativen in Betracht.")

 def is_endpoint_unreliable(self, endpoint_url, recent_threshold=3600):
 # Überprüfen Sie, ob ein Endpoint kürzlich wiederholt fehlgeschlagen ist
 failures = self.problematic_endpoints.get(endpoint_url, [])
 recent_failures = [f for f in failures if time.time() - f["timestamp"] < recent_threshold]
 return len(recent_failures) > 5 # Beispielsgrenze

# Verwendung in einem Agenten :
kb = ErrorKnowledgeBase()

def make_api_call(url):
 if kb.is_endpoint_unreliable(url):
 print(f"Überprüfung {url} aufgrund einer bekannten Unzuverlässigkeit.")
 raise Exception("Endpoint gilt als unzuverlässig.")
 try:
 # ... tatsächlicher API-Aufruf ...
 if random.random() < 0.6: # Fehlersimulation
 raise requests.exceptions.HTTPError(f"403 Verboten von {url}")
 return "Daten von " + url
 except Exception as e:
 kb.record_failure(url, type(e).__name__, time.time(), str(e))
 raise

import requests

for _ in range(10):
 try:
 print(make_api_call("http://example.com/sensitive_api"))
 except Exception as e:
 print(f"Erfasster Fehler: {e}")
 time.sleep(0.1)

Menschliches Feedback :

Für kritische oder unrecoverable Fehler ist die Eskalation an einen Menschen oft die beste Strategie. Der Agent sollte allen relevanten Kontext bereitstellen :

  • Was versuchte der Agent zu tun ?
  • Welcher Schritt ist fehlgeschlagen ?
  • Was war die genaue Fehlermeldung/Stack-Trace ?
  • Welche Wiederherstellungsversuche wurden unternommen ?
  • Welche Daten führten zum Fehler ?

Die Lösung des Menschen (z.B. eine korrigierte Eingabe bereitstellen, ein Werkzeug aktualisieren, die Logik des Agenten ändern) kann dann in die Wissensdatenbank oder den Code des Agenten für zukünftige Iterationen integriert werden.

Beobachtbarkeit und Überwachung für das Fehler Management

Selbst das beste Fehlermanagement ist nutzlos, wenn Sie nicht wissen, ob es funktioniert (oder fehlschlägt). Eine solide Beobachtbarkeit ist unerlässlich.

  • Strukturierte Protokollierung: Protokollieren Sie Fehler mit konsistenten Formaten (JSON ist großartig). Fügen Sie Zeitstempel, Agenten-ID, Aufgaben-ID, Fehlertyp, Schweregrad, Stack-Trace und relevante Kontextvariablen hinzu.
  • Metriken und Warnungen: Verfolgen Sie die Häufigkeit der verschiedenen Fehlertypen. Richten Sie Warnungen für kritische Fehler, hohe Fehlerquoten oder verlängerte Sicherungsaktivierungen ein.
  • Tracking: Bei komplexen und mehrstufigen Agenten kann verteiltes Tracking helfen, den Fluss zu visualisieren und Fehler über verschiedene Komponenten oder Dienste hinweg zu lokalisieren.
  • Dashboards: Erstellen Sie Dashboards, um Fehlertrends, Wiederherhaltungsraten und die allgemeine Gesundheit Ihrer Agenten zu visualisieren.

Fazit: Robuste und Intelligente Agenten aufbauen

Fortgeschrittenes Fehlermanagement verwandelt einen Agenten von einem fragilen Skript in eine widerstandsfähige und intelligente Entität. Durch das Verständnis der Fehlertypen, die Implementierung ausgefeilter Wiederholungs- und Sicherungsmuster, die Annahme eines semantischen Fehlermanagements und den Aufbau von Selbstkorrektur- und Lernmechanismen können wir Agenten schaffen, die elegant durch die Komplexitäten der realen Welt navigieren. Dieser proaktive Ansatz verbessert nicht nur die Zuverlässigkeit Ihrer KI-Systeme, sondern senkt auch die Betriebskosten und verbessert das gesamte Benutzererlebnis, sodass der Weg zu einer wirklich autonomen und vertrauenswürdigen KI geebnet wird.

🕒 Published:

✍️
Written by Jake Chen

AI technology writer and researcher.

Learn more →
Browse Topics: ci-cd | debugging | error-handling | qa | testing
Scroll to Top