Reduza os Custos de LLM: Estratégias de Otimização de Tokens

Reduza os custos do LLM em 80% com otimização inteligente de tokens

Conteúdo da página

A otimização de tokens é a habilidade crítica que separa as aplicações de LLM custo-efetivas das experiências que consomem orçamento.

Com os custos da API escalando linearmente com o uso de tokens, compreender e implementar estratégias de otimização pode reduzir os custos em 60-80% mantendo a qualidade.

arquitetura inteligente

Entendendo a Economia de Tokens

Antes de otimizar, você precisa entender como os tokens e os preços funcionam em diferentes provedores de LLM.

Básicos dos Tokens

Tokens são as unidades fundamentais que os LLMs processam - aproximadamente equivalentes a 4 caracteres ou 0,75 palavras em inglês. A string “Hello, world!” contém aproximadamente 4 tokens. Diferentes modelos usam diferentes tokenizers (GPT usa o tiktoken, Claude usa o seu próprio), então as contagens de tokens variam ligeiramente entre os provedores.

Comparação de Modelos de Preços

Preços da OpenAI (até 2025):

  • GPT-4 Turbo: $0,01 de entrada / $0,03 de saída por 1K tokens
  • GPT-3.5 Turbo: $0,0005 de entrada / $0,0015 de saída por 1K tokens
  • GPT-4o: $0,005 de entrada / $0,015 de saída por 1K tokens

Preços da Anthropic:

  • Claude 3 Opus: $0,015 de entrada / $0,075 de saída por 1K tokens
  • Claude 3 Sonnet: $0,003 de entrada / $0,015 de saída por 1K tokens
  • Claude 3 Haiku: $0,00025 de entrada / $0,00125 de saída por 1K tokens

Para uma comparação abrangente de provedores de LLM na nuvem, incluindo preços detalhados, recursos e casos de uso, consulte nosso guia dedicado.

Insight-chave: Os tokens de saída custam 2-5 vezes mais que os tokens de entrada. Limitar o comprimento da saída tem um impacto desproporcional nos custos.

Engenharia de Prompt para Eficiência

A engenharia de prompt eficaz reduz drasticamente o consumo de tokens sem sacrificar a qualidade.

1. Elimine a Redundância

Exemplo Ruim (127 tokens):

Você é um assistente útil. Por favor, me ajude com a seguinte tarefa.
Eu gostaria que você analisasse o seguinte texto e me fornecesse
um resumo. Aqui está o texto que gostaria que você resumisse:
[text]
Por favor, forneça um resumo conciso dos principais pontos.

Otimizado (38 tokens):

Resuma os pontos principais:
[text]

Economia: Redução de 70% nos tokens, qualidade de saída idêntica.

2. Use Formatos Estruturados

JSON e saídas estruturadas reduzem o desperdício de tokens devido a linguagem natural verbose.

Em vez de:

Por favor, extraia o nome da pessoa, a idade e a profissão deste texto
e formate sua resposta claramente.

Use:

Extraia para JSON: {nome, idade, profissão}
Texto: [input]

3. Otimização de Aprendizado com Poucos Exemplos

Exemplos com poucos exemplos são poderosos, mas caros. Otimize usando:

  • Use o mínimo de exemplos necessários (1-3 normalmente suficiente)
  • Mantenha os exemplos concisos - remova palavras desnecessárias
  • Compartilhe prefixos comuns - reduza instruções repetidas
# Prompt otimizado com poucos exemplos
prompt = """Classifique o sentimento (pos/neg):
Texto: "Produto excelente!" -> pos
Texto: "Desapontado" -> neg
Texto: "{user_input}" ->"""

Para mais padrões de otimização do Python e atalhos de sintaxe, veja nossa Folha de Dicas do Python.

Estratégias de Cache de Contexto

O cache de contexto é a estratégia mais eficaz de otimização para aplicações com conteúdo estático repetido.

Como o Cache de Contexto Funciona

Provedores como a OpenAI e a Anthropic cacheiam prefixos de prompt que aparecem em múltiplas solicitações. Partes cacheadas custam 50-90% menos que tokens regulares.

Requisitos:

  • Conteúdo cacheável mínimo: 1024 tokens (OpenAI) ou 2048 tokens (Anthropic)
  • TTL do cache: 5-60 minutos dependendo do provedor
  • O conteúdo deve ser idêntico e aparecer no início do prompt

Exemplo de Implementação

from openai import OpenAI

client = OpenAI()

# Mensagem do sistema cacheada entre solicitações
SYSTEM_PROMPT = """Você é um assistente de atendimento ao cliente para a TechCorp.
Políticas da empresa:
[Documento de política grande - 2000 tokens]
"""

# Isso é cacheado automaticamente
response = client.chat.completions.create(
    model="gpt-4-turbo",
    messages=[
        {"role": "system", "content": SYSTEM_PROMPT},
        {"role": "user", "content": "Como faço para devolver um item?"}
    ]
)

# Chamadas subsequentes dentro do TTL do cache usam o prompt do sistema cacheado
# Pagando apenas pela mensagem do usuário + saída

Impacto Real-World: Aplicações com bases de conhecimento ou instruções longas veem uma redução de custos de 60-80%.

Estratégia de Seleção de Modelos

Usar o modelo certo para cada tarefa é crucial para a otimização de custos.

A Escada dos Modelos

  1. GPT-4 / Claude Opus - Raciocínio complexo, tarefas criativas, precisão crítica
  2. GPT-4o / Claude Sonnet - Equilíbrio entre desempenho/custo, propósito geral
  3. GPT-3.5 / Claude Haiku - Tarefas simples, classificação, extração
  4. Modelos menores finetunados - Tarefas repetitivas especializadas

Padrão de Roteamento

def route_request(task_complexity, user_query):
    """Roteia para o modelo apropriado com base na complexidade"""
    
    # Classificação simples - use Haiku
    if task_complexity == "simple":
        return call_llm("claude-3-haiku", user_query)
    
    # Moderado - use Sonnet
    elif task_complexity == "moderate":
        return call_llm("claude-3-sonnet", user_query)
    
    # Raciocínio complexo - use Opus
    else:
        return call_llm("claude-3-opus", user_query)

Estudo de Caso: Um chatbot de atendimento ao cliente que roteia 80% das consultas para o GPT-3.5 e 20% para o GPT-4 reduziu os custos em 75% em comparação ao usar o GPT-4 para tudo.

Processamento em Lote

Para cargas de trabalho que não são sensíveis ao tempo, o processamento em lote oferece descontos de 50% da maioria dos provedores.

API de Processamento em Lote da OpenAI

from openai import OpenAI
client = OpenAI()

# Crie um arquivo em lote
batch_requests = [
    {"custom_id": f"request-{i}", 
     "method": "POST",
     "url": "/v1/chat/completions",
     "body": {
         "model": "gpt-3.5-turbo",
         "messages": [{"role": "user", "content": query}]
     }}
    for i, query in enumerate(queries)
]

# Envie o lote (50% de desconto, processamento de 24h)
batch = client.batches.create(
    input_file_id=upload_batch_file(batch_requests),
    endpoint="/v1/chat/completions",
    completion_window="24h"
)

Casos de Uso:

  • Rótulo e anotação de dados
  • Geração de conteúdo para blogs/SEO
  • Geração de relatórios
  • Traduções em lote
  • Geração sintética de conjuntos de dados

Técnicas de Controle de Saída

Como os tokens de saída custam 2-5 vezes mais, controlar o comprimento da saída é crítico.

1. Defina o Número Máximo de Tokens

response = client.chat.completions.create(
    model="gpt-4",
    messages=messages,
    max_tokens=150  # Limite rígido previne custos descontrolados
)

2. Use Sequências de Parada

response = client.chat.completions.create(
    model="gpt-4",
    messages=messages,
    stop=["END", "\n\n\n"]  # Parem em marcadores
)

3. Peça Formatos Concisos

Adicione instruções como:

  • “Responda em menos de 50 palavras”
  • “Forneça apenas pontos em destaque”
  • “Retorne apenas JSON, sem explicação”

Streaming para uma Melhor Experiência do Usuário

Embora o streaming não reduza os custos, melhora a performance percebida e permite a interrupção precoce.

stream = client.chat.completions.create(
    model="gpt-4",
    messages=messages,
    stream=True
)

for chunk in stream:
    if chunk.choices[0].delta.content:
        token = chunk.choices[0].delta.content
        print(token, end="")
        
        # Interrompa precocemente se a resposta sair do caminho
        if undesired_pattern(token):
            break

Otimização de RAG

Geração Aumentada com Recuperação (RAG) adiciona contexto, mas um RAG não otimizado desperdiça tokens.

Padrão de RAG Eficiente

def optimized_rag(query, vector_db):
    # 1. Recupere os trechos relevantes
    chunks = vector_db.search(query, top_k=3)  # Não muito muitos
    
    # 2. Comprima os trechos - remova redundâncias
    compressed = compress_chunks(chunks)  # Compressão personalizada
    
    # 3. Truncar até o limite de tokens
    context = truncate_to_tokens(compressed, max_tokens=2000)
    
    # 4. Prompt estruturado
    prompt = f"Contexto:\n{context}\n\nQ: {query}\nA:"
    
    return call_llm(prompt)

Técnicas de Otimização:

  • Use chunking semântico (não tamanho fixo)
  • Remova formatação markdown dos trechos recuperados
  • Implemente reclassificação para obter conteúdo mais relevante
  • Considere resumo de chunk para documentos grandes

Caching de Respostas

Cache de solicitações idênticas ou similares para evitar totalmente chamadas à API.

Implementação com Redis

import redis
import hashlib
import json

redis_client = redis.Redis()

def cached_llm_call(prompt, model="gpt-4", ttl=3600):
    # Crie a chave de cache a partir do prompt + modelo
    cache_key = hashlib.md5(
        f"{model}:{prompt}".encode()
    ).hexdigest()
    
    # Verifique o cache
    cached = redis_client.get(cache_key)
    if cached:
        return json.loads(cached)
    
    # Chame o LLM
    response = call_llm(model, prompt)
    
    # Cache o resultado
    redis_client.setex(
        cache_key, 
        ttl, 
        json.dumps(response)
    )
    
    return response

Caching Semântico: Para consultas similares (não idênticas), use embeddings vetoriais para encontrar respostas cacheadas.

Monitoramento e Análise

Monitore o uso de tokens para identificar oportunidades de otimização.

Métricas Essenciais

class TokenTracker:
    def __init__(self):
        self.metrics = {
            'total_tokens': 0,
            'input_tokens': 0,
            'output_tokens': 0,
            'cost': 0.0,
            'requests': 0
        }
    
    def track_request(self, response, model):
        usage = response.usage
        self.metrics['input_tokens'] += usage.prompt_tokens
        self.metrics['output_tokens'] += usage.completion_tokens
        self.metrics['total_tokens'] += usage.total_tokens
        self.metrics['cost'] += calculate_cost(usage, model)
        self.metrics['requests'] += 1
    
    def report(self):
        return {
            'avg_tokens_per_request': 
                self.metrics['total_tokens'] / self.metrics['requests'],
            'total_cost': self.metrics['cost'],
            'input_output_ratio': 
                self.metrics['input_tokens'] / self.metrics['output_tokens']
        }

Alertas de Custo

Configure alertas quando o uso ultrapassar os limites:

def check_cost_threshold(daily_cost, threshold=100):
    if daily_cost > threshold:
        send_alert(f"Custo diário ${daily_cost} excedeu ${threshold}")

Técnicas Avançadas

1. Modelos de Compressão de Prompt

Use modelos dedicados para comprimir prompts:

  • LongLLMLingua
  • AutoCompressors
  • Tokens de compressão aprendidos

Esses podem alcançar razões de compressão de 10x mantendo 90%+ de desempenho nas tarefas.

2. Decodificação Especulativa

Execute um modelo pequeno junto com um modelo grande para prever tokens, reduzindo chamadas ao modelo grande. Normalmente 2-3x aceleração e redução de custos para qualidade semelhante.

3. Quantização

Para modelos auto-hospedados, a quantização (4-bit, 8-bit) reduz memória e computação:

  • 4-bit: ~75% redução de memória, perda mínima de qualidade
  • 8-bit: ~50% redução de memória, perda insignificante de qualidade

Se você estiver executando LLMs localmente, Ollama fornece uma excelente plataforma para implantar modelos quantizados com mínima configuração. Para seleção de hardware e benchmarks de desempenho, nossa comparação entre NVIDIA DGX Spark, Mac Studio e RTX-4080 mostra o desempenho real em diferentes configurações de hardware executando modelos grandes quantizados.

Checklist de Otimização de Custo

  • Perfil o uso atual de tokens e custos por endpoint
  • Audite prompts para redundância - remova palavras desnecessárias
  • Implemente cache de contexto para conteúdo estático > 1K tokens
  • Configure roteamento de modelos (pequeno para simples, grande para complexo)
  • Adicione limites de max_tokens a todas as solicitações
  • Implemente cache de resposta para consultas idênticas
  • Use a API de lote para cargas de trabalho não urgentes
  • Ative streaming para melhor experiência do usuário
  • Otimize RAG: menos chunks, melhor classificação
  • Monitore com rastreamento de tokens e alertas de custo
  • Considere finetuning para tarefas repetitivas
  • Avalie modelos menores (Haiku, GPT-3.5) para classificação

Estudo de Caso Real-World

Cenário: Chatbot de suporte ao cliente, 100K solicitações/mês

Antes da Otimização:

  • Modelo: GPT-4 para todas as solicitações
  • Média de tokens de entrada: 800
  • Média de tokens de saída: 300
  • Custo: 100K × (800 × 0,00003 + 300 × 0,00006) = $4.200/mês

Depois da Otimização:

  • Roteamento de modelos: 80% GPT-3.5, 20% GPT-4
  • Cache de contexto: 70% dos prompts cacheados
  • Compressão de prompt: 40% redução
  • Cache de resposta: 15% taxa de acerto no cache

Resultados:

  • 85% das solicitações evitaram o GPT-4
  • 70% beneficiaram-se do desconto do cache de contexto
  • 40% menos tokens de entrada
  • Custo efetivo: $780/mês
  • Economia: 81% ($3.420/mês)

Conclusão

A otimização de tokens transforma a economia de LLM de proibitivamente cara para escalável de forma sustentável. Ao implementar compressão de prompt, cache de contexto, seleção inteligente de modelos e cache de resposta, a maioria das aplicações consegue reduzir os custos em 60-80% sem comprometer a qualidade.

Comece com as vitórias rápidas: audite seus prompts, ative o cache de contexto e roteie tarefas simples para modelos menores. Monitore seu uso de tokens religiosamente - o que é medido é otimizado. A diferença entre uma aplicação de LLM custo-efetiva e uma cara não é a tecnologia — é a estratégia de otimização.

Artigos Relacionados