Latenz, Streaming & Caching
Die erste Ausgabe erscheint schnell, trotzdem steigen Abbrüche und Kosten. Gleichzeitig liefert ein Cache gelegentlich eine alte Antwort aus. Das Modul verbindet wahrgenommene Reaktivität mit End-to-End-Deadlines, Prefix-Reuse, Cache-Keys und belastbarer Invalidierung.
Lehrtext · 11 Abschnitte · zuletzt geprüft: 2026-09-04
Warum „Antwortzeit“ hier mehrdeutig ist
Bei einem klassischen HTTP-Dienst ist Latenz die Zeit bis zur vollständigen Antwort. Ein generativer Dienst produziert die Antwort inkrementell: erst nach einer Vorlaufphase erscheint das erste Token, danach fließen weitere Token nach. Damit zerfällt „Antwortzeit“ in mindestens drei Größen, die unterschiedliche Ursachen und unterschiedliche Gegenmaßnahmen haben.
- Time to first token (TTFT)
- Zeit bis zum ersten sichtbaren Zeichen — dominiert das Gefühl von Reaktivität.
- Token-Rate
- Wie schnell die Ausgabe danach nachfließt — bestimmt, ob Lesen oder Warten führt.
- Gesamtdauer
- Zeit bis zum letzten Token — bestimmt Timeouts, Kosten und Kapazitätsbindung.
Diese Größen laufen auseinander. Ein Dienst kann sehr schnell anfangen und trotzdem lange dauern; eine Optimierung, die die Gesamtdauer senkt, kann die TTFT verschlechtern. Wenn dein Dashboard nur eine Latenzzahl kennt, kannst du eine Regression nicht zuordnen.
Betriebsprobe: LATENCY-BUDGET
Szenario
Support meldet: „Der Assistent ist seit dem letzten Release träge.“ Euer Dashboard zeigt eine einzige Metrik request_duration_seconds, deren p95 von 6,0 s auf 6,4 s gestiegen ist — statistisch kaum auffällig. Die Beschwerden sind trotzdem eindeutig und häufen sich. Das Release enthielt eine neue synchrone Eingabeprüfung vor dem Modellaufruf.
Anforderungen
- Was ist der nächste Schritt, um die Klage zu erklären?
- Bewerte Ursache, wirksame Grenze und den Preis der tragfähigen Maßnahme getrennt.
Schritte
- Tragfähiger Ansatz: TTFT als eigene Metrik erheben und die Gesamtdauer über Spans auf die Pipeline-Stufen aufteilen, bevor irgendetwas geändert wird. Richtig. Die Klage betrifft Reaktivität, die Metrik misst Gesamtdauer — das sind verschiedene Größen. Erst die Zerlegung zeigt, ob die neue Vorprüfung die Zeit bis zum ersten Token verschoben hat.
- Plausibler Fehlweg: Auf ein kleineres, schnelleres Modell wechseln, weil die Inferenz der größte Latenzblock ist. Das ist eine Annahme ohne Messung. Eine synchrone Vorprüfung liegt vor der Inferenz und würde die TTFT anheben, ohne dass ein Modellwechsel daran etwas ändert — und du zahlst die Qualitätsminderung umsonst.
- Plausibler Fehlweg: Das p95-Ziel auf 7 s anheben, da die Änderung im Rauschen liegt und das SLO sonst dauernd flappt. Das definiert die Beschwerde weg. Die Nutzer erleben eine reale Verschiebung, die deine Metrik nicht abbildet — ein angepasstes Ziel macht dich nur blinder.
- Plausibler Fehlweg: Streaming aktivieren, damit die Antwort sofort erscheint. Plausibel, aber verfrüht. Streaming kann die TTFT nicht unter die Vorlaufzeit drücken, die vor dem ersten Token liegt — läuft die Prüfung synchron davor, bleibt genau die gemeldete Trägheit bestehen.
Merksatz: Eine Nutzerklage ist erst diagnostizierbar, wenn sie auf eine Größe abgebildet ist, die du getrennt misst. Aggregate über heterogene Phasen verstecken Verschiebungen zwischen den Phasen. + Die Ursache wird zuordenbar statt geraten. − Zerlegung kostet Instrumentierungsarbeit und zusätzliche Metrik- beziehungsweise Span-Dimensionen, die Speicher und Kardinalität erhöhen.
Das Latenz-Budget entlang der Kette
Die Gesamtdauer eines LLM-Requests ist eine Summe über Stufen, nicht eine Eigenschaft des Modells. Erst wenn du das Budget auf die Stufen aufteilst, weißt du, wo Optimierung überhaupt etwas bringt.
Ein typischer Fehler: Alle Aufmerksamkeit geht an die Inferenz, während eine synchrone Guardrail-Prüfung oder ein langsamer Retrieval-Hop einen erheblichen Teil des Budgets frisst. Die Zuordnung liefert dir das verteilte Tracing aus dem Observability-Modul — Latenz-Arbeit ohne Spans ist Raten.
Betriebsprobe: PERCEIVED-LATENCY
Szenario
Ein interaktives Chat-Feature soll spürbar reaktiver werden. Messung: TTFT p95 liegt bei 4,2 s, davon entfallen rund 3 s auf einen Retrieval-Schritt mit anschließendem Reranking, der Rest auf die Vorlaufphase der Inferenz. Die Gesamtdauer p95 liegt bei 11 s, die Antwortqualität gilt als gut und darf nicht sinken.
Anforderungen
- Welche Maßnahme greift die gemeldete Reaktivität am direktesten an?
- Bewerte Ursache, wirksame Grenze und den Preis der tragfähigen Maßnahme getrennt.
Schritte
- Tragfähiger Ansatz: Die Stufen vor dem ersten Token angehen — Retrieval und Reranking parallelisieren oder in ein Zeitbudget mit Teilergebnis zwingen — und den Fortschritt sichtbar machen, solange noch kein Token fließt. Richtig. Reaktivität hängt an dem, was vor dem ersten Token liegt. Ein Zeitbudget mit Teilergebnis begrenzt genau diesen Block, und sichtbarer Fortschritt trägt die verbleibende Wartezeit.
- Plausibler Fehlweg:
max_tokenssenken, damit die Antworten kürzer und damit schneller werden — als einheitliche Gateway-Vorgabe für interaktive und asynchrone Arbeitsklassen ausgerollt und ohne getrennte Qualitäts- oder Deadline-Gates als globaler Standard beibehalten. Das verkürzt die Gesamtdauer, nicht die TTFT — der Nutzer wartet unverändert lange auf das erste Zeichen. Zusätzlich beschneidest du die Antwortqualität, die laut Vorgabe erhalten bleiben soll. - Plausibler Fehlweg: Auf ein größeres Modell mit höherer Token-Rate wechseln. Die Token-Rate wirkt erst nach dem ersten Token. Ein Modellwechsel adressiert die falsche Größe und ändert obendrein das Qualitäts- und Kostenprofil, das gerade stabil ist.
- Plausibler Fehlweg: Die Antworten vollständig serverseitig fertigstellen und erst dann in einem Stück ausliefern, das wirkt ruhiger als ein zeilenweise wachsender Text. Das verschlechtert die gemeldete Größe direkt: Der Nutzer sieht dann erst nach der vollen Generationsdauer etwas. Ruhige Darstellung ist ein Layout-Problem, kein Grund, die Ausgabe zurückzuhalten.
Merksatz: Optimiere die Phase, in der die Wartezeit tatsächlich anfällt. Bei generativen Diensten entscheidet alles vor dem ersten Token über das Reaktivitätsgefühl — alles danach über Dauer und Kosten. + Der Dienst wirkt reaktiver, ohne die Antwortqualität anzutasten. − Ein hartes Zeitbudget im Retrieval liefert gelegentlich einen dünneren Kontext; dieser Qualitätsverlust muss gemessen und begrenzt werden, sonst tauschst du Reaktivität still gegen Genauigkeit.
Streaming ist eine Betriebsentscheidung, keine UI-Kosmetik
Streaming ändert die Gesamtdauer nicht. Es ändert, wann der Nutzer das erste Zeichen sieht, und macht damit lange Generationen erträglich. Betrieblich hat das Folgen, die über die UI hinausgehen.
- Die Verbindung bleibt für die volle Generationsdauer offen — Proxys, Load-Balancer und Gateways brauchen passende Idle- und Read-Timeouts.
- Ein Fehler kann mitten in der Antwort auftreten, wenn der Client bereits Text sieht — ein simpler Retry würde doppelten Text erzeugen.
- Ausgabe-Validierung, die das vollständige Ergebnis braucht (etwa strikte Schema-Prüfung), kollidiert mit früher Anzeige.
- Abbruch durch den Nutzer wird betrieblich wertvoll: du kannst die Generation stoppen und Kosten sparen — wenn dein Stack den Abbruch bis zum Anbieter durchreicht.
Betriebsprobe: STREAMING-TTFT
Szenario
Ein Batch-Job erzeugt nachts Zusammenfassungen und schreibt sie in eine Datenbank; kein Mensch wartet auf eine einzelne Antwort. Der Job läuft an die Grenze seines Zeitfensters. Ein Kollege schlägt vor, die Aufrufe auf Streaming umzustellen, „weil das schneller ist“.
Anforderungen
- Wie bewertest du den Vorschlag?
- Bewerte Ursache, wirksame Grenze und den Preis der tragfähigen Maßnahme getrennt.
Schritte
- Tragfähiger Ansatz: Ablehnen: Streaming senkt die Gesamtdauer nicht, sondern nur die Zeit bis zum ersten Token — für einen Job ohne wartenden Menschen bringt es keinen Durchsatz, sondern nur mehr Verbindungs- und Fehlerkomplexität. Richtig. Der Engpass ist Durchsatz im Zeitfenster, nicht Reaktivität. Streaming adressiert eine Größe, die hier niemanden betrifft, und bringt zusätzlich Teilantwort- und Timeout-Fälle mit.
- Plausibler Fehlweg: Zustimmen: Streaming reduziert die Wartezeit pro Aufruf und damit auch die Gesamtlaufzeit des Jobs — als einheitliche Gateway-Vorgabe für interaktive und asynchrone Arbeitsklassen ausgerollt und ohne getrennte Qualitäts- oder Deadline-Gates als globaler Standard beibehalten. Die Prämisse stimmt nicht. Der letzte Token kommt beim Streaming nicht früher; nur der erste. Die Summe der Generationszeiten bleibt gleich.
- Plausibler Fehlweg: Zustimmen, weil Streaming durch frühere Freigabe der Verbindung Kapazität spart. Umgekehrt: Beim Streaming bleibt die Verbindung über die volle Generationsdauer offen. Kapazität wird nicht früher frei.
- Plausibler Fehlweg: Zustimmen, weil du beim Streaming abbrechen kannst, sobald die Zusammenfassung lang genug ist. Verlockend, aber es löst das genannte Problem auf riskante Weise: ein Abbruch nach Zeichenzahl kappt die Zusammenfassung mitten im Satz. Wenn die Länge das Problem ist, ist das Ausgabelimit beziehungsweise der Antwortvertrag der richtige Hebel — nicht das Transportverfahren.
Merksatz: Wähle eine Optimierung nach der Größe, die dein Engpass tatsächlich ist. Reaktivitäts-Techniken helfen dort nicht, wo Durchsatz oder Gesamtdauer bindet. + Kein Umbau ohne Wirkung, keine neue Fehlerklasse im Batch-Pfad. − Der eigentliche Engpass bleibt offen und muss über Parallelität, kürzere Ausgaben oder ein anderes Zeitfenster gelöst werden — das ist die unbequemere Arbeit.
Timeouts: die Kette muss konsistent sein
Ein Timeout ist die Aussage „ab hier ist Warten wertloser als Aufgeben“. Bei generativen Diensten ist die Streuung der Gesamtdauer groß, weil die Ausgabelänge variiert — ein Timeout, das am Mittelwert kalibriert ist, kappt systematisch die langen, oft wertvollsten Antworten.
Zwei Regeln tragen: Erstens muss das Timeout außen größer sein als innen — ein Gateway, das früher abbricht als der Anwendungsdienst, erzeugt verwaiste Arbeit, die weiterläuft, Tokens verbraucht und niemanden erreicht. Zweitens ist bei Streaming ein Idle-Timeout (Zeit ohne neues Token) oft aussagekräftiger als ein Gesamt-Timeout, weil es Stillstand von Länge unterscheidet.
Betriebsprobe: PREFIX-REUSE
Szenario
Eine Anwendung schickt bei jedem Aufruf einen umfangreichen, immer gleichen Systemkontext (Richtlinien, Formatvorgaben, Beispiele) und hängt hinten die kurze Nutzerfrage an. Die TTFT ist hoch, die Ausgaben sind kurz. Aus historischen Gründen wird der Systemkontext bei jedem Aufruf leicht anders zusammengebaut — etwa mit einem eingebetteten Zeitstempel am Anfang.
Anforderungen
- Welche Änderung senkt die Vorlaufzeit am wirksamsten?
- Bewerte Ursache, wirksame Grenze und den Preis der tragfähigen Maßnahme getrennt.
Schritte
- Tragfähiger Ansatz: Den gleichbleibenden Teil des Kontexts zeichengenau stabil und an den Anfang stellen, Variables ans Ende — damit ist der unveränderte Anfang über Aufrufe hinweg wiederverwendbar. Richtig. Prefix-Wiederverwendung greift nur, solange der Anfang identisch ist; ein wechselnder Zeitstempel ganz vorn macht jeden Aufruf zu einem neuen Präfix und verschenkt genau diesen Effekt.
- Plausibler Fehlweg: Einen ähnlichkeitsbasierten Antwort-Cache vor den Aufruf setzen. Das adressiert eine andere Ebene: Es hilft nur, wenn sich die Fragen wiederholen. Hier wiederholt sich der Systemkontext, nicht notwendigerweise die Nutzerfrage — die Vorlaufzeit bleibt bei jeder neuen Frage bestehen.
- Plausibler Fehlweg:
max_tokenssenken, um die Vorlaufzeit zu reduzieren. Das Ausgabelimit wirkt auf die Generierungsphase, nicht auf die Verarbeitung der Eingabe. Die Ausgaben sind laut Szenario ohnehin kurz. - Plausibler Fehlweg: Den Systemkontext radikal kürzen, bis die Vorlaufzeit passt. Ein legitimer Hebel, aber hier der teurere: Er opfert Richtlinien und Beispiele, die die Antwortqualität tragen, obwohl die Kosten der Wiederholung durch stabile Anordnung ohne Qualitätsverlust vermeidbar sind.
Merksatz: Wiederverwendung setzt Stabilität voraus. Ordne einen Kontext so, dass das Unveränderliche vorn steht und das Veränderliche hinten — das gilt für Präfix-Wiederverwendung wie für jede andere Form von inkrementellem Caching. + Deutlich geringere Vorlaufzeit und weniger wiederholte Verarbeitung ohne jeden Qualitätsverlust. − Die Kontextreihenfolge wird zu einer Betriebseigenschaft, die niemand versehentlich ändern darf; das braucht einen Test oder eine Prüfung im Release-Pfad.
Wahrgenommene Latenz und der ehrliche Trade-off
Wartezeit wird nicht linear erlebt: Reaktionen unterhalb weniger Zehntelsekunden wirken unmittelbar, um die Sekunde herum bleibt der Gedankenfluss erhalten, danach braucht es Fortschrittsanzeigen, damit die Aufmerksamkeit hält. Genau deshalb wirkt ein Dienst mit früher TTFT schneller als ein gleich langer ohne Streaming.
Trotzdem darf die wahrgenommene Latenz die gemessene nicht ersetzen. Kosten, Kapazität, Queue-Alter und Timeouts hängen an der Gesamtdauer. Ein Dienst, der sich schnell anfühlt und dabei Kapazität doppelt so lange bindet, kippt unter Last.
ai-foundations. Hier geht es um Latenz als laufend gemessene und durchgesetzte Betriebsgröße.Was die Checks prüfen
- Ob du eine Latenzklage der richtigen Größe zuordnest (TTFT, Rate, Gesamtdauer)
- Wann Streaming das richtige Mittel ist — und wann es das Problem nur verdeckt
- Wie du Timeouts entlang einer Kette konsistent setzt
- Wie du das Latenz-Budget auf Stufen aufteilst, statt pauschal am Modell zu drehen
Drei verschiedene Dinge heißen „Cache“
Im LLM-Betrieb werden drei völlig unterschiedliche Mechanismen gleich genannt. Sie haben verschiedene Trefferbedingungen, verschiedene Risiken und verschiedene Zuständige — sie zu verwechseln führt zu Diskussionen, in denen alle recht haben und niemand dasselbe meint.
- Exakter Antwort-Cache
- Gleiche Anfrage plus gleicher Kontext liefert die gespeicherte Antwort. Trefferbedingung ist Gleichheit.
- Ähnlichkeitsbasierter Cache
- Eine hinreichend ähnliche frühere Anfrage liefert deren Antwort. Trefferbedingung ist eine Schwelle.
- Prefix-Wiederverwendung
- Ein gleichbleibender Kontextanfang muss nicht erneut verarbeitet werden. Spart Vorlaufzeit, erzeugt aber keine fertige Antwort.
Der Cache-Schlüssel ist die eigentliche Designentscheidung
Ein Antwort-Cache ist nur so korrekt wie sein Schlüssel. Alles, was die Ausgabe beeinflusst, muss im Schlüssel stecken — fehlt ein Faktor, liefert der Cache Antworten aus einem anderen Zustand.
- Nutzereingabe in normalisierter Form
- Prompt-Version und Modell-Pin
- Decoding-Parameter, soweit sie die Ausgabe bestimmen
- Retrieval-Ergebnis oder eine Version des zugrunde liegenden Index
- Berechtigungs- beziehungsweise Mandantenkontext
Ähnlichkeitsbasiertes Caching: hohe Trefferquote, echtes Risiko
Ein ähnlichkeitsbasierter Cache beantwortet eine neue Frage mit der Antwort auf eine andere, ähnlich eingebettete Frage. Die Trefferquote steigt dadurch deutlich — aber die Schwelle entscheidet über eine Fehlerklasse, die es beim exakten Cache nicht gibt: eine sachlich falsche, aber flüssig passende Antwort.
Besonders tückisch sind kleine Unterschiede mit großer Bedeutung: eine verneinte Frage, eine andere Jahreszahl, ein anderer Vertragstyp. Solche Paare liegen im Einbettungsraum nah beieinander und sind inhaltlich unvereinbar.
Invalidierung: der Teil, der den Cache betreibbar macht
Ein Cache ohne Invalidierungsplan liefert nach jeder Änderung veraltete Antworten — und zwar genau dann, wenn eine Korrektur eilt. Drei Ereignisse müssen einen Cache mindestens ungültig machen: ein neues Release des Prompt-Modell-Artefakts, eine Änderung der zugrunde liegenden Wissensbasis und eine inhaltliche Korrektur nach einem Vorfall.
Praktisch am robustesten ist Versionierung statt aktivem Löschen: Nimmt der Schlüssel die Artefakt- und Indexversion auf, sind alte Einträge nach einem Release automatisch unerreichbar und laufen über die Ablaufzeit aus. Ein zusätzlicher Sofort-Löschpfad bleibt für den Vorfall nötig — ein einzelner toxischer Eintrag darf nicht bis zum nächsten Release ausgeliefert werden.
Wann Caching wirklich hilft
Caching lohnt sich, wenn Anfragen sich wiederholen. Bei stark verteilten, individuellen Anfragen bleibt die Trefferquote niedrig, und du betreibst zusätzliche Infrastruktur mit zusätzlicher Latenz im Fehlschlagfall für wenig Ersparnis. Miss deshalb vor dem Bau die tatsächliche Wiederholungsrate — nicht die vermutete.
- Gut geeignet: häufige Standardfragen, geteilte Systemkontexte, wiederkehrende Batch-Eingaben, teure Zwischenschritte.
- Schlecht geeignet: stark personalisierte Antworten, zeitkritische Fakten, kreative Ausgaben mit erwarteter Variation.
- Immer zu messen: Trefferquote, ersparte Kosten, zusätzliche Latenz bei Fehlschlag und — bei Ähnlichkeit — die Falschtrefferrate.
Jetzt anwenden
Diesen Stoff gibt es als Modul mit bewerteten Entscheidungs-Checks — dieselbe Einführung, danach die Übungen.
Zum Modul →