Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Multi-turn memorizzazione nella cache delle conversazioni
Per le applicazioni con conversazioni a turni multipli, lo stesso messaggio utente può avere significati diversi a seconda del contesto. Ad esempio, «Dimmi di più» in una conversazione su Valkey significa qualcosa di diverso da «Dimmi di più» in una conversazione su Python.
La sfida
Single-prompt la memorizzazione nella cache funziona bene per le query senza stato. Nelle conversazioni a più turni, è necessario memorizzare nella cache l'intero contesto della conversazione, non solo l'ultimo messaggio:
# "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)
Strategia: chiavi di cache sensibili al contesto
Invece di incorporare solo l'ultimo messaggio dell'utente, incorpora un riepilogo dell'intero contesto della conversazione. In questo modo, domande di follow-up simili in flussi di conversazione simili possono riutilizzare le risposte memorizzate nella 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 isolamento della cache con filtri TAG
Utilizza i campi TAG per isolare le conversazioni memorizzate nella cache per utente, sessione o altre dimensioni. Ciò impedisce che le conversazioni memorizzate nella cache di un utente vengano restituite a un altro utente:
# 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", )
Ricerca con filtro ibrido (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}
Nota
Il filtro @user_id:{user_123} TAG assicura che le conversazioni memorizzate nella cache dell'utente A non vengano trasmesse all'utente B. La query ibrida (TAG+ KNN) viene eseguita come un'unica operazione atomica: prefiltraggio per utente, quindi ricerca del contesto di conversazione più vicino.
Strategie di isolamento della cache
| Strategia | Filtro TAG | Ideale per |
|---|---|---|
| Per-user | @user_id:{user_123} |
Assistenti personalizzati |
| Per-session | @session_id:{sess_abc} |
Short-lived chat |
| Globale (condiviso) | Nessun filtro (*) |
FAQ, bot, domande comuni |
| Per-model | @model:{gpt-4} |
Multi-model distribuzioni |
| Per-product | @product_id:{prod_456} |
E-commerce assistenti |