AI Prompt Engineering · Lektion

Strategien für Logging und Dokumentation

Aufzeichnen von Prompt-Versionen, Eingaben und Ausgaben für reproduzierbares Debugging.

Lektion 4 von 413 Schritte

Strategien für Logging und Dokumentation 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 Prompt-Protokollierung wichtig ist

Ohne Protokollierung bleiben Prompt-Fehler unsichtbar, bis ein Benutzer sie meldet. Mit Protokollierung können Sie:

  • Regressionen sofort bei ihrem Auftreten erkennen
  • Jeden vergangenen Fehler exakt so reproduzieren, wie er aufgetreten ist
  • Verbesserungen im Laufe der Zeit messen, während sich Prompts weiterentwickeln
  • Das Verhalten des Modells auf Compliance oder Sicherheit prüfen

Protokollierung ist für Prompt-Systeme in der Produktion keine Option, sondern die Grundlage zuverlässiger LLM-Anwendungen.

Der minimale brauchbare Protokolleintrag

Bei jeder Prompt-Interaktion sollten mindestens die folgenden Felder protokolliert werden:

  • timestamp: ISO 8601 UTC
  • prompt_id: verwendete Prompt-Vorlage
  • model: exakter Modellname und Version
  • temperature: Sampling-Parameter
  • input: Benutzernachricht (oder ein Hash, wenn sie PII enthält)
  • output: Modellantwort
  • latency_ms: Antwortzeit
  • tokens_used: Eingabe- + Ausgabetoken
import time, json
from datetime import datetime, timezone

def logged_call(prompt_id, system_prompt, user_message, model='gpt-4o', temperature=0.7):
    start = time.time()
    resp = client.chat.completions.create(
        model=model,
        messages=[
            {'role': 'system', 'content': system_prompt},
            {'role': 'user', 'content': user_message}
        ],
        temperature=temperature
    )
    latency = int((time.time() - start) * 1000)
    output = resp.choices[0].message.content
    log_entry = {
        'timestamp': datetime.now(timezone.utc).isoformat(),
        'prompt_id': prompt_id,
        'model': model,
        'temperature': temperature,
        'input': user_message,
        'output': output,
        'latency_ms': latency,
        'input_tokens': resp.usage.prompt_tokens,
        'output_tokens': resp.usage.completion_tokens
    }
    append_log(log_entry)
    return output

Strukturiertes Protokollformat

Verwenden Sie Newline-delimited JSON (JSONL) für Protokolldateien. Jede Zeile ist ein vollständiges, gültiges JSON-Objekt. Dieses Format ist:

  • Einfach ohne Sperren zu erweitern
  • Mit jq, pandas und allen Log-Aggregatoren lesbar
  • Streaming-freundlich – jede Zeile kann verarbeitet werden, sobald sie eintrifft
import json

LOG_FILE = 'prompt_logs.jsonl'

def append_log(entry):
    with open(LOG_FILE, 'a') as f:
        f.write(json.dumps(entry) + '\n')

def read_logs():
    with open(LOG_FILE) as f:
        return [json.loads(line) for line in f if line.strip()]

# Query: all entries for prompt_id 'summarize_v3'
logs = read_logs()
summarize_logs = [e for e in logs if e['prompt_id'] == 'summarize_v3']
print(f'Total calls to summarize_v3: {len(summarize_logs)}')

Prompt-Versionierung

Prompts ändern sich im Laufe der Zeit. Ohne Versionierung können Sie vergangenes Verhalten nicht reproduzieren und keine Modellausgaben über verschiedene Prompt-Versionen hinweg vergleichen. Verwenden Sie in jedem Protokolleintrag einen Versionsbezeichner.

Einfache Versionierung: eine semantische Versionszeichenfolge (z. B. v1.2.3) oder ein Git-Commit-Hash. Speichern Sie Prompt-Versionen in einer eigenen Datei, damit jede Version für eine erneute Ausführung abgerufen werden kann.

PROMPTS = {
    'summarize': {
        'v1': 'Summarize the following text.',
        'v2': 'Summarize the following text in 3 sentences.',
        'v3': 'Summarize the following text in exactly 3 sentences. '
              'Start each sentence on a new line. No bullet points.'
    }
}

CURRENT_VERSIONS = {'summarize': 'v3'}

def get_prompt(prompt_id):
    version = CURRENT_VERSIONS[prompt_id]
    return version, PROMPTS[prompt_id][version]

version, prompt = get_prompt('summarize')
log_entry['prompt_version'] = version

Umgang mit PII in Protokollen

Benutzereingaben können personenbezogene Daten (PII) enthalten. Die Protokollierung unbereinigter Eingaben kann gegen die DSGVO oder den CCPA verstoßen. Möglichkeiten:

  • Hash: SHA-256 der Eingabe speichern – reproduzierbar für die Deduplizierung, aber nicht für eine erneute Ausführung
  • Redigieren: Einen regulären Ausdruck oder ein NER-Modell verwenden, um PII vor der Protokollierung zu ersetzen
  • Getrennte Speicherung: PII in einem verschlüsselten Speicher mit Zugriffskontrollen protokollieren; im Hauptprotokoll nur eine Referenz-ID speichern
import hashlib, re

def redact_pii(text):
    # Redact email addresses
    text = re.sub(r'[\w.-]+@[\w.-]+\.\w+', '[EMAIL]', text)
    # Redact phone numbers (US format)
    text = re.sub(r'\b\d{3}[-.]\d{3}[-.]\d{4}\b', '[PHONE]', text)
    return text

def hash_input(text):
    return hashlib.sha256(text.encode()).hexdigest()[:16]

log_entry['input'] = redact_pii(user_message)
log_entry['input_hash'] = hash_input(user_message)

Latenz- und Kostenverfolgung

Protokolle ermöglichen Dashboards für Kosten und Latenz. Verfolgen Sie Metriken pro Prompt-Version, um Regressionen bei Leistung oder Kosten nach einer Prompt-Änderung zu erkennen:

def compute_cost(entry, price_per_1m_input=5.0, price_per_1m_output=15.0):
    input_cost = entry['input_tokens'] / 1_000_000 * price_per_1m_input
    output_cost = entry['output_tokens'] / 1_000_000 * price_per_1m_output
    return input_cost + output_cost

def prompt_stats(prompt_id, version):
    logs = [e for e in read_logs()
            if e['prompt_id'] == prompt_id and e.get('prompt_version') == version]
    if not logs:
        return
    avg_latency = sum(e['latency_ms'] for e in logs) / len(logs)
    total_cost = sum(compute_cost(e) for e in logs)
    print(f'{prompt_id} {version}: {len(logs)} calls, avg {avg_latency:.0f}ms, total ${total_cost:.4f}')

Protokollierung der Ausgabebewertung

Speichern Sie zusätzlich zu den Rohprotokollen Bewertungswerte zusammen mit jedem Protokolleintrag. So wird eine Trendanalyse ermöglicht: Verbessert sich die Ausgabequalität über die verschiedenen Prompt-Versionen hinweg?

def evaluated_call(prompt_id, system_prompt, user_message, evaluator_fn):
    output = logged_call(prompt_id, system_prompt, user_message)
    score = evaluator_fn(user_message, output)
    # Update the last log entry with the evaluation score
    logs = read_logs()
    last = logs[-1]
    last['eval_score'] = score
    last['eval_pass'] = score >= 0.8
    # Rewrite the last line
    with open(LOG_FILE, 'a') as f:
        # In practice, use a DB or separate eval log
        pass
    return output, score

Prompt-Dokumentation

Jede Prompt-Vorlage sollte einen zugehörigen Dokumentationseintrag mit folgenden Inhalten haben:

  • Zweck: welche Aufgabe dieser Prompt ausführt
  • Variablen: welche Platzhalter vorhanden sind und welche Werte sie erwarten
  • Bekannte Einschränkungen: Eingaben, bei denen der Prompt bekanntermaßen fehlschlägt
  • Versionsverlauf: was sich in jeder Version geändert hat und warum
  • Testfälle: Verweis auf die Testsuite für diesen Prompt
PROMPT_DOCS = {
    'summarize': {
        'purpose': 'Summarize a single text passage into 3 sentences.',
        'variables': {'text': 'The passage to summarize (max 2000 tokens)'},
        'known_limitations': [
            'Fails to preserve numbers accurately for texts with many statistics',
            'May not summarize correctly for non-English text'
        ],
        'versions': {
            'v1': 'Initial version — vague length instruction',
            'v2': 'Added 3-sentence limit',
            'v3': 'Added line-break and no-bullet formatting fix'
        },
        'test_suite': 'tests/test_summarize.py'
    }
}

Zentralisierte Protokolldienste verwenden

Schreiben Sie Protokolle für Produktionssysteme in einen zentralisierten Dienst statt in lokale Dateien:

  • LangSmith: native Tracing- und Evaluierungsplattform von LangChain
  • Weights and Biases Prompts: Experimentverfolgung für Prompts
  • Datadog / Grafana: standardmäßige Operations-Dashboards mit benutzerdefinierten Metriken
  • Supabase / PostgreSQL: Protokolle mit SQL für Ad-hoc-Analysen abfragen

Das Schema bleibt gleich; nur das Ziel ändert sich.

# Example: writing to Supabase
from supabase import create_client

supabase = create_client('https://xxx.supabase.co', 'your-anon-key')

def log_to_supabase(entry):
    supabase.table('prompt_logs').insert(entry).execute()

# Now query with SQL:
# SELECT prompt_id, prompt_version, AVG(latency_ms), COUNT(*)
# FROM prompt_logs
# WHERE timestamp > NOW() - INTERVAL '7 days'
# GROUP BY prompt_id, prompt_version
# ORDER BY COUNT(*) DESC;

Warnungen bei sprunghaften Fehleranstiegen

Konfigurieren Sie Warnungen, wenn die Fehlerquote einen Schwellenwert überschreitet. Beispiel: Wenn in einem Zeitraum von 5 Minuten mehr als 10 % der Aufrufe eines Prompts ungültiges JSON zurückgeben, senden Sie eine Warnung.

from collections import deque
from datetime import datetime, timezone, timedelta

recent_results = deque(maxlen=100)  # sliding window

def track_and_alert(prompt_id, success, alert_fn, threshold=0.10):
    recent_results.append({'success': success, 'time': datetime.now(timezone.utc)})
    window = [
        r for r in recent_results
        if r['time'] > datetime.now(timezone.utc) - timedelta(minutes=5)
    ]
    if not window:
        return
    fail_rate = sum(1 for r in window if not r['success']) / len(window)
    if fail_rate > threshold:
        alert_fn(f'ALERT: {prompt_id} failure rate {fail_rate:.0%} in last 5 min')

Aufbewahrung und Archivierung

Definieren Sie eine Richtlinie zur Protokollaufbewahrung:

  • Rohe Aufruf-Logs: 30 Tage (rollierend) – hohes Volumen, zum Debuggen aktueller Probleme erforderlich
  • Aggregierte Metriken: 1 Jahr – für Trendanalysen und Kostenprognosen erforderlich
  • Fehler-Logs: unbegrenzt – für Muster bei den Grundursachen erforderlich

Komprimieren und archivieren Sie rohe Logs nach 30 Tagen. Löschen Sie Fehler-Logs niemals – sie sind Ihr institutionelles Gedächtnis für Prompt Engineering.

Wissensüberprüfung

Welchen Hauptvorteil bietet das Format zeilengetrenntes JSON (JSONL) für Prompt-Logs gegenüber einem einzigen großen JSON-Array?

Zusammenfassung: Protokollierung und Dokumentation

Wichtige Vorgehensweisen für die Protokollierung und Dokumentation von Prompts:

  • Jeden Aufruf protokollieren: Zeitstempel, prompt_id, Version, model, temperature, input, output, latency, tokens
  • JSONL-Format verwenden: zum Anhängen geeignet und mit Standardtools abfragbar
  • Prompts versionieren: Jede Änderung erhält eine neue Version; in den Logs wird auf die Version verwiesen
  • Mit PII umgehen: Maskieren oder hashen Sie sensible Eingaben vor der Protokollierung
  • Kosten und Latenz erfassen: Erkennen Sie Regressionen nach Prompt-Aktualisierungen
  • Bei sprunghaften Fehleranstiegen alarmieren: Überwachung der Fehlerquote in einem gleitenden Zeitfenster

Damit ist Kurs 17 zum Debuggen von Prompt-Fehlern abgeschlossen. Als Nächstes: Prompt-Injection und Abwehrmaßnahmen.

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 „Strategien für Logging und Dokumentation“ kostenlos?

Ja — der vollständige Text von „Strategien für Logging und Dokumentation“ 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 „Strategien für Logging und Dokumentation“?

Aufzeichnen von Prompt-Versionen, Eingaben und Ausgaben für reproduzierbares Debugging. 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 „Strategien für Logging und Dokumentation“?

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. Unerwartete Ausgaben diagnostizieren
  2. Ursachenanalyse für Prompts
  3. Systematischer Debugging-Ansatz
  4. Strategien für Logging und Dokumentation
← Zurück zu AI Prompt Engineering