Gerenciamento de memória em agentes de IA: memória de longo prazo e governança do conhecimento

Atualização de 08/06/2026: revisei o benchmark LOCOMO e as descrições dos frameworks (Mem0, Letta, Zep e Cognee continuam atuais), substituí referências desatualizadas a preços de modelos por uma formulação genérica e acrescentei leituras relacionadas. Frameworks e benchmarks evoluem rapidamente; consulte as fontes oficiais para os números mais recentes.
“E aquele pedido que você consultou para mim da última vez, como ficou?”
Quando o usuário fez essa pergunta, o agente de atendimento travou. Procurou em todo o contexto da conversa atual e não encontrou qualquer registro sobre um “pedido” — porque a consulta tinha ocorrido na tarde anterior, em outra sessão.
Isso não é um bug. É amnésia.
Quando encontrei esse problema pela primeira vez, foi complicado. O agente respondia muito bem e a experiência do usuário era boa, mas bastava a pessoa trocar de janela, fechar o navegador ou voltar algumas horas depois para tudo retornar a zero. O agente não lembrava as preferências do usuário, as decisões anteriores nem por que havia tomado aquelas decisões.
Pior ainda: simplesmente aumentar a janela de contexto não resolve. Pelo contrário — por mais estranho que pareça — pode deixar o agente menos capaz. É o que chamamos de “deterioração do contexto”: informações irrelevantes diluem a atenção do modelo como ruído, o custo de recuperação cresce exponencialmente e a latência salta de algumas centenas de milissegundos para mais de dez segundos.
Então, como fazer um agente realmente “lembrar”? Não basta salvar a conversa em um banco de dados. Ele precisa agir mais como uma pessoa: lembrar o que importa, esquecer o que é trivial, recuperar a informação quando necessário e rastrear as razões por trás de cada decisão.
A seguir, vamos destrinchar a lógica fundamental dos sistemas de memória para agentes: os três tipos de memória (a maioria das pessoas conhece apenas dois), como escolher entre seis frameworks populares, de que forma grafos de conhecimento cobrem os pontos cegos dos bancos vetoriais e quais armadilhas aparecem na prática.
Por que um agente precisa de um sistema de memória independente
Deterioração do contexto: uma janela maior pode ser pior
Comecemos com alguns dados do benchmark LOCOMO, um conjunto de dados de referência voltado especificamente à avaliação da memória de agentes:
À primeira vista, o Full-context tem precisão maior. Mas você aceitaria esperar dez segundos? Mais importante: o consumo de tokens é 13 vezes maior. Considerando os preços dos principais modelos de linguagem, o contexto sozinho pode custar de alguns centavos a valores bem maiores em cada conversa.
Por que uma janela maior pode piorar o resultado?
Pense em uma biblioteca. Quando há apenas dez livros, basta olhar rapidamente para encontrar o que você procura. Quando há cem mil — mesmo que todas as capas estejam visíveis ao mesmo tempo — localizar o livro certo leva muito mais tempo.
O mecanismo de atenção de um modelo funciona de forma parecida. Quanto mais informações entram na janela de contexto, menos atenção é destinada a cada item. Conversas históricas irrelevantes, estados de tarefas desatualizados, problemas já resolvidos… tudo fica amontoado, e o modelo perde a capacidade de distinguir o que realmente importa.
Essa é a deterioração do contexto. Quanto mais informação, menor a relação sinal-ruído.
Já fiz um experimento em que pedi ao agente, depois de cem rodadas de conversa, que respondesse sobre um detalhe mencionado na primeira rodada. O resultado? A precisão com o contexto completo caiu de 90% para 60%. Com um sistema de memória, permaneceu acima de 85%.
De “ferramenta” a “parceiro”: memória além dos limites da sessão
Um agente sem memória é, no máximo, uma ferramenta avançada. Você termina de usá-lo, e ele se esquece de você.
Um agente com memória pode realmente se tornar um “parceiro”. Ele se lembra de que você prefere respostas objetivas, de que já fez uma pergunta parecida e de que seu projeto usa React, não Vue. Você não precisa repetir tudo a cada conversa.
A equipe da Letta, empresa por trás do MemGPT, apresentou um ótimo exemplo: um assistente de programação que permanece em execução por longos períodos. Ele se lembra do estilo de código do projeto, dos bugs anteriores e suas soluções e até das bibliotecas de terceiros usadas com frequência. Quando você pede “escreva outra função parecida”, ele sabe o que “parecida” significa, porque lembra da função anterior.
Essa continuidade entre sessões é a base da evolução do agente de “ferramenta” para “parceiro”.
Três tipos fundamentais de memória: curto prazo, longo prazo e raciocínio (a terceira é ignorada pela maioria)
Quando se fala em memória para agentes, muita gente conhece apenas a memória de curto e de longo prazo. Mas há um terceiro tipo: Reasoning Memory, ou memória de raciocínio. É justamente isso que falta na maioria dos sistemas.
Vamos por partes:
Memória de curto prazo (Short-term Memory): é a janela de contexto atual. Sua capacidade é limitada, as informações são recentes e desaparecem ao fim da sessão. Pense nela como a RAM: desligou, perdeu.
Memória de longo prazo (Long-term Memory): são informações mantidas em armazenamento externo, como bancos de dados vetoriais, bancos relacionais ou grafos de conhecimento. Ela tem grande capacidade, é persistente e permite recuperação. Funciona como um disco, sempre disponível para leitura e gravação.
Memória de raciocínio (Reasoning Memory): é a mais fácil de ignorar. Ela registra o processo decisório do agente — por que A foi escolhido em vez de B, quais eram as restrições e como foi a cadeia de raciocínio. Sem essa memória, o agente toma decisões, mas não consegue explicar o “porquê”. Isso é muito importante para explicabilidade, depuração e aprendizado contínuo.
Uma passagem do blog técnico da Neo4j resume bem: “Um agente que apenas executa, mas não consegue explicar seu processo decisório, é como um funcionário que trabalha, mas nunca faz uma retrospectiva. Pode funcionar no curto prazo, porém inevitavelmente causará problemas no longo prazo.”
Entre os frameworks que analisei, apenas alguns, como Letta e Zep, implementam memória de raciocínio. A maioria ainda está no estágio de “salvar conversas em um banco vetorial”.
Arquitetura cognitiva da memória de um agente
Modelo de memória em quatro camadas
Inspirados no design de sistemas operacionais e na ciência cognitiva, os sistemas modernos de memória para agentes costumam adotar uma arquitetura em camadas. O modelo mais clássico é o de quatro camadas da Letta/MemGPT:
Camada 1: Message Buffer (buffer de mensagens)
↓ compactação ao transbordar
Camada 2: Core Memory (memória central)
↓ gravação ativa
Camada 3: Recall Memory (memória de recuperação)
↓ consulta sob demanda
Camada 4: Archival Memory (memória de arquivo)
Message Buffer: é a janela de contexto da conversa atual, com capacidade limitada (por exemplo, 4K ou 8K tokens). Quando o buffer está quase cheio, o sistema compacta mensagens antigas em um resumo, liberando espaço para as novas.
Core Memory: um pequeno bloco de “memória de trabalho” cuidadosamente mantido, que guarda as informações mais relevantes para a tarefa atual, como preferências do usuário, objetivo corrente e decisões recentes. Sua capacidade vai de algumas centenas a alguns milhares de tokens. Ele permanece dentro da janela de contexto para que o modelo sempre o veja durante a geração.
Recall Memory: o armazenamento vetorial das conversas anteriores. Quando o agente precisa lembrar “o que o usuário perguntou da última vez”, consulta essa camada. Os critérios de recuperação podem incluir similaridade semântica, período, palavras-chave e outros filtros.
Archival Memory: armazenamento de longo prazo para informações que “podem ser úteis no futuro, mas não são necessárias agora”, como conversas de seis meses atrás e registros de tarefas concluídas.
Qual é a vantagem desse design em camadas? Pense na hora de programar: a Core Memory corresponde ao que está na sua cabeça e aos poucos arquivos abertos no editor; a Recall Memory equivale ao histórico do Git e à documentação do projeto; a Archival Memory é o conjunto de outros projetos no computador e materiais disponíveis na internet. Quanto mais próxima a camada, mais rápido o acesso e menor a capacidade. Quanto mais distante, maior a capacidade e mais lento o acesso.
Gerenciamento semelhante a um sistema operacional no MemGPT
A ideia do MemGPT, hoje chamado Letta, é interessante: tratar o gerenciamento da memória do agente como o gerenciamento de memória de um sistema operacional.
Em um sistema operacional, a RAM é limitada e o disco é muito maior. Quando falta RAM, parte dos dados é transferida (swap) para o disco e carregada novamente quando necessária.
O MemGPT adota um design semelhante:
- RAM = janela de contexto (limitada, cara e rápida)
- Disk = armazenamento externo (praticamente ilimitado, barato e mais lento)
O agente conta com um mecanismo de “autogerenciamento”: mantém um “Core Memory Block” dentro da janela de contexto, assim como um sistema operacional mantém uma tabela de páginas. Quando a Core Memory fica cheia, o agente “expulsa” ativamente parte das informações para o armazenamento externo. Quando precisa de algo arquivado, ele o “recupera”.
O ponto central desse design é que o próprio agente decide o que manter, excluir ou consultar. Em vez de depender apenas de regras codificadas, ele se ajusta dinamicamente à tarefa atual.
Veja um exemplo concreto da estrutura de dados de um Core Memory Block:
{
"label": "user_preferences",
"description": "Preferências do usuário",
"value": "Prefere respostas objetivas, prefere português e costuma usar React",
"limit": 2000
}
Quando o limite se aproxima, o agente pode compactar o conteúdo (extraindo o essencial), dividi-lo em vários blocos ou expulsá-lo para a Archival Memory.
Sleep-time Compute: processamento assíncrono da memória sem bloquear a resposta
Essa é uma proposta muito inteligente da Letta.
Na abordagem tradicional, ao fim de cada conversa o sistema processa imediatamente a memória: extrai informações importantes, atualiza o índice vetorial e gera um resumo. Isso bloqueia a resposta e aumenta a espera do usuário.
No Sleep-time Compute, os dados brutos são colocados em uma fila durante a conversa e a resposta retorna de imediato. Quando o agente fica “ocioso” (sleep), processa a memória com calma.
As vantagens são claras:
- A latência percebida pelo usuário cai significativamente
- É possível executar um processamento de memória mais complexo, como construir grafos de conhecimento, sem medo de timeout
- O processamento em lote é mais eficiente e barato
O custo é o atraso na atualização da memória. Em grande parte dos cenários — atendimento, assistentes e parceiros de programação — alguns segundos ou minutos são aceitáveis. Já em situações que exigem memória em tempo real, como a identificação de emoções durante uma conversa ao vivo, essa abordagem é menos adequada.
Expulsão de memória e resumos recursivos: preservar 70% para manter a continuidade
Quando a janela de contexto fica cheia, como decidir o que excluir e o que preservar?
Uma estratégia simples é o resumo recursivo: comprimir conversas antigas em um resumo, mantendo a informação central e descartando detalhes.
Mas surge outra pergunta: qual deve ser o grau de compressão? Se for agressiva demais, informações importantes desaparecem; se for branda demais, o espaço continua insuficiente.
Os experimentos da equipe da Letta sugerem preservar 70% da informação como o melhor equilíbrio entre continuidade e taxa de compressão.
Como isso funciona na prática? Imagine uma janela de contexto cheia, com cem mensagens:
- As primeiras 50 mensagens são compactadas em um resumo de 500 tokens
- O resumo preserva os objetivos do usuário, restrições importantes, decisões relevantes e questões pendentes
- Os dados originais são movidos para a Archival Memory e continuam disponíveis para consulta
- A nova janela de contexto passa a conter o resumo, as últimas 50 mensagens e as novas mensagens
Assim, a continuidade é mantida — o agente sabe o que aconteceu antes — e há espaço para a conversa prosseguir.
Governança do conhecimento: gerenciamento do ciclo de vida da memória
Memória não é algo que basta “salvar e esquecer”. Ela tem um ciclo de vida: captura, compressão, armazenamento, recuperação, decaimento e limpeza. Cada etapa exige uma estratégia.
Estratégias de TTL para três tipos de memória: preferências, estado da tarefa e logs de operação
TTL (Time To Live, ou tempo de vida) é um parâmetro central no gerenciamento da memória. Tipos diferentes exigem TTLs completamente diferentes.
Memória de longo prazo do usuário: TTL infinito ou muito longo, de vários anos. Inclui nome, preferências, ferramentas mais usadas e escolhas de stack. Essas informações mudam pouco e devem ser preservadas por bastante tempo.
Memória da tarefa: TTL configurável, de horas a dias. Inclui o contexto do projeto atual, registros recentes de bugs e decisões em andamento. Ao concluir a tarefa, a memória pode ser limpa ou arquivada.
Memória de eventos: TTL curto, de minutos a horas. Inclui o turno atual da conversa, resultados temporários de cálculos e informações recém-recuperadas. Pode ser descartada depois do uso.
Já vi muitos projetos armazenarem toda a memória no mesmo banco vetorial, sem qualquer diferenciação de TTL. O resultado é previsível: o banco cresce continuamente, as consultas ficam mais lentas e começam a recuperar informações desatualizadas e irrelevantes.
Uma abordagem razoável é usar três formas de armazenamento com TTLs e estratégias de limpeza diferentes:
Memória de longo prazo do usuário → banco vetorial (sem TTL, compactação periódica)
Memória da tarefa → banco relacional + vetores (TTL conforme o ciclo da tarefa)
Memória de eventos → memória ou Redis (TTL curto, expiração automática)
A arte da compactação: um resumo estruturado de 200 palavras
Compactar cem rodadas de conversa em um resumo parece simples, mas envolve muitos detalhes.
Se o resumo for básico demais, perde informações. Se for complexo demais, o modelo não consegue interpretá-lo bem.
A prática da Letta propõe um modelo estruturado que produz bons resultados:
{
"goals": ["O que o usuário quer realizar"],
"constraints": ["Restrições do usuário"],
"decisions": ["Decisões tomadas pelo agente"],
"open_questions": ["Questões ainda não resolvidas"],
"evidence_index": ["Índice das fontes de informações importantes"]
}
Ao final de cada conversa, o agente gera um resumo estruturado de cerca de 200 palavras. Isso traz três benefícios:
- Estrutura clara: o modelo sabe o que cada parte representa
- Alta densidade de informação: preserva apenas o essencial e descarta o ruído
- Rastreabilidade: o evidence_index aponta para os dados originais, permitindo recuperar detalhes quando necessário
Já testei resumos não estruturados, por exemplo: “Esta foi uma conversa sobre a consulta de um pedido pelo usuário…”. O resultado foi bem pior. O modelo tinha dificuldade para localizar rapidamente as informações centrais, e o conteúdo também era menos útil na recuperação.
Estratégia de injeção: quando inserir memória proativamente e quando recuperá-la sob demanda
Há dois modos de recuperar memórias: injeção proativa e recuperação sob demanda.
Injeção proativa: antes de cada geração, as memórias relevantes são inseridas automaticamente no contexto. É adequada quando o volume de memória é pequeno e a exigência de tempo real é alta. A desvantagem é que muitas memórias ocupam espaço da janela de contexto.
Recuperação sob demanda: a consulta só acontece quando necessário. O modelo gera uma “solicitação de recuperação” e busca dados em um banco vetorial ou grafo de conhecimento. É adequada para grandes volumes de memória e cenários sensíveis à latência. A desvantagem é uma etapa adicional de consulta.
A Letta recomenda injetar a Core Memory proativamente e recuperar Recall/Archival Memory sob demanda.
Na prática, as informações da Core Memory — preferências do usuário e objetivo atual — precisam estar disponíveis em cada geração, por isso entram diretamente no contexto. As informações históricas da Recall e da Archival Memory só são consultadas quando o modelo decide que “precisa se lembrar”.
Isso exige que o modelo reconheça quando deve consultar dados. Modelos de ponta, como GPT-5 e Claude, têm bom desempenho nisso e podem ser orientados por prompts. Modelos menores precisam de regras mais explícitas.
Decaimento e limpeza: como evitar o “inchaço da memória”
O crescimento excessivo da memória é um problema real. Quanto mais tempo o usuário utiliza o sistema, mais memórias se acumulam, mais lenta fica a recuperação e mais dispersas se tornam as informações retornadas.
A solução combina decaimento e limpeza.
Decaimento: cada memória recebe uma “pontuação de importância”, que diminui com o tempo. Se uma memória não é recuperada ou utilizada por muito tempo, sua pontuação cai abaixo de um limite e aciona o arquivamento ou a exclusão.
Limpeza: uma varredura periódica remove memórias expiradas, duplicadas e de baixo valor.
Um índice de memória pode seguir esta estrutura:
{
"memory_id": "mem_001",
"content": "O usuário prefere a stack React",
"importance": 0.85,
"last_accessed": "2026-04-12",
"access_count": 23,
"decay_rate": 0.01
}
Uma tarefa de limpeza é executada diariamente de madrugada:
- importance < 0.2 → excluir
- memórias duplicadas → mesclar
- TTL expirado → arquivar
Assim, o banco de memórias permanece sob controle, a eficiência das consultas se mantém estável e o volume não cresce indefinidamente.
Escolha técnica: banco vetorial ou grafo de conhecimento
Vantagens e limitações dos bancos vetoriais: a busca semântica não reconstrói relações
Bancos de dados vetoriais são hoje a solução mais comum para armazenar memórias. Pinecone, Weaviate, Milvus, Qdrant… você provavelmente já ouviu falar deles.
Sua principal capacidade é a busca por similaridade semântica: o texto é convertido em vetores, e os vizinhos mais próximos são localizados.
“O usuário gosta de respostas objetivas” e “o usuário prefere respostas curtas” ficam próximas no espaço vetorial e podem recuperar uma à outra. Esse é o ponto forte dos bancos vetoriais.
Mas eles têm um ponto cego crítico: não conseguem encontrar “relações”.
Considere estas informações no histórico de uma conversa:
- “Estou trabalhando em um projeto de e-commerce”
- “O projeto usa Next.js”
- “O backend é Supabase”
- “Ultimamente estou cuidando do módulo de pagamentos”
Uma busca vetorial por “stack do projeto” pode recuperar apenas “usa Next.js” e deixar de fora “o backend é Supabase”, porque as duas frases não são semanticamente parecidas o bastante. Na prática, porém, elas estão relacionadas: ambas descrevem escolhas técnicas do projeto.
É aí que entra o grafo de conhecimento.
Graph RAG: permitindo que o agente compreenda conexões
Grafos de conhecimento armazenam entidades e relações.
No exemplo anterior, o grafo teria esta forma:
(Usuário) --[TRABALHA_EM]--> (Projeto de e-commerce)
(Projeto de e-commerce) --[FRONTEND]--> (Next.js)
(Projeto de e-commerce) --[BACKEND]--> (Supabase)
(Projeto de e-commerce) --[MÓDULO_ATUAL]--> (Módulo de pagamentos)
Quando o agente pergunta “qual é a stack do projeto?”, pode percorrer o grafo e encontrar todas as escolhas técnicas relacionadas.
O blog técnico da Neo4j apresentou uma implementação completa de memória para agentes baseada em três tipos de grafo:
- Grafo do usuário: perfil, preferências e histórico de comportamento
- Grafo da tarefa: tarefa atual, subtarefas e dependências
- Grafo de conhecimento: conhecimento do domínio e relações entre conceitos
O poder das consultas em grafos está na recuperação de múltiplos saltos. Vetores só encontram o que é “parecido”; grafos encontram o que está “relacionado”.
Para responder “quais problemas o usuário já enfrentou neste projeto?”, por exemplo, o grafo pode:
- Partir do nó “usuário”
- Localizar os “projetos em que participa”
- Encontrar os “problemas” relacionados ao projeto
- Encontrar as “soluções” desses problemas
Esse tipo de associação em múltiplos saltos não é viável apenas com um banco vetorial.
Reasoning Memory: a chave para rastrear decisões
Voltemos à memória de raciocínio, uma capacidade essencial ignorada pela maioria dos frameworks.
Ela não registra “o que aconteceu”, mas “por que foi feito dessa forma”.
Por exemplo:
- Usuário: “Crie uma página de login para mim”
- Agente: “É necessário login com terceiros?”
- Usuário: “Não, apenas login por e-mail”
- Decisão do agente: usar NextAuth sem integrar OAuth
A memória de raciocínio registraria:
{
"decision": "Usar NextAuth sem integrar OAuth",
"reasoning": "O usuário precisa apenas de login por e-mail, sem login com terceiros",
"constraints": ["Não introduzir OAuth"],
"alternatives_considered": ["Clerk", "Autenticação personalizada"],
"chosen_because": "NextAuth é leve e atende aos requisitos"
}
Qual é o valor dessa memória?
- Explicabilidade: se o usuário perguntar “por que não usar Clerk?”, o agente consegue responder
- Depuração: diante de um problema, é possível rastrear a cadeia de decisões
- Aprendizado contínuo: em uma situação semelhante, decisões anteriores podem servir de referência
Na implementação da Neo4j, a memória de raciocínio é modelada como um “nó de decisão” conectado aos “nós de restrição” e aos “nós de resultado”. Isso permite rastrear por completo as causas e consequências de uma decisão.
Abordagem híbrida: vetores + grafo + armazenamento estruturado
Depois de tudo isso, qual tecnologia escolher?
A resposta é: uma abordagem híbrida.
Usar apenas um banco vetorial faz com que relações se percam. Usar apenas um grafo de conhecimento custa caro para construir e oferece uma busca semântica mais fraca. Usar apenas um banco relacional limita a flexibilidade e a capacidade de recuperação.
A melhor combinação na prática é:
- Banco de dados vetorial: armazena o texto das conversas para busca semântica
- Grafo de conhecimento: armazena relações entre entidades para raciocínio de múltiplos saltos
- Banco de dados relacional: armazena dados estruturados, como informações do usuário e estado da tarefa
Os três trabalham desta forma:
- A pergunta do usuário passa primeiro por uma busca vetorial, que recupera trechos semanticamente relacionados
- As entidades dos trechos são extraídas e usadas para consultar informações associadas no grafo
- Os dados estruturados são consultados diretamente no banco relacional
Assim, a flexibilidade da busca semântica se soma à capacidade de associação do grafo e à eficiência das consultas estruturadas.
Comparação prática de seis frameworks
Depois da teoria, vejamos como escolher um framework real.
Mem0: integração rápida e memória em vários níveis
O Mem0 é um dos frameworks de memória para agentes mais populares atualmente. Sua proposta é “memória como serviço”: você não precisa gerenciar armazenamento e recuperação por conta própria, basta chamar a API.
Principais características:
- Serviço gerenciado, sem necessidade de montar a própria infraestrutura
- Integração com 21 frameworks, como LangChain, LangGraph, LlamaIndex e CrewAI
- Extração, atualização e recuperação automáticas de memórias
- Suporte a vários tenants e várias sessões
Dados do benchmark LOCOMO:
- Precisão: 66,9%
- Latência: 0,71 s
- Consumo de tokens: ~2K
Cenários indicados:
- Desenvolvimento rápido de protótipos
- Agentes de voz, sensíveis à latência
- Projetos que precisam integrar vários frameworks
Limitações:
- É um serviço gerenciado, portanto os dados não ficam sob seu controle direto
- Recursos avançados, como memória de raciocínio, são limitados
- A personalização é menor do que em uma solução própria
Exemplo de código:
from mem0 import Memory
m = Memory()
# Adicionar memória
m.add("O usuário prefere respostas objetivas", user_id="user_001")
# Recuperar memória
results = m.search("Preferências do usuário", user_id="user_001")
# Retorno: ["O usuário prefere respostas objetivas"]
É surpreendentemente simples. Essa é a maior vantagem do Mem0: a barreira de entrada é baixa.
Letta: a principal escolha para agentes de longa duração
A Letta, antes chamada MemGPT, segue outro caminho: trata a memória como uma hierarquia semelhante à de um sistema operacional e enfatiza a capacidade de “autogerenciamento” do agente.
Principais características:
- Memória hierárquica inspirada em sistemas operacionais: RAM (contexto) + Disk (armazenamento externo)
- O agente decide de forma autônoma como ler, gravar, expulsar e recuperar memórias
- Processamento assíncrono com Sleep-time Compute
- Suporte completo à memória de raciocínio
Cenários indicados:
- Agentes de longa duração, como assistentes de programação e assistentes pessoais
- Projetos que precisam rastrear decisões por completo
- Cenários que exigem grande autonomia
Limitações:
- Curva de aprendizado mais acentuada
- Exige implantação e gerenciamento próprios
- Depende da capacidade do modelo; modelos menores podem não administrar bem a própria memória
Diagrama da arquitetura:
┌─────────────────────────────────────┐
│ Agente (LLM) │
│ ┌───────────────────────────────┐ │
│ │ Core Memory (RAM) │ │
│ │ - Self Block: Eu sou... │ │
│ │ - User Block: Usuário gosta...│ │
│ │ - Task Block: Tarefa atual... │ │
│ └───────────────────────────────┘ │
└─────────────────────────────────────┘
↓ gerenciamento ativo
┌─────────────────────────────────────┐
│ Armazenamento externo (Disk) │
│ - Recall Memory (banco vetorial) │
│ - Archival Memory (arquivo) │
└─────────────────────────────────────┘
Se você está criando um agente que deve acompanhar o usuário por muito tempo, a Letta é hoje a opção mais madura.
Zep: especialista em memória de conversas
O Zep é focado no gerenciamento de memória em cenários conversacionais. Sua principal capacidade é o “resumo progressivo”: conforme a conversa avança, o histórico é compactado continuamente para manter a janela de contexto utilizável.
Principais características:
- Resumo progressivo: quanto mais longa a conversa, mais refinado o resumo
- Recuperação híbrida por semântica e tempo
- Extração de fatos: identifica automaticamente entidades e relações nas conversas
- Suporte multimodal, incluindo texto e imagens
Cenários indicados:
- Chatbots de atendimento
- Aplicações de IA conversacional
- Cenários que exigem históricos extensos de conversa
Limitações:
- É mais voltado a conversas e tem suporte menor para agentes de uso geral
- A versão open source oferece recursos limitados, e a versão empresarial tem preço elevado
Um destaque do Zep é a detecção automática de “fatos” nas conversas, por exemplo, “o usuário se chama Zhang San” ou “o usuário mora em Pequim”, que são armazenados como dados estruturados. Na conversa seguinte, essas informações ficam disponíveis sem a necessidade de vasculhar todo o histórico.
Cognee: solução baseada em grafos de conhecimento
O Cognee é um framework especializado em memória por grafos de conhecimento. Quando o projeto exige forte capacidade de raciocínio sobre relações, ele é a principal escolha.
Principais características:
- Construção automática de grafos de conhecimento
- Suporte a vários bancos de grafos, como Neo4j e NetworkX
- Pipeline de extração de entidades e relações
- Suporte a atualizações incrementais
Comparação do custo de extração de entidades:
| Método | Latência | Qualidade | Custo |
|---|---|---|---|
| spaCy | ~5 ms | Média | Baixo |
| GLiNER2 | ~50 ms | Alta | Médio |
| LLM | ~500 ms | Máxima | Alto |
Cenários indicados:
- Agentes intensivos em conhecimento, como assistentes de pesquisa e sistemas de perguntas e respostas sobre bases de conhecimento
- Cenários que exigem raciocínio de múltiplos saltos
- Aplicações que dependem de redes de relações
Limitações:
- Alto custo de construção, especialmente com LLMs para extração de entidades
- Exige infraestrutura de banco de dados em grafo
- Pode ser uma solução complexa demais para cenários simples
Matriz de decisão
Depois de tantas opções, como escolher? Organizei uma matriz de decisão:
| Cenário | Framework recomendado | Motivo |
|---|---|---|
| Protótipo rápido / MVP | Mem0 | A curva de entrada mais rápida e nenhuma infraestrutura própria |
| Agente de voz | Mem0 | Baixa latência e serviço gerenciado estável |
| Agente de companhia de longo prazo | Letta | Gerenciamento semelhante a um sistema operacional e memória de raciocínio completa |
| Atendimento empresarial | Zep | Especializado em memória de conversas e extração automática de fatos |
| Agente intensivo em conhecimento | Cognee | Grafos robustos e forte raciocínio sobre relações |
| Infraestrutura própria | Letta + banco vetorial à escolha | Maior flexibilidade e custos controláveis |
Minha recomendação geral é:
- Validar o protótipo primeiro com Mem0
- Migrar para Letta quando houver necessidade de memória de longo prazo
- Acrescentar Cognee ou Neo4j quando o raciocínio sobre relações ficar complexo
Casos práticos e melhores práticas
Solução de memória para agentes de voz
Agentes de voz são extremamente sensíveis à latência. Se nada acontece nos primeiros 200 ms depois que o usuário termina de falar, a interação já parece travada.
Isso significa que a recuperação de memória precisa ocorrer em menos de 100 ms, deixando os outros 100 ms para síntese e transmissão da voz.
A abordagem com Mem0:
- Pré-carregar a Core Memory: preferências e configurações frequentes do usuário são carregadas na memória uma única vez no início da sessão
- Recuperar a Recall Memory sob demanda: consultar apenas quando houver necessidade clara, usando um índice vetorial eficiente
- Atualizar de forma assíncrona: atualizar a memória após a conversa sem bloquear a resposta
Nos testes da integração do agente de voz da ElevenLabs com Mem0, a latência de ponta a ponta ficou abaixo de 300 ms, proporcionando uma boa percepção de fluidez ao usuário.
Agente de atendimento empresarial
As necessidades centrais do atendimento empresarial são lembrar do usuário no longo prazo e conseguir explicar o processo decisório.
Uma arquitetura típica:
Mensagem do usuário
↓
Reconhecimento de intenção
↓
┌─────────────────┬─────────────────┐
│ Core Memory │ Recall Memory │
│ (perfil) │ (histórico) │
└─────────────────┴─────────────────┘
↓
Consulta à base de conhecimento (RAG)
↓
Geração da resposta
↓
Registro da memória de raciocínio (por que a resposta foi dada)
O Zep funciona bem nesse cenário: a extração automática de fatos registra as informações básicas do usuário, enquanto o resumo progressivo lida com conversas longas.
Assistente pessoal: aprendizado entre sessões
A principal capacidade de um assistente pessoal é aprender as preferências do usuário e manter a continuidade entre sessões.
Elementos fundamentais do design:
- Memória do perfil do usuário: armazenamento de longo prazo para preferências, hábitos e ferramentas frequentes
- Memória do contexto do projeto: isolamento por projeto e carregamento do contexto correspondente ao trocar de projeto
- Memória de raciocínio: registro de por que uma solução foi recomendada e por que uma alternativa foi descartada
O design da Letta se encaixa muito bem nesse cenário: a Core Memory guarda o perfil do usuário, a Recall Memory armazena o histórico do projeto e a Archival Memory preserva projetos arquivados.
Armadilhas a evitar
Estes são alguns erros que já encontrei na prática:
Armadilha 1: colocar todas as memórias em um banco vetorial
Problema: bancos vetoriais são bons apenas em busca semântica, não em consultas exatas nem em raciocínio sobre relações.
Solução: usar armazenamento híbrido. Dados estruturados, como ID do usuário e estado do projeto, ficam em um banco relacional; memórias semânticas, em um banco vetorial; e memórias relacionais, em um grafo.
Armadilha 2: não definir uma estratégia de TTL
Problema: o volume de memórias cresce, as consultas ficam mais lentas e informações expiradas começam a ser recuperadas.
Solução: definir TTLs por tipo de memória. Memórias de eventos expiram em poucas horas, memórias de tarefas são limpas ao fim da tarefa e o perfil do usuário é mantido por longo prazo.
Armadilha 3: ignorar a memória de raciocínio
Problema: o agente toma uma decisão, mas não consegue explicar o motivo. A depuração fica difícil e o usuário questiona o resultado.
Solução: registrar explicitamente a cadeia de decisão. Para cada decisão importante, guardar o que foi escolhido, por quê e quais alternativas foram descartadas.
Armadilha 4: depender demais do LLM para gerenciar a memória
Problema: modelos pequenos apresentam resultados ruins quando precisam decidir sozinhos o que lembrar e o que excluir.
Solução: apoiar modelos pequenos com regras, como padrões claros de extração de entidades, modelos fixos de memória e pesos de importância predefinidos.
Conclusão
Depois de tudo isso, as ideias centrais são estas:
Primeiro, a memória é o “segundo cérebro” do agente. Não é opcional, mas parte da arquitetura central. Um agente sem memória é como um computador sem disco: ao desligar, esquece tudo e recomeça do zero. Para evoluir de “ferramenta” para “parceiro”, não há como evitar um sistema de memória.
Segundo, os três tipos de memória são indispensáveis. A memória de curto prazo mantém o contexto, a de longo prazo garante persistência e a de raciocínio sustenta a explicabilidade. A maioria dos frameworks implementa apenas as duas primeiras; a memória de raciocínio continua seriamente subestimada.
Terceiro, a escolha do framework depende do cenário; não há solução universal. Para agentes de voz, use Mem0 pela baixa latência. Para tarefas de longo prazo, Letta pelo gerenciamento semelhante a um sistema operacional. Para conhecimento intensivo, Cognee pela força dos grafos. Para atendimento, Zep pela especialização em conversas.
Quarto, bancos vetoriais não resolvem tudo. A busca semântica encontra o que é “parecido”, grafos de conhecimento encontram “relações” e o armazenamento estruturado encontra resultados “exatos”. A combinação dos três é a solução correta.
Quinto, a memória exige governança; não basta armazenar dados. Políticas de TTL, mecanismos de decaimento e limpeza periódica são indispensáveis. Sem isso, o banco de memórias se transforma em um depósito de lixo.
Próximos passos sugeridos:
- Comece pelos dados do benchmark LOCOMO para entender as métricas de desempenho dos sistemas de memória
- Monte rapidamente um protótipo com Mem0 ou neo4j-agent-memory e valide o fluxo antes de otimizar
- Acompanhe a Reasoning Memory: ela será um dos principais diferenciais na próxima fase da evolução dos agentes
O futuro dos agentes não depende apenas de “modelos mais inteligentes”, mas também de “memórias mais persistentes”. Quando um agente consegue lembrar o que você disse há um mês, compreender por que determinada decisão foi tomada e retomar o contexto na conversa seguinte, aí sim temos algo verdadeiramente “inteligente”.
Leituras relacionadas
- Arquitetura de agentes de IA na prática
- Gerenciamento de estado com LangGraph: checkpoints e recuperação de falhas
- Guia para escolher um banco vetorial para RAG
Referências
- State of AI Agent Memory 2026 - Blog oficial do Mem0 e fonte dos dados do benchmark LOCOMO
- Agent Memory: How to Build Agents that Learn and Remember - Blog oficial da Letta sobre gerenciamento de memória semelhante a um sistema operacional
- Meet Lenny’s Memory: Building Context Graphs for AI Agents - Blog oficial da Neo4j sobre implementação de memória com grafos de conhecimento
- The 6 Best AI Agent Memory Frameworks - Comparação de frameworks
- Por que os agentes de IA falham na prática? Três tipos de memória de longo prazo e um pipeline em três etapas são essenciais - Análise aprofundada em chinês
FAQ
Por que um agente de IA precisa de um sistema de memória independente? A janela de contexto não é suficiente?
Qual é a diferença entre memória de curto prazo, memória de longo prazo e memória de raciocínio?
• Memória de curto prazo: é a janela de contexto, tem capacidade limitada e desaparece ao fim da sessão, como a RAM
• Memória de longo prazo: é o armazenamento externo (banco vetorial/grafo), tem grande capacidade e é persistente, como um disco
• Memória de raciocínio: registra o processo decisório (por que A foi escolhido em vez de B) e serve para explicabilidade e depuração
A maioria dos frameworks implementa apenas os dois primeiros tipos. A memória de raciocínio é uma capacidade seriamente subestimada.
Como escolher entre Mem0, Letta, Zep e Cognee?
• Mem0: protótipos rápidos e agentes de voz (baixa latência de 0,71 s)
• Letta: agentes de companhia de longo prazo (gerenciamento semelhante a um sistema operacional e memória de raciocínio completa)
• Zep: atendimento empresarial (resumos progressivos e extração de fatos)
• Cognee: agentes intensivos em conhecimento (grafos robustos e raciocínio de múltiplos saltos)
A recomendação é validar primeiro o protótipo com Mem0 e depois migrar para Letta ou Cognee conforme a necessidade.
Como bancos de dados vetoriais e grafos de conhecimento devem trabalhar em conjunto?
Um sistema de memória pode sofrer com crescimento excessivo? Como governá-lo?
• Política de TTL: definir a expiração por tipo (horas para memórias de eventos, duração do ciclo para memórias de tarefas e longo prazo para o perfil do usuário)
• Mecanismo de decaimento: reduzir a pontuação de importância com o tempo e arquivar memórias abaixo do limite
• Limpeza periódica: excluir memórias expiradas, duplicadas ou de baixo valor
A Letta recomenda preservar 70% da informação, o melhor equilíbrio entre continuidade e taxa de compressão.
O que é Reasoning Memory e por que a maioria dos frameworks não a implementa?
27 min de leitura · Publicado em: 13 abr 2026 · Atualizado em: 4 set 2026
Guia de engenharia de AI Agents
Se você chegou pela busca, o caminho mais rápido é ir para o post anterior ou próximo desta série.
Anterior
Arquitetura de agentes de IA: guia prático de design e implementação
Compare ReAct, Plan-and-Execute e Multi-Agent, conheça cinco modelos de orquestração e implemente um agente com o Claude Agent SDK.
Parte 2 de 13
Próximo
Chamadas de ferramentas em agentes: faça a IA acessar APIs e serviços externos
De Function Calling a MCP, entenda como funcionam as chamadas de ferramentas no Claude e na OpenAI, com exemplos completos de código e boas práticas para criar agentes de IA capazes de acessar APIs
Parte 4 de 13



Comentários
Entre com GitHub para comentar