Pular para o conteúdo
24/30Capítulo 24 de 30

Context Engineering: por que seu agent fica mais burro no turno 40

Mover um fato três linhas abaixo em um prompt com 2,6% da context window derruba a recuperação de 84% para 19%.

Nesta página

Aqui está um prompt enviado 288 vezes ao mesmo modelo com greedy decoding. Ele tem 853 tokens. Contém um registro de vinte e cinco tickets de suporte — cidade, fila, prioridade, responsável, ramal — e uma pergunta: Marta Ferreira precisa receber uma ligação sobre o ticket dela. Qual é o ramal direto desse ticket?

O registro é idêntico todas as vezes. O modelo é idêntico todas as vezes. A única coisa que muda é qual das vinte e cinco linhas contém a resposta.

posição da respostaacertostaxa de recuperaçãointervalo de 95 %
1 de 2527/3284 %68–93 %
4 de 256/3219 %9–35 %
7 de 256/3219 %9–35 %
10 de 259/3228 %16–45 %
13 de 258/3225 %13–42 %
16 de 256/3219 %9–35 %
19 de 256/3219 %9–35 %
22 de 253/329 %3–24 %
25 de 257/3222 %11–39 %

Trinta e duas tentativas por linha, um ticket diferente a cada tentativa, intervalos de Wilson do Capítulo 4, porque dezessete de vinte não distingue nada de nada.

A posição um é respondida 84 % das vezes. Todas as outras posições ficam entre 9 % e 28 %, e todos esses oito intervalos se sobrepõem; então a leitura honesta é primeiro, e depois todo o resto. Liu et al. encontraram um U — alto nas duas pontas, baixo no meio — e o braço de recência não aparece claramente aqui: 22 % na última posição está dentro da dispersão das posições do meio. O que não está dentro de nada é a queda da posição 1 para a posição 4. Três linhas.

A context window desse modelo é de 32.768 tokens. O prompt usa 853 deles, 2,6 %. Nada transbordou, nada foi truncado, nenhum limite foi atingido, nenhum aviso apareceu. O modelo parou de encontrar uma linha que tinha recebido, porque a linha desceu três posições em uma lista de vinte e cinco.

O Capítulo 16 colocou preço na context window e terminou avisando que ter um milhão de tokens não é usá-los, e apontou para cá. Isto é o cá.

Mostrar detalhes

O que este capítulo precisa dos anteriores.

  • Capítulo 9 derivou self-attention e seu custo O(n2)O(n^2). Todo token atende a todos os outros, então o número de relações par a par cresce com o quadrado do comprimento. Esse fato é usado abaixo, não derivado novamente.
  • Capítulo 16 contou os cinco baldes de tokens faturáveis e mostrou que a conta de uma conversa cresce quadraticamente. Este capítulo é o que você faz a respeito sem quebrar o agent.
  • Capítulo 18 construiu o catálogo de ferramentas e mediu que vinte ferramentas não prejudicaram a seleção, mas multiplicaram o prompt por seis. Aqui está a conta delas.
  • Capítulo 19 construiu a recuperação. A recuperação just-in-time abaixo é aquele capítulo aplicado ao histórico do próprio agent; chunking não é explicado de novo.
  • Capítulo 23 construiu o harness. Tudo neste capítulo é uma política que roda dentro do loop dele, e é por isso que está em TypeScript: o artefato é um serviço de longa duração que mantém estado, não um notebook que mantém tensores.

A Anthropic traçou a linha em setembro de 2025, e as duas frases pertencem lado a lado. Prompt engineering é “métodos para escrever e organizar instruções de LLM para resultados ideais”. Context engineering é “o conjunto de estratégias para curar e manter o conjunto ideal de tokens (informações) durante a inferência de LLM, incluindo todas as outras informações que podem acabar ali fora dos prompts”.1

A diferença operacional é quando, e por quem. Um prompt é criado uma vez, por uma pessoa, e revisado. Um contexto é montado em toda chamada, por código que ninguém está olhando, a partir de material que ninguém escreveu à mão: quarenta turnos de histórico, seis resultados de ferramentas, quatro trechos recuperados, um perfil de usuário, doze schemas JSON. O Capítulo 15 mediu o que instruções melhores compram. Este capítulo é sobre os outros noventa por cento dos tokens, que chegam sozinhos.

O mesmo documento nomeia o recurso que todos eles gastam: modelos “têm um ‘orçamento de attention’ do qual sacam ao analisar grandes volumes de contexto. Cada novo token introduzido esgota esse orçamento em alguma medida”. E nomeia o sintoma: “à medida que o número de tokens na context window aumenta, a capacidade do modelo de recordar informações com precisão a partir desse contexto diminui” — context rot.1

Essa última frase é uma afirmação sobre comportamento, o que significa que pode ser verificada, e a tabela no topo desta página é a verificação.

Quarenta linhas contra o endpoint local do Capítulo 22 — um pequeno servidor Python mantendo Qwen2.5-0.5B-Instruct na CPU e falando no formato chat-completions, para que o loop fique em TypeScript e os tensores fiquem do outro lado da porta.

position.tsTS
const DEPTHS = [0, 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875, 1];

for (const d of DEPTHS) {
  const slot = Math.round(d * (N - 1));
  let hits = 0, other = 0;
  for (let t = 0; t < TRIALS; t++) {
    const recs = buildRecords(N, 1000 + t);          // 25 unique tickets
    const gold = recs[Math.floor(rng(7 + t)() * N)]; // a different one each trial
    const rest = recs.filter((x) => x.ticket !== gold.ticket).slice(0, N - 1);
    const lines = [...rest.slice(0, slot).map((x) => x.line),   
                   gold.line,                                   
                   ...rest.slice(slot).map((x) => x.line)];     
    const r = await complete(prompt(lines, ask(gold.owner)), { maxTokens: 12 });
    const said = /\d{4}/.exec(r.text)?.[0];
    if (said === String(gold.ext)) hits++;
    else if (said && recs.some((x) => String(x.ext) === said)) other++;
  }
}

O contador other é o que transforma um resultado decepcionante em um resultado útil: quando o modelo erra, ele está perdido ou está confiante?

A resposta é confiante. Nas oito posições que não são a primeira, 136 das 205 respostas erradas eram o ramal de outro ticket — um número real de quatro dígitos, formatado corretamente, lido da linha errada. Na posição 1, só uma das cinco falhas foi isso; na posição 7, vinte e uma de vinte e seis foram.

Essa distinção é o que importa em produção. Um modelo que diz não consigo encontrar é um bug que você percebe; um modelo que retorna o número de uma linha vizinha é um bug que você coloca no ar, porque na tela os dois parecem idênticos. É a falha contra a qual o Capítulo 19 construiu citações verificáveis, chegando de dentro do prompt em vez de vir do índice.

Posição é um eixo. Comprimento é o outro, e mais fácil de testar: mantenha a resposta no meio e aumente a lista.

registrostokens do promptacertostaxaintervalo de 95 %linha erradanenhum dos dois
19718/2090 %70–97 %02
315911/2055 %34–74 %90
83153/2015 %5–36 %170
206952/2010 %3–30 %162
401.3243/2015 %5–36 %152
802.5871/205 %1–24 %181
1404.4772/2010 %3–30 %180

Um registro e 97 tokens: 90 %. Três registros e 159 tokens: 55 %. Oito registros e 315 tokens: 15 %, e daí em diante baixo e plano até 140 registros e 4.477 tokens. Todo o colapso acontece entre a primeira e a oitava linha de uma lista.

A última coluna é tudo que não é nem o ramal correto nem o de outro registro; com um único registro na página, é o único lugar onde uma resposta errada pode cair. As duas falhas com um registro merecem ser relatadas, não arredondadas para fora, porque nenhuma foi uma recusa: uma respondeu 5806 para um registro cuja única linha diz 5805. Com 97 tokens e um único candidato, este modelo ainda copia um dígito errado duas vezes em vinte, e esse é o piso contra o qual todo o resto é medido.

Duas coisas decorrem disso. Uma context maior compra o direito de enviar mais, não a certeza de ser lido: este modelo tem uma window de 32.768 tokens e uma faixa de trabalho, nesta tarefa, de algumas centenas de tokens. E não há limiar, penhasco nem estado de “contexto cheio” — a degradação já está em curso no terceiro registro e completa no oitavo, a um por cento da window. Seja lá o que for um limite de contexto, não é isso que governa este resultado.

Dois mecanismos costumam ser oferecidos. O primeiro é a aritmética do Capítulo 9, que a Anthropic enuncia nos mesmos termos deste curso: modelos “são baseados na arquitetura transformer, que permite que todo token atenda a todos os outros tokens em todo o contexto. Isso resulta em n² relações par a par para n tokens”.1 Attention sobre uma sequência mais longa não é a mesma operação aplicada a mais material; é um orçamento fixo de massa de probabilidade espalhado por mais concorrentes. O segundo é o treinamento: modelos veem muito mais sequências curtas do que longas, então padrões posicionais de longo alcance são a parte menos praticada da rede. Isso é um argumento, não uma medição, e este capítulo não consegue resolvê-lo.

O que está resolvido é o formato, e está desde 2023. Liu et al. testaram resposta a perguntas em múltiplos documentos e recuperação key-value em famílias e tamanhos de modelos, e descobriram que “o desempenho costuma ser mais alto quando a informação relevante ocorre no começo ou no fim do contexto de entrada, e degrada significativamente quando os modelos precisam acessar informação relevante no meio de contextos longos, mesmo em modelos explicitamente de contexto longo”.2 O Capítulo 15 tirou sua regra de posição desse artigo; o Capítulo 19 tirou dele o motivo pelo qual vinte chunks recuperados podem pontuar pior do que quatro. A forma prática do fato é a única frase aqui sobre a qual você deve agir: isso leva cinco minutos para medir no seu próprio modelo com seus próprios dados, e nenhuma curva publicada substitui a sua.

Ninguém sabe o que está na própria window

Link para a seção: Ninguém sabe o que está na própria window

Pergunte a uma equipe o que preenche o contexto do agent dela e você recebe uma estimativa, porque nenhuma API retorna a resposta: a resposta fornece prompt_tokens, um número único para tudo.

Você pode recuperar a decomposição com quatro contagens e três subtrações — o prompt inteiro renderizado, o mesmo sem definições de ferramentas, apenas a mensagem de sistema com e sem elas, e tudo com os resultados das ferramentas removidos:

buckets.tsTS
async function buckets(messages: Msg[]) {
  const sys = messages.slice(0, 1);
  const withoutResults = messages.filter((m) => m.role !== "tool");
  const [total, sysWithTools, sysNoTools, noResults] = await Promise.all([
    countPrompt(messages, CATALOGUE),        // everything
    countPrompt(sys, CATALOGUE),             // system + scaffolding + schemas
    countPrompt(sys),                        // system + scaffolding
    countPrompt(withoutResults, CATALOGUE),  // everything but tool output
  ]);
  return {
    system: sysNoTools,
    tools: sysWithTools - sysNoTools,                                  
    toolResults: total - noResults,                                    
    conversation: total - sysWithTools - (total - noResults),          
    total,
  };
}

countPrompt aplica o próprio template de chat do modelo antes de tokenizar, o que importa mais do que parece: seu texto não é o que é contado. Marcadores de papel, o preâmbulo de tool calling e a renderização do schema são todos tokens pelos quais você paga e nunca digitou. O Capítulo 7 construiu um tokenizer e o Capítulo 16 contou com js-tiktoken; aqui, a contagem vem do mesmo modelo que lerá o prompt, que é a única contagem exatamente certa.

Agora rode um agent real por ele: quarenta turnos de uma investigação de incidente, doze ferramentas, um ambiente operacional falso retornando despejos de log realistas e séries de métricas.

turnosystemdefinições de ferramentasconversaresultados de ferramentasprompt totalentrada faturada neste turno
1851.8171554902.5474.370
2851.8172825292.7135.275
5851.8176471.8704.4198.093
10851.8179462.1414.9894.951
20851.8171.5002.9436.3456.316
30851.8172.1874.0008.0898.059
40851.8173.0535.67710.63221.090

Leia a primeira linha contra a última.

No turno 1, o prompt tem 2.547 tokens e 71 % dele são definições de ferramentas. O system prompt é 3 %. O que o usuário digitou é 6 %. O agent ainda não fez nada e já está carregando 1.817 tokens de schema JSON.

No turno 40, o prompt tem 10.632 tokens e as proporções se inverteram: definições 17 %, conversa 29 %, resultados de ferramentas 53 %. A saída das ferramentas ultrapassou as definições no turno 5; a conversa só as ultrapassou no turno 25, então nos primeiros sessenta por cento da sessão o catálogo de ferramentas era maior do que tudo que havia sido dito.

Então o total. Em 57 chamadas de modelo, a execução faturou 370.291 tokens de entrada para um contexto final de 10.632 — o último prompt pago cerca de trinta e cinco vezes, que é o quadrático do Capítulo 16 com um multiplicador de agent por cima. Desses 370.291, 103.569, ou 28 % de tudo que foi faturado, eram as doze definições de ferramentas, reenviadas byte a byte idênticas em toda chamada.

O catálogo de ferramentas é o maior custo fixo em um agent e é invisível, porque você nunca o vê: você passa um array de objetos e o provedor o renderiza no prompt por você. Medido nas mesmas doze ferramentas:

tooldefs.ts outputTEXT
system prompt + chat scaffolding, no tools:        85 tokens
all twelve definitions:                          1,817 tokens
  of which fixed tool-calling scaffolding:         126 tokens
three tools instead of twelve:                     605 tokens
same twelve, one-sentence descriptions,
  no parameter prose:                            1,291 tokens  (-29 %)

Por ferramenta, o custo marginal vai de 80 tokens para get_current_time, que recebe uma string, a 263 para search_tickets, que recebe quatro parâmetros com um enum e uma frase de orientação para cada um. Essa é a taxa de câmbio por trás do conselho central do Capítulo 18 de que a descrição é a API: uma boa descrição custa cerca de cem tokens em toda requisição pelo resto da vida do agent. Três consequências.

Uma ferramenta que você não usa ainda é faturada. O agent chamou sete das doze. As outras cinco custaram 697 tokens em cada uma das 57 requisições — 39.729 no total, mais de um décimo de tudo que a execução faturou, por capacidades que ele nunca tocou. Uma das cinco carrega o detalhe mais afiado do trace: o modelo tentou três vezes chamar read_log, que não existe. A ferramenta que ele queria era search_logs, a segunda definição mais cara do catálogo, com 237 tokens. Ele pagou por essa definição 57 vezes, nunca a usou e nunca encontrou seu nome.

Cortar prosa é a otimização mais barata disponível, e é uma troca. Reduzir descrições a uma frase e remover a documentação de parâmetros economizou 526 tokens por chamada, 29 por cento, sem tocar em uma linha de lógica — e fez o modelo chamar pior as ferramentas, que foi o que o Capítulo 18 mediu. O ponto é que os dois lados dessa troca agora estão na mesma unidade.

Em certa escala, enviar definições deixa de fazer sentido. A Anthropic colocou um número nisso em novembro de 2025: um conjunto grande de servidores conectados significa processar “centenas de milhares de tokens” de definições antes de a requisição ser lida, e substituir isso por execução de código — o agent descobrindo e carregando apenas as definições de que precisa — “reduz o uso de tokens de 150.000 tokens para 2.000 tokens, uma economia de tempo e custo de 98,7%”.3 A mesma ideia do resto deste capítulo, aplicada a schemas em vez de histórico: mantenha o índice, resolva a entrada sob demanda.

Duas coisas foram plantadas naquele transcript de quarenta turnos. No turno 2, antes de qualquer trabalho real, o usuário declara uma regra permanente: qualquer ticket que você abrir deve ser registrado sob meu número de funcionário, 4417. No turno 19, no meio do incidente, um fato: o shard afetado é pay-shard-7, confirmado pela equipe de pagamentos. No turno 40, o usuário pede ao agent que abra o ticket de incidente, que precisa dos dois. Cada sondagem é feita em seis formulações diferentes e pontuada de seis — greedy decoding é determinístico, então uma chamada dá um sim ou não irrepetível, e seis dão uma taxa.

O transcript então é reproduzido sob sete políticas de contexto. Reproduzido, não executado de novo, deliberadamente: as mensagens, as chamadas de ferramentas e os resultados das ferramentas são byte a byte idênticos nas sete, então a única variável é o que cada política escolheu manter. O Capítulo 16 mostrou por que uma sliding window é uma jogada econômica ruim, porque destrói o prefixo que poderia usar cache. Aqui está o que ela faz com o comportamento:

política de contextotokens de entrada nos 40 turnosprompt no turno 40regra do turno 2fato do turno 19
histórico completo370.29110.6326/65/6
sliding window, últimas 12 mensagens157.5782.9225/60/6
omitir resultados de ferramentas com mais de 4 turnos243.4456.3116/63/6
compactação a cada 6 turnos195.5153.2206/60/6
compactação mais notas escritas pelo modelo200.8493.2866/60/6
fixar os turnos do próprio usuário, na frente168.5503.5596/65/6
fixar os turnos do próprio usuário, no fim168.8353.5646/66/6
controle: os dois turnos e nada mais1.9816/66/6

As linhas de compactação incluem o custo de compactar: 18.581 tokens de entrada para sete resumos e mais 3.392 para o anotador. A linha de controle está ali para que um zero possa ser lido como zero — com apenas as duas mensagens em um prompt de 1.981 tokens, este modelo responde às duas sondagens perfeitamente, então nenhuma linha é a tarefa sendo difícil demais.

O histórico completo lembra, e é a coisa mais cara da tabela: 370.291 tokens de entrada para uma sessão cujo conteúdo durável são duas frases.

Isso responde a uma pergunta que a abertura deixou em aberto. Por que um transcript de 10.632 tokens mantém um fato que um registro de 853 tokens perde? Porque comprimento é a variável errada. O registro contém vinte e cinco ramais de quatro dígitos em vinte e cinco frases idênticas — vinte e quatro iscas quase perfeitas para aquilo que você quer. O transcript contém exatamente um número de funcionário e um nome de shard. Context rot é interferência antes de ser volume, e é por isso que 136 das 205 respostas erradas lá em cima eram o valor de um vizinho. A pergunta útil sobre uma window não é quanto ela é longa; é quantas coisas nela se parecem com a resposta.

A sliding window é 57 % mais barata e perdeu o incidente. O número de funcionário sobrevive só porque o agent o tinha repetido nos turnos recentes. O shard, declarado uma vez no turno 19, não está nas últimas doze mensagens — e o modelo não diz isso. Quando perguntado seis vezes, respondeu “o shard de pagamento afetado é shard 4417”, buscando o número de funcionário, o único outro identificador que restava em sua window, e duas vezes “pool”, tirado da string pool_exhausted em uma linha de log.

Compactação é barata e perdeu o mesmo fato. Sete resumos, escritos pelo modelo sob uma instrução explícita para manter identificadores, números, instruções permanentes e perguntas em aberto, e pay-shard-7 não está em nenhum dos que importavam; os seis palpites foram shard 1, pay_shard_1 e pool. Compactação não falha de forma barulhenta. Ela produz uma sessão fluente, plausível e muito mais curta que apagou uma linha em silêncio.

Três linhas marcaram 0/6 no fato do turno 19 — a sliding window, a compactação e a compactação com notas. Dezoito respostas erradas entre elas, e nenhuma delas foi “não sei.”

Então vem a linha que deveria ser constrangedora. Manter as próprias quarenta mensagens do usuário literalmente, mais os últimos quatro turnos completos e nada mais, custa 168.550 tokens — 54 % menos que o histórico completo — e responde às duas sondagens tão bem quanto o histórico completo, ou melhor. Sem summariser, sem anotador, sem segundo modelo: um filtro em role === "user". As palavras do usuário são os tokens baratos de maior valor na window de um agent, e a maioria dos designs as descarta junto com todo o resto.

As duas últimas linhas são a tabela de abertura de novo, dentro do agent. O mesmo bloco fixado, movido da mensagem de sistema para o fim do prompt: 5/6 vira 6/6. Em seis tentativas, isso não é uma diferença significativa e não é apresentado como tal — é apresentado como lembrete de que onde é um parâmetro que você está definindo, sabendo ou não.

As quatro estratégias abaixo são da Anthropic, na ordem dela, embora só as três últimas estejam em sua lista de longo horizonte.1 Todas as quatro são variações de uma instrução: não carregue o que você pode buscar, e não carregue em bruto o que você pode carregar comprimido.

Não pré-carregue conteúdo. Mantenha identificadores — um caminho de arquivo, uma query, um número de ticket, o nome de uma ferramenta e seus argumentos — e resolva-os quando necessário. O maior balde no agent acima é saída de ferramenta que foi lida uma vez, usada uma vez e então carregada por mais trinta turnos. Substituir todo resultado com mais de quatro turnos por um stub dizendo o que era e como recuperá-lo tem seis linhas:

policies.tsTS
const elide: Policy = (h) => [SYSTEM, ...h.flatMap((turn, ti) =>
  turn.map((m) => (ti < h.length - 4 && m.role === "tool"
    ? { role: "tool", name: m.name,
        content: `[${m.name} result from turn ${ti + 1}, ${m.content.length} chars, ` +
                 `elided; call ${m.name} again with the same arguments to re-read it]` }
    : m)))];

Isso é o Capítulo 19 com o corpus substituído pelo próprio passado do agent. A maquinaria de recuperação já está lá — é o catálogo de ferramentas.

Quando o transcript passa de um limite, substitua sua parte mais antiga por um resumo escrito pelo modelo e continue. O prompt que escreve o resumo é o design inteiro, e é onde a compactação vence ou perde: mantenha identificadores, números, instruções permanentes e perguntas em aberto; descarte gentilezas e saída de ferramentas que você pode buscar de novo.

Compactação é lossy por construção, o que ela perde é escolhido por um modelo em seu nome, e nada gera erro quando ele escolhe errado. Ela também não é de graça: toda compactação é uma chamada extra cuja entrada é aquilo que está sendo compactado.

Mantenha um pequeno armazenamento fora do contexto e reinsira-o inteiro a cada turno. Ao contrário de um resumo, ele é append-only e endereçável: uma regra escrita no turno 2 ainda está lá literalmente no turno 400. A versão medida aqui pergunta ao modelo, depois de cada mensagem do usuário, se ela contém algo durável:

notes.tsTS
const r = await complete([
  { role: "system", content:
      "You keep a durable note file for a support session. Given one user message, " +
      "output one short note ONLY if it states a standing rule, an identifier or a fact " +
      "that must survive the rest of the session. Otherwise output exactly NONE." },
  { role: "user", content: `Turn ${i + 1}: ${user}` },
], { maxTokens: 40 });
if (!/^none\b/i.test(r.text.trim())) notes.push(`turn ${i + 1}: ${r.text.trim()}`);

Esta é a estratégia com o teto mais alto aqui, e é a que falhou na medição. Ao longo de quarenta mensagens de usuário, o anotador manteve três notas e nenhuma das duas que importavam: uma linha de conselho de runbook, um anúncio de que a sessão estava terminando e Europe/Madrid é atualmente 13:45 — um horário que ele inventou, já que a ferramenta que estava parafraseando retornou 09:52 UTC. O anotador é um modelo, e tudo neste capítulo também se aplica a ele.

Dê a uma tarefa focada sua própria window — seu próprio system prompt, seu próprio catálogo pequeno, nenhum histórico do pai — e retorne uma resposta curta em vez de um transcript. O Capítulo 23 colocou um atrás de um schema de ferramenta e deixou a conta aqui; a conta é que a resposta do filho é a única parte da window do filho pela qual o pai paga.

O sub-agent não está na tabela acima porque não roda por quarenta turnos: roda uma vez, em uma window que alguém delimitou para ele. Recebendo o system prompt, os turnos 17 a 19 e nada mais — 2.737 tokens — ele respondeu à sondagem do shard 6/6, melhor que todas as políticas da tabela, e à sondagem do funcionário 0/6, porque esse número não está nos três turnos que recebeu.

Isso são sub-agents em dois números: uma window limpa não é inteligência, é escopo, e o escopo é definido de antemão por código que já precisa saber quais turnos importam. Mais uma coisa nessas respostas merece ficar. Essa foi a única política que respondeu “None available” em vez de inventar algo. Um modelo com um contexto pequeno e coerente sabe do que sente falta; um modelo com um contexto grande e ruidoso, não.

Quase toda conversa confusa sobre memória de agent são três mecanismos usando uma palavra só. Eles têm tempos de vida, donos e modos de falha diferentes, e um sistema que os mantém no mesmo lugar tem um problema que ainda não percebeu.

histórico da conversarecuperaçãomemória persistente do usuário
contémo que foi dito nesta sessãodocumentos que você possuifatos sobre uma pessoa
viveuma sessãoaté ser reindexadoem todas as sessões, para sempre
escrito poro loop, automaticamenteum pipeline de ingestãoo modelo, de propósito
entra no promptinteiro, em toda chamadaquatro trechos, quando uma query correspondeinteiro, em toda chamada
falha porcrescer até apodrecerrecuperar o chunk erradolembrar algo errado sobre você
construído emCapítulo 23Capítulo 19este capítulo

O enquadramento acadêmico é do CoALA, que organiza language agents em torno de “componentes de memória modulares” e separa working memory de armazenamentos episódicos, semânticos e procedurais.4 O MemGPT leva a mesma ideia ao pé da letra, pegando memória virtual emprestada de sistemas operacionais: uma camada rápida dentro da window, uma camada lenta fora dela, e o próprio modelo movendo dados entre elas com function calls.5 Ambos forçam a pergunta que um produto precisa responder de qualquer forma — não quanto posso manter, mas a qual armazenamento isso pertence, e quando expira.

O teste prático é uma pergunta por fato: o que ainda deve ser verdade amanhã? Um resultado de ferramenta do turno 12, nada. Um resumo da sessão, até a sessão acabar. Que o número de funcionário do usuário é 4417, até ele mudar de emprego. Três respostas, três armazenamentos.

Agora você consegue medir o que há em uma window, decidir o que fica nela e distinguir um agent que esqueceu algo de um que estava carregando aquilo e não olhou.

A última das quatro estratégias é a que não cabe aqui. Um sub-agent não é uma política de contexto, é um segundo agent, e no momento em que há dois você precisa decidir o que passa entre eles e qual está no comando. O Capítulo 25 é isso: os cinco padrões de orquestração e de onde cada um de seus nomes realmente vem, as duas topologias que se confundem — pedir algo a um sub-agent e receber uma resposta de volta, versus entregar a conversa a ele e não recebê-la de volta — e o achado medido de que, na tarefa cujo custo ele calcula, o arranjo mais simples vence — seguido pelo teste de quando ele para de vencer.

Ele também herda exatamente o que este capítulo acabou de medir. Um sub-agent retorna um resumo. Um resumo é uma compactação que você não escreveu, produzida por um modelo cuja window você não consegue ver, e o pai não tem como diferenciar um resumo bom de um confiantemente errado — a mesma distinção que separou 84 % de 19 % no topo desta página, e que transformou dezoito fatos ausentes em dezoito invenções. Então: quando o sub-agent está errado, o que exatamente o pai pode examinar?


Todos os números aqui foram produzidos nesta máquina e nenhum foi estimado. O modelo é Qwen2.5-0.5B-Instruct em float32 na CPU com greedy decoding, servido por loopback por um pequeno endpoint Python que fala no formato chat-completions e expõe uma rota de contagem de tokens — de novo a costura do Capítulo 14, tensores do lado Python e o loop do lado TypeScript — então toda contagem é o tokenizer do próprio modelo aplicado ao seu próprio template de chat. A tabela de posição tem 288 chamadas, nove posições por trinta e duas tentativas com um ticket diferente em cada tentativa; a tabela de comprimento tem 140 chamadas; a execução do agent tem 57 chamadas de modelo ao longo de 43 minutos de relógio; a tabela de políticas é aquele único transcript reproduzido sob sete políticas. Os intervalos são de Wilson, do Capítulo 4. Nenhuma API paga foi chamada, e é também por isso que não há um preço sequer no capítulo: as contagens de tokens são exatas, e as taxas pelas quais você as multiplicaria são as do Capítulo 16.

  1. Anthropic, Effective context engineering for AI agents, 29 de setembro de 2025, anthropic.com/engineering/effective-context-engineering-for-ai-agents, lido em 7 de setembro de 2026. Fonte das duas definições citadas no topo, do “orçamento de attention” e da afirmação de que cada novo token o esgota, da descrição de context rot, do enquadramento de relações par a par n² e das estratégias usadas como espinha deste capítulo. Três delas são sua lista de longo horizonte — compactação, tomada de notas estruturada e arquiteturas multi-agent; recuperação just-in-time aparece antes no mesmo artigo, em context retrieval e agentic search, e é agrupada com elas aqui. 2 3 4

  2. Liu, N. F., Lin, K., Hewitt, J., Paranjape, A., Bevilacqua, M., Petroni, F. e Liang, P. Lost in the Middle: How Language Models Use Long Contexts. arXiv:2307.03172 (v1 julho de 2023, v3 novembro de 2023). Citado nos Capítulos 15, 16 e 19 e medido aqui. A frase citada vem do resumo; as duas tarefas do artigo são resposta a perguntas em múltiplos documentos e recuperação key-value, e seu achado de que o efeito persiste em modelos explicitamente de contexto longo é a parte que importa para uma decisão de produto.

  3. Anthropic, Code execution with MCP: building more efficient agents, 4 de novembro de 2025, anthropic.com/engineering/code-execution-with-mcp, lido em 7 de setembro de 2026. Fonte da redução de 150.000 para 2.000 tokens e do número de 98,7 %, e da observação de que definições de ferramentas carregadas antecipadamente ocupam contexto antes de a requisição ser lida.

  4. Sumers, T. R., Yao, S., Narasimhan, K. e Griffiths, T. L. Cognitive Architectures for Language Agents. arXiv:2309.02427 (2023). Organiza language agents em torno de “componentes de memória modulares, um espaço de ação estruturado para interagir com memória interna e ambientes externos, e um processo de tomada de decisão generalizado para escolher ações”, e divide a memória em working, episódica, semântica e procedural. O Capítulo 22 usou sua taxonomia para o learning agent; a tabela de três armazenamentos acima é sua sombra prática.

  5. Packer, C., Wooders, S., Lin, K., Fang, V., Patil, S. G., Stoica, I. e Gonzalez, J. E. MemGPT: Towards LLMs as Operating Systems. arXiv:2310.08560 (outubro de 2023). Propõe “gerenciamento de contexto virtual, uma técnica inspirada em sistemas de memória hierárquica de sistemas operacionais tradicionais”, com o próprio modelo movendo dados entre uma camada rápida dentro da window e uma camada lenta fora dela. A declaração mais clara em qualquer lugar de por que a window é um cache, não uma memória.

Pronto para deixar a LIA escolher por você?

Crie com todos os modelos de IA em um só lugar — comece grátis hoje.