Introdução

  • O limite dos agentes de AI não depende apenas do tamanho do modelo, mas sim da habilidade de “gerenciar o contexto”. Essa prática é como configurar a memória para um CPU, determinando a profundidade e a eficiência do pensamento do agente.
  • A janela de contexto não é uma lixeira: o excesso de informações pode “contaminar”, distrair e confundir o julgamento da AI. Precisão é muito mais importante do que um grande volume de dados.
  • Especialistas utilizam as quatro etapas de “escrever, filtrar, comprimir e isolar” para gerenciar o contexto da AI, usando a limitada “memória” de forma eficaz e alcançando redução de custos e aumento de eficiência.
  • O futuro da competição será uma disputa pela eficiência dos sistemas. Isolar tarefas usando uma arquitetura de múltiplos agentes, permitindo que cada agente se destaque em sua própria pequena janela, é fundamental para a construção de sistemas complexos.

Resumo Central

Os agentes (Agents) realizam suas tarefas com o auxílio do contexto (Context). A chamada “engenharia de contexto” refere-se à arte e à ciência de injetar informações adequadas na janela de contexto de um agente durante cada etapa da execução da tarefa. Neste artigo, compilamos as estratégias de engenharia de contexto usadas pelos agentes atuais em grandes categorias.

Engenharia de Contexto

Engenharia de Contexto (Context Engineering)

Como André Karpathy afirmou, os modelos de linguagem grande (LLM) são como um “novo tipo de sistema operacional”. Os LLM funcionam como um CPU, e sua “janela de contexto” atua como RAM, servindo como a memória de trabalho do modelo. Assim como a capacidade da RAM é limitada, a janela de contexto dos LLM também enfrenta restrições de capacidade ao lidar com diversas fontes de contexto. Uma das funções centrais do sistema operacional é gerenciar o uso eficiente da RAM do CPU, e a “engenharia de contexto” desempenha um papel similar. Karpathy resumiu isso de forma precisa:

A engenharia de contexto é “… uma arte e ciência refinada para preencher com precisão a janela de contexto para o próximo passo (cálculo).”

Engenharia de Contexto

Ao desenvolver aplicações baseadas em LLM, que tipos de contexto precisamos gerenciar? O conceito de engenharia de contexto abrange os seguintes tipos diferentes de contexto:

  • Instruções (Instructions) – Palavras-chave, memória, exemplos de poucos disparos, descrições de ferramentas, etc.
  • Conhecimento (Knowledge) – Fatos, memórias, etc.
  • Ferramentas (Tools) – Informações de feedback sobre chamadas de ferramentas

Engenharia de Contexto para Agentes

Neste ano, à medida que as capacidades dos LLM em raciocínio e chamadas de ferramentas aumentam, o interesse pelos agentes cresce dia após dia. Os agentes executam tarefas alternando entre LLM e ferramentas, sendo especialmente habilidosos em lidar com tarefas complexas de longa duração.

Engenharia de Contexto para Agentes

No entanto, as tarefas longas e o feedback acumulado das chamadas de ferramentas significam que os agentes geralmente consomem uma grande quantidade de tokens. Isso pode acarretar vários problemas: exceder os limites de capacidade da janela de contexto, resultando em aumentos nos custos e na latência, e até mesmo deteriorar o desempenho do agente. Drew Breunig destacou de forma clara que um contexto excessivamente longo pode levar a problemas de desempenho das seguintes maneiras:

  • Contaminação de Contexto (Context Poisoning): Quando informações errôneas (ilusões) entram no contexto.
  • Distração de Contexto (Context Distraction): Quando um excesso de informações no contexto sobrecarrega o conhecimento treinado do modelo.
  • Confusão de Contexto (Context Confusion): Quando informações irrelevantes no contexto afetam as respostas do modelo.
  • Conflito de Contexto (Context Clash): Quando diferentes partes do contexto se contradizem.

Diante desses problemas, a empresa Cognition AI enfatizou a importância da engenharia de contexto:

“A engenharia de contexto”… é na verdade a principal tarefa do engenheiro que constrói agentes de AI.

A Anthropic também esclareceu:

Agentes geralmente precisam passar por centenas de rodadas de diálogo, o que nos exige adotar estratégias de gerenciamento de contexto prudentes.

Então, como os desenvolvedores de hoje estão enfrentando esse desafio? Resumi as abordagens existentes em quatro categorias: Escrever (Write), Filtrar (Select), Comprimir (Compress), e Isolar (Isolate) — e darei exemplos para cada uma.

Tipo de Memória

Escrever o Contexto (Write Context)

Escrever o contexto significa armazenar informações fora da janela de contexto, para que possam ser utilizadas pelo agente durante a execução da tarefa.

Áreas de Trabalho (Scratchpads)

Quando os humanos resolvem problemas, costumam anotar e lembrar de certos aspectos para utilizá-los em tarefas futuras relacionadas. Os agentes também estão adquirindo gradualmente essas habilidades! Fazer anotações em uma “área de trabalho” é uma forma de persistir informações durante a execução da tarefa pelo agente. A ideia central é manter informações fora da janela de contexto, mas acessíveis ao agente quando necessário. O sistema de pesquisa multi-agente da Anthropic fornece um exemplo claro:

O “pesquisador-chefe” primeiro pensa em uma forma de resolver o problema e salva seu plano na “memória” para persistir o contexto, já que uma vez que a janela de contexto ultrapassa 200 mil tokens, ela pode ser truncada, e manter o plano é vital.

Existem várias formas de implementar a área de trabalho. Pode ser uma simples chamada de ferramenta, como gravar um arquivo; ou um campo em um objeto de estado em tempo de execução que se mantém constante durante toda a sessão. Independentemente da abordagem, a área de trabalho permite que o agente armazene informações úteis para melhor atender às suas tarefas.

Memórias (Memories)

A área de trabalho ajuda o agente a resolver tarefas em uma única sessão, mas às vezes os agentes precisam lembrar de informações ao longo de múltiplas sessões. O modelo Reflexion introduziu a ideia de refletir após cada ação do agente, reutilizando essas memórias auto-geradas. Modelos de Agentes Geradores podem periodicamente sintetizar memórias a partir de conjuntos de feedback passados dos agentes.

Esses conceitos foram aplicados em produtos populares como ChatGPT, Cursor e Windsurf. Todos possuem mecanismos para gerar memórias de longo prazo automaticamente a partir da interação dos usuários com os agentes.

Memórias

Filtrar o Contexto (Select Context)

Filtrar o contexto refere-se a trazer a informação necessária para a janela de contexto a fim de auxiliar o agente na execução de suas tarefas.

Áreas de Trabalho (Scratchpad)

O mecanismo de filtro a partir da área de trabalho depende de como ela foi implementada. Se for uma ferramenta, o agente pode simplesmente fazer uma chamada para ler. Se for parte do estado de execução do agente, o desenvolvedor pode expor seletivamente certas partes do estado para o agente a cada etapa. Isso fornece controle refinado sobre o contexto da área de trabalho fornecido ao LLM nas rodadas seguintes.

Memórias (Memories)

Se o agente tem a capacidade de armazenar memória, ele também precisa ser capaz de filtrar memórias que são relevantes para a tarefa atual. Isso é especialmente útil, pois: o agente pode selecionar exemplos de poucos disparos (memórias situacionais) para aprender padrões de comportamento esperados; pode selecionar instruções (memórias programáticas) para guiar seu próprio comportamento; ou pode escolher fatos (memórias semânticas) para fornecer o contexto relevante para a tarefa.

Memory Type

Um grande desafio é garantir que as memórias filtradas sejam relevantes. Alguns agentes populares utilizam apenas uma pequena parte de um conjunto fixo de arquivos, que são sempre carregados no contexto. Por exemplo, muitos agentes de código usam arquivos para armazenar instruções (memórias programáticas), ou em alguns casos, exemplos (memórias situacionais). Claude Code utiliza CLAUDE.md, enquanto Cursor e Windsurf utilizam arquivos de regras.

No entanto, se o agente armazenar uma grande quantidade de fatos ou relações (por exemplo, do tipo “memórias semânticas”), filtrar se torna mais complicado. O ChatGPT é um ótimo exemplo, pois armazena e filtra a partir de uma grande quantidade de memórias exclusivas de usuários.

Embeddings vetoriais e/ou grafos de conhecimento são técnicas comuns de indexação de memória que auxiliam na filtragem. Apesar disso, a filtragem de memórias continua sendo cheia de desafios. No AIEngineer World Expo, Simon Willison compartilhou um exemplo de erro na filtragem de memórias: o ChatGPT obteve suas informações de localização da memória e acidentalmente as injetou na imagem que ele pediu. Essa recuperação de memória inesperada ou indesejada pode fazer alguns usuários sentirem que a janela de contexto “não lhes pertence mais”!

Ferramentas (Tools)

Os agentes precisam usar ferramentas, mas se muitas ferramentas forem disponibilizadas, eles podem ficar sobrecarregados. Isso geralmente acontece quando as descrições das ferramentas se sobrepõem, o que confunde o modelo ao escolher qual ferramenta usar. Uma abordagem é aplicar RAG (Geração Aumentada por Recuperação) nas descrições das ferramentas, e assim recuperar a ferramenta mais relevante para a tarefa com base na similaridade semântica. Alguns documentos recentes demonstraram que essa abordagem pode aumentar a precisão na seleção de ferramentas em até três vezes.

Conhecimento (Knowledge)

A recuperação aumentada por geração (RAG) é um tópico vasto em si e pode ser um dos desafios centrais da engenharia de contexto. Agentes de código são um dos melhores exemplos da aplicação em larga escala do RAG. Varun, da Windsurf, resumiu bem alguns dos desafios:

Indexar código ≠ recuperar contexto… O que estamos fazendo é usar a AST (árvore de sintaxe abstrata) para analisar o código e segmentá-lo ao longo de limites semanticamente significativos… mas à medida que o tamanho do repositório de código cresce, a busca por embeddings vetoriais se torna menos confiável… Precisamos confiar em uma combinação de várias técnicas, como grep/busca de arquivos, recuperação baseada em grafos de conhecimento, e… um passo de reordenação, onde o contexto é ordenado pela relevância.

Comprimir o Contexto (Compress Context)

Comprimir o contexto significa reter apenas os tokens necessários para a execução da tarefa.

Resumo de Contexto (Context Summarization)

As interações dos agentes podem se estender por centenas de rodadas e utilizar ferramentas que consomem uma grande quantidade de tokens. A compressão é uma abordagem comum para enfrentar esses desafios. Se você já usou o Claude Code, já deve ter visto sua aplicação prática. Quando a taxa de uso da janela de contexto ultrapassa 95%, o Claude Code executa “compressão automática”, resumindo toda a trajetória de interação entre usuário e agente. Essa compressão da trajetória do agente pode adotar diversas estratégias, como resumos recursivos ou resumos hierárquicos.

Resumo de Contexto

Adicionar um passo de resumo no design do agente em um momento oportuno também é útil. Por exemplo, pode ser utilizado para pós-processar chamadas de ferramentas (especialmente para ferramentas que consomem muitos tokens, como a de busca). Além disso, a Cognition mencionou a importância de resumir nas bordas onde a interação entre agentes ocorre, para reduzir o consumo de tokens durante a transferência de conhecimento. Capturar eventos ou decisões específicas pode ser desafiador ao resumir. A Cognition utilizou um modelo finetuning para esse propósito, o que destaca o trabalho intenso que pode ser necessário nesse passo.

Corte de Contexto (Context Trimming)

Os resumos geralmente utilizam LLM para extrair os fragmentos mais relevantes de contexto, enquanto o corte é mais como um filtro ou, como disse Drew Breunig, um “poda” de contexto. Isso pode ser feito por meio de regras heurísticas codificadas, como remover mensagens mais antigas de uma lista de mensagens. Drew também mencionou o Provence, um podador de contexto treinado para tarefas de perguntas e respostas.

Isolar o Contexto (Isolating Context)

Isolar o contexto significa fragmentar o contexto para ajudar os agentes na execução de tarefas.

Múltiplos Agentes (Multi-agent)

Uma das maneiras mais populares de isolar o contexto é dispersá-lo entre múltiplos subagentes. Uma das motivações da biblioteca Swarm da OpenAI é o “desvio de foco”, onde uma equipe de agentes trata sub-tarefas. Cada agente possui seu próprio conjunto específico de ferramentas, instruções e janelas de contexto independentes.

Multi-agente

O sistema de pesquisa multi-agente da Anthropic fornece uma forte evidência para isso: múltiplos agentes com contextos independentes se saem melhor do que um único agente, em grande parte porque a janela de contexto de cada subagente pode se concentrar em uma sub-tarefa mais estreita. Como foi descrito em seu blog:

Os subagentes operam em paralelo com suas respectivas janelas de contexto, explorando diferentes aspectos do problema.

No entanto, o sistema multi-agente também enfrenta desafios, incluindo o consumo de tokens (por exemplo, a Anthropic relatou que seu uso de tokens é 15 vezes maior do que uma conversa) e a necessidade de uma engenharia de prompt cuidadosa para planejar o trabalho dos subagentes, além dos problemas de coordenação entre eles.

Isolando o Contexto com Ambientes (Context Isolation with Environments)

O projeto de pesquise de profundidade da HuggingFace apresenta outro exemplo interessante de isolamento de contexto. A maioria dos agentes utiliza chamadas de ferramentas via API, que retornam objetos JSON (parâmetros da ferramenta) que são então transmitidos à ferramenta (como uma API de busca) para obter feedback (como resultados de busca). A HuggingFace, por sua vez, utiliza um CodeAgent que gera diretamente o código contendo as chamadas de ferramentas necessárias. Esse código é então executado em um ambiente sandbox. Apenas o contexto específico retornado da chamada da ferramenta (como valores de retorno) é transmitido de volta para o LLM.

Isolando o Contexto com Ambientes

Isso permite que o contexto seja isolado no ambiente do LLM. A Hugging Face observa que essa é uma excelente maneira de isolar objetos que consomem muitos tokens:

Os Code Agents são melhores em lidar com estado… Precisa armazenar imagens/áudio/outros dados para uso posterior? Sem problemas, basta alocá-lo como uma variável e você poderá usá-lo mais tarde.

Estado (State)

Vale a pena mencionar que o objeto de estado de execução do agente também é uma boa forma de isolar o contexto. Isso pode funcionar de forma semelhante a um sandbox. O objeto de estado pode definir um esquema (Schema, como um modelo Pydantic) que contém campos que podem ser escritos para o contexto. Um campo no esquema (como messages) pode ser exposto ao LLM a cada interação do agente, mas o esquema pode isolar informações em outros campos para que possam ser utilizadas de forma mais seletiva.

Conclusão

Os padrões de engenharia de contexto dos agentes ainda estão em evolução, mas podemos resumir os métodos comuns em quatro categorias: Escrever, Filtrar, Comprimir e Isolar:

  • • Escrever o contexto, referindo-se ao armazenamento de informações fora da janela de contexto, para que os agentes possam utilizá-las durante a execução de suas tarefas.
  • • Filtrar o contexto, que envolve trazer informações necessárias para a janela de contexto a fim de auxiliar os agentes na execução de suas tarefas.
  • • Comprimir o contexto, mantendo apenas os tokens essenciais para a execução das tarefas.
  • • Isolar o contexto, que refere-se à fragmentação do contexto a fim de ajudar os agentes na execução de suas tarefas.

Compreender e aplicar esses padrões é o trabalho central na construção de agentes de AI eficientes hoje.