As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Multi-turn cache de conversas
Para aplicativos com conversas em vários turnos, a mesma mensagem do usuário pode significar coisas diferentes, dependendo do contexto. Por exemplo, “Conte-me mais” em uma conversa sobre Valkey significa algo diferente de “Conte-me mais” em uma conversa sobre Python.
O desafio
Single-prompt O armazenamento em cache funciona bem para consultas sem estado. Em conversas de vários turnos, você deve armazenar em cache o contexto completo da conversa, não apenas a última mensagem:
# "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)
Estratégia: chaves de cache sensíveis ao contexto
Em vez de incorporar somente a última mensagem do usuário, incorpore um resumo do contexto completo da conversa. Dessa forma, perguntas de acompanhamento semelhantes em fluxos de conversação semelhantes podem reutilizar respostas em 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 de cache com filtros TAG
Use campos TAG para isolar conversas em cache por usuário, sessão ou outras dimensões. Isso evita que as conversas em cache de um usuário sejam retornadas para outro usuário:
# 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", )
Pesquisa com filtragem híbrida (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
O filtro @user_id:{user_123} TAG garante que as conversas em cache do Usuário A não vazem para o Usuário B. A consulta híbrida (TAG + KNN) é executada como uma única operação atômica — pré-filtrando por usuário e, em seguida, encontrando o contexto de conversa mais próximo.
Estratégias de isolamento de cache
| Estratégia | Filtro TAG | Melhor para |
|---|---|---|
| Per-user | @user_id:{user_123} |
Assistentes personalizados |
| Per-session | @session_id:{sess_abc} |
Short-lived conversa |
| Global (compartilhado) | Sem filtro (*) |
Perguntas frequentes, bots, consultas comuns |
| Per-model | @model:{gpt-4} |
Multi-model implantações |
| Per-product | @product_id:{prod_456} |
E-commerce assistentes |