Wie implementiert man ein effektives Semantic Caching, um redundante LLM-Aufrufe bei hoher Ähnlichkeit der Prompts zu vermeiden?

Die Implementierung eines Semantic Caching erfolgt über die Transformation von Texteingaben in hochdimensionale Vektoren (Embeddings), um semantische Ähnlichkeiten statt exakter Zeichenfolgen zu vergleichen. Wir setzen hierfür eine Architektur ein, die aus einem Embedding-Modell, einer Vektordatenbank und einer definierten Ähnlichkeitsschwelle besteht.

Der technische Workflow gliedert sich in folgende Schritte:

  1. Vektorisierung: Der eingehende Prompt wird durch ein Embedding-Modell (z. B. text-embedding-3-small) in einen Vektor umgewandelt.
  2. Ähnlichkeitssuche: Dieser Vektor wird gegen eine Vektordatenbank (z. B. Redis VL, Milvus oder Pinecone) abgefragt. Dabei wird die Cosine Similarity berechnet, um den Abstand zwischen dem aktuellen Prompt und bereits gespeicherten Prompts zu ermitteln.
  3. Schwellenwert-Prüfung: Liegt die Ähnlichkeit über einem definierten Schwellenwert (z. B. 0,95), wird die Antwort aus dem Cache zurückgegeben.
  4. Cache-Update: Unterschreitet die Ähnlichkeit den Wert, erfolgt der LLM-Aufruf. Das Ergebnis sowie der zugehörige Prompt-Vektor werden im Cache gespeichert.

Im Vergleich zum klassischen Key-Value-Caching ergeben sich folgende Unterschiede:

MerkmalExact Match CachingSemantic Caching
Matching-LogikString-IdentitätVektor-Distanz (Cosine Similarity)
TrefferquoteNiedrig (nur bei identischem Text)Hoch (auch bei Umformulierungen)
LatenzMinimal ($\mu$s)Gering (Embedding-Zeit + Vektor-Suche)
KomplexitätGeringMittel (erfordert Embedding-Pipeline)

Die Wahl der Vektordatenbank und die Optimierung der Indexierung fallen in den Bereich unseres Data Engineering, da die Performance des Caches direkt von der Effizienz der Nearest-Neighbor-Suche abhängt. Um "Cache Drift" zu vermeiden, implementieren wir TTL-Werte (Time-to-Live) oder Validierungsmechanismen, die sicherstellen, dass veraltete Antworten bei Modell-Updates gelöscht werden.

Wir empfehlen, den Ähnlichkeitsschwellenwert pro Use-Case dynamisch zu kalibrieren, da ein zu hoher Wert die Cache-Hit-Rate unnötig senkt, während ein zu niedriger Wert zu faktisch falschen Antworten führt, wenn nuancierte Unterschiede im Prompt die Antwort grundlegend ändern.

Sergej Wiens

Sergej Wiens

Gründer & Software Architekt