Conteúdo da trilha
8 minNarração em inglês, legenda em portuguêsPodcast (RSS)
Capítulos
  1. 0:00Abertura
  2. 0:55O diagnóstico
  3. 1:50Por que acontece
  4. 2:42Quanto custa
  5. 3:51Um desafio
  6. 4:26O tratamento
  7. 5:47Um agente de código
  8. 6:33Parentes próximos
  9. 6:59Quando ignorar
  10. 7:28Fechamento
Transcrição

Abertura

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 diagnóstico

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.

Por que acontece

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.

Quanto custa

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.

Um desafio

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.

O tratamento

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.

Um agente de código

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.

Parentes próximos

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 ignorar

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.

Fechamento

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á.

SmellInchaços

Contexto Podre

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.

Elemento
03/37
Nível
Intermediário
Leitura
4 min
Atualizado
Nesta página 7
  1. 01Como reconhecer
  2. 02Por que acontece
  3. 03Quanto custa ignorar
  4. 04Tratamento
  5. 05O que você ganha
  6. 06Quando ignorar
  7. 07É esse smell?
  8. ··Perguntas rápidas

Como reconhecer

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:

  • A conversa ou a sessão do agente só cresce; nada sai do contexto.
  • O modelo cita informação antiga como se fosse atual (um pedido de três meses atrás, um arquivo que já mudou).
  • Instruções dadas no começo da sessão são ignoradas ou misturadas com instruções posteriores.
  • O custo por turno sobe ao longo da sessão, mesmo com perguntas curtas.
  • O tempo até o primeiro token também sobe.
  • A qualidade das respostas cai nas sessões longas e é boa nas curtas.
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
  1. Cada turno novo chega.
  2. O código anexa ao histórico completo, que nunca encolhe.
  3. O modelo lê dezenas de milhares de tokens, a maior parte irrelevante ou desatualizada.
  4. A resposta piora e custa mais. Ela também entra no histórico, e o ciclo continua.
Checagem +20 XP de primeiraO custo por mensagem do seu bot de suporte dobrou entre o turno 3 e o turno 40, e as perguntas dos clientes continuam curtas. O que você olha primeiro?

Por que acontece

  • O padrão dos SDKs é anexar. O exemplo de chat mais simples guarda a lista de mensagens e manda tudo de novo. Funciona nos primeiros dez turnos.
  • Janelas grandes dão falsa segurança. Se cabe um milhão de tokens, parece que não há por que cortar. Caber não quer dizer ser bem usado.
  • Apagar dá medo. Sem saber o que é importante, guardar tudo parece mais seguro.
  • Agentes geram muito texto. Resultados de ferramentas, arquivos lidos e saídas de teste entram no histórico e ficam lá depois de não servirem mais.

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.

Quanto custa ignorar

  • Qualidade. Modelos seguem pior instruções e fatos que estão no meio de contextos longos, e informação contraditória gera respostas instáveis.
  • Dinheiro. O custo de entrada cresce a cada turno. Uma sessão longa custa muito mais por pergunta que uma curta.
  • Latência. O tempo até o primeiro token sobe junto com o contexto.
  • Limite. Em algum momento a sessão estoura a janela, e o corte acontece no pior lugar, sem critério.

Uma conta para ver a curva

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.

Tratamento

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:

  1. Janela fixa das últimas N mensagens. O custo cai, mas o número do pedido dado no começo some. O fato que precisa durar não mora no histórico bruto: mora num estado da conversa que você atualiza.
  2. Resumo que nunca revisita o que ficou velho. Se o resumo ainda carrega “Pix cancelado no mês 1” como fato ativo, você só compactou o podre. O resumo precisa de validade: o que vale agora, o que é histórico.

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
Checagem +20 XP de primeiraUm agente de código leu 40 arquivos, achou a causa do bug e agora escreve o patch. Os 40 conteúdos ainda vão em cada volta. Qual é o próximo passo mais útil?

O que você ganha

  • Respostas que respeitam o que vale agora, não o que valia há doze aulas.
  • Custo por turno estável ao longo da sessão.
  • Latência previsível.
  • Regras e preferências guardadas num lugar que dá para ler, editar e testar.

Quando ignorar

  • Sessões curtas por natureza. Um atendimento que dura cinco turnos não precisa de compactação.
  • Tarefas em que o insumo inteiro é o documento. Revisar um contrato de uma vez é diferente de carregar uma conversa velha. Ali o texto é o trabalho, não o lixo de turnos anteriores.
  • Protótipo. Anexar tudo é o jeito mais rápido de testar uma ideia. Só não vá para produção com sessões longas assim.

É esse smell?

Checagem +20 XP de primeiraUm agente de código lê 40 arquivos para entender um bug. Depois de achar a causa, ele ainda carrega o conteúdo dos 40 arquivos em cada volta enquanto escreve a correção. É Contexto Podre?

Checagem +20 XP de primeiraUm chat de suporte manda sempre as últimas 10 mensagens e descarta as anteriores. Clientes reclamam que o bot esquece o número do pedido que deram no começo. Qual é o problema?

Checagem +20 XP de primeiraO system prompt tem 8 mil tokens e não muda entre turnos. O histórico de cada conversa tem em média 6 turnos. O custo por mensagem é alto. É Contexto Podre?

Checagem +20 XP de primeiraVocê passou a resumir a cada 20 turnos. O resumo ainda diz 'cliente com Pix cancelado, tratar como urgente', de um caso do mês 1. No mês 3 o cliente pergunta o saldo. O bot fala do Pix cancelado. O que falhou?

Perguntas rápidas

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.

Como corrigir Contexto Podre?

Com Trocar Histórico por Resumo e Extrair Subagente. Cada refatoração traz o passo a passo seguro, com eval antes e depois.

Onde Contexto Podre aparece na prática?

Nos cenários reais Bot de suporte com escalonamento humano, Agente de código, Onboarding conversacional e Tutor educacional.

Para ir além

Relações

Aparece nas trilhas 1
Buscar