View a markdown version of this page

マルチターン会話キャッシュ - Amazon ElastiCache

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

マルチターン会話キャッシュ

マルチターン会話を使用するアプリケーションの場合、同じユーザーメッセージはコンテキストに応じて異なる意味を持つ可能性があります。例えば、Valkey に関する会話の「Tell me more」とは、Python に関する会話の「Tell me more」とは別の意味です。

チャレンジ

シングルプロンプトキャッシュは、ステートレスクエリに適しています。マルチターン会話では、最後のメッセージだけでなく、会話コンテキスト全体をキャッシュする必要があります。

# "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)

戦略: コンテキスト対応キャッシュキー

最後のユーザーメッセージのみを埋め込む代わりに、会話コンテキスト全体の概要を埋め込みます。これにより、同様の会話フローで同様のフォローアップの質問がキャッシュされた回答を再利用できます。

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)

TAG フィルターを使用したユーザーごとのキャッシュ分離

TAG フィールドを使用して、キャッシュされた会話をユーザー、セッション、またはその他のディメンション別に分離します。これにより、あるユーザーのキャッシュされた会話が別のユーザーに返されるのを防ぐことができます。

# 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", )

ハイブリッドフィルタリングで検索 (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}
注記

@user_id:{user_123} TAG フィルターは、ユーザー A のキャッシュされた会話がユーザー B にリークされないようにします。ハイブリッドクエリ (TAG + KNN) は 1 つのアトミックオペレーションとして実行され、ユーザーによって事前フィルタリングされた後、最も近い会話コンテキストを見つけます。

キャッシュ分離戦略

方針 タグフィルター 次の用途に適しています
ユーザーごと @user_id:{user_123} パーソナライズされたアシスタント
セッションごと @session_id:{sess_abc} 存続期間の短いチャット
グローバル (共有) フィルターなし (*) よくある質問ボット、一般的なクエリ
モデルごと @model:{gpt-4} マルチモデルデプロイ
製品ごと @product_id:{prod_456} e コマースアシスタント