O que é Contexto Podre?
Contexto Podre (Context Rot) é um smell de IA, ou seja, um sinal de problema em sistemas com LLM, do grupo Inchaços. A conversa longa carrega histórico velho que confunde o modelo e encarece cada turno.
Um tutor de matemática acompanha uma aluna há doze aulas. Tudo na mesma conversa.
Na aula um, ela pediu: não me mostra a solução, só dicas. Combinado, disse o tutor.
Na aula seis, para uma lista de revisão, ela pediu o contrário. Nesta lista, pode mostrar a solução completa.
Agora é a aula doze, e o histórico tem quase noventa mil tokens. Ela pede ajuda com a questão quatro. E o tutor alterna entre as duas regras, sem lógica clara.
Ninguém avisou o tutor que a regra da aula seis valia só para aquela lista. Ninguém resumiu o que a aluna já domina. O modelo recebe tudo e tenta adivinhar o que ainda vale. Nesta aula, você vai aprender a reconhecer esse smell, e o que colocar no lugar de um histórico que só cresce.
O ciclo é este. Chega um turno novo.
O código acrescenta ao histórico inteiro, que nunca diminui.
O modelo lê dezenas de milhares de tokens, a maioria irrelevante, ou velha.
A resposta piora, e custa mais. E ela também entra no histórico, então o ciclo continua.
Como identificar? A conversa, ou a sessão do agente, só cresce. Nada nunca sai.
O modelo cita informação velha como se fosse atual. Um pedido de três meses atrás, um arquivo que já mudou.
Instruções dadas no começo são ignoradas, ou misturadas com as de depois.
O custo por turno sobe ao longo da sessão, mesmo para perguntas curtas. E o tempo até a primeira palavra aparecer também.
E a qualidade da resposta cai nas sessões longas, enquanto está boa nas curtas.
Os exemplos padrão só acrescentam. O código de chat mais simples guarda a lista de mensagens e manda tudo de novo. Funciona nos primeiros dez turnos.
Janelas grandes parecem seguras. Se cabe um milhão de tokens, não parece ter motivo para cortar. Mas caber não é o mesmo que ser bem usado. Os modelos usam com menos confiança o que fica no meio de um contexto longo. E as instruções da aula um e da aula seis brigam exatamente nesse meio. A janela comporta. A atenção, não.
Apagar dá medo. Sem saber o que importa, guardar tudo parece mais seguro.
E agentes produzem muito texto. Resultados de ferramentas, arquivos lidos, saída de testes. Tudo entra no histórico e fica lá, muito depois de deixar de ser útil.
O custo começa na qualidade. Regras e fatos enterrados no meio são seguidos com menos confiança, e informação contraditória produz respostas instáveis.
Depois, dinheiro, com números ilustrativos. Um prompt de sistema de dois mil tokens, e mais quatrocentos a cada turno. No turno três, uma chamada manda uns três mil e duzentos tokens. No turno doze, uns seis mil e oitocentos. No turno quarenta, uns dezoito mil.
A pergunta da aluna cabe numa linha. A conta, não. O cache de prompt barateia um começo estável, mas um histórico que muda a cada turno não fica nesse começo guardado. E em algum momento a sessão estoura a janela, e o corte acontece no pior lugar, sem lógica nenhuma.
A mesma coisa aparece no atendimento de um banco pelo WhatsApp. No mês um, o cliente falou de um Pix cancelado. No mês três, ele pergunta o saldo, e o bot ainda fala daquele Pix como o problema atual. A mensagem nova tinha doze palavras. O contexto carregava meses de atendimento.
Uma pergunta para você. Um chat de atendimento sempre manda só as últimas dez mensagens e descarta o resto. Agora os clientes reclamam que o bot esquece o número do pedido que eles deram no começo. Isso é context rot?
Não. O contexto não está podre, está curto demais. Cortar por uma janela fixa resolve o custo, mas perde fatos. O que falta é um estado explícito da conversa, uma memória de curto prazo. O número do pedido mora ali, fora do histórico bruto, onde o seu código mantém atualizado.
São duas refatorações. Quando a sessão é uma conversa longa, troque o histórico por um resumo. Os turnos antigos viram um resumo, e os fatos que precisam durar, como preferências e regras combinadas, vão para um estado explícito.
E quando o contexto incha com trabalho de leitura, como arquivos, páginas ou logs, extraia um subagente. Ele lê num contexto limpo e devolve só a conclusão.
Aqui está a aula doze, antes e depois. Antes, noventa mil tokens de chat bruto, com duas regras em conflito, enterradas no meio. Depois, um resumo curto, o estado, com o nível da aluna e a regra atual, e os turnos mais recentes. A regra ativa mora num campo só, que dá para ler, editar e testar.
E cuidado com um erro quando começar a cortar. Digamos que você resume a cada vinte turnos. No mês três, o resumo ainda diz: cliente com Pix cancelado, tratar como urgente. E o bot volta a falar disso, quando o cliente só pediu o saldo. Você só compactou o apodrecimento. Um resumo precisa de validade. O que vale agora vai para o estado, com prazo de validade. E o passado fica no resumo como passado, ou sai.
Mais uma, do mundo dos agentes. Um agente de código leu quarenta arquivos, achou a causa de um bug e agora está escrevendo a correção. Os quarenta arquivos ainda vão em todo turno. Qual é o próximo passo mais útil?
Limpe os resultados antigos de ferramentas, ou leve a leitura para um subagente que devolve só a conclusão. Os arquivos já cumpriram o papel deles. Agora eles empurram a instrução da correção para o meio do contexto, onde o modelo lê pior. Uma janela maior não resolve. E mandar o modelo ignorar os arquivos que não vai usar disputa com dezenas de milhares de tokens que continuam lá. Quem tira o que não serve é o código. Não o modelo.
E um caso que parece, mas não é. Um prompt de sistema de oito mil tokens, que nunca muda entre turnos, em conversas de uns seis turnos. O custo por mensagem é alto. Mas o contexto não cresce durante a sessão. O peso está fixo no prompt. Isso é prompt bloat. Enxugue o prompt e, se o começo é estável, use cache.
Quando dá para ignorar? Sessões curtas por natureza. Um chat de atendimento que dura cinco turnos não precisa de compactação.
Tarefas em que a entrada inteira é o documento. Revisar um contrato de uma vez é diferente de carregar uma conversa velha. Ali, o texto é o trabalho, não sobra de turnos.
E protótipo. Acrescentar tudo é o jeito mais rápido de testar uma ideia. Só não coloque sessões longas no ar assim.
Então, a ideia para levar. Um histórico longo não é memória. É uma pilha que o modelo precisa revirar a cada turno, e pagar por isso. Guarde os fatos que precisam durar num estado explícito, resuma o passado como passado, e deixe o trabalho terminado sair do contexto.
Na próxima aula, a gente faz a primeira refatoração passo a passo: replace history with summary. Até lá.
Context Rot
Contexto Podre (Context Rot) é um smell de IA, ou seja, um sinal de problema em sistemas com LLM, do grupo Inchaços. A conversa longa carrega histórico velho que confunde o modelo e encarece cada turno.
Um tutor de matemática acompanha uma aluna há doze aulas. Tudo está na mesma conversa. Na aula 1, ela pediu: “não me mostre a resolução, só dicas”. Na aula 6, pediu o contrário para uma lista de revisão: “agora pode mostrar a resolução completa”. Na aula 12, o histórico tem quase 90 mil tokens, e o tutor alterna sem critério entre as duas regras.
Trecho do contexto enviado na aula 12 (anonimizado e cortado):
[aula 1] aluna: não me mostre a resolução, só dicas
[aula 1] tutor: combinado
... [312 mensagens] ...
[aula 6] aluna: para esta lista pode mostrar a resolução completa
... [540 mensagens] ...
[aula 12] aluna: me ajuda com a questão 4?
Ninguém disse ao tutor que a regra da aula 6 valia só para aquela lista. Ninguém resumiu o que a aluna já domina. O modelo recebe tudo e tenta adivinhar o que ainda vale.
Sinais de Contexto Podre:
flowchart LR
T1(["1. Turno novo"]):::io --> H[("2. Histórico inteiro")]:::store
H --> M(["3. Modelo"]):::llm
M --> R(["4. Resposta confusa e cara"]):::io
R --> H
O paper “Lost in the Middle” (Liu et al., 2023) mostrou que modelos usam pior o que está no meio de um contexto longo. Instruções da aula 1 e da aula 6 brigam exatamente nesse meio. A janela cabe. A atenção, não.
Os números abaixo são ilustrativos. Suponha um system prompt de 2.000 tokens e 400 tokens acrescentados por turno (mensagem + resposta).
| Turno | Tokens enviados nessa chamada |
|---|---|
| 3 | cerca de 3.200 |
| 12 | cerca de 6.800 |
| 40 | cerca de 18.000 |
A pergunta da aluna na aula 12 cabe em uma linha. A conta não. Cache de prompt barateia o prefixo fixo, mas o histórico que muda a cada turno não entra no prefixo cacheado.
O mesmo padrão aparece no WhatsApp de um banco: o cliente falou de um Pix cancelado no mês 1, e no mês 3 o bot ainda cita aquele Pix como se fosse o problema atual. A mensagem nova tinha 12 palavras. O contexto tinha meses de atendimento.
| Refatoração | Escolha quando |
|---|---|
| Trocar Histórico por Resumo | A sessão é uma conversa longa. Turnos antigos viram um resumo, e fatos que precisam durar (preferências, regras combinadas) vão para um estado explícito. Destino: Compactação de Contexto. |
| Extrair Subagente | O contexto incha com trabalho de leitura: arquivos, páginas, logs. Um subagente lê num contexto limpo e devolve só a conclusão, como no Isolamento de Contexto. |
Dois erros comuns na hora de cortar:
Antes e depois, na aula 12:
| Antes | Depois | |
|---|---|---|
| Enviado ao modelo | 90 mil tokens de chat cru | resumo curto + estado (nível, regra atual) + últimas falas |
| Regra ativa | duas, em conflito, no meio do contexto | uma, no estado: “nesta lista, mostrar resolução” |
| Preferência estável | misturada no histórico | campo explícito, editável, testável |
Responda as 6 perguntas para concluir a aula. Só assistir não conclui: a checagem é o que conta para a trilha e para o certificado.
Contexto Podre (Context Rot) é um smell de IA, ou seja, um sinal de problema em sistemas com LLM, do grupo Inchaços. A conversa longa carrega histórico velho que confunde o modelo e encarece cada turno.
Com Trocar Histórico por Resumo e Extrair Subagente. Cada refatoração traz o passo a passo seguro, com eval antes e depois.
Nos cenários reais Bot de suporte com escalonamento humano, Agente de código, Onboarding conversacional e Tutor educacional.