Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Multi-turn mise en cache des conversations
Pour les applications comportant des conversations à plusieurs tours, le même message utilisateur peut avoir des significations différentes selon le contexte. Par exemple, « Dites-m'en plus » dans une conversation sur Valkey signifie quelque chose de différent de « Dites-m'en plus » dans une conversation sur Python.
Le défi
Single-prompt la mise en cache fonctionne bien pour les requêtes apatrides. Dans les conversations à plusieurs tours, vous devez mettre en cache le contexte complet de la conversation, et pas seulement le dernier message :
# "Tell me more" means nothing without context # Conversation A: "What is Valkey?" -> "Tell me more" (about Valkey) # Conversation B: "What is Python?" -> "Tell me more" (about Python)
Stratégie : clés de cache sensibles au contexte
Au lieu d'intégrer uniquement le dernier message de l'utilisateur, intégrez un résumé du contexte complet de la conversation. Ainsi, des questions de suivi similaires dans des flux de conversation similaires peuvent réutiliser les réponses mises en cache.
def build_context_string(messages: list) -> str: """Build a cacheable context string from conversation messages.""" # Use last 3 turns (6 messages: user + assistant pairs) recent = messages[-6:] parts = [] for msg in recent: role = msg["role"] content = msg["content"][:200] # Truncate long messages parts.append(f"{role}: {content}") return " | ".join(parts)
Per-user isolation du cache avec des filtres TAG
Utilisez les champs TAG pour isoler les conversations mises en cache par utilisateur, session ou autre dimension. Cela empêche les conversations mises en cache d'un utilisateur d'être renvoyées à un autre utilisateur :
# Create index with TAG field for per-user isolation valkey_client.execute_command( "FT.CREATE", "conv_cache_idx", "SCHEMA", "context_summary", "TEXT", "response", "TEXT", "user_id", "TAG", "turn_count", "NUMERIC", "embedding", "VECTOR", "HNSW", "6", "TYPE", "FLOAT32", "DIM", "1024", "DISTANCE_METRIC", "COSINE", )
Recherche avec filtrage hybride (TAG + KNN) :
def lookup_conversation_cache(messages: list, user_id: str, threshold: float = 0.12): """Search cache for similar conversation contexts, scoped to a user. Note: FT.SEARCH with COSINE distance returns a distance score where 0 = identical and 2 = opposite. A lower score means higher similarity. The threshold here is a maximum distance: only return results closer than this value. """ context = build_context_string(messages) query_vec = get_embedding(context) # Hybrid search: filter by user_id TAG + KNN on context embedding results = valkey_client.execute_command( "FT.SEARCH", "conv_cache_idx", f"@user_id:{{{user_id}}}=>[KNN 1 @embedding $query_vec]", "PARAMS", "2", "query_vec", query_vec, "DIALECT", "2", ) if results[0] > 0: fields = results[2] field_dict = {fields[j]: fields[j+1] for j in range(0, len(fields), 2)} distance = float(field_dict.get("__embedding_score", "999")) if distance < threshold: # Lower distance = more similar return {"hit": True, "response": field_dict.get("response", ""), "distance": distance} return {"hit": False}
Note
Le filtre @user_id:{user_123} TAG garantit que les conversations mises en cache de l'utilisateur A ne sont pas transmises à l'utilisateur B. La requête hybride (TAG + KNN) s'exécute comme une opération atomique unique : préfiltrage par utilisateur, puis recherche du contexte de conversation le plus proche.
Stratégies d'isolation du cache
| Stratégie | Filtre TAG | Idéal pour |
|---|---|---|
| Per-user | @user_id:{user_123} |
Assistants personnalisés |
| Per-session | @session_id:{sess_abc} |
Short-lived bavardages |
| Global (partagé) | Aucun filtre (*) |
Bots FAQ, requêtes courantes |
| Per-model | @model:{gpt-4} |
Multi-model déploiements |
| Per-product | @product_id:{prod_456} |
E-commerce assistants |