Strategien für Logging und Dokumentation
Aufzeichnen von Prompt-Versionen, Eingaben und Ausgaben für reproduzierbares Debugging.
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 UTCprompt_id: verwendete Prompt-Vorlagemodel: exakter Modellname und Versiontemperature: Sampling-Parameterinput: Benutzernachricht (oder ein Hash, wenn sie PII enthält)output: Modellantwortlatency_ms: Antwortzeittokens_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 outputStrukturiertes 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'] = versionUmgang 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, scorePrompt-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.
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
- Unerwartete Ausgaben diagnostizieren
- Ursachenanalyse für Prompts
- Systematischer Debugging-Ansatz
- Strategien für Logging und Dokumentation