O que é Introduzir Cache?
Introduzir Cache (Introduce Cache) é uma refatoração de IA para sistemas com LLM, do grupo Operação. Reaproveitar prefixos de prompt e respostas para perguntas equivalentes.
Introduce Cache
Introduzir Cache (Introduce Cache) é uma refatoração de IA para sistemas com LLM, do grupo Operação. Reaproveitar prefixos de prompt e respostas para perguntas equivalentes.
O assistente de uma loja online manda, em toda pergunta, o mesmo system prompt de 9 mil tokens: regras de troca, políticas de frete, descrição das ferramentas. Um terço das perguntas do dia é alguma versão de “como tiro a segunda via do boleto?”. Cada uma é processada do zero, e a fatura do provedor cresce na mesma proporção do tráfego.
O mesmo prefixo grande e as mesmas perguntas são processados do zero toda vez. É o smell Pagando Duas Vezes.
Reaproveite o que se repete, em três níveis: cache de prompt para o prefixo fixo (instruções, ferramentas, documentos), cache de embeddings para textos que não mudam, e cache de resposta (exato ou semântico) para perguntas equivalentes, com regra de validade.
-def answer(question):
- q_vec = embed(question) # pago toda vez
- docs = index.search(q_vec, k=6)
- return llm(SYSTEM_9K_TOKENS, docs, question) # prefixo pago toda vez
+def answer(question):
+ key = normalize(question) # minúsculas, sem pontuação
+ if (hit := answer_cache.get(key)) and hit.sources_unchanged():
+ return hit.answer # 1. cache de resposta
+
+ q_vec = embedding_cache.get_or_compute(key, embed) # 2. cache de embedding
+ docs = index.search(q_vec, k=6)
+ reply = client.messages.create(
+ model=MODEL, max_tokens=1500,
+ system=[{"type": "text", "text": SYSTEM_9K_TOKENS,
+ "cache_control": {"type": "ephemeral"}}], # 3. cache de prompt
+ messages=[{"role": "user", "content": render(docs, question)}],
+ )
+ text = next(b.text for b in reply.content if b.type == "text")
+ answer_cache.set(key, text, ttl="24h",
+ sources=[(d.id, d.version) for d in docs]) # validade ligada às fontes
+ return text
Antes: tudo processado do zero.
flowchart LR
Q(["1. Pergunta"]):::io --> E["2. Embedding"]:::tool
E --> S["3. Busca"]:::tool
S --> M(["4. Modelo lê 9 mil tokens fixos"]):::llm
Depois: três camadas de reaproveitamento.
flowchart LR
Q(["1. Pergunta"]):::io --> C{"2. Já respondida?"}
C -->|sim e fontes iguais| OUT(["Resposta do cache"]):::io
C -->|não| E["3. Embedding do cache ou novo"]:::tool
E --> S["4. Busca"]:::tool
S --> M(["5. Modelo com prefixo cacheado"]):::llm
M --> OUT2(["Resposta, gravada no cache"]):::io
Cada camada ataca um tipo de repetição. Antes de escolher, descubra qual repetição você tem.
| Camada | O que se repete | O que você economiza | Risco principal |
|---|---|---|---|
| Cache de prompt | O começo do prompt, idêntico em toda chamada | A maior parte do custo e parte da latência do prefixo | Quase nenhum: a resposta continua sendo gerada |
| Cache de embedding | O mesmo texto vetorizado de novo | A chamada de embedding | Vetor velho se o modelo de embedding mudar |
| Cache de resposta exato | A mesma pergunta, depois de normalizada | A chamada inteira | Resposta velha ou de outra pessoa |
| Cache semântico | Perguntas diferentes com o mesmo sentido | A chamada inteira | Devolver a resposta de uma pergunta parecida, mas diferente |
O provedor processa o prompt em ordem. Se o começo é idêntico ao de uma chamada recente, ele reaproveita esse processamento e cobra menos por ele. Na API da Anthropic, a ordem é ferramentas, depois system, depois mensagens, e o cache_control marca até onde o prefixo deve ser guardado. Na OpenAI, prompts longos são cacheados automaticamente, sem marcação.
Três regras práticas saem daí. O prefixo precisa ser idêntico byte a byte; um espaço a mais quebra o acerto. Existe um tamanho mínimo de prefixo para entrar no cache, que varia por modelo. E o cache expira: na Anthropic, a validade padrão é de alguns minutos, renovada a cada acerto, com opção de uma hora pagando mais na escrita.
Suponha 10 mil perguntas por dia, um prefixo de 9 mil tokens e um preço ilustrativo de US$ 3 por milhão de tokens de entrada. Na tabela da Anthropic, ler do cache custa 10% do preço normal de entrada, e gravar no cache custa 25% a mais (confira os valores atuais do seu provedor).
sem cache: 10.000 × 9.000 = 90 milhões de tokens/dia × US$ 3/M = US$ 270/dia só de prefixo
com cache: quase tudo vira leitura a 10% ≈ US$ 27/dia
mais as gravações, que acontecem só quando o cache expira
O ganho depende do tráfego ser contínuo. Com uma pergunta a cada meia hora, o cache expira entre uma e outra e quase toda chamada paga a gravação.
A regra de validade é o que torna o cache de resposta seguro: a resposta cacheada guarda de quais fontes veio, em qual versão, e deixa de valer se alguma delas mudou. Os padrões de destino são o Cache de Prompt e o Cache Semântico.
usage da API.cache_read_input_tokens deve ser positivo. Se vier zero, procure algo variável no começo do prompt (data, nome, ordem de ferramentas que muda).A chave do cache exato decide o que conta como “a mesma pergunta”. Minúsculas, espaços e pontuação podem sair. Números, nomes de cidade, datas e negações precisam ficar.
"Como tiro a 2ª via do boleto?" e "como tiro a 2ª via do boleto" mesma chave
"Qual o frete para Manaus?" e "Qual o frete para Belém?" chaves diferentes
"Posso trocar depois de 30 dias?" e "Posso trocar antes de 30 dias?" chaves diferentes
Uma normalização agressiva (tirar números, aplicar sinônimos) sobe a taxa de acerto e começa a errar sem aviso.
cache_read_input_tokens pega isso no dia.Por que este prompt nunca acerta o cache, e como reorganizar?
system = f"""Data: {datetime.now().isoformat()}
Usuário: {user.name} (plano {user.plan})
Você é o assistente da loja. [8 mil tokens de regras e catálogo de ferramentas]"""
O começo do prompt muda a cada chamada (data com segundos, nome do usuário), então o prefixo nunca é igual. Reorganize com o fixo primeiro e o variável depois:
system = [
{"type": "text", "text": RULES_AND_TOOLS_8K, "cache_control": {"type": "ephemeral"}},
{"type": "text", "text": f"Usuário: {user.name} (plano {user.plan}). Data: {date.today()}"},
]A data só com o dia, e depois do ponto de cache.
Introduzir Cache (Introduce Cache) é uma refatoração de IA para sistemas com LLM, do grupo Operação. Reaproveitar prefixos de prompt e respostas para perguntas equivalentes.
Trata Pagando Duas Vezes.
Ao padrão de projeto Cache Semântico e Cache de Prompt.