Memória e Contexto
Janela de Contexto
Resumo automático, compressão de histórico e limpeza para reduzir tokens sem perder intenção.
Nesta aula você vai
- Detectar quando histórico aproxima limite de tokens
- Resumir conversa antiga com segunda chamada LLM
- Aplicar estratégia sliding window + summary
Janela de Contexto
Objetivos
- Reduzir custos quando conversa cresce
- Manter coerência sem enviar 200 mensagens brutas
Estratégia 1: Sliding window
Mantenha só últimas K mensagens (ex: 10 turnos = 20 entries).
Prós: simples, previsível. Contras: esquece início da conversa.
Estratégia 2: Resumo periódico
Quando histórico > 15 mensagens, comprima:
async function summarizeHistory(oldMessages) {
const transcript = oldMessages.map((m) => `${m.role}: ${m.content}`).join('\n');
return chat(
[
{ role: 'system', content: 'Resuma a conversa em 5 bullet points objetivos. Português.' },
{ role: 'user', content: transcript },
],
{ temperature: 0, max_tokens: 300 },
);
}
Nova estrutura enviada ao modelo:
system: {SYSTEM_PROMPT}
system: Resumo da conversa anterior: {summary}
user/assistant: {últimas 6 mensagens brutas}
Custo: 1 chamada extra ocasional — ainda cheaper que 100 mensagens completas.
Estratégia 3: Limpeza por tópico
Detecte mudança de assunto (classificador simples ou palavras-chave) → reset histórico, mantenha só summary:
Usuário mudou de "pedido" para "vaga de emprego" → descarte histórico de pedidos
Estimar tokens antes de enviar
function estimateTokens(text) {
return Math.ceil(text.length / 4); // aproximação
}
const total = messages.reduce((s, m) => s + estimateTokens(m.content), 0);
if (total > 6000) await compress(sessionId);
O que NUNCA resumir sem cuidado
- Números de pedido confirmados
- Dados que o usuário corrigiu ("não, o pedido é 5521")
- Instruções de formato acordadas
Inclua no prompt de resumo: "Preserve IDs, valores e correções do usuário."
Comparação de custo
| Abordagem | Tokens/turno (conv. longa) |
|---|---|
| Histórico completo (50 msgs) | ~8.000+ |
| Window 10 msgs | ~1.500 |
| Summary + window 6 | ~1.800 (+ amortizado) |
Resumo
- Conversa longa estoura contexto e orçamento
- Sliding window = MVP; summary = produção madura
- Resumo é chamada LLM — trate como pipeline, não hack
- Preserve fatos críticos no prompt de compressão