View a markdown version of this page

Multi-turn almacenamiento en caché de conversaciones - Amazon ElastiCache

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