Inteligência Artificial

Memória de longo prazo para agentes

Quando e como externalizar contexto sem perder coerência

27 de nov. de 2025·Ricardo Coelho

Os quatro posts anteriores trataram o contexto como recurso finito que precisa ser compactado, podado e mantido enxuto por disciplina operacional. Todos esses mecanismos assumem que a informação relevante cabe, de alguma forma, na janela de contexto da chamada atual. A partir de um certo horizonte temporal esse pressuposto quebra. Um agente que opera por semanas ou meses com o mesmo usuário acumula histórico que nenhuma janela absorve sem degradação. Pra mim, é nesse ponto que o problema deixa de ser gestão de contexto dentro da chamada e passa a ser arquitetura de memória fora dela.

A memória de longo prazo de um agente é uma camada externa de persistência que ele consulta e na qual grava, entre invocações, aquilo que precisa sobreviver à janela atual. Ela existe pra resolver uma assimetria estrutural entre dois tipos de informação. Há informação efêmera, que importa apenas durante o turno corrente e pode ser descartada logo depois, e há informação persistente, que define quem é o usuário, o que ele já pediu e quais restrições foram combinadas ao longo do relacionamento. Tratar ambas do mesmo modo, empurrando tudo pra context window, produz a inflação de tokens que os posts anteriores descreveram. Separar as duas é o que viabiliza agentes de longa duração com um custo previsível.

Na minha análise, a decisão sobre quando externalizar deriva de dois sinais observáveis. O primeiro é a razão entre histórico e turno útil: quando mensagens passadas começam a ocupar mais do que cerca de 40% da janela em chamadas recorrentes, o agente carrega memória que deveria estar fora. O segundo é a taxa de referência cruzada: quando o modelo precisa resgatar fatos estabelecidos há muitos turnos pra responder ao turno atual, a context window opera como armazenamento primário, o que é caro e frágil, até porque informação antiga tende a ser comprimida nas estratégias de poda e o agente perde coerência. A ausência dessa camada externa é o que produz o esquecimento que usuários percebem como degradação de qualidade.

A arquitetura de memória externa tende a se estabilizar em três camadas com responsabilidades distintas. A camada episódica armazena eventos com timestamps, preservando o rastro do que aconteceu na ordem em que aconteceu, e é consultada quando o agente precisa responder perguntas sobre o próprio histórico. A camada semântica armazena fatos consolidados sobre o usuário e o domínio, extraídos a partir dos episódios, e é consultada quando o agente precisa de conhecimento estável, não de cronologia. A camada procedural armazena preferências operacionais e regras implícitas aprendidas ao longo das interações, e é consultada pra ajustar comportamento sem que o usuário precise reafirmar o que já disse. Cada camada tem política própria de gravação e expiração. Misturar essas políticas num único store é, na minha avaliação, o erro arquitetural mais comum em primeiras implementações.

A gravação não deve ser síncrona ao turno do agente. Extrair fatos e consolidar memória dentro da chamada do usuário introduz latência perceptível e acopla a qualidade da resposta à qualidade do pipeline de memória, produzindo falhas correlacionadas difíceis de diagnosticar. O padrão que se sustenta em produção é gravação assíncrona, com um pipeline separado que consome turnos concluídos, deduplica candidatos contra a memória existente e persiste apenas o que sobrevive à filtragem por regras de precedência. Esse pipeline opera em segundo plano, tolera atraso de minutos e pode ser reprocessado sem afetar o agente em execução.

A recuperação, por outro lado, precisa ser síncrona e rápida, até porque acontece dentro da chamada. O padrão operacional consiste em transformar a query em vetor, consultar a memória semântica por similaridade e injetar apenas os itens cujo score supera um limiar calibrado. A tentação de recuperar muito pra garantir cobertura é, na minha avaliação, a origem da maior parte dos custos desnecessários nessa camada, até porque cada item recuperado consome tokens e degrada a atenção do modelo sobre o que importa. A calibragem do limiar depende do domínio, do custo por token e da tolerância do produto a respostas que ignoram memória disponível.

A coerência entre sessões depende menos da sofisticação do store e mais da disciplina com que fatos conflitantes são resolvidos. Memória externa acumula contradições ao longo do tempo, porque usuários mudam de ideia e fatos de ontem deixam de ser verdadeiros hoje. Sem uma política explícita de versionamento, com timestamps em cada fato e invalidação quando um fato novo contradiz um anterior, o agente começa a operar com base em verdades incompatíveis e produz respostas que parecem confiantes, mas estão desalinhadas com o estado atual. Pra mim, esse é o modo de falha mais caro de diagnosticar, até porque não aparece como erro do modelo, aparece como deriva de comportamento que o time atribui a causas erradas.

O trade-off de externalizar memória é operacional, não conceitual. O agente ganha horizonte temporal arbitrário e custo de contexto previsível por chamada, mas herda um sistema de persistência que precisa ser monitorado e auditado com o mesmo rigor de qualquer base de dados de produção. Na minha avaliação, quem trata a memória de longo prazo como detalhe de implementação acaba reconstruindo, em seis meses, as mesmas falhas que a context window inflacionada produziria, apenas deslocadas pra uma camada que ninguém está observando. A externalização resolve o problema de custo da janela de contexto e substitui por um problema de governança de dados. Que é o problema que engenharia sabe resolver.