Memória e Contexto
Histórico de Conversa
Persistir mensagens em banco, Redis ou sessão e reconstruir messages[] a cada chamada.
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
- Implemente
insertMessage+getLastMessages - Converse: "Me chamo Ana" → "Qual meu nome?" — deve funcionar
- 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