Blog/LLMOps & Evals
Semantisches Caching für LLM-Apps: wann Antworten wiederverwenden sicher ist und wann nicht
Wie semantische Caches LLM-Antworten für ähnliche Fragen wiederverwenden, was sie vom Prompt-Caching trennt, wie man falsche Treffer und Lecks vermeidet.
Balázs Csorba··6 Min. Lesezeit
- Semantic cache
- LLM cost
- Latency
- Embeddings
- Redis

Das Wichtigste in Kürze
- Prompt-Caching nutzt beim Anbieter ein identisches Präfix wieder und ändert die Antwort nie; ein semantischer Cache liefert eine gespeicherte Antwort auf eine ähnliche Frage.
- In einem veröffentlichten Test mit Kundenservice-ähnlichen Fragen senkte ein semantischer Cache die API-Aufrufe um bis zu 68,8 % bei über 97 % korrekten Treffern.
- Die Ähnlichkeitsschwelle ist eine Produktentscheidung: Man setzt sie anhand gelabelter Fragepaare, die eine Antwort teilen müssen oder dürfen nicht.
- Cache-Schlüssel nach Mandant, Nutzer, Sprache und Datenstand trennen, sonst bekommt ein Kunde die Antwort eines anderen.
- Nur Antworten cachen, die nicht von frischen Daten oder persönlichem Kontext abhängen, und jedem Eintrag eine TTL und einen Invalidierungsweg geben.
Support-Assistenten und FAQ-Bots beantworten immer wieder dieselben Fragen: Wie setze ich mein Passwort zurück, wo ist meine Rechnung, wie lange dauert die Lieferung. Jede dieser Fragen kostet einen Modellaufruf. Ein semantischer Cache speichert die Antwort beim ersten Mal und liefert sie, wenn eine spätere Frage dasselbe meint, auch wenn sie anders formuliert ist. Gut gemacht, entfällt ein großer Teil der Aufrufe und die Antwort kommt in Millisekunden. Nachlässig gemacht, liefert er selbstsichere Antworten auf Fragen, die niemand gestellt hat.
Dieser Artikel trennt semantisches Caching vom Prompt-Caching der Anbieter, zeigt die Architektur und verbringt die meiste Zeit mit den Teilen, die über die Sicherheit entscheiden: Schwelle, Cache-Bereich, was man nicht cachen sollte und Invalidierung.
Was unterscheidet semantisches Caching vom Prompt-Caching?
| Aspekt | Prompt-Caching (Anbieter) | Semantisches Caching (eigenes) |
|---|---|---|
| Treffer | Exakt identisches Präfix | Ähnliche Bedeutung über einer Schwelle |
| Was wiederverwendet wird | Verarbeitete Eingabe-Tokens | Die ganze gespeicherte Antwort |
| Modell läuft trotzdem | Ja, die Antwort wird neu erzeugt | Nein, bei einem Treffer |
| Risiko falscher Antwort | Keines durchs Caching | Ja, bei falschem Treffer |
Die Dokumentation zum Prompt-Caching von Claude sagt klar, dass Treffer zu 100 % identische Prompt-Abschnitte verlangen und das Caching die Ausgabe nicht beeinflusst. Das ist von Haus aus sicher, und man sollte es zuerst einschalten; mehr dazu in Prompt-Caching und Modell-Routing. Ein semantischer Cache sitzt vor dem Modell und ist eine andere Art Entscheidung, denn er ändert, was der Nutzer bekommt.
Wie funktioniert ein semantischer Cache?
Bibliotheken wie GPTCache teilen das in einen Embedding-Generator, einen Speicher für Antworten, einen Vektorspeicher für Fragen und einen Similarity Evaluator, der entscheidet, ob ein Kandidat passt. Eine Bibliothek braucht man dafür nicht: Eine Embedding-Tabelle mit Vektorindex in Postgres, etwa pgvector, und zwanzig Zeilen Code reichen.
# Illustrative semantic cache on Postgres + pgvector
def cached_answer(question: str, scope: dict) -> str:
q = normalize(question)
vec = embed(q) # same model for writes and reads
row = db.fetchone("""
SELECT answer, 1 - (embedding <=> %(v)s) AS sim
FROM answer_cache
WHERE tenant = %(tenant)s AND lang = %(lang)s AND data_version = %(ver)s
AND expires_at > now()
ORDER BY embedding <=> %(v)s LIMIT 1""", {"v": vec, **scope})
if row and row.sim >= THRESHOLD:
metrics.hit(row.sim)
return row.answer
answer = call_model(question, scope)
if cacheable(question, answer):
db.execute("INSERT INTO answer_cache (...) VALUES (...)") # with expires_at = now() + ttl
return answer
Wie viel spart ein semantischer Cache?
Das Paper zu GPT Semantic Cache speicherte Anfrage-Embeddings in Redis und testete repetitive, kundenservice-ähnliche Anfragen. Es berichtet bis zu 68,8 % weniger API-Aufrufe, Trefferquoten zwischen 61,6 % und 68,8 % je nach Kategorie und korrekte Treffer, also Treffer mit richtiger Antwort, von über 97 %. Diese Zahlen stammen aus bewusst repetitivem Traffic. Eine Produkt-FAQ sieht so aus; ein offener Assistent oder ein Coding-Tool nicht und wird nur einen Bruchteil der Treffer sehen.
Vor dem Bauen messen: eine Woche Fragen loggen, einbetten und zählen, wie viele einen nahen Nachbarn haben, den ein Mensch als dieselbe Frage akzeptieren würde. Diese Zahl ist die Obergrenze.
Wie wählt man die Ähnlichkeitsschwelle?
Embedding-Ähnlichkeit misst das Thema, nicht die Absicht. Wie storniere ich meine Bestellung? und Wie kündige ich mein Abo? liegen im Vektorraum sehr nah und brauchen verschiedene Antworten. Kann ich geöffnete Artikel zurückgeben? und Kann ich ungeöffnete Artikel zurückgeben? unterscheiden sich um eine Vorsilbe und haben gegensätzliche Antworten. Eine auf durchschnittliche Ähnlichkeit getrimmte Schwelle liefert die eine für die andere.
- Einige hundert Paare echter Fragen sammeln und jedes labeln: gleiche oder andere Antwort. Die kniffligen Negativbeispiele bewusst aufnehmen.
- Die Ähnlichkeit jedes Paars mit dem Embedding-Modell berechnen, das in Produktion läuft.
- Die niedrigste Schwelle wählen, bei der falsche Treffer bei oder nahe null bleiben, und die daraus folgende Trefferquote akzeptieren.
- Die Prüfung bei jedem Wechsel des Embedding-Modells wiederholen, denn Ähnlichkeitsskalen unterscheiden sich zwischen Modellen.
Eine zweite Prüfung hilft im Grenzbereich: Bei Treffern knapp über der Schwelle ein kleines, günstiges Modell fragen, ob beide Fragen dieselbe Antwort haben. Das kostet weit weniger als die Antwort zu erzeugen und entfernt die meisten Beinahe-Treffer.
Wie verhindert man, dass ein semantischer Cache Daten preisgibt?
Ein Cache ist gemeinsamer Speicher zwischen Nutzern. Wird die Antwort auf Wie hoch ist mein aktueller Rabatt? ohne Kundennummer im Schlüssel gecacht, bekommt der nächste Kunde den Rabatt des ersten. Jede Abfrage nach allem trennen, wovon die Antwort abhängt:
- Mandant und bei persönlichen Antworten der Nutzer. Oder persönliche Antworten ganz vom Cache ausschließen.
- Sprache, damit eine deutsche Frage keine gecachte englische Antwort bekommt.
- Rolle oder Berechtigungsstufe, wenn interne Mitarbeitende mehr sehen als Kunden.
- Daten- und Prompt-Version: Eine neue Preisliste, ein neuer Richtlinientext oder System-Prompt sollte einen frischen Cache-Namensraum starten.
Gecachte Antworten mit personenbezogenen Daten sind gespeicherte personenbezogene Daten, mit den entsprechenden Löschpflichten; siehe PII-Redaktion in LLM-Pipelines. Ein Cache ist außerdem ein Schreibweg: Können Nutzer beliebige Modellausgaben speichern lassen, die anderen ausgeliefert werden, kann sich eine per Prompt Injection manipulierte Antwort verbreiten. Nur Antworten aus vertrauenswürdigen Abläufen speichern und nie aus Sitzungen, die die Guardrails markiert haben.
Wie lässt man gecachte Antworten ablaufen und invalidiert sie?
Drei Mechanismen kombinieren. Eine TTL für jeden Eintrag, eher Stunden oder Tage als Monate. Eine Version im Cache-Schlüssel für Daten und Prompt, aus denen die Antwort stammt, damit eine Inhaltsänderung in einen frischen Namensraum wechselt, statt Zeilen einzeln zu löschen. Und eine manuelle Bereinigung pro Dokument: Ändert jemand die Rückgaberichtlinie, alle Einträge löschen, deren Antwort dieses Dokument zitiert hat. Dafür muss man die Quell-IDs mit jeder Antwort speichern, was sich für Zitate ohnehin lohnt, wie bei Grounding und Zitaten.
Was sollte man überwachen?
| Metrik | Warum |
|---|---|
| Trefferquote pro Bereich | Zeigt, wo sich der Cache lohnt |
| Ähnlichkeitsverteilung der Treffer | Viele Treffer nahe der Schwelle bedeuten Risiko |
| Daumen-runter-Quote gecacht vs. frisch | Das direkte Signal falscher Treffer |
| Stichproben-Review der Treffer | Findet falsche Treffer, die Nutzer nicht melden |
Cache-Treffer wie jeden anderen Schritt tracen, mit Ähnlichkeitswert und ID des Eintrags, damit sich eine falsche Antwort auf die Frage zurückführen lässt, für die sie ursprünglich erzeugt wurde; siehe Observability für LLM-Agenten.
Quellen
Häufige Fragen
Was ist der Unterschied zwischen Prompt-Caching und semantischem Caching?
Prompt-Caching ist eine Anbieterfunktion, die das verarbeitete Präfix eines Prompts wiederverwendet, wenn es exakt gleich ist; das Modell erzeugt trotzdem eine neue Antwort. Semantisches Caching ist eine eigene Schicht, die eine früher erzeugte Antwort liefert, wenn eine neue Frage einer gecachten ähnlich genug ist, und den Modellaufruf ganz spart.
Wie viel spart ein semantischer Cache?
Das hängt davon ab, wie repetitiv der Traffic ist. Das Paper zu GPT Semantic Cache berichtet bei repetitiven, kundenservice-ähnlichen Fragen bis zu 68,8 % weniger API-Aufrufe, Trefferquoten von 61,6 bis 68,8 % und über 97 % korrekte Treffer. Offener Chat hat deutlich weniger Treffer.
Welche Ähnlichkeitsschwelle sollte ich nutzen?
Eine allgemeingültige Zahl gibt es nicht; sie hängt vom Embedding-Modell und der Domäne ab. Paare echter Fragen sammeln, die als gleiche oder unterschiedliche Antwort gelabelt sind, und die Schwelle wählen, bei der falsche Treffer auf diesem Satz nahe null bleiben.
Ist ein semantischer Cache mit personenbezogenen Daten sicher?
Nur wenn Cache-Einträge auf den Nutzer oder Mandanten beschränkt sind, dem sie gehören, und Antworten mit personenbezogenen Daten ausgeschlossen oder pro Nutzer gecacht werden. Ein gemeinsamer Cache ohne Trennung kann die Antwort eines Nutzers an einen anderen geben.
Wann sollte ich keinen semantischen Cache nutzen?
Wenn Antworten von Live-Daten wie Bestand, Preisen oder Bestellstatus abhängen, vom bisherigen Gespräch oder von den Rechten des Nutzers. Dann die teuren Teile cachen, etwa Retrieval-Ergebnisse oder Tool-Ausgaben, nicht die finale Antwort.