AI Prompt Engineering · Lektion

Fehlerbehandlung in Prompt-Ketten

Validieren Sie Zwischenergebnisse und stellen Sie den Ablauf nach Fehlern in der Kette wieder her

Lektion 4 von 413 Schritte

Fehlerbehandlung in Prompt-Ketten ist eine kostenlose AI Prompt Engineering-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des AI Prompt Engineering-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der AI Prompt Engineering-Kurs umfasst insgesamt 4 Lektionen.

Warum Ketten fehlschlagen

Prompt-Ketten führen zu neuen Fehlerarten, die bei Systemen mit nur einem Prompt nicht auftreten. Jeder Schritt kann auf seine eigene Weise fehlschlagen, und Fehler verstärken sich: Eine fehlerhafte Ausgabe von Schritt 2 beeinträchtigt alle nachfolgenden Schritte.

Häufige Fehlerarten:

  • Das Modell gibt fehlerhaftes JSON zurück, das nicht geparst werden kann
  • Das Modell missversteht die Aufgabe und erzeugt eine inhaltlich falsche Ausgabe
  • Rate-Limits oder API-Timeouts führen zu Fehlern in einzelnen Schritten
  • Das Kontextfenster wird in einer langen Kette überschritten
  • Das Modell halluziniert Daten, die nachfolgende Schritte als Fakten behandeln

Ausgabe nach jedem Schritt validieren

Die erste Verteidigungslinie besteht darin, die Ausgabe unmittelbar nach jedem Schritt zu validieren, bevor sie an den nächsten übergeben wird. Gehen Sie nie davon aus, dass das Modell genau das zurückgegeben hat, was Sie angefordert haben.

import json

def validate_json_output(raw_text, required_fields):
    'Parse and validate that required fields are present in model output.'
    try:
        data = json.loads(raw_text.strip())
    except json.JSONDecodeError as e:
        raise ValueError(f'Invalid JSON: {e}. Raw: {raw_text[:200]}')

    missing = [f for f in required_fields if f not in data]
    if missing:
        raise ValueError(f'Missing required fields: {missing}. Got: {list(data.keys())}')

    return data

# Usage after a chain step
raw = '{"sentiment": "positive", "priority": "high"}'
validated = validate_json_output(raw, required_fields=['sentiment', 'priority'])
print('Valid:', validated)

Wiederholungslogik für vorübergehende Fehler

API-Fehler wie Rate-Limits, Timeouts und Serverfehler sind vorübergehend. Implementieren Sie für Fehler auf Netzwerkebene eine Wiederholungslogik mit exponentiellem Backoff:

import anthropic, time

client = anthropic.Anthropic(api_key='YOUR_API_KEY')

def call_with_retry(prompt, max_retries=3, base_delay=1.0):
    last_error = None
    for attempt in range(max_retries):
        try:
            r = client.messages.create(
                model='claude-opus-4-5', max_tokens=500,
                messages=[{'role': 'user', 'content': prompt}]
            )
            return r.content[0].text
        except anthropic.RateLimitError as e:
            wait = base_delay * (2 ** attempt)
            print(f'Rate limited. Waiting {wait}s before retry {attempt+1}/{max_retries}...')
            time.sleep(wait)
            last_error = e
        except anthropic.APIError as e:
            last_error = e
            if attempt < max_retries - 1:
                time.sleep(base_delay)
    raise RuntimeError(f'All retries exhausted: {last_error}')

Semantische Validierung

Manche Fehler sind strukturell gültig, aber semantisch falsch: Das Modell gibt gültiges JSON mit falschen Werten zurück. Verwenden Sie einen schlanken Validierungsschritt, um die semantische Korrektheit zu überprüfen:

def semantic_validate(data, schema_rules):
    'Apply semantic validation rules to parsed output.'
    errors = []

    for field, rules in schema_rules.items():
        value = data.get(field)

        if rules.get('required') and value is None:
            errors.append(f'{field} is required but missing')
            continue

        if 'allowed_values' in rules and value not in rules['allowed_values']:
            errors.append(f'{field} must be one of {rules["allowed_values"]}, got: {value}')

        if 'min_length' in rules and isinstance(value, list) and len(value) < rules['min_length']:
            errors.append(f'{field} must have at least {rules["min_length"]} items, got {len(value)}')

    if errors:
        raise ValueError('Semantic validation failed: ' + '; '.join(errors))

    return data

rules = {'sentiment': {'allowed_values': ['positive', 'negative', 'mixed']}, 'issues': {'min_length': 1}}
data = {'sentiment': 'positive', 'issues': ['login bug']}
print(semantic_validate(data, rules))

Fallback-Prompts

Wenn ein Schritt die Validierung auch nach mehreren Wiederholungen nicht besteht, kann ein Fallback-Prompt eine einfachere, aber verwendbare Ausgabe erzeugen, anstatt die gesamte Kette abstürzen zu lassen:

import json

def call_with_fallback(primary_prompt, fallback_prompt, required_fields):
    # Try primary prompt
    try:
        raw = call_with_retry(primary_prompt)
        return validate_json_output(raw, required_fields)
    except (ValueError, RuntimeError) as e:
        print(f'Primary prompt failed: {e}. Trying fallback...')

    # Try simpler fallback prompt
    try:
        raw = call_with_retry(fallback_prompt)
        return validate_json_output(raw, required_fields)
    except (ValueError, RuntimeError) as e:
        print(f'Fallback also failed: {e}. Returning safe default.')

    # Return safe default — chain continues with minimal data
    return {field: None for field in required_fields}

# Usage
primary = 'Analyze this review. Return JSON with 10 fields: {...}'
fallback = 'Classify this review. Return JSON: {"sentiment": "positive|negative|neutral"}'
result = call_with_fallback(primary, fallback, ['sentiment'])
print(result)

Circuit Breaker

Ein Circuit Breaker verhindert, dass eine fehlerhafte Kette API-Aufrufe verschwendet. Nach N aufeinanderfolgenden Fehlern öffnet er den Circuit und gibt sofort einen Fehler zurück, ohne weitere API-Aufrufe auszuführen:

class CircuitBreaker:
    def __init__(self, failure_threshold=3, recovery_timeout=60):
        self.failure_count = 0
        self.threshold = failure_threshold
        self.state = 'closed'  # closed = normal, open = blocking
        self.opened_at = None

    def call(self, fn, *args, **kwargs):
        import time
        if self.state == 'open':
            elapsed = time.time() - self.opened_at
            if elapsed > 60:  # recovery_timeout
                self.state = 'half-open'
            else:
                raise RuntimeError('Circuit open — skipping API call')
        try:
            result = fn(*args, **kwargs)
            self.failure_count = 0
            self.state = 'closed'
            return result
        except Exception as e:
            self.failure_count += 1
            if self.failure_count >= self.threshold:
                self.state = 'open'
                self.opened_at = time.time()
                print(f'Circuit opened after {self.failure_count} failures.')
            raise e

cb = CircuitBreaker(failure_threshold=3)
print('Circuit breaker initialized.')

Lange Ketten mit Checkpoints versehen

Verwenden Sie für Ketten mit vielen oder besonders teuren Schritten Checkpoints, um Zwischenergebnisse zu speichern. Wenn ein später Schritt fehlschlägt, können Sie beim Checkpoint fortsetzen, statt bei Schritt 1 neu zu beginnen:

import json, os

CHECKPOINT_DIR = '/tmp/chain_checkpoints'
os.makedirs(CHECKPOINT_DIR, exist_ok=True)

def save_checkpoint(run_id, step_id, data):
    path = os.path.join(CHECKPOINT_DIR, f'{run_id}_step{step_id}.json')
    with open(path, 'w') as f:
        json.dump(data, f)
    print(f'Checkpoint saved: step {step_id}')

def load_checkpoint(run_id, step_id):
    path = os.path.join(CHECKPOINT_DIR, f'{run_id}_step{step_id}.json')
    if os.path.exists(path):
        with open(path) as f:
            return json.load(f)
    return None

def run_with_checkpoints(run_id, input_data):
    step1 = load_checkpoint(run_id, 1) or json.loads(call(f'Step 1 processing: {input_data}'))
    save_checkpoint(run_id, 1, step1)

    step2 = load_checkpoint(run_id, 2) or json.loads(call(f'Step 2 processing: {step1}'))
    save_checkpoint(run_id, 2, step2)

    return step2

print('Checkpointing system defined.')

Graceful Degradation

Wenn ein Schritt der Kette fehlschlägt und nicht wiederhergestellt werden kann, setzt Graceful Degradation die Kette mit Teildaten fort, statt sie vollständig abstürzen zu lassen:

def process_with_degradation(tickets):
    results = []
    for ticket in tickets:
        try:
            # Full chain: extract -> classify -> respond
            extracted = json.loads(call(f'Extract issue from ticket. Return JSON: {{"issue": str}}\n\n{ticket}'))
            classified = json.loads(call(f'Classify priority. Return JSON: {{"priority": str}}\n\n{extracted["issue"]}'))
            response = call(f'Draft response for {classified["priority"]} priority: {extracted["issue"]}')
            results.append({'ticket': ticket, 'response': response, 'degraded': False})
        except Exception as e:
            print(f'Chain failed for ticket, using fallback: {e}')
            # Fallback: simple direct response without classification
            simple_response = call(f'Respond to this support ticket:\n{ticket}')
            results.append({'ticket': ticket, 'response': simple_response, 'degraded': True})
    return results

print('Graceful degradation pipeline defined.')

Strukturiertes Fehler-Logging

Protokollieren Sie Fehler mit ausreichend Kontext, um zu ermitteln, welcher Schritt fehlgeschlagen ist, wie die Eingabe aussah und was das Modell zurückgegeben hat:

import logging, traceback
from datetime import datetime

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger('chain')

def logged_step(step_name, prompt, validator=None):
    start = datetime.utcnow()
    try:
        raw = call_with_retry(prompt)
        result = validator(raw) if validator else raw
        logger.info(f'[{step_name}] SUCCESS in {(datetime.utcnow()-start).total_seconds():.2f}s')
        return result
    except Exception as e:
        logger.error(f'[{step_name}] FAILED after {(datetime.utcnow()-start).total_seconds():.2f}s')
        logger.error(f'[{step_name}] PROMPT: {prompt[:200]}')
        logger.error(f'[{step_name}] ERROR: {traceback.format_exc()}')
        raise

print('Structured error logging defined.')

Fehlerszenarien testen

Testen Sie Ihre Fehlerbehandlung ausdrücklich, indem Sie Fehler einschleusen. Verwenden Sie Mock-Objekte, um API-Fehler und fehlerhafte Ausgaben zu simulieren:

from unittest.mock import patch, MagicMock

def test_fallback_on_json_error():
    with patch('__main__.call') as mock_call:
        # First call returns malformed JSON, fallback returns valid JSON
        mock_call.side_effect = [
            'This is not JSON at all',
            '{"sentiment": "positive"}'
        ]

        result = call_with_fallback(
            primary_prompt='Analyze review with 10 fields',
            fallback_prompt='Just classify sentiment as JSON',
            required_fields=['sentiment']
        )

        assert result['sentiment'] == 'positive'
        print('PASS: fallback activated correctly on JSON parse error')

def test_circuit_breaker_opens():
    cb = CircuitBreaker(failure_threshold=2)
    for i in range(2):
        try:
            cb.call(lambda: (_ for _ in ()).throw(RuntimeError('API fail')))
        except RuntimeError:
            pass
    assert cb.state == 'open'
    print('PASS: circuit breaker opened after 2 failures')

print('Error handling tests defined.')

Zustand der Kette in Produktion überwachen

Überwachen Sie in der Produktion Kennzahlen zum Zustand der Kette, um Verschlechterungen zu erkennen, bevor sie den Benutzern auffallen:

  • Erfolgsrate pro Schritt: Prozentsatz der Durchläufe, bei denen jeder Schritt beim ersten Versuch erfolgreich ist
  • Aktivierungsrate des Fallbacks: Wie häufig wird der Fallback-Prompt verwendet?
  • Degradationsrate: Welcher Anteil der Kettendurchläufe wird im eingeschränkten Modus abgeschlossen?
  • Latenz pro Schritt: Überwachen Sie die p50-/p95-Latenz jedes Schritts – eine langsame Ausführung deutet auf Probleme mit der Prompt-Komplexität hin
  • Validierungsfehlerquote: Eine hohe Rate deutet darauf hin, dass der Prompt überarbeitet werden muss

Schnelltest

Welchen Zweck hat ein Circuit Breaker in einer Prompt-Kette?

Fehlerbehandlung in Ketten – wichtigste Erkenntnisse

Eine robuste Fehlerbehandlung unterscheidet Prototyp-Ketten von produktionsreifen Systemen:

  • Validieren Sie die Ausgabe jedes Schritts, bevor Sie sie an nachfolgende Schritte weitergeben – gehen Sie nie davon aus, dass das Modell korrekte Daten zurückgegeben hat
  • Wiederholen Sie vorübergehende API-Fehler mit exponentiellem Backoff – Rate-Limits und Timeouts lassen sich beheben
  • Verwenden Sie Fallback-Prompts für einfachere Ausgaben, wenn der primäre Prompt die semantische Validierung nicht besteht
  • Circuit Breaker verhindern nach wiederholten Fehlern unnötige API-Aufrufe
  • Setzen Sie Checkpoints für teure Schritte, damit lange Ketten nach einem Fehler in einem späten Schritt fortgesetzt werden können
  • Graceful Degradation hält die Pipeline mit Teildaten am Laufen, statt sie abstürzen zu lassen
  • Überwachen Sie in der Produktion die Erfolgs-, Fallback- und Degradationsrate der Schritte
Kostenlos starten

Lerne AI Prompt Engineering mit einem KI-Tutor — kostenlos

Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.

Kurse
53
Lektionen
199

Häufig gestellte Fragen

Ist die Lektion „Fehlerbehandlung in Prompt-Ketten“ kostenlos?

Ja — der vollständige Text von „Fehlerbehandlung in Prompt-Ketten“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des AI Prompt Engineering-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der AI Prompt Engineering-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Fehlerbehandlung in Prompt-Ketten“?

Validieren Sie Zwischenergebnisse und stellen Sie den Ablauf nach Fehlern in der Kette wieder her Du übst AI Prompt Engineering mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um AI Prompt Engineering zu starten?

Keine Vorkenntnisse erforderlich. AI Prompt Engineering auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Fehlerbehandlung in Prompt-Ketten“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser AI Prompt Engineering-Lektion Code schreiben und ausführen?

Ja. Jede AI Prompt Engineering-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Was ist Prompt Chaining?
  2. Muster von Ausgabe zu Eingabe
  3. Sequenzielle Transformationsketten
  4. Fehlerbehandlung in Prompt-Ketten
← Zurück zu AI Prompt Engineering