Agentes precisam de contexto para executar tarefas. A Engenharia de Contexto é a arte e a ciência de preencher a janela de contexto com apenas as informações certas em cada etapa da trajetória de um Agente. Nesta publicação, eu agrupo a engenharia de contexto em algumas estratégias comuns vistas em muitos agentes populares hoje.

context_engenering

Engenharia de Contexto

Como Andrej Karpathy coloca, LLMs são como um novo tipo de sistema operacional. O LLM é como a CPU e sua janela de contexto é como a RAM, servindo como a memória de execução do modelo. Assim como a RAM, a janela de contexto do LLM tem capacidade limitada para lidar com várias fontes de contexto. E assim como um sistema operacional gerencia o que se encaixa na RAM de uma CPU, a “engenharia de contexto” desempenha um papel semelhante. Karpathy resume isso bem:

[Engenharia de contexto é a] “…a delicada arte e ciência de preencher a janela de contexto com a informação exata para o próximo passo.”

context_types

Quais são os tipos de contexto que precisamos gerenciar ao construir aplicações com LLMs? Engenharia de contexto é um guarda-chuva que se aplica a diferentes tipos de contexto:

  • Instruções – prompts, memórias, exemplos few-shot, descrições de ferramentas, etc.
  • Conhecimento – fatos, memórias, etc.
  • Ferramentas – feedback de chamadas de ferramentas

Engenharia de Contexto para Agentes

Este ano, o interesse em Agentes cresceu enormemente à medida que os LLMs (Grandes Modelos de Linguagem) aprimoram suas capacidades de raciocínio e chamada de ferramentas. Agentes intercalam chamadas de LLMs e chamadas de ferramentas, muitas vezes para tarefas de longa duração.

agent_flow

No entanto, tarefas de longa duração e o acúmulo de feedback de chamadas de ferramentas significam que os Agentes frequentemente utilizam um grande número de tokens. Isso pode causar vários problemas: Exceder o tamanho da janela de contexto, aumentar o custo/latência, ou diminuir o desempenho do Agente. Drew Breunig delineou claramente uma série de maneiras específicas pelas quais um contexto mais longo pode causar problemas de desempenho, incluindo:

  • Envenenamento de Contexto: Quando uma alucinação entra no contexto.
  • Distração de Contexto: Quando o contexto sobrecarrega o treinamento.
  • Confusão de Contexto: Quando contexto supérfluo influencia a resposta.
  • Conflito de Contexto: Quando partes do contexto discordam.

Com isso em mente, a Cognition ressaltou a importância da engenharia de contexto:

“Engenharia de contexto”… é efetivamente a função #1 dos engenheiros que constroem Agentes de IA.

Antropic também deixou claro:

Agentes frequentemente se envolvem em conversas que se estendem por centenas de turnos, exigindo estratégias cuidadosas de gerenciamento de contexto.

Então, como as pessoas estão lidando com esse desafio hoje? Eu agrupo as abordagens em 4 categorias — write, select, compress, e isolate — e dou alguns exemplos de cada uma abaixo.

context_engenering

Sumário

Contexto de Escrita (Write Context)

Escrever o contexto significa salvar o contexto fora da janela de contexto para ajudar um Agente a executar uma tarefa.

Bloco de rascunho (Scratchpads)

Quando humanos resolvem tarefas, eles fazem anotações e memorizam coisas para tarefas futuras relacionadas. Agentes também estão adquirindo essas capacidades! A tomada de notas via “bloco de rascunho” é uma abordagem para persistir informações enquanto um Agente está executando uma tarefa. A ideia central é salvar informações fora da janela de contexto para que estejam disponíveis para o Agente. Um pesquisador de multiagentes da Anthropic ilustra um exemplo claro disso:

O LeadResearcher começa pensando na abordagem e salvando seu plano na Memória para persistir o contexto, já que se a janela de contexto exceder 200.000 tokens, ela será truncada e é importante manter o plano.

Blocos de rascunho podem ser implementados de algumas maneiras diferentes. Eles podem ser uma chamada de ferramenta que simplesmente escreve em um arquivo. Também pode ser apenas um campo em um objeto de estado de tempo de execução que persiste durante a sessão. Em ambos os casos, os blocos de rascunho permitem que os agentes salvem informações úteis para ajudá-los a realizar uma tarefa.

Memórias (Memories)

Blocos de rascunho ajudam os agentes a resolver uma tarefa dentro de uma sessão específica, mas, às vezes, os agentes se beneficiam ao lembrar de coisas em muitas sessões. A Reflexão introduziu a ideia de reflexão após cada turno do Agente e a reutilização dessas memórias autogeradas. Já os Agentes Generativos criaram memórias sintetizadas periodicamente a partir de coleções de feedback de agentes anteriores.

Esses conceitos foram incorporados em produtos populares como ChatGPT, Cursor e Windsurf, que possuem mecanismos para gerar automaticamente memórias de longo prazo com base nas interações entre usuário e Agente.

context_memoring

Contexto de Seleção (Select Context)

Selecionar o contexto significa puxar um contexto de fora para dentro de uma janela de contexto, ajudando um Agente a executar a tarefa.

Bloco de rascunho (Scratchpads)

O mecanismo para selecionar contexto de um bloco de rascunho depende de como ele é implementado. Se for uma ferramenta, um agente pode simplesmente lê-lo fazendo uma chamada de ferramenta. Se for parte do estado de tempo de execução do agente, o desenvolvedor pode escolher quais partes do estado expor ao agente em cada etapa. Isso proporciona um nível de controle refinado para expor o contexto do bloco de rascunho ao LLM em turnos posteriores.

Memórias (Memories)

Se os agentes têm a capacidade de salvar memórias, eles também precisam da capacidade de selecionar as memórias relevantes para a tarefa que estão executando. Isso pode ser útil por algumas razões. Os agentes podem selecionar exemplos few-shot (memórias episódicas) para ver exemplos de comportamento desejado, instruções (memórias procedurais) para direcionar o comportamento, ou fatos (memórias semânticas) para dar ao agente um contexto relevante para a tarefa.

Tipo de Memória Armazenado Exemplo Humano Exemplo Agente
Semântica Fatos Coisas aprendidas Fatos sobre o usuário
Episódica Experiências Coisas feitas Ações passadas
Procedural Instruções Instintos ou Reflexos Prompt do Sistema do Agente

Um desafio é garantir que as memórias relevantes sejam selecionadas. Alguns agentes populares simplesmente usam um conjunto restrito de arquivos que são sempre puxados para o contexto. Por exemplo, muitos agentes de código usam arquivos para salvar instruções (memórias “procedurais”) ou, em alguns casos, exemplos (memórias “episódicas”). O Claude Code usa o CLAUDE.md. O Cursor e o Windsurf usam arquivos de regras.

No entanto, se um agente está armazenando uma coleção maior de fatos e/ou relacionamentos (por exemplo, memórias semânticas), a seleção é mais difícil. O ChatGPT é um bom exemplo de um produto popular que armazena e seleciona a partir de uma grande coleção de memórias específicas do usuário.

Embeddings e/ou grafos de conhecimento para indexação de memória são comumente usados para auxiliar na seleção. Ainda assim, a seleção de memória é desafiadora. Na AIEngineer World’s Fair, Simon Willison compartilhou um exemplo de seleção de memória que deu errado: o ChatGPT buscou a localização dele nas memórias e a injetou inesperadamente em uma imagem solicitada. Esse tipo de recuperação de memória inesperada ou indesejada pode fazer com que alguns usuários sintam que a janela de contexto “não lhes pertence mais”!

Ferramentas (Tools)

Agentes utilizam ferramentas, mas podem ficar sobrecarregados se lhes forem fornecidas muitas delas. Isso geralmente ocorre porque as descrições das ferramentas podem se sobrepor, causando confusão no modelo sobre qual ferramenta usar. Uma abordagem é aplicar RAG (geração aumentada por recuperação) às descrições das ferramentas para buscar as ferramentas mais relevantes para uma tarefa com base na similaridade semântica. Alguns artigos recentes demonstraram que isso melhora a precisão na seleção de ferramentas em três vezes.

Conhecimento (Knowledge)

RAG (Retrieval Augmented Generation) é um tema vasto e pode ser um desafio central na engenharia de contexto. Agentes de código são alguns dos melhores exemplos de RAG em produção em larga escala. Varun, da Windsurf, aborda bem alguns desses desafios:

Indexar código != recuperação de contexto… [Estamos fazendo indexação e busca por embedding… [com] parsing de código AST e agrupamento ao longo de limites semanticamente significativos… a busca por embedding torna-se não confiável como heurística de recuperação à medida que o tamanho da base de código cresce… devemos confiar em uma combinação de técnicas como grep/busca de arquivo, recuperação baseada em grafo de conhecimento, e… uma etapa de reclassificação onde [o contexto] é classificado em ordem de relevância.

Contexto de Compressão (Compressing Context)

Comprimir o contexto envolve reter apenas os tokens necessários para realizar uma tarefa.

Resumo do Contexto

Interações de agentes podem se estender por centenas de turnos e usar chamadas de ferramentas com muitos tokens. O resumo é uma forma comum de lidar com esses desafios. Se você já usou o Claude Code, viu isso em ação. O Claude Code executa um “auto-compact” depois que você excede 95% da janela de contexto e ele resume a trajetória completa das interações entre usuário e agente. Esse tipo de compressão ao longo de uma trajetória do agente pode usar várias estratégias, como resumo recursivo ou hierárquico.

context_curation

Também pode ser útil adicionar resumos em pontos específicos do design de um agente. Por exemplo, pode ser usado para pós-processar certas chamadas de ferramentas (como ferramentas de busca que consomem muitos tokens). Como segundo exemplo, a Cognition mencionou o resumo em fronteiras entre agentes para reduzir tokens durante a transferência de conhecimento. A sumarização pode ser um desafio se eventos ou decisões específicas precisarem ser capturados. A Cognition usa um modelo ajustado para isso, o que ressalta o trabalho que pode ser investido nesta etapa.

Corte de Contexto

Enquanto a sumarização geralmente usa um LLM para destilar as partes mais relevantes do contexto, o corte (trimming) frequentemente pode filtrar ou, como Drew Breunig aponta, “podar” o contexto. Isso pode usar heurísticas codificadas (hard-coded), como remover mensagens mais antigas de uma lista de mensagens. Drew também menciona Provence, um podador de contexto treinado para Perguntas e Respostas.

Contexto de Isolamento (Isolating Context)

Isolar o contexto envolve dividí-lo para ajudar um agente a realizar uma tarefa.

Multiagente

Uma das formas mais populares de isolar o contexto é dividindo-o entre subagentes. Uma das motivações para a biblioteca Swarm da OpenAI foi a “separação de responsabilidades”, onde uma equipe de agentes pode lidar com subtarefas. Cada agente possui um conjunto específico de ferramentas, instruções e sua própria janela de contexto.

context_multi_agent

O pesquisador multiagente da Anthropic defende essa abordagem: muitos agentes com contextos isolados superaram um único agente, em grande parte porque a janela de contexto de cada subagente pode ser alocada para uma subtarefa mais restrita. Como o blog afirmou:

[Subagentes operam] em paralelo com suas próprias janelas de contexto, explorando diferentes aspectos da questão simultaneamente.

Claro, os desafios com multiagentes incluem o uso de tokens (por exemplo, até 15 vezes mais tokens do que no chat, conforme relatado pela Anthropic), a necessidade de uma engenharia de prompt cuidadosa para planejar o trabalho dos subagentes e a coordenação dos subagentes.

Isolamento de Contexto com Ambientes

O pesquisador da HuggingFace mostra outro exemplo interessante de isolamento de contexto. A maioria dos agentes usa APIs de chamada de ferramentas, que retornam objetos JSON (argumentos da ferramenta) que podem ser passados para as ferramentas (por exemplo, uma API de busca) para obter feedback (por exemplo, resultados de busca). A HuggingFace usa um CodeAgent, que gera um código contendo as chamadas de ferramenta desejadas. O código então é executado em um ambiente sandbox. O contexto selecionado (por exemplo, valores de retorno) das chamadas de ferramentas é então passado de volta para o LLM.

context_isolation

Isso permite que o contexto seja isolado do LLM no ambiente. A Hugging Face observou que essa é uma ótima maneira de isolar objetos que consomem muitos tokens, em particular:

[Code Agents permitem] um melhor manuseio do estado… Precisa armazenar esta imagem/áudio/outros para uso posterior? Sem problemas, basta atribuí-lo como uma variável em seu estado e você [o usa depois].

Estado

Vale ressaltar que o objeto de estado em tempo de execução de um agente também pode ser uma excelente forma de isolar o contexto. Isso pode servir ao mesmo propósito que o isolamento (sandboxing). Um objeto de estado pode ser projetado com um schema (por exemplo, um modelo Pydantic) que possui campos nos quais o contexto pode ser escrito. Um campo do schema (por exemplo, messages) pode ser exposto ao LLM em cada turno do agente, mas o esquema pode isolar informações em outros campos para uso mais seletivo.

Conclusão

Os padrões para a engenharia de contexto de agentes ainda estão em evolução, mas podemos agrupar as abordagens comuns em quatro categorias: write, select, compress, e isolate.

  • Escrever contexto significa salvá-lo fora da janela de contexto para ajudar um agente a realizar uma tarefa.
  • Selecionar contexto significa puxá-lo para dentro da janela de contexto para ajudar um agente a realizar uma tarefa.
  • Comprimir contexto envolve reter apenas os tokens necessários para realizar uma tarefa.
  • Isolar contexto envolve dividi-lo para ajudar um agente a realizar uma tarefa.

Compreender e utilizar esses padrões é uma parte central da construção de agentes eficazes hoje em dia.

Créditos

Esta postagem é uma tradução autorizada do post Context Engineering for Agents, de autoria de Lance Martin, phd Stanford.