DEV Community

Cover image for 🧠 Agentes de IA também precisam esquecer: Entendendo TTL e Expiração de Memória
Felipe Cezar
Felipe Cezar

Posted on

🧠 Agentes de IA também precisam esquecer: Entendendo TTL e Expiração de Memória

Imagine a seguinte cena: você acaba de criar o seu primeiro Agente de IA. Ele é brilhante, rápido e responde aos seus usuários com uma precisão assustadora. No primeiro dia, é só alegria. Na primeira semana, ele continua ótimo.

Mas no trigésimo dia, algo estranho acontece. O seu agente começa a demorar 15 segundos para responder a um simples "Olá". Pior ainda, ao checar a sua fatura de consumo de API (seja da OpenAI, Google ou Anthropic), você toma um susto: os custos explodiram. Além disso, o agente começa a se confundir, misturando o contexto de uma conversa de três semanas atrás com a dúvida atual do usuário.

O que deu errado? Você construiu um agente com memória fotográfica eterna, mas esqueceu de ensiná-lo a esquecer.

É aqui que entra um dos conceitos mais importantes (e subestimados) na arquitetura de Agentes de IA: o TTL (Time-To-Live) e as estratégias de expiração de contexto.


🕰️ O que é TTL, afinal? (A Base)

Se você vem do mundo de redes ou de banco de dados, provavelmente já conhece essa sigla. TTL (Time-To-Live), ou Tempo de Vida, é um mecanismo que define por quanto tempo um pedaço de dado deve existir em um sistema antes de ser descartado.

  • Nas Redes: É o que impede que um pacote de dados fique vagando pela internet para sempre em um loop infinito (quando o TTL zera, o pacote morre).
  • Nos Bancos de Dados (como Redis): É o que faz um dado em cache desaparecer após algumas horas, garantindo que você não acesse informações desatualizadas.

No contexto de Agentes de IA, o TTL e a "expiração" referem-se a como gerenciamos a janela de contexto (a memória de curto prazo) do modelo e os caches de respostas. ---

💸 Por que a "Amnésia Controlada" é uma Feature, e não um Bug?

Os Modelos de Linguagem (LLMs) não têm estado (stateless). Para que eles "lembrem" de uma conversa, você precisa re-enviar todo o histórico de mensagens a cada nova interação. Se você não expirar essas informações, enfrentará três grandes vilões:

  1. O Limite Físico (Context Window): Todo LLM tem um limite máximo de tokens que consegue processar por vez (ex: 8k, 128k, 1M). Se a conversa passar disso, a API simplesmente rejeita a requisição.
  2. A Falência Financeira (Custos): As APIs cobram por tokens de entrada. Se você envia um histórico de 10.000 tokens a cada nova mensagem "ok", você está queimando dinheiro à toa.
  3. A Perda de Foco (Sinal de Ruído): Quanto mais longa a janela de contexto, mais difícil fica para a IA prestar atenção na instrução mais recente (o famoso problema do "Lost in the Middle", onde a IA esquece o que estava no meio do texto gigante).

🛠️ Como o TTL funciona na prática com IA? (Estratégias)

Implementar expiração em agentes não é apenas colocar um "timer". Existem diferentes formas de fazer seu agente esquecer de maneira inteligente. Vamos explorar as principais:

1. TTL Baseado em Tempo (O Clássico)

Aqui, o TTL funciona exatamente como no Redis. Se o usuário ficou inativo por "X" minutos, a sessão é encerrada e a memória de curto prazo é apagada.

  • Caso de uso ideal: Chatbots de atendimento ao cliente (SAC). Se o cliente abriu um chamado às 10h da manhã e mandou outra mensagem às 20h, provavelmente é um assunto totalmente novo. Manter o contexto anterior só vai atrapalhar e custar caro.

2. Expiração por Janela Deslizante (Sliding Window)

Em vez de tempo cronológico, o limite é baseado na quantidade de interações. Você configura o agente para manter apenas as últimas N mensagens no array de contexto.

  • Como funciona: Se o limite é 10, assim que a 11ª mensagem entra, a mensagem número 1 (a mais antiga) é deletada do array enviado ao LLM.
  • Caso de uso ideal: Assistentes pessoais e agentes de linha de comando (CLI) que precisam de contexto imediato, mas não do histórico completo da vida do desenvolvedor.

3. Expiração Baseada em Tokens (Token Limits)

Mais precisa que a janela deslizante. Você calcula ativamente os tokens (usando bibliotecas como o tiktoken) e expira as mensagens mais antigas apenas quando o limite financeiro ou técnico (ex: máximo de 4.000 tokens de memória) é atingido.

4. Cache TTL (Prevenindo chamadas repetidas)

Agentes muitas vezes usam ferramentas (Tools/Function Calling) para buscar dados, como consultar a previsão do tempo ou o preço do dólar.
Se o agente consultar o dólar agora, e outro usuário perguntar a mesma coisa 1 minuto depois, não há por que gastar tokens e latência chamando a API de novo. Usa-se um Cache de Resposta com TTL de alguns minutos. Bateu no cache? O agente responde instantaneamente. O TTL expirou? Ele chama a ferramenta novamente.


👨‍💻 Storytelling em Código: Construindo a Memória

Como isso se parece no código? Abaixo, um exemplo conceitual simples em Python de um Agente gerenciando sua própria memória com Sliding Window e verificação de TTL por tempo inativo:

import time

class AgentMemory:
    def __init__(self, max_messages=10, ttl_seconds=3600):
        self.messages = []
        self.max_messages = max_messages
        self.ttl_seconds = ttl_seconds
        self.last_interaction = time.time()

    def add_message(self, role, content):
        current_time = time.time()

        # 1. TTL por Tempo: Se passou muito tempo desde a última mensagem, limpa a memória!
        if (current_time - self.last_interaction) > self.ttl_seconds:
            print("⏳ TTL expirado. O agente esqueceu a conversa anterior.")
            self.messages = []

        # Adiciona a nova mensagem
        self.messages.append({"role": role, "content": content})
        self.last_interaction = current_time

        # 2. Expiração por Quantidade (Sliding Window): Remove os itens mais velhos
        if len(self.messages) > self.max_messages:
            # Mantém apenas as últimas 'max_messages' mensagens
            self.messages = self.messages[-self.max_messages:]
            print("✂️ Limite de contexto atingido. Mensagem mais antiga descartada.")

    def get_context(self):
        return self.messages

# Testando nosso agente
memory = AgentMemory(max_messages=3, ttl_seconds=10)

memory.add_message("user", "Qual a capital do Brasil?")
memory.add_message("assistant", "A capital é Brasília.")
memory.add_message("user", "Quantos habitantes tem lá?")
memory.add_message("assistant", "Tem cerca de 3 milhões.") # Aqui atingiu o limite de 3+1 = 4. O primeiro "user" será cortado!
Enter fullscreen mode Exit fullscreen mode

🧠 E se eu precisar lembrar para sempre? (Memória de Longo Prazo)

"Mas eu quero que meu agente lembre que eu sou alérgico a camarão para sempre!"

Se você expirar as mensagens (curto prazo), como ele vai lembrar disso? A solução não é desligar o TTL, mas sim mudar o tipo de memória.

Quando uma informação é muito importante para ser esquecida, nós a transferimos da Memória de Curto Prazo (Janela de Contexto) para a Memória de Longo Prazo (Banco de Dados Vetorial / RAG).
Assim, o agente "esquece" a conversa do dia a dia, mas quando você pedir uma receita, ele busca ativamente no banco de dados: "Opa, achei aqui no banco que esse usuário é alérgico a camarão", e injeta essa informação na janela de contexto apenas naquele momento exato.

Conclusão

Construir Agentes de IA escaláveis vai muito além de escolher o melhor prompt ou o LLM mais poderoso. Trata-se de engenharia de software tradicional aplicada a novas interfaces.

Esquecer de forma estratégica é o que mantém o seu agente rápido, barato e preciso. Na próxima vez que estiver codificando um loop de interação, pergunte-se: Qual é o tempo de vida ideal para esta informação?

E você, já teve algum susto com a fatura da OpenAI por causa de vazamento de contexto? Como você está gerenciando a memória dos seus agentes hoje? Conta aí nos comentários! 👇

Top comments (0)