View a markdown version of this page

Menerapkan cache semantik dengan ElastiCache untuk Valkey - Amazon ElastiCache

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Menerapkan cache semantik dengan ElastiCache untuk Valkey

Panduan berikut menunjukkan cara menerapkan cache semantik read-through menggunakan Valkey dengan Amazon Bedrock. ElastiCache

Langkah 1: Buat cluster ElastiCache untuk Valkey

Buat cluster ElastiCache for Valkey dengan versi 8.2 atau yang lebih baru menggunakan: AWS CLI

aws elasticache create-replication-group \ --replication-group-id "valkey-semantic-cache" \ --cache-node-type cache.r7g.large \ --engine valkey \ --engine-version 8.2 \ --num-node-groups 1 \ --replicas-per-node-group 1

Langkah 2: Connect ke cluster dan konfigurasikan embeddings

Dari kode aplikasi yang berjalan di instans Amazon EC2, sambungkan ke ElastiCache klaster dan siapkan model penyematan:

from valkey.cluster import ValkeyCluster from langchain_aws import BedrockEmbeddings # Connect to ElastiCache for Valkey valkey_client = ValkeyCluster( host="mycluster.xxxxxx.clustercfg.use1.cache.amazonaws.com", # Your cluster endpoint port=6379, decode_responses=False ) # Set up Amazon Bedrock Titan embeddings embeddings = BedrockEmbeddings( model_id="amazon.titan-embed-text-v2:0", region_name="us-east-1" )

Ganti nilai host dengan titik akhir konfigurasi ElastiCache klaster Anda. Untuk petunjuk tentang menemukan titik akhir klaster Anda, lihat Mengakses klaster Anda ElastiCache .

Langkah 3: Buat indeks vektor untuk cache semantik

Konfigurasikan a ValkeyStore yang secara otomatis menyematkan kueri menggunakan indeks HNSW dengan jarak COSINE untuk pencarian vektor:

from langgraph_checkpoint_aws import ValkeyStore from hashlib import md5 store = ValkeyStore( client=valkey_client, index={ "collection_name": "semantic_cache", "embed": embeddings, "fields": ["query"], # Fields to vectorize "index_type": "HNSW", # Vector search algorithm "distance_metric": "COSINE", # Similarity metric "dims": 1024 # Titan V2 produces 1024-d vectors } ) store.setup() def cache_key_for_query(query: str): """Generate a deterministic cache key for a query.""" return md5(query.encode("utf-8")).hexdigest()
catatan

ElastiCache untuk Valkey menggunakan indeks untuk menyediakan pencarian vektor yang cepat dan akurat. FT.CREATEPerintah menciptakan indeks yang mendasarinya. Untuk informasi selengkapnya, lihat Pencarian vektor untuk ElastiCache.

Langkah 4: Menerapkan fungsi pencarian dan pembaruan cache

Buat fungsi untuk mencari cache untuk kueri semantik serupa dan untuk menyimpan pasangan kueri-respons baru:

def search_cache(user_message: str, k: int = 3, min_similarity: float = 0.8): """Look up a semantically similar cached response from ElastiCache.""" hits = store.search( namespace="semantic-cache", query=user_message, limit=k ) if not hits: return None # Sort by similarity score (highest first) hits = sorted(hits, key=lambda h: h["score"], reverse=True) top_hit = hits[0] score = top_hit["score"] if score < min_similarity: return None # Below similarity threshold return top_hit["value"]["answer"] # Return cached answer def store_cache(user_message: str, result_message: str): """Store a new query-response pair in the semantic cache.""" key = cache_key_for_query(user_message) store.put( namespace="semantic-cache", key=key, value={ "query": user_message, "answer": result_message } )

Langkah 5: Menerapkan pola cache read-through

Integrasikan cache ke dalam penanganan permintaan aplikasi Anda:

import time def handle_query(user_message: str) -> dict: """Handle a user query with read-through semantic cache.""" start = time.time() # Step 1: Search the semantic cache cached_response = search_cache(user_message, min_similarity=0.8) if cached_response: # Cache hit - return cached response elapsed = (time.time() - start) * 1000 return { "response": cached_response, "source": "cache", "latency_ms": round(elapsed, 1), } # Step 2: Cache miss - invoke LLM llm_response = invoke_llm(user_message) # Your LLM invocation function # Step 3: Store the response in cache for future reuse store_cache(user_message, llm_response) elapsed = (time.time() - start) * 1000 return { "response": llm_response, "source": "llm", "latency_ms": round(elapsed, 1), }

Perintah Valkey yang mendasari

Tabel berikut menunjukkan perintah Valkey yang digunakan untuk mengimplementasikan cache semantik:

Operasi Perintah Valkey Latensi khas
Buat indeks FT.CREATE semantic_cache SCHEMA query TEXT answer TEXT embedding VECTOR HNSW 6 TYPE FLOAT32 DIM 1024 DISTANCE_METRIC COSINE One-time penyiapan
Pencarian cache FT.SEARCH semantic_cache "*=>[KNN 3 @embedding $query_vec]" PARAMS 2 query_vec [bytes] DIALECT 2 Mikrodetik
Tanggapan toko HSET cache:{hash} query "..." answer "..." embedding [bytes] Mikrodetik
Setel TTL EXPIRE cache:{hash} 82800 Mikrodetik
Inferensi LLM (miss) Panggilan API eksternal ke Amazon Bedrock 500—6000 ms