Stratégies de Mise en Cache pour Réduire la Latence et le Coût RAG

Réduisez les Coûts de 80% : Implémentez la Mise en Cache Sémantique, la Mise en Cache d'Embeddings et la Mise en Cache de Réponses pour un RAG Production.

Auteur
Équipe de Recherche Ailog
Date de publication
Temps de lecture
10 min de lecture
Niveau
intermediate
Étape du pipeline RAG
Optimization

Pourquoi utiliser le cache ?

Sans cache : • Chaque requête → Appel API ($$$) • Latence de 500ms+ • Limitations de débit

Avec cache : • Réduction des coûts de 80% • Réponses en 10ms depuis le cache • Pas de limitations de débit Cache sémantique de requêtes

Ne cachez pas les correspondances exactes - cachez les requêtes similaires :

``python import numpy as np from sentence_transformers import SentenceTransformer

model = SentenceTransformer('all-MiniLM-L6-v2') cache = {} {embedding: response}

def semantic_cache_lookup(query, threshold=0.95): query_emb = model.encode(query)

Vérifier si une requête similaire est dans le cache for cached_emb, response in cache.items(): similarity = np.dot(query_emb, cached_emb) if similarity > threshold: return response Cache hit!

return None Cache miss

def rag_with_cache(query): Vérifier d'abord le cache cached = semantic_cache_lookup(query) if cached: return cached

Cache miss - exécuter le pipeline RAG complet response = full_rag_pipeline(query)

Stocker dans le cache cache[model.encode(query)] = response

return response ` Cache d'embeddings

Mettez en cache les embeddings pour éviter de les recalculer :

`python import hashlib import redis

redis_client = redis.Redis(host='localhost', port=6379)

def get_embedding_cached(text): Créer une clé de cache cache_key = f"emb:{hashlib.md5(text.encode()).hexdigest()}"

Vérifier le cache cached = redis_client.get(cache_key) if cached: return np.frombuffer(cached, dtype=np.float32)

Calculer l'embedding embedding = openai_embed(text)

Stocker dans le cache (expire après 7 jours) redis_client.setex( cache_key, 604800, 7 jours embedding.tobytes() )

return embedding ` Intégration GPTCache

`python from gptcache import Cache from gptcache.embedding import OpenAI from gptcache.similarity_evaluation import SearchDistanceEvaluation

cache = Cache() cache.init( embedding_func=OpenAI().to_embeddings, similarity_evaluation=SearchDistanceEvaluation(), )

def cached_llm_call(prompt): Vérifier le cache cached_response = cache.get(prompt) if cached_response: return cached_response

Appeler le LLM response = openai.ChatCompletion.create( model="gpt-4", messages=[{"role": "user", "content": prompt}] )

Mettre en cache la réponse cache.set(prompt, response)

return response ` Cache à deux niveaux

Mémoire rapide + Redis persistant :

`python from functools import lru_cache import redis

redis_client = redis.Redis()

@lru_cache(maxsize=1000) def l1_cache(query): Cache L2 (Redis) cached = redis_client.get(f"rag:{query}") if cached: return cached.decode()

Cache miss - calculer result = rag_pipeline(query)

Stocker dans L2 redis_client.setex(f"rag:{query}", 3600, result)

return result ` Invalidation du cache

`python import time

cache_with_ttl = {}

def get_with_ttl(key, ttl=3600): if key in cache_with_ttl: value, timestamp = cache_with_ttl[key] if time.time() - timestamp < ttl: return value else: del cache_with_ttl[key] Expiré

return None

def set_with_ttl(key, value): cache_with_ttl[key] = (value, time.time()) ``

Analyse des coûts

Sans cache (1M requêtes/mois) : • Embeddings : 100$ • LLM : 3000$ • Total : 3100$

Avec cache (taux de succès de 80%) : • Embeddings : 20$ • LLM : 600$ • Redis : 50$ • Total : 670$ (économie de 78%)

Le cache est le fruit le plus accessible pour l'optimisation RAG. Implémentez-le dès le début.

Tags

  • caching
  • optimization
  • cost
  • latency
7. OptimizationIntermédiaire

Stratégies de Mise en Cache pour Réduire la Latence et le Coût RAG

20 novembre 2025
10 min de lecture
Équipe de Recherche Ailog

Réduisez les Coûts de 80% : Implémentez la Mise en Cache Sémantique, la Mise en Cache d'Embeddings et la Mise en Cache de Réponses pour un RAG Production.

Pourquoi utiliser le cache ?

Sans cache :

  • Chaque requête → Appel API ($$$)
  • Latence de 500ms+
  • Limitations de débit

Avec cache :

  • Réduction des coûts de 80%
  • Réponses en 10ms depuis le cache
  • Pas de limitations de débit

1. Cache sémantique de requêtes

Ne cachez pas les correspondances exactes - cachez les requêtes similaires :

DEVELOPERpython
import numpy as np from sentence_transformers import SentenceTransformer model = SentenceTransformer('all-MiniLM-L6-v2') cache = {} # {embedding: response} def semantic_cache_lookup(query, threshold=0.95): query_emb = model.encode(query) # Vérifier si une requête similaire est dans le cache for cached_emb, response in cache.items(): similarity = np.dot(query_emb, cached_emb) if similarity > threshold: return response # Cache hit! return None # Cache miss def rag_with_cache(query): # Vérifier d'abord le cache cached = semantic_cache_lookup(query) if cached: return cached # Cache miss - exécuter le pipeline RAG complet response = full_rag_pipeline(query) # Stocker dans le cache cache[model.encode(query)] = response return response

2. Cache d'embeddings

Mettez en cache les embeddings pour éviter de les recalculer :

DEVELOPERpython
import hashlib import redis redis_client = redis.Redis(host='localhost', port=6379) def get_embedding_cached(text): # Créer une clé de cache cache_key = f"emb:{hashlib.md5(text.encode()).hexdigest()}" # Vérifier le cache cached = redis_client.get(cache_key) if cached: return np.frombuffer(cached, dtype=np.float32) # Calculer l'embedding embedding = openai_embed(text) # Stocker dans le cache (expire après 7 jours) redis_client.setex( cache_key, 604800, # 7 jours embedding.tobytes() ) return embedding

3. Intégration GPTCache

DEVELOPERpython
from gptcache import Cache from gptcache.embedding import OpenAI from gptcache.similarity_evaluation import SearchDistanceEvaluation cache = Cache() cache.init( embedding_func=OpenAI().to_embeddings, similarity_evaluation=SearchDistanceEvaluation(), ) def cached_llm_call(prompt): # Vérifier le cache cached_response = cache.get(prompt) if cached_response: return cached_response # Appeler le LLM response = openai.ChatCompletion.create( model="gpt-4", messages=[{"role": "user", "content": prompt}] ) # Mettre en cache la réponse cache.set(prompt, response) return response

4. Cache à deux niveaux

Mémoire rapide + Redis persistant :

DEVELOPERpython
from functools import lru_cache import redis redis_client = redis.Redis() @lru_cache(maxsize=1000) def l1_cache(query): # Cache L2 (Redis) cached = redis_client.get(f"rag:{query}") if cached: return cached.decode() # Cache miss - calculer result = rag_pipeline(query) # Stocker dans L2 redis_client.setex(f"rag:{query}", 3600, result) return result

5. Invalidation du cache

DEVELOPERpython
import time cache_with_ttl = {} def get_with_ttl(key, ttl=3600): if key in cache_with_ttl: value, timestamp = cache_with_ttl[key] if time.time() - timestamp < ttl: return value else: del cache_with_ttl[key] # Expiré return None def set_with_ttl(key, value): cache_with_ttl[key] = (value, time.time())

Analyse des coûts

Sans cache (1M requêtes/mois) :

  • Embeddings : 100$
  • LLM : 3000$
  • Total : 3100$

Avec cache (taux de succès de 80%) :

  • Embeddings : 20$
  • LLM : 600$
  • Redis : 50$
  • Total : 670$ (économie de 78%)

Le cache est le fruit le plus accessible pour l'optimisation RAG. Implémentez-le dès le début.

Tags

cachingoptimizationcostlatency

Articles connexes

Ailog Assistant

Ici pour vous aider

Salut ! Pose-moi des questions sur Ailog et comment intégrer votre RAG dans vos projets !