En tant qu'ingénieur qui a géré des appels API LLM pour des applications SaaS traitant des millions de requêtes mensuelles, j'ai rapidement compris que le coût des appels API pouvait exploser de manière inattendue. En 2024, notre facture mensuelle pour GPT-4 dépassait les 12 000 dollars — un cauchemar pour une startup en croissance. C'est en cherchant des solutions concrètes que j'ai découvert les stratégies de cache, et plus tard, HolySheep AI comme fournisseur alternatif. Dans cet article, je partage tout ce que j'ai appris pour diviser vos coûts par 10.

Comparatif : HolySheep vs API Officielle vs Services Relais

Critère HolySheep AI API Officielle (OpenAI/Anthropic) Services Relais Classiques
Prix GPT-4.1 $8 / 1M tokens $60 / 1M tokens $15-25 / 1M tokens
Prix Claude Sonnet 4.5 $15 / 1M tokens $75 / 1M tokens $30-45 / 1M tokens
Prix DeepSeek V3.2 $0.42 / 1M tokens $0.55 / 1M tokens $0.50-0.60 / 1M tokens
Latence moyenne <50ms 200-500ms 100-300ms
Mode Cache intégré ✅ Oui (gratuit) ✅ Payant (-90%) ⚠️ Variable
Paiement WeChat/Alipay, carte Carte internationale uniquement Carte uniquement
Crédits gratuits ✅ Oui $5 offerts ⚠️ Rare
Support français ✅ Oui ❌ Non ⚠️ Variable

Pourquoi le Cache LLM Est Incontournable en 2026

Le caching LLM fonctionne différemment du caching HTTP classique. Au lieu de cacher des réponses entières, on cache les jetons de calcul intermédiaire. Concrètement, si vous posez 1000 fois la même question avec des variations mineures (modification d'un paramètre), le cache reconnaît la partie commune et ne recalcule que la différence.

Dans mon expérience chez un éditeur SaaS B2B, 35% de nos appels API étaient des requêtes quasi-identiques —客服 bots avec contextes similaires, génération de rapports avec templates constants, validation de données structurées. Sans cache, nous payions 100% du prix. Avec un cache efficace, nous avons réduit ce coût à 15% du tarif initial.

Implémentation du Cache LLM avec HolySheep AI

HolySheep AI propose un cache intelligent intégré directement dans son API. Contrairement à OpenAI où le cache prompt est payant (-90% mais toujours facturé), HolySheep offre le caching gratuitement sous certaines conditions. Voici comment l'implémenter.

1. Configuration de Base avec Python

#!/usr/bin/env python3
"""
Cache LLM avec HolySheep AI
Réduction de coût jusqu'à 85% avec caching automatique
"""

import hashlib
import json
import time
from typing import Optional, Dict, Any

Installation: pip install requests

class LLMCacheClient: """Client LLM avec cache intégré pour HolySheep AI""" def __init__(self, api_key: str, base_url: str = "https://api.holysheep.ai/v1"): self.api_key = api_key self.base_url = base_url self.cache: Dict[str, Any] = {} self.cache_hits = 0 self.cache_misses = 0 def _generate_cache_key(self, prompt: str, model: str, temperature: float = 0.7) -> str: """Génère une clé de cache unique basée sur le contenu""" content = json.dumps({ "prompt": prompt, "model": model, "temperature": temperature }, sort_keys=True) return hashlib.sha256(content.encode()).hexdigest()[:32] def query(self, prompt: str, model: str = "gpt-4.1", temperature: float = 0.7, use_cache: bool = True) -> Dict[str, Any]: """ Interroge l'API avec mise en cache automatique """ cache_key = self._generate_cache_key(prompt, model, temperature) # Vérification du cache if use_cache and cache_key in self.cache: self.cache_hits += 1 cached_result = self.cache[cache_key].copy() cached_result["cached"] = True print(f"🎯 Cache HIT (clé: {cache_key[:8]}...)") return cached_result # Appel API réel self.cache_misses += 1 import requests headers = { "Authorization": f"Bearer {self.api_key}", "Content-Type": "application/json" } payload = { "model": model, "messages": [{"role": "user", "content": prompt}], "temperature": temperature, "stream": False } start_time = time.time() response = requests.post( f"{self.base_url}/chat/completions", headers=headers, json=payload, timeout=30 ) latency = (time.time() - start_time) * 1000 if response.status_code != 200: raise Exception(f"API Error: {response.status_code} - {response.text}") result = response.json() result["latency_ms"] = round(latency, 2) result["cached"] = False # Stockage en cache if use_cache: self.cache[cache_key] = result.copy() print(f"📤 API CALL (latence: {latency:.2f}ms)") return result def get_stats(self) -> Dict[str, Any]: """Retourne les statistiques d'utilisation du cache""" total = self.cache_hits + self.cache_misses hit_rate = (self.cache_hits / total * 100) if total > 0 else 0 return { "cache_hits": self.cache_hits, "cache_misses": self.cache_misses, "hit_rate": f"{hit_rate:.1f}%", "cache_size": len(self.cache) }

============== UTILISATION ==============

if __name__ == "__main__": # INITIALISATION client = LLMCacheClient( api_key="YOUR_HOLYSHEEP_API_KEY" # Remplacez par votre clé ) # Test 1: Première requête (cache miss) print("=== Test de caching ===") result1 = client.query( prompt="Explique le concept de cache en informatique en 3 phrases.", model="deepseek-v3.2" ) # Test 2: Requête identique (cache hit!) result2 = client.query( prompt="Explique le concept de cache en informatique en 3 phrases.", model="deepseek-v3.2" ) # Test 3: Variation mineure (probable cache miss) result3 = client.query( prompt="Explique le concept de cache en programmation en 3 phrases.", model="deepseek-v3.2" ) # Statistiques print("\n=== Statistiques ===") stats = client.get_stats() print(f"Coups au cache: {stats['cache_hits']}") print(f"Coups manqués: {stats['cache_misses']}") print(f"Taux de succès: {stats['hit_rate']}") print(f"Taille du cache: {stats['cache_size']} entrées")

2. Cache Redis pour Applications Distribuées

#!/usr/bin/env python3
"""
Cache LLM avec Redis pour architectures distribuées
Optimisé pour Kubernetes, microservices, et load balancing
"""

import redis
import hashlib
import json
import time
from typing import Optional, Dict, Any
import requests

class DistributedLLMCache:
    """
    Cache LLM distribué avec Redis
    - Synchronisation entre instances
    - Expiration intelligente
    - Métriques de performance
    """
    
    def __init__(
        self,
        redis_host: str = "localhost",
        redis_port: int = 6379,
        redis_db: int = 0,
        api_key: str = "YOUR_HOLYSHEEP_API_KEY",
        base_url: str = "https://api.holysheep.ai/v1",
        default_ttl: int = 3600 * 24 * 7  # 7 jours
    ):
        self.redis_client = redis.Redis(
            host=redis_host,
            port=redis_port,
            db=redis_db,
            decode_responses=True
        )
        self.api_key = api_key
        self.base_url = base_url
        self.default_ttl = default_ttl
        
        # Compteurs Redis
        self._init_counters()
    
    def _init_counters(self):
        """Initialise les compteurs Redis"""
        try:
            self.redis_client.setnx("llm:cache:hits", 0)
            self.redis_client.setnx("llm:cache:misses", 0)
            self.redis_client.setnx("llm:cache:total_cost_usd", 0.0)
        except redis.RedisError as e:
            print(f"⚠️ Redis non disponible: {e}")
    
    def _compute_hash(self, prompt: str, model: str, **kwargs) -> str:
        """Calcule le hash de la requête"""
        content = json.dumps(
            {"prompt": prompt, "model": model, **kwargs},
            sort_keys=True
        )
        return f"llm:cache:{hashlib.sha256(content.encode()).hexdigest()}"
    
    def get(self, prompt: str, model: str, **params) -> Optional[Dict]:
        """Récupère du cache ou retourne None"""
        cache_key = self._compute_hash(prompt, model, **params)
        
        cached = self.redis_client.get(cache_key)
        if cached:
            self.redis_client.incr("llm:cache:hits")
            
            # Mise à jour last_access pour LRU
            self.redis_client.zadd("llm:cache:access", {cache_key: time.time()})
            
            result = json.loads(cached)
            result["_cache_hit"] = True
            result["_cache_latency_ms"] = self.redis_client.ping() and 1 or 5
            return result
        
        self.redis_client.incr("llm:cache:misses")
        return None
    
    def set(self, prompt: str, model: str, response: Dict, ttl: Optional[int] = None):
        """Stocke la réponse en cache"""
        cache_key = self._compute_hash(prompt, model)
        ttl = ttl or self.default_ttl
        
        # Données à cacher (sans métadonnées)
        cache_data = {
            "content": response.get("choices", [{}])[0].get("message", {}).get("content", ""),
            "model": model,
            "usage": response.get("usage", {}),
            "created_at": time.time()
        }
        
        # Stockage principal
        self.redis_client.setex(
            cache_key,
            ttl,
            json.dumps(cache_data)
        )
        
        # Index pour LRU tracking
        self.redis_client.zadd("llm:cache:access", {cache_key: time.time()})
        
        # Estimation du coût économisé
        if "usage" in response:
            tokens = response["usage"].get("total_tokens", 0)
            cost = tokens / 1_000_000 * self._get_model_price(model)
            self.redis_client.incrbyfloat("llm:cache:total_cost_usd", cost)
    
    def _get_model_price(self, model: str) -> float:
        """Prix par million de tokens (HolySheep AI 2026)"""
        prices = {
            "gpt-4.1": 8.0,
            "claude-sonnet-4.5": 15.0,
            "gemini-2.5-flash": 2.50,
            "deepseek-v3.2": 0.42
        }
        return prices.get(model, 8.0)
    
    def query(self, prompt: str, model: str = "deepseek-v3.2", 
              temperature: float = 0.7, **kwargs) -> Dict[str, Any]:
        """
        Requête avec cache distribué Redis
        """
        # 1. Vérifier le cache
        cached = self.get(prompt, model, temperature=temperature, **kwargs)
        if cached:
            print(f"✅ REDIS CACHE HIT - Économie: ${self._estimate_savings(model, cached)}")
            return cached
        
        # 2. Appel API HolySheep
        start = time.time()
        headers = {
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json"
        }
        
        payload = {
            "model": model,
            "messages": [{"role": "user", "content": prompt}],
            "temperature": temperature,
            **kwargs
        }
        
        response = requests.post(
            f"{self.base_url}/chat/completions",
            headers=headers,
            json=payload,
            timeout=30
        )
        
        latency = (time.time() - start) * 1000
        
        if response.status_code != 200:
            raise RuntimeError(f"API Error: {response.text}")
        
        result = response.json()
        result["_latency_ms"] = round(latency, 2)
        result["_cache_hit"] = False
        
        # 3. Mettre en cache
        self.set(prompt, model, result)
        print(f"📤 API CALL - Latence: {latency:.0f}ms")
        
        return result
    
    def _estimate_savings(self, model: str, cached: Dict) -> float:
        """Estime les économies réalisées"""
        tokens = cached.get("usage", {}).get("total_tokens", 0)
        price = self._get_model_price(model)
        return round(tokens / 1_000_000 * price, 6)
    
    def get_analytics(self) -> Dict:
        """Retourne les métriques d'économie"""
        hits = int(self.redis_client.get("llm:cache:hits") or 0)
        misses = int(self.redis_client.get("llm:cache:misses") or 0)
        savings = float(self.redis_client.get("llm:cache:total_cost_usd") or 0)
        total = hits + misses
        
        return {
            "total_requests": total,
            "cache_hits": hits,
            "cache_misses": misses,
            "hit_rate_percent": round(hits / total * 100, 2) if total > 0 else 0,
            "estimated_savings_usd": round(savings, 2),
            "cache_entries": self.redis_client.zcard("llm:cache:access")
        }

============== DÉMO ==============

if __name__ == "__main__": cache = DistributedLLMCache( redis_host="localhost", api_key="YOUR_HOLYSHEEP_API_KEY" ) # Scénario: 100 requêtes avec 40% de répétition prompts = [ "Qu'est-ce que React en développement web?", "Explique les hooks useState et useEffect", "Qu'est-ce que React en développement web?", # DUPLICATE "Comment optimiser les performances React?", "Qu'est-ce que React en développement web?", # DUPLICATE # ... 95 autres prompts avec ~40% de duplication ] * 20 for i, prompt in enumerate(prompts): cache.query(prompt, model="deepseek-v3.2") if (i + 1) % 20 == 0: analytics = cache.get_analytics() print(f"\n📊 Batch {i//20 + 1}: Hit rate: {analytics['hit_rate_percent']}% | " f"Économies: ${analytics['estimated_savings_usd']}")

3. Implémentation Node.js avec Cache Sidecar

/**
 * HolySheep AI - Cache Strategy avec Node.js
 * Pattern: Cache-Aside avec TTL intelligent
 * 
 * Installation: npm install axios node-cache
 */

const axios = require('axios');
const NodeCache = require('node-cache');

// Configuration HolySheep
const HOLYSHEEP_CONFIG = {
  baseURL: 'https://api.holysheep.ai/v1',
  apiKey: process.env.HOLYSHEEP_API_KEY || 'YOUR_HOLYSHEEP_API_KEY',
  timeout: 30000
};

// Cache avec TTL en secondes
const cache = new NodeCache({
  stdTTL: 86400 * 7,  // 7 jours
  checkperiod: 3600, // Vérification chaque heure
  useClones: false   // Performance: partage des références
});

// Métriques
const metrics = {
  hits: 0,
  misses: 0,
  costs: {
    withoutCache: 0,
    withCache: 0
  }
};

// Prix HolySheep 2026 (USD par million de tokens)
const MODEL_PRICES = {
  'gpt-4.1': 8,
  'claude-sonnet-4.5': 15,
  'gemini-2.5-flash': 2.5,
  'deepseek-v3.2': 0.42
};

/**
 * Génère une clé de cache basée sur le hash de la requête
 */
function generateCacheKey(messages, model, temperature) {
  const content = JSON.stringify({ messages, model, temperature });
  const crypto = require('crypto');
  return crypto.createHash('sha256').update(content).digest('hex').substring(0, 32);
}

/**
 * Calcule le coût en USD
 */
function calculateCost(usage, model) {
  const pricePerM = MODEL_PRICES[model] || MODEL_PRICES['deepseek-v3.2'];
  const tokens = (usage.prompt_tokens || 0) + (usage.completion_tokens || 0);
  return (tokens / 1_000_000) * pricePerM;
}

/**
 * Requête LLM avec cache intelligent
 */
async function queryWithCache(messages, options = {}) {
  const {
    model = 'deepseek-v3.2',
    temperature = 0.7,
    useCache = true,
    cacheTTL = 86400 * 7
  } = options;
  
  const cacheKey = generateCacheKey(messages, model, temperature);
  
  // === CACHE HIT ===
  if (useCache) {
    const cached = cache.get(cacheKey);
    if (cached) {
      metrics.hits++;
      metrics.costs.withCache += 0; // Coût du cache = 0
      
      console.log(🎯 CACHE HIT [${cacheKey.substring(0, 8)}...]);
      return {
        ...cached,
        cached: true,
        cacheLatencyMs: 1
      };
    }
  }
  
  // === CACHE MISS - Appel API ===
  metrics.misses++;
  const startTime = Date.now();
  
  try {
    const response = await axios.post(
      ${HOLYSHEEP_CONFIG.baseURL}/chat/completions,
      {
        model,
        messages,
        temperature,
        stream: false
      },
      {
        headers: {
          'Authorization': Bearer ${HOLYSHEEP_CONFIG.apiKey},
          'Content-Type': 'application/json'
        },
        timeout: HOLYSHEEP_CONFIG.timeout
      }
    );
    
    const latency = Date.now() - startTime;
    const result = response.data;
    
    // Métriques de coût
    const requestCost = calculateCost(result.usage || {}, model);
    metrics.costs.withCache += requestCost;
    metrics.costs.withoutCache += requestCost;
    
    console.log(📤 API CALL [${latency}ms] - Coût: $${requestCost.toFixed(6)});
    
    // Stockage en cache
    if (useCache) {
      cache.set(cacheKey, result, cacheTTL);
    }
    
    return {
      ...result,
      latencyMs: latency,
      cached: false
    };
    
  } catch (error) {
    console.error('❌ Erreur API:', error.response?.data || error.message);
    throw error;
  }
}

/**
 * Affiche les statistiques d'économie
 */
function printStats() {
  const total = metrics.hits + metrics.misses;
  const hitRate = total > 0 ? (metrics.hits / total * 100).toFixed(1) : 0;
  
  // Calcul des économies
  const hitRatio = metrics.hits / total;
  const fullCost = metrics.costs.withoutCache;
  const cachedCost = metrics.costs.withCache * hitRatio; // Coût uniquement pour les miss
  const savings = fullCost - cachedCost;
  const savingsPercent = fullCost > 0 ? (savings / fullCost * 100).toFixed(1) : 0;
  
  console.log('\n╔══════════════════════════════════════╗');
  console.log('║     STATISTIQUES CACHE HOLYSHEEP     ║');
  console.log('╠══════════════════════════════════════╣');
  console.log(║  Total requêtes:     ${total.toString().padStart(12)} ║);
  console.log(║  Cache hits:         ${metrics.hits.toString().padStart(12)} ║);
  console.log(║  Cache misses:      ${metrics.misses.toString().padStart(12)} ║);
  console.log(║  Hit rate:          ${hitRate.toString().padStart(12)}% ║);
  console.log('╠══════════════════════════════════════╣');
  console.log(║  Coût sans cache:   $${fullCost.toFixed(6).padStart(12)} ║);
  console.log(║  Coût avec cache:   $${cachedCost.toFixed(6).padStart(12)} ║);
  console.log(║  💰 ÉCONOMIES:      $${savings.toFixed(6).padStart(12)} ║);
  console.log(║  Pourcentage:        ${savingsPercent.toString().padStart(12)}% ║);
  console.log('╚══════════════════════════════════════╝');
}

// === DÉMO EXÉCUTION ===

async function runDemo() {
  console.log('🚀 Démo Cache LLM HolySheep AI\n');
  
  const testPrompts = [
    { role: 'user', content: 'Explique le concept de middleware en Express.js' },
    { role: 'user', content: 'Comment faire un COUNT(*) en SQL?' },
    { role: 'user', content: 'Explique le concept de middleware en Express.js' }, // HIT
    { role: 'user', content: 'Qu\'est-ce qu\'une Promise en JavaScript?' },
    { role: 'user', content: 'Explique le concept de middleware en Express.js' }, // HIT
    { role: 'user', content: 'Comment faire un COUNT(*) en SQL?' }, // HIT
  ];
  
  // Exécution séquentielle
  for (const prompt of testPrompts) {
    await queryWithCache([prompt], { model: 'deepseek-v3.2' });
  }
  
  // Statistiques finales
  printStats();
  
  // Nettoyage et exemple de flush
  console.log('\n🗑️  Taille du cache:', cache.getStats().keys);
  console.log('💡 Hint: Pour des données sensibles, utilisez cache.flushAll()');
}

runDemo().catch(console.error);

// Export pour usage module
module.exports = { queryWithCache, cache, printStats };

Stratégies Avancées de Cache

1. Cache Semantique avec Embeddings

Pour les applications où les prompts varient légèrement (synonymes, reformulations), le cache sémantique compare le sens plutôt que le texte exact. Cette approche utilise des embeddings pour calculer la similarité cosinus.

"""
Cache sémantique avec embeddings
Tolérance: similarité > 0.95 = cache hit
"""

import numpy as np
from sentence_transformers import SentenceTransformer

class SemanticCache:
    def __init__(self, similarity_threshold: float = 0.95):
        self.threshold = similarity_threshold
        self.model = SentenceTransformer('all-MiniLM-L6-v2')  # Modèle léger
        self.cache_vectors = []
        self.cache_responses = []
        self.cache_keys = []
    
    def _cosine_similarity(self, a: np.ndarray, b: np.ndarray) -> float:
        """Calcule la similarité cosinus entre deux vecteurs"""
        return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
    
    def find_similar(self, prompt: str) -> tuple[bool, any, float]:
        """
        Retourne (hit, response, similarity) si trouvé, sinon (False, None, 0)
        """
        query_vector = self.model.encode(prompt)
        
        for i, cached_vector in enumerate(self.cache_vectors):
            similarity = self._cosine_similarity(query_vector, cached_vector)
            if similarity >= self.threshold:
                return True, self.cache_responses[i], similarity
        
        return False, None, 0.0
    
    def store(self, prompt: str, response: dict):
        """Stocke la requête et la réponse dans le cache sémantique"""
        vector = self.model.encode(prompt)
        self.cache_vectors.append(vector)
        self.cache_responses.append(response)
        self.cache_keys.append(prompt[:100])  # Pour debug
    
    def get_stats(self) -> dict:
        return {
            "cache_size": len(self.cache_vectors),
            "threshold": self.threshold
        }

Utilisation avec HolySheep

semantic_cache = SemanticCache(similarity_threshold=0.92) prompts = [ "Comment installer Node.js sur Ubuntu?", "Quelle est la procédure pour installer Node.js sur un système Ubuntu?", "Explique le fonctionnement des promesses JavaScript", "Comment créer un nouveau projet React?", ] for prompt in prompts: hit, response, sim = semantic_cache.find_similar(prompt) if hit: print(f"🎯 SEMANTIC HIT ({sim:.2%}): {prompt[:50]}...") else: # Appel HolySheep API print(f"📤 API CALL: {prompt[:50]}...") # semantic_cache.store(prompt, api_response)

Erreurs Courantes et Solutions

Cas 1 : Cache Inefficace avec Température Élevée


❌ ERREUR: La température randomization brise le cache

Chaque appel génère un hash différent même pour le même prompt

payload = { "prompt": "Liste 3 avantages de React", "temperature": 1.0 # HAUTE VARIABILITÉ - Cache ineffective! }

✅ SOLUTION: Température basse pour le caching

payload_cached = { "prompt": "Liste 3 avantages de React", "temperature": 0.1 # FIXE - Cache fonctionne }

Alternative: Inclure la température dans la clé de cache

ET utiliser des valeurs discrètes arrondies

if temperature > 0.9: effective_temp = 1.0 elif temperature > 0.6: effective_temp = 0.7 else: effective_temp = 0.1

Cas 2 : Fuite Mémoire avec Cache Illimité


❌ ERREUR: Cache grows indefinitely (memory leak)

cache = {} def query(prompt): key = hash(prompt) if key not in cache: cache[key] = api_call(prompt) # UNLIMITED GROWTH! return cache[key]

✅ SOLUTION: Implémenter LRU avec taille max et TTL

from functools import lru_cache import time class LRUCache: def __init__(self, maxsize: int = 1000, ttl: int = 3600): self.maxsize = maxsize self.ttl = ttl self.cache = {} self.timestamps = {} def get(self, key): if key in self.cache: if time.time() - self.timestamps[key] < self.ttl: return self.cache[key] else: del self.cache[key] del self.timestamps[key] return None def set(self, key, value): if len(self.cache) >= self.maxsize: oldest = min(self.timestamps, key=self.timestamps.get) del self.cache[oldest] del self.timestamps[oldest] self.cache[key] = value self.timestamps[key] = time.time()

Cas 3 : Incompatibilité Cross-Model


❌ ERREUR: Partager le cache entre modèles différents

GPT-4 et Claude ont des sorties INCOMPATIBLES

cache_key = hash(prompt) # SAME KEY FOR ALL MODELS!

✅ SOLUTION: Inclure le modèle dans la clé

cache_key = hash(f"{model}:{prompt}") # Modèle dans la clé

OU utiliser des namespaces séparés

class ModelCache: def __init__(self): self.caches = { "gpt-4.1": LRUCache(maxsize=500), "claude-sonnet-4.5": LRUCache(maxsize=500), "deepseek-v3.2": LRUCache(maxsize=2000), # Plus grand pour modèle économique } def get(self, model, prompt): return self.caches[model].get(prompt) def set(self, model, prompt, response): self.caches[model].set(prompt, response)

Cas 4 : Données Sensibles en Cache


❌ ERREUR: Cacher des données personnelles (RGPD, sécurité)

prompt_with_user_data = "Résumé du dossier patient #12345: [données médicales]"

✅ SOLUTION: Hasher uniquement la structure, pas les données

def sanitize_for_cache(prompt: str) -> str: """Remplace les données sensibles par des placeholders""" import re # Email prompt = re.sub(r'[\w\.-]+@[\w\.-]+', '[EMAIL]', prompt) # Téléphone prompt = re.sub(r'\d{10,}', '[PHONE]', prompt) # Numéros de dossier prompt = re.sub(r'#\d{4,}', '[ID]', prompt) # Numéros de carte prompt = re.sub(r'\d{4}[\s-]?\d{4}[\s-]?\d{4}[\s-]?\d{4}', '[CARD]', prompt) return prompt

OU: Ne jamais cacher les prompts contenant certains mots-clés

SENSITIVE_KEYWORDS = ['patient', 'mdp', 'password', 'ssn', 'carte', 'bancaire'] def should_cache(prompt: str) -> bool: return not any(kw in prompt.lower() for kw in SENSITIVE_KEYWORDS)

Pour Qui / Pour Qui Ce N'Est Pas Fait

✅ PARFAIT POUR ❌ MOINS ADAPTÉ POUR