Semantic Caching
La mise en cache sémantique renvoie une réponse de LLM stockée lorsqu’une nouvelle requête a le même sens qu’une requête précédente. La comparaison des plongements permet d’éviter de nouveaux appels au modèle et de réduire les coûts.
La mise en cache sémantique stocke les réponses d’un grand modèle de langage (LLM) ou d’un autre modèle génératif, puis les réutilise pour les nouvelles requêtes qui ont le même sens qu’une requête antérieure, même si leur formulation diffère. Le cache convertit chaque invite en incorporation vectorielle, trouve l’invite enregistrée la plus similaire et renvoie sa réponse lorsque la similarité dépasse un seuil. Un résultat du cache évite entièrement l’appel au modèle : la latence tombe à quelques millisecondes et la requête ne consomme aucun jeton. Comme la correspondance repose sur le sens, « J’ai oublié mon mot de passe » et « Comment réinitialiser mon mot de passe ? » renvoient à une même réponse enregistrée ; un cache à correspondance exacte, indexé par le texte de l’invite, devrait stocker cette réponse deux fois. Zilliz a publié en 2023 la bibliothèque open source GPTCache pour cette méthode, et les bases de données vectorielles et les passerelles API la proposent désormais comme fonctionnalité intégrée.
Fonctionnement d’un cache sémantique#
Un modèle d’incorporation de phrases encode l’invite entrante, puis une recherche vectorielle la compare aux incorporations vectorielles des invites auxquelles il a déjà été répondu, généralement par similarité cosinus. Les petits caches tiennent en mémoire, tandis que les grands sont hébergés dans une base de données vectorielle dotée d’un index approximatif des plus proches voisins. En cas d’échec du cache, le modèle génère une nouvelle réponse, puis enregistre ensemble l’incorporation vectorielle de la nouvelle invite et la réponse, généralement avec une durée d’expiration.
La clé de cache doit couvrir tous les autres éléments qui influent sur la réponse correcte. Les réponses générées avec une invite système, une version du modèle, un niveau d’autorisation utilisateur ou un ensemble de documents récupérés différents sont stockées dans des espaces distincts, de sorte que la réponse mise en cache pour un client n’est jamais renvoyée à un autre. La fraîcheur des données exige la même attention : lorsqu’un prix, une politique ou un document source change, les entrées fondées sur l’ancienne version continuent de correspondre aux nouvelles invites. Chaque entrée a donc une durée de vie, et l’espace concerné est vidé lorsque ses données sources changent.
Choisir le seuil de similarité#
Le seuil détermine dans quelle mesure deux invites peuvent différer tout en partageant une réponse. Cet exemple utilise le modèle all-MiniLM-L6-v2 de Sentence Transformers comme encodeur pour un cache à trois entrées :
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 reformulation de la question sur le mot de passe obtient un score de 0,89 et correspond correctement à une entrée. La reformulation sur les horaires d’ouverture n’obtient que 0,61 et ne trouve aucune correspondance. « Comment annuler ma commande ? » obtient 0,71 par rapport à « Comment annuler mon abonnement ? » et renverrait des instructions erronées. La similarité des incorporations vectorielles mesure les mots et les thèmes communs ; aucun seuil unique ne permet donc de distinguer ces trois cas. Les caches de production réduisent l’écart en ajustant finement l’encodeur sur des paires de paraphrases issues de leur propre trafic, en définissant des seuils par catégorie ou en transmettant chaque correspondance potentielle à un réordonnanceur qui évalue ensemble les deux invites avant de renvoyer la réponse mise en cache.
Quand utiliser la mise en cache sémantique#
La mise en cache sémantique est utile lorsque de nombreux utilisateurs posent les mêmes questions et que les réponses évoluent lentement : chatbots d’assistance, services d’assistance internes et assistants de génération augmentée par récupération (RAG) fondés sur une documentation stable. Les requêtes personnalisées, sensibles au facteur temps ou créatives en bénéficient peu, car une réponse réutilisée serait erronée ou répétitive.
Deux autres caches utilisés pour servir les LLM interviennent à d’autres niveaux :
- Mise en cache des invites : Le serveur du modèle stocke les états calculés d’un préfixe d’invite exact répété, ce qui raccourcit le préremplissage ; le modèle génère tout de même une nouvelle réponse.
- Cache KV : Les clés et les valeurs des jetons précédents sont conservées au cours d’une même génération, de sorte que chaque nouveau jeton évite de les recalculer.
La recherche sémantique utilise la même recherche par incorporations vectorielles pour récupérer des documents en réponse à une requête, tandis qu’un cache sémantique récupère des réponses déjà produites, souvent au sein d’une passerelle IA située entre les applications et les fournisseurs de modèles.
Les images peuvent servir de clés de cache de la même façon. embed() dans Ultralytics YOLO renvoie un vecteur de caractéristiques pour chaque image ; un modèle YOLO26 entraîné à la classification d’images peut donc fournir la clé de recherche qui permet aux images de caméra presque identiques de réutiliser la description antérieure d’un modèle vision-langage.










