Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Multi-turn almacenamiento en caché de conversaciones
En el caso de las aplicaciones con conversaciones de varios turnos, el mismo mensaje de usuario puede tener diferentes significados según el contexto. Por ejemplo, «Cuéntame más» en una conversación sobre Valkey significa algo diferente de «Cuéntame más» en una conversación sobre Python.
¿El desafío
Single-prompt El almacenamiento en caché funciona bien para consultas sin estado. En las conversaciones de varios turnos, debes almacenar en caché todo el contexto de la conversación, no solo el último mensaje:
# "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)
Estrategia: claves de caché sensibles al contexto
En lugar de incrustar solo el último mensaje del usuario, inserta un resumen del contexto completo de la conversación. De esta forma, las preguntas de seguimiento similares en flujos de conversación similares pueden reutilizar las respuestas almacenadas en caché.
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 aislamiento de caché con filtros TAG
Utilice los campos TAG para aislar las conversaciones en caché por usuario, sesión u otras dimensiones. Esto evita que las conversaciones almacenadas en caché de un usuario se devuelvan a otro usuario:
# 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", )
Búsqueda con filtrado híbrido (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
El filtro @user_id:{user_123} TAG garantiza que las conversaciones almacenadas en caché del usuario A no se filtren al usuario B. La consulta híbrida (TAG + KNN) se ejecuta como una sola operación atómica: se filtra previamente por usuario y, a continuación, se encuentra el contexto de conversación más cercano.
Estrategias de aislamiento de caché
| Strategy (Estrategia) | Filtro TAG | Lo mejor para |
|---|---|---|
| Per-user | @user_id:{user_123} |
Asistentes personalizados |
| Per-session | @session_id:{sess_abc} |
Short-lived chats |
| Global (compartido) | Sin filtro (*) |
Preguntas frecuentes: bots, consultas comunes |
| Per-model | @model:{gpt-4} |
Multi-model despliegues |
| Per-product | @product_id:{prod_456} |
E-commerce asistentes |