Semantic Caching
A cache semântica devolve uma resposta de LLM armazenada quando uma nova consulta tem o mesmo significado que uma consulta anterior, comparando embeddings para evitar chamadas ao modelo e reduzir custos.
O cache semântico armazena as respostas de um modelo de linguagem grande (LLM) ou de outro modelo generativo e as reutiliza para novas solicitações com o mesmo significado de uma solicitação anterior, mesmo que a formulação seja diferente. O cache transforma cada prompt em um embedding, encontra o prompt armazenado mais semelhante e retorna a resposta salva quando a similaridade ultrapassa um limiar. Um acerto dispensa completamente a chamada ao modelo, reduzindo a latência a milissegundos e eliminando o consumo de tokens pela solicitação. Como a correspondência se baseia no significado, “Esqueci minha senha” e “Como redefino minha senha?” compartilham uma resposta armazenada; um cache de correspondência exata indexado pelo texto do prompt precisaria armazená-la duas vezes. Em 2023, a Zilliz lançou a biblioteca de código aberto GPTCache para esse padrão, que agora é oferecido como recurso integrado por bancos de dados vetoriais e gateways de API.
Como funciona um cache semântico#
Um modelo de embedding de frases codifica o prompt recebido, e uma busca vetorial o compara com os embeddings de prompts respondidos anteriormente, geralmente usando similaridade de cosseno. Caches pequenos cabem na memória, enquanto os grandes ficam em um banco de dados vetorial com um índice aproximado de vizinhos mais próximos. Quando não há correspondência, o modelo gera uma resposta nova, e o embedding do novo prompt é armazenado junto com a resposta, normalmente com um prazo de expiração.
A chave do cache precisa abranger todo o restante que possa alterar a resposta correta. Respostas geradas com um prompt de sistema, uma versão do modelo, um nível de permissão de usuário ou um conjunto de documentos recuperados diferentes são armazenadas em escopos separados, para que a resposta armazenada de um cliente nunca seja fornecida a outro. A atualização dos dados exige o mesmo cuidado: quando um preço, uma política ou um documento de origem muda, as entradas baseadas na versão antiga continuam correspondendo a novos prompts; por isso, cada entrada tem um tempo de vida, e o escopo afetado é limpo quando seus dados de origem mudam.
Como escolher o limiar de similaridade#
O limiar determina o quanto dois prompts podem diferir e ainda assim compartilhar uma resposta. Neste exemplo, o modelo all-MiniLM-L6-v2 do Sentence Transformers codifica os prompts de um cache com três entradas:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("all-MiniLM-L6-v2")
# Earlier prompts whose answers are already stored in the cache
cached = ["How do I reset my password?", "What are your opening hours?", "How do I cancel my subscription?"]
cached_embeddings = model.encode(cached)
# Each new prompt reuses the closest cached answer if it clears the threshold
queries = ["I forgot my password, how can I change it?", "When does the store open?", "How do I cancel my order?"]
for query in queries:
query_embedding = model.encode(query)
scores = model.similarity(query_embedding, cached_embeddings)[0]
best = scores.argmax().item()
status = "hit" if scores[best] >= 0.7 else "miss"
print(f"{query} -> {cached[best]} ({scores[best]:.2f}, {status})")A paráfrase sobre a senha tem pontuação de 0,89 e gera um acerto correto. A paráfrase sobre o horário de funcionamento tem pontuação de apenas 0,61 e não encontra correspondência. “Como cancelo meu pedido?” tem pontuação de 0,71 em relação a “Como cancelo minha assinatura?” e retornaria instruções erradas. A similaridade entre embeddings mede a semelhança de vocabulário e tópico; portanto, nenhum limiar único distingue esses três casos. Caches de produção reduzem essa lacuna com o ajuste fino do codificador em pares de paráfrases do próprio tráfego, definindo limiares por categoria ou enviando cada possível acerto a um reranqueador que pontua os dois prompts juntos antes de fornecer a resposta armazenada.
Onde o cache semântico se encaixa#
O cache semântico traz benefícios quando muitos usuários fazem as mesmas perguntas e as respostas mudam lentamente: chatbots de suporte, centrais de ajuda internas e assistentes de geração aumentada por recuperação (RAG) com documentação estável. Solicitações personalizadas, urgentes ou criativas se beneficiam pouco, pois uma resposta reutilizada pode estar errada ou ser repetitiva.
Dois outros caches usados para servir LLMs atuam em camadas diferentes:
- Cache de prompt: O servidor do modelo armazena os estados calculados de um prefixo de prompt repetido exatamente, reduzindo a pré-computação, mas o modelo ainda gera uma resposta nova.
- Cache KV: As chaves e os valores dos tokens anteriores são mantidos durante uma única geração, para que cada novo token não precise recalculá-los.
A busca semântica usa a mesma consulta de embeddings para recuperar documentos para uma consulta, enquanto um cache semântico a usa para recuperar respostas prontas, muitas vezes dentro de um gateway de IA entre aplicações e provedores de modelos.
As imagens também podem servir de chave para um cache. embed() no Ultralytics YOLO retorna um vetor de características para cada imagem; assim, um modelo YOLO26 treinado para classificação de imagens pode fornecer a chave de busca que permite que quadros de câmera quase duplicados reutilizem uma descrição anterior de um modelo de visão e linguagem.










