Sur un site de support client équipé d’un assistant de réponse aux questions fréquentes, un cache classique par clé exacte ratait l’essentiel des cas utiles : « comment annuler ma commande » et « comment puis-je annuler une commande » sont deux chaînes de caractères différentes, donc deux entrées de cache différentes, alors qu’il s’agit exactement de la même question. Ce constat nous a menés vers le cache sémantique, qui compare le sens des questions plutôt que leur formulation exacte.
Cet article ne reprend pas la question plus large de la maîtrise des coûts d’API, traitée séparément : il se concentre spécifiquement sur la mécanique du cache sémantique et son seuil de tolérance.
Le principe : comparer des vecteurs, pas des chaînes de caractères
Chaque question posée à l’assistant est d’abord transformée en vecteur d’embedding. Avant d’appeler le modèle de génération, on compare ce vecteur à ceux des questions déjà mises en cache, via une similarité cosinus. Si une question déjà en cache dépasse un seuil de similarité fixé, sa réponse stockée est renvoyée directement, sans nouvel appel au modèle de génération.
function wpm_chercher_cache_semantique( array $vecteur_question, $seuil = 0.92 ) {
global $wpdb;
$entrees = $wpdb->get_results(
"SELECT id, question, reponse, vecteur FROM {$wpdb->prefix}wpm_cache_ia WHERE expire_le > NOW()"
);
$meilleur_score = 0;
$meilleure_entree = null;
foreach ( $entrees as $entree ) {
$vecteur_stocke = json_decode( $entree->vecteur, true );
$score = wpm_similarite_cosinus( $vecteur_question, $vecteur_stocke );
if ( $score > $meilleur_score ) {
$meilleur_score = $score;
$meilleure_entree = $entree;
}
}
return $meilleur_score >= $seuil ? $meilleure_entree : null;
}
Pourquoi le seuil de similarité est le paramètre le plus délicat
Un seuil trop bas fait ressortir des réponses en cache pour des questions en réalité différentes : « comment annuler ma commande » et « comment modifier ma commande » restent lexicalement proches mais appellent des réponses distinctes, et un seuil mal calibré peut les confondre. Un seuil trop haut, à l’inverse, ne capture presque aucune reformulation et rend le cache sémantique à peine plus utile qu’un cache exact classique.

Comment nous avons calibré le seuil en pratique
Le calibrage s’est fait empiriquement, à partir d’un jeu de cent paires de questions réelles issues de l’historique du support, classées manuellement en deux catégories : « même intention » et « intention différente ». Nous avons testé plusieurs seuils sur ce jeu et retenu celui qui minimisait les faux positifs, quitte à accepter quelques faux négatifs qui déclenchent simplement un appel superflu au modèle plutôt qu’une réponse incorrecte.
| Seuil testé | Faux positifs (mauvaise réponse servie) | Taux de cache atteint |
|---|---|---|
| 0,85 | Élevé, inacceptable | Très élevé |
| 0,92 | Quasi nul | Correct |
| 0,97 | Nul | Faible |
Le seuil de 0,92 retenu privilégie délibérément la sécurité de la réponse sur le taux de cache, un choix que nous recommandons systématiquement pour un assistant destiné aux clients finaux.
Stocker le vecteur, pas seulement la réponse
Chaque entrée de cache stocke la question d’origine, sa réponse, son vecteur d’embedding sérialisé, et une date d’expiration. Le vecteur est indispensable pour toute comparaison future ; le recalculer à chaque lecture reviendrait à annuler le bénéfice du cache.
La stratégie d’invalidation
Un cache sémantique pose un problème d’invalidation spécifique : une réponse en cache peut devenir obsolète si l’information sous-jacente change, par exemple une politique de retour produit modifiée. Deux mécanismes complémentaires gèrent ce risque.
- Une expiration systématique après sept jours, forçant un renouvellement périodique même sans changement détecté.
- Une invalidation manuelle déclenchée par l’équipe support depuis une interface d’administration listant les entrées en cache, en cas de changement connu d’une politique ou d’une information produit.
Le gain mesuré
Sur le mois suivant la mise en place du cache sémantique, environ un tiers des questions posées à l’assistant ont été résolues sans nouvel appel au modèle de génération, un taux nettement supérieur à celui obtenu avec un cache par correspondance exacte sur le même trafic, mesuré à quelques pourcents seulement auparavant.
Le cache sémantique ne fait pas gagner en qualité de réponse. Il fait gagner en coût et en latence, à condition d’accepter qu’un seuil trop généreux transforme cet avantage en risque.
En résumé
Un cache sémantique bien calibré réduit significativement les appels redondants à un modèle de génération, mais sa fiabilité repose entièrement sur un seuil de similarité choisi avec prudence et validé sur des cas réels, jamais fixé arbitrairement sans test préalable.