Aplicação de LLM tem um padrão de custo peculiar: ela funciona, ninguém olha a fatura por dois meses, e quando alguém olha o valor triplicou sem que o número de usuários tenha triplicado.
Na quase totalidade dos casos que analisamos, o vazamento está nos mesmos cinco lugares. Nenhum deles exige trocar de modelo nem reescrever o produto.
Registre em cada chamada: tokens de entrada, tokens de saída, modelo, tipo de tarefa e usuário. Sem isso você vai otimizar o que é fácil, não o que é caro.
É comum descobrir que 80% do gasto vem de um único fluxo que ninguém suspeitava — e que os outros vinte não valem o esforço.
1. O histórico que cresce para sempre
É o vazamento número um, com folga. Um chat que reenvia toda a conversa a cada mensagem tem custo quadrático: a décima mensagem paga as nove anteriores de novo.
Numa conversa de 30 trocas, com 200 tokens por mensagem, você paga cerca de 93 mil tokens de entrada em vez dos 6 mil que a conversa contém. Quinze vezes mais.
A correção padrão é uma janela deslizante com resumo:
MAX_RECENTES = 8
def montar_contexto(sistema, historico, resumo_atual):
recentes = historico[-MAX_RECENTES:]
antigas = historico[:-MAX_RECENTES]
if antigas and precisa_resumir(antigas, resumo_atual):
resumo_atual = resumir(antigas) # chamada barata, modelo pequeno
msgs = [{"role": "system", "content": sistema}]
if resumo_atual:
msgs.append({"role": "system",
"content": f"Resumo da conversa até aqui: {resumo_atual}"})
return msgs + recentes
Resuma apenas quando o trecho antigo passar de um limite, e reaproveite o resumo — resumir a cada mensagem troca um problema por outro. Efeito típico: 40 a 70% de corte em produtos de conversa.
2. Modelo caro fazendo trabalho fácil
A diferença de preço entre o modelo mais simples e o mais capaz da mesma prateleira passa de trinta vezes na entrada e de setenta na saída. Usar o mais caro para classificar uma intenção em cinco categorias é queimar dinheiro por conforto.
| Tarefa | Modelo adequado | Por quê |
|---|---|---|
| Classificar intenção, detectar idioma, extrair campo simples | O mais barato | Tarefa fechada, acerto praticamente igual |
| Resumir, reescrever, responder com contexto dado | Intermediário | Precisa de fluência, não de raciocínio profundo |
| Código, análise em várias etapas, decisão difícil | O mais capaz | Aqui a diferença de qualidade aparece |
O roteamento pode ser explícito — cada ponto do seu código escolhe o modelo — ou por triagem: um modelo barato classifica a dificuldade e só encaminha ao caro o que precisa. A primeira opção é mais simples e quase sempre suficiente.
Efeito típico: 30 a 60%, dependendo de quanta tarefa mecânica existe no seu fluxo.
3. Saída sem teto
Saída custa de duas a cinco vezes mais que entrada. E, sem max_tokens, o modelo escreve até se satisfazer — o que costuma ser mais do que o usuário queria ler.
{
"model": "gpub-mini",
"max_tokens": 350,
"messages": [
{"role": "system", "content": "Responda em no máximo 3 frases curtas."},
...
]
}
Use os dois: o teto técnico impede o desastre, a instrução no prompt evita que a resposta seja cortada no meio. Só o teto, sem a instrução, produz frases truncadas — que é pior que resposta longa.
Modelos com raciocínio explícito geram um bloco de pensamento antes da resposta, e esse bloco é cobrado como saída. Numa pergunta simples, o raciocínio pode ser cinco vezes maior que a resposta.
Se a sua tarefa não precisa de raciocínio — classificar, extrair, reescrever —, escolha um modelo que não pense, ou reduza o esforço de raciocínio se o modelo permitir. É um dos cortes mais fáceis e menos conhecidos.
4. Contexto recuperado em excesso
Em sistemas com busca sobre documentos, é comum mandar os 10 trechos mais relevantes por garantia. Dez trechos de 500 palavras são cerca de 6.500 tokens por pergunta, em toda pergunta.
Duas correções que somam:
- Reordene e corte. Recupere 20, reordene com um modelo de reordenação e mande os 4 melhores. Costuma melhorar a resposta, porque trecho irrelevante distrai o modelo.
- Corte por relevância, não por número fixo. Se o quinto trecho tem pontuação muito abaixo do primeiro, ele provavelmente não ajuda — descarte.
Efeito típico: 40 a 60% do custo de entrada em sistemas de busca, com qualidade igual ou melhor.
5. Perguntas repetidas
Em atendimento, uma fração enorme das perguntas é a mesma: horário de funcionamento, política de troca, como cancelar. Não há motivo para pagar geração toda vez.
import hashlib, json
def chave(pergunta, contexto_id):
normal = " ".join(pergunta.lower().split())
return hashlib.sha1(f"{contexto_id}|{normal}".encode()).hexdigest()
def responder(pergunta, contexto_id, ttl=86400):
k = chave(pergunta, contexto_id)
if (r := cache.get(k)):
return r
r = chamar_modelo(pergunta)
cache.set(k, r, ttl)
return r
Duas cautelas: inclua no identificador tudo que muda a resposta (cliente, plano, versão da política) — cache que devolve a resposta de outro contexto é pior que não ter cache. E defina prazo de validade curto para conteúdo que muda.
Um passo além é o cache semântico: se a nova pergunta for muito parecida com uma já respondida (medida por embedding), reaproveite. Ganha mais acertos e exige limiar bem calibrado — acima de 0,95 de similaridade, na prática.
A conta antes e depois
Assistente interno, 2.000 conversas por mês, 12 mensagens por conversa:
| Antes | Depois | |
|---|---|---|
| Tokens de entrada por conversa | ~78.000 | ~14.000 |
| Tokens de saída por conversa | ~6.000 | ~3.600 |
| Modelo | O mais capaz em tudo | Barato em 70% das chamadas |
| Custo mensal estimado | ~R$ 3.400 | ~R$ 190 |
Preços de agosto de 2026, para uma GPU avulsa, sem interrupção programada. O catálogo muda: confira a vitrine antes de fechar a conta.
Não é um exemplo forçado: os quatro primeiros cortes se multiplicam entre si. Janela de contexto pela metade e modelo dez vezes mais barato em boa parte das chamadas dá uma redução que parece exagerada até você refazer a conta.
Veja para onde vai o seu gasto
O painel mostra consumo por modelo e por chave, e a cobrança é em reais no mesmo saldo das GPUs. Sem assinatura, sem mínimo.
Criar conta →O que não vale a pena
- Encurtar o prompt de sistema. Economiza 200 tokens e pode custar qualidade. Não é aí que está o dinheiro.
- Trocar palavras por abreviações. O ganho é irrisório e a resposta piora.
- Migrar tudo para servidor próprio por causa do custo. Só compensa com volume alto e constante; com uso irregular, a máquina parada custa mais que a API.
- Otimizar antes de medir. Já dito, e continua sendo o conselho mais ignorado.
Conclusão
Conta de token alta quase nunca é preço de modelo — é desenho de aplicação. Corte o histórico com janela e resumo, escolha o modelo por tarefa, ponha teto na saída, mande menos contexto e melhor selecionado, e guarde o que se repete.
Comece registrando tokens por chamada e por fluxo durante uma semana. O gráfico vai apontar o culpado sozinho, e na maioria das vezes ele é o primeiro item desta lista.
Continue: servidor próprio vs API · latência percebida · medir onde gasta