View a markdown version of this page

Implementazione di una cache semantica con ElastiCache for Valkey - Amazon ElastiCache

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Implementazione di una cache semantica con ElastiCache for Valkey

La seguente procedura dettagliata mostra come implementare una cache semantica di lettura utilizzando ElastiCache Valkey con Amazon Bedrock.

Fase 1: creare un cluster for Valkey ElastiCache

Crea un cluster ElastiCache for Valkey con versione 8.2 o successiva utilizzando: 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

Fase 2: Connect al cluster e configurazione degli incorporamenti

Dal codice dell'applicazione in esecuzione sulla tua istanza Amazon EC2, connettiti al ElastiCache cluster e configura il modello di incorporamento:

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

Sostituisci il valore dell'host con l'endpoint di configurazione del ElastiCache cluster. Per istruzioni su come trovare l'endpoint del cluster, consulta Accesso al ElastiCache cluster.

Fase 3: Creare l'indice vettoriale per la cache semantica

Configura un programma ValkeyStore che incorpori automaticamente le query utilizzando un indice HNSW con distanza COSINE per la ricerca vettoriale:

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()
Nota

ElastiCache for Valkey utilizza un indice per fornire una ricerca vettoriale rapida e accurata. Il FT.CREATE comando crea l'indice sottostante. Per ulteriori informazioni, vedere Ricerca vettoriale per ElastiCache.

Fase 4: Implementazione delle funzioni di ricerca e aggiornamento della cache

Crea funzioni per cercare nella cache query semanticamente simili e per memorizzare nuove coppie query-risposta:

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 } )

Fase 5: Implementazione del modello di cache di lettura

Integra la cache nella gestione delle richieste dell'applicazione:

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), }

Comandi Valkey sottostanti

La tabella seguente mostra i comandi Valkey utilizzati per implementare la cache semantica:

Operation Comando Valkey Latenza tipica
Creazione di un indice FT.CREATE semantic_cache SCHEMA query TEXT answer TEXT embedding VECTOR HNSW 6 TYPE FLOAT32 DIM 1024 DISTANCE_METRIC COSINE One-time configurazione
Ricerca nella cache FT.SEARCH semantic_cache "*=>[KNN 3 @embedding $query_vec]" PARAMS 2 query_vec [bytes] DIALECT 2 Microsecondi
Risposta del negozio HSET cache:{hash} query "..." answer "..." embedding [bytes] Microsecondi
Imposta TTL EXPIRE cache:{hash} 82800 Microsecondi
Inferenza LLM (mancata) Chiamata API esterna ad Amazon Bedrock 500-6000 ms