Semantic Caching
Il caching semantico restituisce una risposta LLM memorizzata quando una nuova query ha lo stesso significato di una precedente, confrontando gli embedding per saltare le chiamate al modello e ridurre i costi.
La cache semantica archivia le risposte di un modello linguistico di grandi dimensioni (LLM) o di un altro modello generativo e le riutilizza per le nuove richieste che hanno lo stesso significato di una richiesta precedente, anche quando la formulazione è diversa. La cache converte ogni prompt in un embedding, trova il prompt archiviato più simile e restituisce la risposta salvata se la similarità supera una soglia. Un riscontro evita del tutto la chiamata al modello, riducendo la latenza a pochi millisecondi e azzerando il consumo di token della richiesta. Poiché la corrispondenza si basa sul significato, «Ho dimenticato la password» e «Come posso reimpostare la password?» condividono la stessa risposta archiviata, che una cache a corrispondenza esatta indicizzata sul testo del prompt avrebbe dovuto memorizzare due volte. Nel 2023 Zilliz ha pubblicato la libreria open source GPTCache per questo schema; oggi i database vettoriali e i gateway API lo offrono come funzionalità integrata.
Come funziona una cache semantica#
Un modello di embedding di frasi codifica il prompt in arrivo e una ricerca vettoriale lo confronta con gli embedding dei prompt a cui è già stata data risposta, di solito tramite la similarità coseno. Le cache piccole entrano in memoria, mentre quelle grandi risiedono in un database vettoriale con un indice approssimato dei vicini più prossimi. Se non trova una corrispondenza, il modello genera una nuova risposta e il nuovo embedding del prompt viene archiviato insieme alla risposta, solitamente con una scadenza.
La chiave della cache deve includere tutto il resto che può cambiare la risposta corretta. Le risposte generate con un prompt di sistema, una versione del modello, un livello di autorizzazione utente o un insieme di documenti recuperati diversi vengono archiviate in ambiti separati, così la risposta in cache di un cliente non viene mai fornita a un altro. Anche la freschezza richiede la stessa attenzione: quando cambiano un prezzo, una policy o un documento di origine, le voci basate sulla versione precedente continuano a corrispondere ai nuovi prompt; perciò ogni voce ha una durata di validità e l'ambito interessato viene svuotato quando cambiano i dati di origine.
Scegliere la soglia di similarità#
La soglia stabilisce quanto possono essere diversi due prompt perché condividano comunque una risposta. Questo esempio usa il modello all-MiniLM-L6-v2 di Sentence Transformers come codificatore per una cache con tre voci:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("all-MiniLM-L6-v2")
# Earlier prompts whose answers are already stored in the cache
cached = ["How do I reset my password?", "What are your opening hours?", "How do I cancel my subscription?"]
cached_embeddings = model.encode(cached)
# Each new prompt reuses the closest cached answer if it clears the threshold
queries = ["I forgot my password, how can I change it?", "When does the store open?", "How do I cancel my order?"]
for query in queries:
query_embedding = model.encode(query)
scores = model.similarity(query_embedding, cached_embeddings)[0]
best = scores.argmax().item()
status = "hit" if scores[best] >= 0.7 else "miss"
print(f"{query} -> {cached[best]} ({scores[best]:.2f}, {status})")La parafrasi sulla password ottiene 0,89 ed è un riscontro corretto. La parafrasi sugli orari di apertura ottiene solo 0,61 e non trova corrispondenze. «Come annullo il mio ordine?» ottiene 0,71 rispetto a «Come annullo il mio abbonamento?» e restituirebbe istruzioni sbagliate. La similarità tra embedding misura la corrispondenza di formulazione e argomento, quindi nessuna singola soglia distingue questi tre casi. Le cache in produzione riducono il problema con il fine-tuning dell'encoder su coppie di parafrasi ricavate dal proprio traffico, soglie specifiche per categoria o l'invio di ogni possibile riscontro a un riordinatore, che valuta insieme i due prompt prima di restituire la risposta in cache.
Dove si inserisce la cache semantica#
La cache semantica è utile quando molti utenti fanno le stesse domande e le risposte cambiano lentamente: chatbot di supporto, help desk interni e assistenti di generazione aumentata dal recupero (RAG) basati su documentazione stabile. Le richieste personalizzate, sensibili al tempo o creative ne traggono pochi vantaggi, perché una risposta riutilizzata potrebbe essere sbagliata o ripetitiva.
Altre due cache usate nell'erogazione degli LLM operano a livelli diversi:
- Cache dei prompt: il server del modello archivia gli stati calcolati di un prefisso di prompt ripetuto esattamente, riducendo la fase di prefill; il modello genera comunque una nuova risposta.
- Cache KV: le chiavi e i valori dei token precedenti vengono conservati durante una singola generazione, così per ogni nuovo token non serve ricalcolarli.
La ricerca semantica usa la stessa ricerca tramite embedding per recuperare documenti in base a una query; una cache semantica la usa per recuperare risposte già generate, spesso all'interno di un gateway AI che si interpone tra le applicazioni e i fornitori di modelli.
Anche le immagini possono fungere da chiavi per una cache. embed() in Ultralytics YOLO restituisce un vettore di caratteristiche per ogni immagine, quindi un modello YOLO26 addestrato per la classificazione delle immagini può fornire la chiave di ricerca che consente a fotogrammi quasi duplicati ripresi da una videocamera di riutilizzare una descrizione precedente di un modello visione-linguaggio.










