Generative AI

15 abr, 2026

A Arte de Lembrar: Adicionando memória á uma conversa com Spring AI e ChatMemory

Publicidade

Quando estamos implementando serviços baseados em AI Generativa um dos pontos que devemos ter em mente se trata de como manter a memória da conversa. De forma natural ao interagir com uma AI Generativa ela não armazena nenhum prompt ou resposta que tenha acontecido ao longo do chat.

Abaixo demonstro isso na prática utilizando o agente construído aqui:

Conteúdo do artigo

Imagem 01 – Interagindo com o chat sem memória

Nota-se que pelo fluxo de conversação ao perguntar sobre a característica do agente ele responde de forma coerente, mas quando perguntado:

Qual foi a pergunta feita anteriormente?

Neste momento o agente não sabe como lidar com essa situação, e acaba respondendo:

Desculpe, mas não consigo lembrar ou acessar perguntas anteriores. Por favor, repita sua solicitação ou pergunte novamente.

E isso ocorre porque por default as LLMs trabalham de forma de stateless, ou seja cada prompt ou pergunta é processada como se fosse sempre a primeira vez, e isso torna a experiência de navegação ruim, sem contexto e sem fluidez. Este conceito de memória é amplamente abordado em discussões e artigos sobre IA Generativa.

Neste artigo será apresentado como o Spring AI permite que seja feita a implementação de memória dentro de um ciclo de interação com um chat. Partindo do exemplo apresentado ele será melhorado gradativamente com as implementações de memória.

Chat Memory

Dentro do ecossistema do Spring AI é facilmente possível realizar a simulação de memória em chats de conversação. Através das abstrações oferecidas pelo Spring permite várias implementações de memória, neste artigo focaremos em duas abordagens, citadas abaixo:

MessageWindowChatMemory: Com essa implementação é possível definir uma quantidade de mensagens que são armazenadas em memória, o valor padrão é de 20 mensagens, sempre removendo as mais antigas. No exemplo do cloud-agentic-provider mencionado anteriormente após a implementação da memória, o chat consegue responder o que lhe foi pedido anteriormente conforme a imagem abaixo:

Conteúdo do artigo

Imagem 02 – Chat após implementação de um MessageWindowChatMemory

Agora quando ele recebe a instrução:

Qual foi a pergunta feita anteriormente?

O chat por sua vez passa a responder:

A pergunta anterior foi: “o que você sabe fazer?”. Respondi que consigo provisionar infraestrutura AWS via Terraform e posso gerar código HCL para qualquer serviço AWS suportado pelo provedor HashiCorp AWS.

Na implementação do exemplo foi utilizado o código apresentado nas imagens abaixo:

Conteúdo do artigo

Imagem 03 – Builder MessageWindowChatMemory e adicionando defaultAdvisors ao chat

JdbcChatMemoryRepository: É possível também implementar repositórios para persistência de dados tanto em memória, como também para banco de dados relacionais.

Essa implementação permite que cada interação realizada com o chat seja salvo em banco de dados de sua preferência, no caso os seguintes bancos são suportados PostgreSQL, MySQL / MariaDB, SQL Server, HSQLDB, Oracle Database. No exemplo desse agente foi realizada uma implementação utilizando  PostgresSQL. Abaixo estão os principais pontos de implementação:

Iniciando pelas dependências que foram adicionadas ao pom.xml:
Conteúdo do artigo

Imagem 04 – Adicionando dependências para utilizar JdbcChatMemoryRepository

Abaixo segue a configuração necessária realizada no application.properties:

Conteúdo do artigo

Imagem 05 – Properties configurando datasource para PostgresSQL

Abaixo está o exemplo de uso da implementação do JdbcChatMemoryRepository sendo integrado ao chat:

Conteúdo do artigo

Imagem 06 – Builder MessageWindowChatMemory e adicionando defaultAdvisors ao chat

A implementação é muito parecida com a primeira, no entanto com alguns detalhes vale notar que MessageWindowChatMemory chama uma propriedade “.chatMemoryRepository()”, que neste caso recebe o ChatMemoryRepository que está sendo injetado via construtor. O ponto mais interessante nisso tudo é que não foi preciso informar nome de tabela ou qualquer schema sql, toda esse controle está abstraído no comportamento de JdbcChatMemoryRepository. Ele será responsável por recuperar a quantidade de mensagens definidas por MessageWindowChatMemory e preparar o prompt a ser enviado ao LLM, e ao obter o retorno do LLM ele então insere esse novo registro na base.  Com essa implementação realizada ao interagir com o agente algumas vezes, é possível notar que na base de dados ele persiste todas as mensagens que foram trocadas,  conforme mostrado na imagem abaixo:

Conteúdo do artigo
Imagem 07 – Tabela spring_ai_chat_memory populada com dados da conversa

Para consultar o resultado é possível utilizar o seguinte select:

SELECT conversation_id, type, left(content, 80), timestamp FROM spring_ai_chat_memory ORDER BY timestamp

CONCLUSÃO

Todo sistema que for baseado em AI deverá considerar nas suas implementações algum mecanismo de memória, isso será útil para manter o contexto da conversa, isso melhora na interação com a ferramenta. No ecossistema do Spring AI essas foram apenas duas implementações demonstradas, mas na documentação oficial é possível obter outros exemplos, e no link do github é possível visualizar a implementação completa e como foi feito para provisionar a base de dados PostgresSQL.