Memória e Contexto

Histórico de Conversa

Persistir mensagens em banco, Redis ou sessão e reconstruir messages[] a cada chamada.

Intermediário 25 min 30 pontos Leitura 0%

Nesta aula você vai

  • Salvar mensagens user/assistant após cada turno
  • Carregar últimas N mensagens ao montar prompt
  • Manter sessionId estável por conversa

Histórico de Conversa

Objetivos

  • Criar contexto persistente entre mensagens
  • Exercício: salvar e recuperar últimas mensagens

Schema SQL mínimo

CREATE TABLE chat_messages (
  id         INTEGER PRIMARY KEY AUTOINCREMENT,
  session_id TEXT NOT NULL,
  role       TEXT NOT NULL CHECK (role IN ('user', 'assistant')),
  content    TEXT NOT NULL,
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX idx_session ON chat_messages(session_id, created_at);

Fluxo no endpoint

app.post('/api/chat', async (req, res) => {
  const sessionId = req.cookies.chat_session;
  const { message } = req.body;

  await db.insertMessage(sessionId, 'user', message);

  const history = await db.getLastMessages(sessionId, 20); // últimas 20

  const messages = [
    { role: 'system', content: SYSTEM_PROMPT },
    ...history.map((m) => ({ role: m.role, content: m.content })),
  ];

  const reply = await chat(messages);

  await db.insertMessage(sessionId, 'assistant', reply);
  res.json({ reply });
});

Redis como alternativa

Lista por sessão — rápido, volátil se não persistir:

await redis.rpush(`chat:${sessionId}`, JSON.stringify({ role: 'user', content: message }));
await redis.ltrim(`chat:${sessionId}`, -40, -1); // mantém últimas 20 pares ≈ 40 entries

Bom para MVP; produção costuma usar Redis + PostgreSQL (Redis hot, PG archive).

PHP Session (protótipo)

session_start();
$_SESSION['chat'][] = ['role' => 'user', 'content' => $message];
// limite
$_SESSION['chat'] = array_slice($_SESSION['chat'], -20);

Limitação: não escala horizontalmente sem sticky session.

Exercício

  1. Implemente insertMessage + getLastMessages
  2. Converse: "Me chamo Ana" → "Qual meu nome?" — deve funcionar
  3. Abra nova sessão (novo cookie) — deve esquecer

Privacidade

  • TTL: apagar sessões > 30 dias
  • LGPD: histórico é dado pessoal se identificar usuário — documente retenção
  • Não logue conteúdo completo em produção sem necessidade

Resumo

  • Salve user + assistant após cada turno
  • Reconstrua messages[] do storage, não do cliente
  • Limite N mensagens desde o início — custo e context window