Saltar para o conteúdo
V VazDEng
llm

Prompt caching: o ajuste de 1 linha que corta 90% do custo de LLM em produção

cache_control ephemeral, TTL 5 min, e como uma linha derrubou 75% do custo do meu pipeline noturno.

Por Thais Vaz 11 Jun · 2026 5 min de leitura PT · EN
Prompt caching: o ajuste de 1 linha que corta 90% do custo de LLM em produção

18 mil tokens. Era o custo de cada execução do meu pipeline de notícias com 6 sub-agents paralelos. Depois de uma linha de código, virou 4 mil e quinhentos. Sem mudar o modelo. Sem mudar o prompt. Sem mudar o output. Só liguei o cache.

A feature existe na API Anthropic há mais de um ano. A maioria dos times que usa LLM em produção ainda não ligou. Eu mesma rodei meses pagando preço cheio antes de olhar a fatura com atenção. É o ajuste com melhor retorno por minuto de trabalho que conheço hoje.

Por que o custo de LLM em produção é prefixo

Toda chamada pra API manda 4 coisas: system prompt, few-shots, contexto e pergunta. Em pipeline de verdade, os 3 primeiros somam 80 a 95 por cento dos tokens, e repetem a cada chamada. A pergunta muda. O resto é prefixo.

Sem cache, você paga pelo prefixo inteiro toda vez. Em pipeline que roda dezenas ou centenas de vezes por hora, isso vira a conta. Em pipeline com fan-out paralelo (vários sub-agents, mesmo system prompt), vira a conta vezes o número de sub-agents.

Com cache, você paga o prefixo uma vez (cache write), e depois só o delta da nova chamada (cache read). Cache read custa cerca de 10% do preço de input normal.

Anatomia de uma chamada: system prompt, few-shots e contexto são 80-95% dos tokens e repetem; só a pergunta muda

Como funciona o cache na Anthropic

Você marca um bloco do prompt com cache_control: ephemeral. Exemplo simplificado:

"system": [
  {
    "type": "text",
    "text": "<system prompt longo e estável aqui>",
    "cache_control": {"type": "ephemeral"}
  }
]

TTL padrão é 5 minutos. Próxima chamada dentro desse intervalo: o prefixo cacheado é lido a 10% do preço normal. A Anthropic também oferece TTL de 1 hora como opção paga, útil pra workflows mais espaçados.

A API retorna 2 métricas que você precisa monitorar:

Sem mexer no modelo, sem reescrever prompt. Só sinalizar o que é cacheável.

Bench real do pipeline noticias-diarias

O número da abertura vem de um pipeline que eu construí e mantenho: minha skill de notícias diárias, que roda todo dia às 8h BRT. Dispara 6 sub-agents paralelos via tool Agent: data-eng, IA, invest, cripto, política BR, política internacional. Cada um carrega um system prompt fixo de aproximadamente 3 mil tokens com regras de tom, formato Telegram, fontes priorizadas e estilo de síntese.

Sem cache, a conta que eu pagava era direta:

Com cache:

Em pipeline de produção mais agressivo (que roda dezenas de vezes por hora, com prefixos maiores), o corte chega a 90%.

Bench real: 18 mil tokens por execução sem cache vs 4,5 mil com cache, corte de 75%

Onde brilha, onde não brilha

Brilha:

Não brilha:

Onde o cache brilha: prefixo fixo, fan-out, loop, documento grande. Onde não: one-shot, prompt instável, cadência acima do TTL

Cuidados que matam o ganho se você não conhece:

  1. Cache write é mais lento que call normal. Você paga uma vez em latência, ganha em todas as seguintes. Em pipeline noturno isso não importa. Em chat interativo, importa.
  2. Não cachear PII ou dado sensível sem auditar. Cache é per-account na Anthropic, mas o princípio vale.
  3. TTL 5 min é janela curta. Se sua skill roda o pipeline a cada 10 minutos, o cache nunca pega. Pra esses casos, use o TTL de 1 hora.
  4. Você só vê o ganho se monitora as 2 métricas. Um timestamp no começo do system prompt basta pra o prefixo nunca cachear, e sem olhar cache_read você acha que ligou e não ligou.

Não é micro-otimização. É arquitetura.

Quem está pagando 100% do preço de cada chamada porque “não teve tempo de configurar” está acumulando dívida com a Anthropic todo mês. Em pipeline de produção com volume sério, isso vira milhares de reais por ano. Por uma linha de código.

A regra que eu sigo em tudo que construo agora: estruture o prompt em camadas. Estável primeiro (cacheável), volátil depois. Marque o estável com cache_control: ephemeral. Monitore cache_creation e cache_read. Pague uma vez, leia muitas.

É o ABC. E ainda tem time chamando isso de “otimização avançada”.


Próximo post sábado 10h: Zero to Expert Ep 02 sobre dependências em DAG, a lei que todo orquestrador segue por baixo do nome. Sem Airflow no centro.

Assina o VazDEng se ainda não assina: vazdeng.substack.com.