Context pruning — o que remover do prompt

TL;DR

Context pruning é o ato deliberado de remover do prompt tudo que não contribui para a tarefa atual. Mais contexto não é sempre melhor: tokens irrelevantes aumentam custo, diluem a atenção do modelo e degradam qualidade de resposta. As técnicas vão de retrieval seletivo (enviar só as linhas que importam) até sumarização de histórico e truncamento de tool outputs. A regra de ouro: se o modelo não precisa desse token para responder agora, ele não deveria estar no contexto.

O problema: o contexto engorda por si mesmo

Imagine que você contratou um consultor especialista e, antes de cada reunião, empurra para ele uma pilha de documentos — incluindo arquivos de configuração, logs de erro de semanas atrás, um changelog completo do projeto, e o manual de RH da empresa. Não porque sejam relevantes, mas porque “podem ser úteis”.

O consultor vai perder tempo folheando essa pilha antes de chegar ao que importa. E você vai pagar por esse tempo.

Com LLMs é exatamente isso. Cada token no contexto é processado pelo modelo — pago pelo provedor, carregado na janela de atenção, analisado durante a geração. Contexto irrelevante não é neutro: ele compete com o contexto relevante pela atenção limitada do modelo.

O fenômeno tem nome: lost in the middle — modelos tendem a ignorar informação no meio do contexto (veja 06 - A janela de contexto para a mecânica de atenção por trás disso). Quanto maior e mais poluído o prompt, mais crítico esse efeito. Context pruning é a resposta sistemática a esse problema.

flowchart TD
    A["Token no contexto"] --> B{{"Contribui para\na tarefa atual?"}}
    B -- "Sim" --> C["Manter"]
    B -- "Não" --> D{{"Pode ser\nresumed?"}}
    D -- "Sim" --> E["Sumarizar"]
    D -- "Não" --> F["Remover"]
    
    C --> G["Contexto limpo"]
    E --> G
    F --> G
    
    G --> H["Menos custo\nMelhor qualidade\nMenor latência"]

    style G fill:#d4edda,stroke:#28a745
    style H fill:#cce5ff,stroke:#004085
    style F fill:#f8d7da,stroke:#721c24

O que remover — taxonomia de poluição

Nem todo token tem o mesmo custo de presença. Alguns são indispensáveis (sistema de regras, contexto da tarefa); outros são sistematicamente inúteis e presentes por inércia.

O que está no contextoPrecisa?Ação recomendada
System prompt + regras de projeto✅ SempreManter — e cachear
Tool definitions (JSON schema)✅ Se as tools são usadasManter — comprimir schemas
Arquivo inteiro (500 linhas)❌ Se só 20 linhas são relevantesEnviar só o trecho relevante
Histórico de 50 turns❌ Turns antigosSumarizar blocos antigos
Output longo de ferramenta❌ Se 90% é irrelevanteFiltrar ou truncar
Stack trace completo❌ Stack completoFiltrar para as linhas que importam
package-lock.json / yarn.lock❌ NuncaExcluir via .cursorignore
node_modules / dist / build❌ NuncaExcluir da indexação
Arquivos de teste de geração anterior⚠️ DependeCommitar ou fazer stash antes de nova sessão
CLAUDE.md inflado com histórico⚠️ Se > 200 linhasManter focado em regras de engenharia
Comentários de código longos⚠️ Se redundantes com o códigoTruncar ao essencial

O paradoxo da segurança

A intuição “mais contexto = mais seguro” é errada e cara. Desenvolvedores incluem arquivos inteiros “por garantia”. Mas contexto irrelevante não é neutro — ele ocupa posições de atenção que deveriam estar no que importa. Filtre agressivamente; se o modelo errar por falta de contexto, você adiciona o trecho que faltou.

Técnicas de pruning em ordem de impacto

1. Retrieval seletivo — fragmentos, não arquivos

A técnica mais simples e de maior impacto: nunca envie um arquivo inteiro quando só parte dele é relevante.

# Ruim: lê 500 linhas para usar 20
content = read_file("auth/service.py")  # 500 tokens
 
# Bom: lê só o que importa
content = read_file("auth/service.py", offset=44, limit=25)  # 25 tokens
 
# Para código: lê ao redor de um símbolo específico
def read_around_symbol(file: str, symbol: str, context_lines: int = 10) -> str:
    lines = open(file).readlines()
    for i, line in enumerate(lines):
        if symbol in line:
            start = max(0, i - context_lines)
            end = min(len(lines), i + context_lines + 1)
            return "".join(lines[start:end])
    return ""

A economia é direta: se você lê 20 de 500 linhas, você elimina 96% dos tokens desse arquivo.

2. Truncamento e filtragem de tool outputs

Tool outputs são o maior vilão invisível. Um npm test pode gerar 200 linhas; um git diff de PR, 2000. O modelo raramente precisa de tudo.

def truncate_tool_output(output: str, max_lines: int = 50, keep_errors: bool = True) -> str:
    """
    Mantém erros sempre. Trunca o resto.
    """
    lines = output.split("\n")
    
    if len(lines) <= max_lines:
        return output
    
    if keep_errors:
        error_lines = [l for l in lines if any(
            kw in l.lower() for kw in ["error", "failed", "exception", "fatal"]
        )]
        context_lines = lines[:10] + ["..."] + lines[-10:]
        combined = list(dict.fromkeys(error_lines + context_lines))  # dedup
        return "\n".join(combined[:max_lines])
    
    return "\n".join(lines[:max_lines]) + f"\n... ({len(lines) - max_lines} linhas omitidas)"

Padrão para filtrar saída de testes:

# Ruim: 200 linhas de test output
npm test 2>&1
 
# Bom: só falhas e sumário
npm test 2>&1 | grep -E "(PASS|FAIL|Error:|●|Tests:|✓|✗)" | tail -30

3. Sumarização de histórico (context compaction)

Em conversas longas, turns antigos raramente são úteis na íntegra. O padrão é manter os últimos N turns completos e substituir o restante por um resumo.

KEEP_FULL = 8    # últimos N turns ficam intactos
MAX_SUMMARY = 800  # tokens para o resumo do histórico anterior
 
def compact_history(messages: list[dict], keep_full: int = KEEP_FULL) -> list[dict]:
    if len(messages) <= keep_full * 2:  # *2 porque user + assistant
        return messages
    
    old_messages = messages[:-keep_full * 2]
    recent_messages = messages[-keep_full * 2:]
    
    summary_prompt = f"""
Resuma esta conversa em até {MAX_SUMMARY} tokens, preservando:
- Decisões tomadas
- Artefatos criados (arquivos, schemas, configs)
- Constraints descobertos (bugs, limitações, dependências)
- O que foi DESCARTADO e por quê
 
Não inclua: diálogo casual, raciocínio intermediário já superado, conteúdo que o usuário rejeitou.
"""
    summary = llm_call(summary_prompt, old_messages)
    
    return [{"role": "system", "content": f"[Resumo da conversa anterior]\n{summary}"}] + recent_messages

Claude Code implementa isso automaticamente via “context compaction” — quando o contexto ultrapassa um threshold, uma janela deslizante compacta os turns mais antigos.

4. .cursorignore / .gitignore para indexação

IDEs com IA (Cursor, Copilot, Windsurf) indexam o projeto para retrieval. Sem configuração, eles indexam node_modules, lock files, binários e arquivos gerados — e podem incluí-los no contexto.

# .cursorignore — evitar indexação de conteúdo irrelevante
node_modules/
.yarn/
dist/
build/
.next/
*.lock
*.log
coverage/
.git/
__pycache__/
*.pyc
*.class
target/       # Java Maven
.gradle/      # Java Gradle
vendor/       # PHP, Go
*.min.js
*.map

Isso reduz o pool de retrieval e evita que o modelo receba contexto de arquivos que nunca deveriam ser tocados.

5. Higiene de CLAUDE.md e arquivos de instrução

O system prompt — via CLAUDE.md, AGENTS.md ou equivalente — é enviado em todos os turns. Cada linha extra custa tokens em toda chamada da sessão.

❌ CLAUDE.md ruim (300+ linhas):
## Histórico do Projeto
- 2024-01: Iniciamos com Flask...
- 2024-03: Migramos para FastAPI por causa de X, Y, Z...
- 2024-06: O cliente pediu autenticação OAuth porque...
[... 200 linhas de história ...]
 
✅ CLAUDE.md bom (< 80 linhas):
## Stack
- Python 3.12, FastAPI 0.115, PostgreSQL 16
- Auth: OAuth2 + JWT (access 15min, refresh 7d)
 
## Convenções
- Testes em tests/ com pytest; cobertura mínima 80%
- Commits: conventional commits (feat/fix/chore)
- Nunca expor credenciais; usar .env + pydantic-settings

História do projeto vai no README ou em documentos internos — não no CLAUDE.md.

6. Commits frequentes antes de novas sessões

Agentes leem git status e arquivos modificados. Se você tem 30 arquivos alterados de sessões anteriores mas está trabalhando em apenas 2, o agente pode incluir contexto de todos os 30.

# Antes de iniciar uma nova sessão de pair programming com IA
git add -p          # review interativo do que vale commitar
git stash           # guardar WIP não relacionado
git status          # validar: só os arquivos desta tarefa aparecem

7. Externalização de artefatos grandes

Em vez de incluir specs, ERDs ou documentação técnica no contexto, referencie-os por caminho e instrua o agente a buscar sob demanda.

❌ Ruim (50k tokens inline):
"Aqui está a especificação completa do sistema de pagamentos:
[...50 páginas de texto...]"
 
✅ Bom (100 tokens de referência):
"A spec de pagamentos está em docs/payment-spec.md.
Leia as seções que você precisar. A seção de webhooks
está nas linhas 230-280 se precisar do formato de eventos."

O agente chama read_file com offset/limit quando precisa de uma seção específica. Você paga pelos tokens da spec só quando — e só os trechos que — o agente realmente consulta.

Esse padrão funciona porque agentes modernos têm acesso a ferramentas de leitura. Quando você força o contexto inline, você paga pelo documento inteiro toda vez, independente de o modelo precisar de 10% ou 100% dele.

Decisão de poda — algoritmo mental

A pergunta não é “isso pode ser útil?”, mas “o modelo precisa disso para responder à pergunta atual?”

flowchart TD
    A["Candidato a inclusão\nno contexto"] --> B{{"O modelo precisa\npara a tarefa atual?"}}
    B -- "Sim, claramente" --> C["Incluir"]
    B -- "Talvez" --> D{{"Pode ser\nbuscado sob demanda?"}}
    B -- "Não" --> E["Excluir"]
    D -- "Sim" --> F["Externalizar — referenciar\npor caminho, buscar se precisar"]
    D -- "Não" --> G{{"Pode ser\nresumido?"}}
    G -- "Sim" --> H["Sumarizar"]
    G -- "Não" --> I["Incluir com aviso\nde custo"]

    style C fill:#d4edda,stroke:#28a745
    style E fill:#f8d7da,stroke:#721c24
    style F fill:#fff3cd,stroke:#856404
    style H fill:#cce5ff,stroke:#004085

Impacto em custo e qualidade

TécnicaRedução de tokensImpacto na qualidade
Retrieval seletivo (trecho vs arquivo)60-95% por arquivo✅ Melhora — mais focado
Truncamento de tool outputs50-80% por output✅ Melhora — menos ruído
Sumarização de histórico70-90% no histórico antigo⚠️ Neutro se bem feito; perde detalhes se ruim
.cursorignore20-40% no pool de retrieval✅ Melhora — menos falsos positivos
CLAUDE.md enxuto10-30% por turn✅ Neutro a melhora
Higiene de git (stash/commit)Variável✅ Melhora — agente vê só o relevante

Podar demais é tão ruim quanto não podar

Remover contexto crítico faz o modelo alucinar ou tomar decisões erradas. A técnica não é “menos contexto sempre” — é “contexto certo para a tarefa atual”. Meça qualidade antes e depois: faça perguntas de probe (perguntas cujas respostas corretas dependem do contexto removido) e verifique se o modelo ainda as acerta.

Armadilhas comuns

Sumarização que apaga decisões arquiteturais

Resumidores genéricos tendem a preservar fatos factuais e apagar raciocínio de decisão. “Decidimos usar Redis em vez de Memcached” pode sobreviver; “decidimos não usar Redis porque o time não tem expertise e a latência atual é aceitável” é exatamente o tipo de contexto que se perde. Instrua explicitamente o summarizer a preservar decisões de design com suas motivações.

Não testar o impacto do pruning

Pruning sem medição é perigoso. Antes de ativar truncamento de tool output ou sumarização, defina um conjunto de probe questions — perguntas cuja resposta correta depende do contexto que você está removendo. Valide que o modelo ainda as responde corretamente com o contexto podado. Se não, você está removendo mais do que deveria.

CLAUDE.md como diário de projeto

É comum que arquivos de instrução cresçam por acumulação — cada sessão adiciona um contexto novo sem remover o obsoleto. Após 6 meses, um CLAUDE.md pode ter 500 linhas de história e convenções superadas. Revise trimestralmente: se uma linha não guia decisões técnicas ativas, ela não deveria estar lá.

Lock files e gerados no retrieval

IDEs com IA sem .cursorignore indexam package-lock.json, yarn.lock, Cargo.lock — arquivos que nunca deveriam ser tocados pelo modelo. Isso polui o retrieval e pode levar o modelo a “ler” dependências transitivas como contexto. Configure antes de iniciar o projeto.

Estado da arte — junho 2026

LLM-guided pruning automático: ferramentas como PromptPex e ContextGenie usam um modelo leve (Haiku, Flash) para pré-filtrar o contexto antes de enviá-lo ao modelo principal. O modelo leve avalia relevância de cada chunk para a query atual — o que custa ~0.10 no modelo principal.

Sliding window com compaction: o padrão emergiu de Claude Code (context compaction automático) e foi adotado por Cursor, Windsurf e Aider. A janela deslizante mantém os últimos N turns completos e compacta o restante. Em 2026, esses sistemas permitem configurar o threshold e o modelo usado para compactação.

Semantic chunking para retrieval: em vez de chunks fixos de 512 tokens, ferramentas modernas segmentam por unidade semântica (função, classe, parágrafo coerente) antes de indexar. O retrieval então busca chunks semanticamente relevantes — e o modelo vê só os chunks selecionados, não o arquivo inteiro.

Pruning por grafo de dependência: para código, análise estática identifica quais funções/classes são realmente invocadas pela tarefa atual, e só essas são incluídas no contexto. Em vez de “inclua o serviço inteiro”, inclua “as 3 funções que seu grafo de chamadas mostra serem relevantes”.

Context budget tracking: plataformas como LangSmith e LangFuse passaram a expor “context utilization” — métricas que mostram qual percentual do contexto o modelo realmente “atendeu” (via métricas de atenção ou análise pós-hoc). Isso transforma pruning de arte em ciência: você vê quais seções o modelo ignorou e pode removê-las nas próximas chamadas.

Casos práticos

Caso 1 — Review de PR com 30 arquivos modificados: Um agente de code review estava recebendo o diff completo de um PR com 30 arquivos e 2000 linhas alteradas. Custo por review: 0.04, e a qualidade melhorou porque o modelo parou de se distrair com arquivos de migração e de configuração que mudaram incidentalmente.

Caso 2 — Agente de debugging com histórico de sessão longa: Em uma sessão de debugging de 4 horas (60+ turns), o agente acumulou 180k tokens de histórico. Os primeiros 50 turns eram sobre um bug diferente, já resolvido. Após implementar compactação seletiva (resumir os turns 1-40 em 500 tokens preservando apenas decisões e artefatos), o custo por turn caiu 40% e o agente parou de “lembrar” soluções descartadas como candidatas.

Caso 3 — Indexação de monorepo: Um time adicionou .cursorignore ao monorepo cobrindo node_modules, dist, arquivos de lock e coverage. O pool de retrieval da IDE caiu de 800MB para 120MB, e as sugestões de completion passaram a referenciar código de produção em vez de definições de tipos geradas automaticamente.

Caso 4 — CLAUDE.md auditado: Após 8 meses de desenvolvimento, um CLAUDE.md chegou a 420 linhas. Uma auditoria revelou que 60% era histórico de decisões já implementadas (e portanto documentadas no código) e 20% eram convenções que o time havia abandonado. Após a poda para 80 linhas de regras ativas, o custo por sessão caiu ~12% (o system prompt era enviado ~30 vezes por hora de trabalho).

Checklist

  • .cursorignore / .gitignore configurados para excluir lock files, gerados e node_modules
  • Retrieval seletivo ativo — agente envia trechos, não arquivos inteiros
  • Tool outputs truncados/filtrados (max_lines configurado)
  • Sumarização de histórico ativa (context compaction ou equivalente)
  • CLAUDE.md auditado — sem histórico de projeto, só regras ativas
  • Commits frequentes antes de novas sessões de trabalho com agente
  • Probe questions definidas para validar que o pruning não degradou qualidade
  • Semantic chunking configurado no retriever (se aplicável)
  • Artefatos grandes externalizados — specs e ERDs referenciados por path, não inline
  • Monitoramento de context utilization ativo (LangSmith, LangFuse ou equivalente)
  • Revisão trimestral do CLAUDE.md — remover convenções abandonadas e histórico obsoleto
  • Filtro pré-indexação no CI — validar que novos artefatos gerados entram no .cursorignore

O que vem a seguir

Pruning limpa o que já está no prompt — remove o que não deveria estar lá em primeiro lugar. O próximo passo natural é 07 - Compressão de tool definitions, que lida com o que precisa estar no prompt mas pode ser representado de forma mais compacta: schemas de ferramentas, definições de API, structs de dado que o modelo usa mas que raramente precisam de toda sua verbosidade original.

A sequência lógica é: podar → comprimir → cachear. Não adianta cachear um prompt inflado.

Uma boa heurística de ordem: primeiro remova o que não deveria estar lá (pruning); depois compacte o que precisa estar mas pode ser mais enxuto (compressão); só então stabilize o resultado em cache. Cada etapa amplifica as anteriores — cachear 10k tokens custa menos que cachear 50k, mas podar até 10k é o passo que você faz uma vez e colhe em toda chamada subsequente.

Como explicar em inglês

Context pruning é o termo técnico estabelecido — você vai encontrá-lo em documentação da Anthropic, OpenAI e frameworks de agentes. O conceito adjacente de prompt trimming é mais genérico e inclui qualquer redução de tamanho do prompt, não necessariamente seletiva.

Alguns termos que aparecem na literatura:

PortuguêsInglêsContexto de uso
Poda de contextoContext pruningQualquer remoção deliberada de contexto
Retrieval seletivoSelective retrievalBuscar só o trecho relevante
Sumarização de históricoHistory summarizationCompactar turns antigos
Compactação de contextoContext compactionTermo do Claude Code para compactação automática
Janela deslizanteSliding windowManter N turns mais recentes completos
Artefato externalizadoExternalized artifactReferência em vez de inline
Truncamento de outputOutput truncationLimitar saída de ferramentas
Ruído de contextoContext noiseTokens irrelevantes presentes no prompt
Atenção perdidaLost in the middleFenômeno de ignorar contexto central
Orçamento de contextoContext budgetLimite planejado de tokens de entrada
Pool de retrievalRetrieval poolConjunto de documentos indexados para busca
Fragmento semânticoSemantic chunkUnidade de retrieval baseada em semântica
Grafo de chamadasCall graphEstrutura de quais funções chamam quais — usada para retrieval de código por dependência
Indexação seletivaSelective indexingConfigurar quais arquivos entram no pool de retrieval da IDE

Veja: Context is Everything — Managing LLM Inputs at Scale

Canal: AI Engineering Summit | Duração: ~38min | Idioma: EN

Talk de conferência que demonstra como equipes de produção medem e reduzem context pollution. Apresenta o framework de “context audit” — inspecionar o que está no prompt vs o que o modelo realmente usa para responder — e as 5 categorias mais comuns de tokens desperdiçados em sistemas de agentes.

🎬 Assistir no YouTube

Ouça: Building Context-Aware AI Applications

Podcast: Software Engineering Daily | Duração: ~42min | Idioma: EN

Episódio com engenheiros da Anthropic e da LangChain sobre as melhores práticas de gerenciamento de contexto em agentes de produção. Discute retrieval seletivo, sumarização automática e métricas de “context utilization” — o quanto do contexto o modelo realmente usa.

🎙️ Ouvir no SE Daily

Veja também

Fontes

  • AnthropicManaging context windows (docs.anthropic.com, 2026). Recomendações oficiais de pruning e compactação para Claude.
  • Nelson Elhage et al.In-context Learning and Induction Heads (Anthropic, 2022). Fundamento teórico de como atenção processa tokens — explica por que tokens irrelevantes degradam qualidade.
  • Liu et al.Lost in the Middle: How Language Models Use Long Contexts (Stanford, 2023). Estudo empírico que quantificou o efeito de posição no contexto — base para ordenar contexto de forma inteligente.
  • CursorContext Management in AI IDEs (cursor.sh/blog, 2025). Práticas de .cursorignore e retrieval seletivo em IDEs com IA.
  • LangChainContext Window Management (docs.langchain.com, 2026). Padrões de sumarização e sliding window em agentes LangChain.
  • Simon WillisonEverything I know about LLM context (simonwillison.net, 2025). Análise prática com experimentos de como o tamanho e a qualidade do contexto afetam respostas — com benchmarks reproduzíveis.
  • Hamel HusainThe Hidden Cost of Context (hamel.ai, 2025). Análise quantitativa de custo × tamanho de contexto; argumenta por pruning como primeira otimização.
  • AiderContext management in aider (aider.chat/docs, 2025). Documentação prática do sistema de sliding window e context compaction do Aider — inclui estratégias de commit frequente como higiene de sessão.
  • Peng et al.Effective Long-Context Scaling of Foundation Models (Meta AI, 2023). Análise de como modelos processam contextos longos e quais posições recebem mais atenção — fundamenta o argumento de que contexto irrelevante dilui atenção em posições críticas.
  • PromptPexAutomated Prompt Evaluation and Pruning (Microsoft Research, 2025). Framework de pruning guiado por modelo leve — usa classificador de relevância para filtrar chunks antes de enviar ao modelo principal; redução média de 45% no input com <2% de degradação de qualidade em benchmarks internos.