LLM Production Ops

SLOs, Incident & On-Call

Der Dienst antwortet mit HTTP 200, aber die fachliche Qualität ist eingebrochen. Ein Infrastrukturmonitor bleibt grün und die Bereitschaft erhält erst Supporttickets. Für probabilistische Dienste müssen Zusage, Alarm, Mitigation und Auswertung dieselbe Nutzerwirkung beschreiben.

Lehrtext · 12 Abschnitte · zuletzt geprüft: 2026-09-04

Das Ops in LLMOps

Ein LLM-Feature ist im Betrieb ein besonderer Dienst: Er ist nicht-deterministisch (dieselbe Eingabe, verschiedene Ausgabe), teuer und ratelimitiert, hängt an einem externen Anbieter — und wenn er „falsch“ antwortet, gibt es keinen Stacktrace. Trotzdem gelten die klassischen SRE-Prinzipien: messbare Ziele, Fehler-Budgets, graceful degradation, geübte Incident-Response.

Dieses Modul ist die Brücke zur SRE-Praxis, angewandt auf LLM-Eigenheiten. Es geht nicht um Modellauswahl oder Prompt-Qualität, sondern darum, den fertigen Dienst zuverlässig laufen zu lassen: beobachten, Ziele setzen, unter Last und Ausfall stabil bleiben, im Zwischenfall richtig handeln.

MerksatzEin LLM-Dienst ist ein probabilistischer, fremd-gehosteter Downstream. Betreibe ihn wie eine unzuverlässige externe Abhängigkeit — nicht wie eine Funktion, die immer klappt.

Betriebsprobe: SLI-SLO

Szenario

Euer LLM-Feature (Ticket-Zusammenfassung) geht in Produktion. Ihr sollt einen Verfügbarkeits-SLO definieren, auf den ihr alarmieren und ein Fehler-Budget führen könnt. Das Feature ruft einen externen Anbieter auf und liefert JSON zurück; ein Product-Owner drängt darauf, „dass die Antworten auch stimmen“, in den SLO aufzunehmen.

Anforderungen

  • Worauf definierst du den Verfügbarkeits-SLI?
  • Bewerte Ursache, wirksame Grenze und den Preis der tragfähigen Maßnahme getrennt.

Schritte

  1. Tragfähiger Ansatz: Anteil Anfragen, die innerhalb des Timeouts eine schema-valide Antwort liefern — Fehler klassifiziert nach Taxonomie (Provider-5xx, 429, Timeout, Schema-invalide). Richtig. Das ist in Echtzeit maschinell prüfbar, taugt für Pager und Fehler-Budget, und die Taxonomie zeigt dir, welche Fehlerklasse gerade brennt — ohne Ground-Truth zu brauchen.
  2. Plausibler Fehlweg: Anteil inhaltlich korrekter Antworten, live von einem LLM-Judge bewertet. Korrektheit braucht Ground-Truth oder ein Urteil, das selbst probabilistisch, teuer und langsam ist — nicht in Echtzeit pager-tauglich. Das gehört ins Offline-Eval und Drift-Monitoring, nicht in den Verfügbarkeits-SLI.
  3. Plausibler Fehlweg: Die HTTP-200-Rate des Anbieters. Zu grob: Ein 200 kann eine leere, abgeschnittene oder nicht-JSON-Antwort tragen. Die 200-Rate verdeckt genau die schema-invaliden App-Fehler, die den Nutzer treffen.
  4. Plausibler Fehlweg: Ein Ziel von 100 % erfolgreicher Anfragen ohne Fehler-Budget. Bei einem probabilistischen, fremd-gehosteten Dienst ist 100 % unerreichbar und ohne Fehler-Budget blockierst du jeden Deploy. Ein SLO braucht ein Budget, das Änderungen finanziert.

Merksatz: Ein SLI muss in Echtzeit maschinell messbar sein, sonst kann er weder alarmieren noch ein Fehler-Budget führen. Miss den prüfbaren Antwort-Vertrag plus eine Fehler-Taxonomie — nicht die Wahrheit der Antwort. + Pager-tauglich und diagnostisch (welche Fehlerklasse brennt). Der SLI sagt nichts über inhaltliche Qualität — Halluzination bei formal gültiger Antwort bleibt unsichtbar und braucht ein separates Drift-Monitoring.

SLIs, SLOs und die Fehler-Taxonomie

Ein SLI (Service Level Indicator) ist eine gemessene Kennzahl deines Dienstes, ein SLO (Service Level Objective) das Ziel darauf — z. B. „99,5 % der Anfragen liefern in unter 8 s eine gültige Antwort“. Ein SLI muss in Echtzeit maschinell messbar sein, sonst kannst du weder alarmieren noch ein Fehler-Budget führen.

Deshalb ist „die Antwort ist inhaltlich falsch“ kein brauchbarer Verfügbarkeits-SLI: Korrektheit erfordert Ground-Truth oder ein (selbst probabilistisches, teures, langsames) Urteil — das gehört ins Offline-Eval und ins Drift-Monitoring, nicht auf den Pager. Der Verfügbarkeits-SLI stützt sich auf einen maschinell prüfbaren Antwort-Vertrag und eine klare Fehler-Taxonomie:

Provider-5xx (500/503)
Anbieter-seitiger Fehler, meist transient. Zählt gegen Verfügbarkeit; kandidat für Backoff-Retry.
Rate-Limit (429)
Deine Anfrage wurde gedrosselt — ein Kapazitätssignal, kein Defekt. Retry-After beachten.
Timeout
Antwort kam nicht rechtzeitig zurück — hängt an deiner Timeout-Wahl (siehe Tail-Latenz).
Schema-invalide Antwort
HTTP 200, aber unbrauchbar: kein valides JSON, leer, abgeschnitten. App-Fehler trotz HTTP-Erfolg.
MerksatzEin SLI misst, was du in Echtzeit entscheiden kannst. „Falsche Antwort“ ist real, aber kein SLI — und ein reines HTTP-200 verdeckt schema-invalide Antworten.

Ein SLO impliziert ein Fehler-Budget: 99,5 % Ziel = 0,5 % erlaubte Fehler. Das Budget ist Betriebsmittel — es finanziert Deploys und Experimente. Ein 100-%-Ziel ist bei einem probabilistischen, fremd-gehosteten Dienst weder erreichbar noch sinnvoll.

Betriebsprobe: TAIL-LATENCY

Szenario

Euer LLM-Endpoint zeigt im Dashboard p50 = 900 ms — sieht gesund aus. Trotzdem häufen sich Beschwerden „hängt manchmal ewig“. Eine genauere Messung zeigt p95 = 4 s, p99 = 11 s; die langsamen Fälle sind lange Generierungen und Aufrufe, die intern einmal auf einen 503 retried haben. Ihr müsst Timeout und Latenz-SLO festlegen.

Anforderungen

  • Wie gehst du vor?
  • Bewerte Ursache, wirksame Grenze und den Preis der tragfähigen Maßnahme getrennt.

Schritte

  1. Tragfähiger Ansatz: SLO und Timeout gegen p95/p99 setzen und für die am Timeout gekappten Anfragen einen Fallback definieren. Richtig. Den Schwanz erleben die Nutzer, nicht den Median. Ein bewusst am Tail gewählter Timeout kappt die Ausreißer, und der Fallback fängt die gekappten Anfragen auf, statt sie hart scheitern zu lassen.
  2. Plausibler Fehlweg: Auf den p50/Mittelwert optimieren — das ist die typische Nutzererfahrung — anschließend ohne Zeitfenster oder Serviceklasse direkt als Paging-Regel verwendet. Median und Mittelwert verstecken genau den Schwanz. Die wenigen sehr langsamen Anfragen dominieren die erlebte Zuverlässigkeit, und bei Fan-out summieren sich schon moderate p99 zum „tail at scale“.
  3. Plausibler Fehlweg: Den Client-Timeout auf 60 s anheben, damit fast nichts mehr abbricht. Das versteckt das Problem, statt es zu lösen: Nutzer warten trotzdem, Verbindungen und Kapazität bleiben lange gebunden. Der Timeout ist eine bewusste SLO-/UX-Grenze, kein Knopf, um Fehler verschwinden zu lassen.
  4. Plausibler Fehlweg: Aggressive Retries mit kurzem Timeout ergänzen, um die Latenz zu drücken. Ein Retry startet die ganze Generierung neu und vervielfacht die Arbeit — bei einem langschwänzigen, teuren Aufruf verschlimmert das den Tail und die Last, statt ihn zu senken.

Merksatz: Zusammengefasste Mittelwerte verbergen die Verteilung. Bei langschwänzigen, retry-behafteten Aufrufen steuerst und alarmierst du gegen Perzentile (p95/p99); der Timeout ist die bewusst gewählte Grenze am Schwanz. + Der SLO spiegelt die real erlebte Latenz und der Fallback fängt Ausreißer. Ein am Tail knapp gesetzter Timeout kappt auch echte, nur langsame Antworten — du tauschst „lang warten“ gegen „früher degradieren“.

Tail-Latenz: der Median lügt

Generative Aufrufe sind langschwänzig (heavy-tailed): Die Antwortdauer hängt an der erzeugten Token-Zahl, und Retries auf transiente Fehler starten die ganze Generierung neu. Der Median (p50) sieht dann harmlos aus, während p95/p99 weit darüber liegen — und genau diese langsamen Anfragen sind die, die Nutzer als „hängt“ erleben.

Bei Fan-out verschärft sich das: Wartet eine Anfrage auf mehrere Aufrufe, bestimmt der langsamste die Gesamtlatenz — schon moderate p99 einzelner Aufrufe summieren sich („the tail at scale“). Betreibe und alarmiere deshalb gegen p95/p99, nicht gegen Mittelwert oder Median.

Der Timeout ist keine technische Nebensache, sondern eine SLO-/UX-Entscheidung: Er kappt den Schwanz. Zu kurz → viele abgeschnittene Anfragen (die einen Fallback brauchen); zu lang → Nutzer warten, Verbindungen und Kapazität bleiben gebunden. Wähle ihn bewusst am Tail entlang, mit einem definierten Verhalten für die gekappten Anfragen.

MerksatzMittelwerte verstecken den Schwanz. Setze Timeout und SLO gegen p95/p99 — den erlebst du, nicht den Median.

Betriebsprobe: FALLBACK-DEGRADATION

Szenario

Euer primärer Anbieter meldet seit 10 Minuten stark erhöhte 5xx-Fehler. Das betroffene Feature schlägt bei jedem Support-Ticket eine Antwort und drei Kategorie-Vorschläge vor; die Kategorien treiben nachgelagert eine Routing-Automation. Ein Kill-Switch auf einen definierten Fallback existiert.

Anforderungen

  • Welche Degradations-Strategie fährst du für die Ausfalldauer?
  • Bewerte Ursache, wirksame Grenze und den Preis der tragfähigen Maßnahme getrennt.

Schritte

  1. Tragfähiger Ansatz: Auf einen definierten Fallback degradieren — Cache/kleineres Modell für den Antwortvorschlag, regelbasierte Default-Kategorie — und den reduzierten Modus für Nutzer sichtbar machen. Richtig. Die Kernfunktion bleibt teilweise nutzbar statt komplett auszufallen, und die sichtbare Kennzeichnung verhindert, dass jemand dem schwächeren Modus blind vertraut.
  2. Plausibler Fehlweg: Einen harten 5xx zurückgeben und den Client retrien lassen, bis der Anbieter wieder da ist — anschließend ohne Zeitfenster oder Serviceklasse direkt als Paging-Regel verwendet und ohne Bezug zu Nutzerwirkung, Fehlerbudget oder ausführbarer Gegenmaßnahme dauerhaft aktiviert. Das macht aus einer Teil-Störung eine Voll-Störung: Nutzer bekommen gar nichts, und die Client-Retries legen zusätzliche Last auf einen ohnehin wankenden Anbieter.
  3. Plausibler Fehlweg: Den primären Anbieter in enger Schleife weiter anfragen, bis ein Aufruf durchkommt. Das ist keine Degradation, sondern ein Retry-Sturm gegen einen überlasteten Dienst — er verlängert dessen Erholung und liefert dem Nutzer trotzdem nichts Verlässliches.
  4. Plausibler Fehlweg: Still auf ein deutlich schwächeres Modell umschalten und die Ausgaben unverändert als normal präsentieren. Ein unsignalisierter Qualitäts-Absturz ist eine getarnte Störung: Bei den Kategorien, die eine Automation steuern, führen unbemerkt schlechtere Vorschläge zu falschem Routing — ein akzeptabler degradierter Modus muss ehrlich signalisiert sein.

Merksatz: Graceful degradation hält bei Ausfall/Überlast die Kernfunktion teilweise am Leben statt hart zu scheitern. Ein akzeptabler degradierter Modus ist noch nützlich und ehrlich signalisiert — nicht ein stiller Qualitäts-Absturz. + Teilverfügbarkeit statt Totalausfall, ohne falsches Vertrauen. Der Fallback-Pfad ist zusätzlicher Code, der gepflegt und regelmäßig getestet werden muss, sonst rottet er und versagt genau im Ernstfall.

Graceful degradation: lieber schwächer als tot

Fällt der Anbieter aus oder ist überlastet, ist ein harter Fehler die schlechteste Antwort — er macht aus einer Teil-Störung eine Voll-Störung. Graceful degradation hält die Kernfunktion teilweise am Leben, statt hart zu scheitern.

  • Cache: vorhandene oder ähnliche Antwort ausliefern statt neu generieren.
  • Kleineres/sekundäres Modell: günstiger, schwächer, aber verfügbar.
  • Statische/regelbasierte Antwort: vordefiniert, für den Notfall.
  • Reduzierter Funktionsumfang: die teure Fähigkeit deaktivieren, den Rest liefern.
MerksatzEin akzeptabler degradierter Modus ist noch nützlich und ehrlich signalisiert. Ein stiller Qualitäts-Absturz, den niemand bemerkt, ist keine Degradation, sondern eine getarnte Störung.

Rate-Limits sind deine Kapazitätsgrenze

Anbieter begrenzen dich über RPM (requests per minute) und TPM (tokens per minute) bzw. Quotas. Das ist deine reale Kapazitätsdecke — nicht deine CPU. Mehr Worker oder Concurrency erzeugen gegen ein festes RPM/TPM nur mehr 429er, keine Kapazität.

Ein 429 heißt „langsamer“, nicht „mehr versuchen“. Wer bei 429 sofort und synchron retried, baut einen Retry-Sturm (thundering herd) und verschärft die Drosselung, die er beheben will. Lastspitzen gehören geformt, nicht durchgeprügelt:

  • Queue / Client-seitiger Rate-Limiter: Demand glätten, unter der Decke bleiben.
  • Backpressure: dem Aufrufer signalisieren, langsamer zu senden.
  • Load-Shedding: unwichtige/niedrigpriore Last früh abwerfen, um die wichtige zu schützen.
  • Backoff mit Jitter, `Retry-After` beachten: Retries entzerren, statt sie zu synchronisieren.
MerksatzConcurrency ist keine Kapazität, wenn ein Provider-Quota der Engpass ist. Spitzen mit Queue/Backpressure/Load-Shedding formen — blinde Retries verschärfen die Drossel.

Der Incident ohne Stacktrace

„Das System halluziniert seit heute Früh vermehrt“ oder „verweigert plötzlich gültige Anfragen“ — Health-Checks grün, Latenz normal, keine Errors im Log. Ein Qualitäts-Incident produziert kein Crash-Signal, ist aber echter Nutzer-Schaden. Fehlen eines Stacktraces ist nicht die Abwesenheit eines Incidents.

Wie bei jedem Incident gilt: Severity nach Nutzer-Wirkung einstufen und die Blutung zuerst stoppen. Ohne Stacktrace kann die Root-Cause-Analyse lange dauern — also erst mitigieren, dann diagnostizieren. Sichere Mitigation ist der Rücksprung auf einen bekannt-guten Stand (Rollback / Kill-Switch auf Fallback), nicht ein Vorwärts-Fix live.

erkennenSeverity einstufenmitigierendiagnostizierenkommunizieren
MerksatzErst stoppen, dann verstehen. Ein Vorwärts-Fix unter Unsicherheit zerstört den Vergleich zum bekannt-guten Stand — der Rücksprung dorthin ist die sichere Mitigation.

Provider-Risiko: ein Anbieter, ein Single Point of Failure

Hängt dein Produkt an einem Anbieter, ist dessen Ausfall dein Ausfall — Retries helfen nicht, wenn die einzige Abhängigkeit komplett weg ist. Eine Multi-Provider-Strategie (ein zweiter Anbieter als Fallback) reduziert dieses Risiko, kostet aber real: Prompt-Parität (Anbieter verhalten sich unterschiedlich), doppelte Evals, eine gepflegte Abstraktion, mehr Kosten.

Deshalb ist es eine Abwägung, kein Automatismus: Ein zweiter Anbieter rechtfertigt sich, wenn das Verfügbarkeitsziel über dem liegt, was ein Anbieter allein liefert, und das Feature geschäftskritisch ist. Ein zweiter API-Key oder eine zweite Region desselben Anbieters ist keine echte Redundanz — der Ausfall ist korreliert.

MerksatzRedundanz gegen korrelierte Ausfälle braucht unabhängige Anbieter — und lohnt nur, wenn das Verfügbarkeitsziel die Zusatzkomplexität (Parität, Eval-Doppelung, Kosten) trägt.

Zusammenfassung — gleich im Check

Du kennst jetzt die Betriebs-Achsen eines LLM-Dienstes: SLIs/SLOs & Fehler-Taxonomie, Tail-Latenz & Timeout, graceful degradation, Rate-Limits als Kapazitätsgrenze, Incident ohne Stacktrace und Provider-Risiko.

Gleich im CheckIn den nächsten Entscheidungen betreibst du diesen Dienst selbst durch reale Ops-Situationen — und siehst pro Option, warum sie trägt oder nicht.

Was hier anders ist als in klassischer Bereitschaft

Klassische Bereitschaft reagiert auf Dinge, die kaputt sind: Fehlerraten, Ausfälle, Sättigung. Bei LLM-Diensten kommt eine Klasse dazu, die nicht kaputt ist, sondern falsch: Der Dienst antwortet schnell, mit Code 200 — nur inhaltlich schlechter als gestern. Die dazugehörigen Signale sind indirekt, verrauscht und träge.

NutzerwirkungSignalSLI · Log · TraceEntscheidungOwner + GrenzeHandelnBeobachten, begrenzen, wiederherstellen und die Wirkung erneut am Nutzerziel prüfen.
Erkennen, bewerten, eingreifen, auswerten — der Regelkreis gilt auch dann, wenn das Signal keine Fehlerrate ist.

Daraus folgt die Kernfrage dieses Moduls: Wie baut man Alarme auf Signale, die naturgemäß schwanken, ohne die Bereitschaft mit Fehlalarmen zu zermürben — und ohne echte Regressionen zu verschlafen?

AbgrenzungAllgemeine Bereitschafts- und Incident-Praxis behandelt der Pfad zu Monitoring und Incident-Operations. Hier geht es um die Besonderheiten probabilistischer Dienste.

Alarmiere auf Symptome, nicht auf Ursachen

Die tragfähigste Regel bleibt auch hier: Ein Alarm sollte an dem hängen, was Nutzer erleben, nicht an einer vermuteten Ursache. Für LLM-Dienste heißt das eine kleine Menge symptomnaher Signale statt eines Zoos aus internen Kennzahlen.

Verfügbarkeit und Latenz
Klassisch, deckt aber nur den Ausfall ab, nicht die schlechte Antwort.
Formgültigkeit der Ausgabe
Anteil der Antworten, die den vereinbarten Vertrag verletzen — hart messbar.
Verweigerungs- und Leerantwortquote
Reagiert empfindlich auf Prompt- und Modelländerungen.
Retrieval-Leerquote
Zeigt Datenprobleme, bevor Nutzer sie melden.
Explizite Nutzerrückmeldung
Ehrlich, aber träge und verzerrt — nie als alleiniger Auslöser.
MerksatzJeder Alarm braucht eine Antwort auf die Frage: Was tut die Bereitschaft damit um drei Uhr nachts? Gibt es keine Handlung, ist es kein Alarm, sondern ein Bericht.

Rauschen bändigen, ohne blind zu werden

Qualitäts-Proxymetriken schwanken durch Nicht-Determinismus, Tagesverlauf und Nutzungsmix. Eine feste Schwelle auf ein rohes Signal erzeugt entweder Dauerlärm oder ist so hoch gesetzt, dass sie nichts fängt. Bewährt hat sich eine Kombination:

  • Zeitfenster und Mindestmenge: erst auslösen, wenn genug Anfragen im Fenster liegen — sonst alarmiert die Nacht mit zwanzig Anfragen.
  • Relativ statt absolut: gegen eine Baseline vergleichbarer Zeiträume oder gegen die parallel laufende Vorgängerversion.
  • Nach Segment schneiden: ein Problem in einer Sprache, einem Mandanten oder einer Anfrageklasse verschwindet im Gesamtdurchschnitt.
  • Mehrfenster-Logik: ein schnelles Fenster für den steilen Einbruch, ein langsames für die schleichende Verschlechterung.
MerksatzEin Alarm auf ein verrauschtes Signal braucht eine Mindestmenge und einen Vergleichsmaßstab. Ohne beides misst du Zufall.

Schweregrade für Qualitätsschäden

Ein Schweregradmodell, das nur Verfügbarkeit kennt, stuft eine LLM-Qualitätskrise systematisch zu niedrig ein — der Dienst ist ja erreichbar. Für probabilistische Dienste braucht das Modell eine zweite Achse: die Art des Schadens einer falschen Antwort.

  • Sicherheits- oder rechtlich relevante Falschauskunft an Kunden: höchste Stufe, unabhängig von der Häufigkeit.
  • Systematisch schlechtere, aber unschädliche Antworten: hoch, wenn breit; mittel, wenn eng begrenzt.
  • Einzelne auffällige Ausgaben ohne Muster: kein Incident, sondern ein Prüfauftrag.
  • Eine kaputte Ausgabeform, die nachgelagerte Systeme bricht: wie ein klassischer Ausfall behandeln.
MerksatzDer Schweregrad folgt dem Schaden, nicht der Fehlerrate. Eine seltene, aber gefährliche Falschauskunft ist schwerer als eine häufige, harmlose Unschönheit.

Bereitschaft kann ein Modell nicht reparieren. Sie kann aber eine begrenzte Menge von Hebeln ziehen — und genau die gehören vorbereitet, benannt und geübt.

Symptom bestätigen und eingrenzenLetzte Änderung suchen: Artefakt, Index, AnbieterZurückrollen oder Kill-Switch ziehenAuf Fallback degradierenAuswirkung kommunizierenNach der Entschärfung die Ursache untersuchen

Ein LLM-Runbook braucht zusätzlich zwei Dinge, die klassische Runbooks nicht haben: eine Liste der ausgabewirksamen Achsen, die sich zuletzt geändert haben können — auch ohne eigenen Deploy —, und einen vorbereiteten Weg, eine Stichprobe echter Ausgaben schnell anzusehen. Ohne Ausgabeeinsicht bleibt jede Diagnose eine Vermutung.

Gleich im CheckIn den nächsten Entscheidungen wählst du für konkrete Ops-Szenarien selbst — und siehst pro Option, warum sie trägt oder nicht.

Jetzt anwenden

Diesen Stoff gibt es als Modul mit bewerteten Entscheidungs-Checks — dieselbe Einführung, danach die Übungen.

Zum Modul →
Quellen & Aktualität5 Primärquellen · zuletzt geprüft:
  1. 01Google SRE Workbook, Implementing SLOs
  2. 02Google SRE Workbook, Alerting on SLOs
  3. 03Google SRE Workbook, Incident Response
  4. 04Google SRE Workbook, On-Call
  5. 05Google SRE Book, Postmortem Culture