Aula 06 · Memória

Quando o contexto enche, aprenda a podar

"The agent can forget strategically and keep working forever." Esquecimento estratégico é uma capacidade de engenharia.

⏱ ~12 min · 📝 3 componentes interativos · 🧑‍💻 Baseado em shareAI-lab · s06_context_compact.py

Por que compactar?

Com o tempo, o messages[] do agent incha: cada read_file retorna alguns milhares de tokens, cada bash retorna centenas, e cada rodada ainda acumula o texto de raciocínio do modelo. Depois de 50 rodadas, o contexto pode passar de 100K. Duas consequências:

  • Atingir o limite do modelo: quando a janela de contexto se esgota, o sistema trava, ou o custo de cada chamada de API cresce linearmente.
  • Diluição da atenção: a tarefa atual se perde no meio de 30 rodadas de tool_results irrelevantes, e o modelo começa a divagar.

A estratégia do s06: deixar o agent esquecer ativamente o que não importa, preservando o estado essencial. Três camadas, do mais leve ao mais pesado.

Layer 1 · micro_compact (roda silenciosamente a cada rodada)

A camada mais barata. Roda antes de cada chamada à LLM e substitui tool_results com mais de 3 rodadas de idade por um placeholder:

# a partir da 10ª rodada, a maioria dos tool_results vira:
{
  "type": "tool_result",
  "tool_use_id": "toolu_01A",
  "content": "[Previous: used bash]"   # de milhares de chars para dezenas
}

Há uma exceção: resultados de read_file não são comprimidos. Por quê? Porque o output de read é material de referência — comprimir força o modelo a reler o arquivo, o que custaria ainda mais.

PRESERVE_RESULT_TOOLS = {"read_file"}  # nunca comprime

Veja o micro_compact consumindo resultados antigos por turno

Abaixo, simule 10 rodadas de interação, com o micro_compact rodando antes de cada uma. Observe os tool_results antigos virando [Previous: ...], enquanto os 3 mais recentes permanecem intactos.

Layer 2 · auto_compact (acionado ao ultrapassar o limite)

Mesmo com micro rodando sempre, o acúmulo em grande escala ainda pode estourar. O s06 define um threshold (padrão: 50.000 tokens):

  1. Estima o total de tokens: len(str(messages)) // 4 (estimativa grosseira, mas suficiente).
  2. Ultrapassa o threshold → grava o transcript completo em .transcripts/transcript_TIMESTAMP.jsonl (backup).
  3. Pede à LLM para gerar um summary do transcript completo.
  4. Substitui todo o messages por uma única entrada "[compressed] SUMMARY...".

A desvantagem é clara — perde-se os outputs específicos das ferramentas e o tom da conversa, restando apenas o esqueleto. Mas o agent pode continuar trabalhando, e esse é o benefício central.

Layer 3 · o modelo chama a ferramenta compact ativamente

O auto_compact é acionado automaticamente pelo harness, sem o modelo saber. A Layer 3 inverte isso: dá ao modelo uma ferramenta compact para que ele mesmo peça a compressão — por exemplo, quando sente que a exploração anterior já não é útil e quer iniciar uma nova fase.

O modelo chama:

tool_use("compact", focus="keep the API design decisions")

O processo é o mesmo do auto, mas com um parâmetro focus que guia o que preservar no summary. Na prática é muito útil — o modelo sabe quais são as "subtarefas encerradas", e essa precisão supera a heurística automática do harness.

Qual camada usar? Questões de julgamento

Para os cenários abaixo, determine qual camada — micro / auto / manual — é mais adequada.

Interativo

Widget 1 · Micro Compact · veja o tool_result envelhecer por turno

Avance com Step e observe como os tool_results antigos são substituídos por [Previous: used X], enquanto os 3 mais recentes permanecem intactos. read_file nunca é comprimido (destaque verde).

Turn: 0 · Tokens: ~0
Interativo

Widget 2 · Threshold Simulator · qual camada é acionada conforme o token sobe

Arraste o slider para alterar o número de tokens e veja qual das três camadas entra em ação.

3000
Interativo

Widget 3 · Qual camada usar · 6 cenários para classificar

Para cada cenário, escolha micro / auto / manual e entenda quando cada uma faz sentido.

Acertos: 0 / 6