Conteúdo da trilha
9 minNarração em inglês, legenda em portuguêsPodcast (RSS)
Capítulos
  1. 0:00Abertura
  2. 0:59A ideia
  3. 1:13Antes e depois
  4. 1:50Um caso real
  5. 2:38Por que funciona
  6. 3:27Um desafio
  7. 3:58Passo a passo seguro
  8. 5:34Riscos
  9. 7:05Um fato que muda
  10. 7:41Quando não usar
  11. 8:09Fechamento
Transcrição

Abertura

O tutor de matemática de uma escola roda no WhatsApp. Na aula um, ele combinou com uma aluna: só dicas, nunca a resposta pronta. Na aula seis, ela pediu uma lista de revisão com gabarito, e o tutor deixou, como exceção, para aquela lista.

Na aula doze, ela pede ajuda com um problema novo. O histórico tem as duas regras, várias páginas de contas erradas, três mudanças de horário e um recado da mãe. E o modelo devolve a resposta pronta. Ou, no dia seguinte, recusa até a lista de revisão, porque a regra é só dicas.

Com números ilustrativos, na aula doze, cada chamada já manda uns nove mil e quinhentos tokens de histórico. Na aula quarenta, passa de dezessete mil. E a regra da aula um disputa com tudo o que veio depois. Você conheceu esse smell na aula passada. Agora vai corrigir, com segurança.

A ideia

Troque os turnos antigos por um resumo. Guarde os fatos que precisam durar num estado explícito, fora do histórico bruto. E mande para o modelo o estado, o resumo e só os turnos recentes.

Antes e depois

Antes, o histórico inteiro vai em toda chamada. Mensagem, tudo, modelo, resposta.

Depois, a mensagem nova chega, e só os últimos turnos ficam na forma bruta.

Os fatos duráveis, como preferências, decisões e ids, mais um resumo do resto, ficam num bloco separado.

O modelo recebe esse bloco, mais os turnos recentes. E a resposta entra nos turnos recentes.

Quando os turnos recentes passam de um limite, uma etapa de compactação atualiza o resumo e os fatos, e descarta os turnos antigos.

Um caso real

Aqui está o que o modelo vê depois da compactação da aula doze. O bloco de estado. O nome da aluna. O nível dela por assunto, intermediário em equações, iniciante em geometria. Dicas passo a passo como formato.

E a regra, numa linha só. Só dicas. Com a exceção ao lado, e o escopo dela. A lista de revisão da aula seis.

Depois, um resumo, em poucas linhas. Aulas um a onze: equações do segundo grau, travada em completar o quadrado. Aula seis, a exceção da lista de revisão. Aula onze, começou geometria. E os oito turnos mais recentes ficam inteiros. O recado da mãe e as contas erradas da aula três não entram.

Por que funciona

O histórico bruto mistura três coisas. Fatos que ainda valem, contexto que explica o momento e ruído que não importa mais. O modelo recebe os três com o mesmo peso. Separar dá um peso diferente a cada um. Os fatos ficam num bloco curto, sempre presente. O resumo conta a história em poucas linhas. E o ruído vai embora.

O estado explícito resolve a regra que muda. Em vez de o modelo achar duas regras contraditórias em pontos diferentes do histórico, existe uma linha, com a exceção ao lado. A compactação atualiza essa linha, e você consegue ler e testar o que ela escreveu.

E o custo fica estável. Os turnos recentes têm tamanho limitado, os fatos crescem devagar e o resumo tem um teto de palavras.

Um desafio

Uma pergunta para você. Digamos que você acrescenta só um resumo, sem bloco de fatos. Por que o tutor continua errando a regra das dicas com tanta frequência?

Porque um resumo é uma narrativa. Um parágrafo mistura a regra atual com a exceção, e as duas voltam a disputar. O modelo não tem um campo único para consultar. Um campo de modo de solução, com o escopo da exceção ao lado, deixa explícito o que está valendo.

Passo a passo seguro

Passo zero, medir. Monte um eval com sessões longas reais, anonimizadas, com perguntas que dependem de algo dito no começo. A regra das dicas, o id da conta, o CEP de entrega. Anote o acerto, o custo por turno e o tempo até a primeira palavra, no fim das sessões.

Liste os fatos duráveis do seu domínio. Ids, preferências, regras combinadas, decisões e exceções com o escopo delas. Eles viram um schema.

Escreva o prompt de compactação pedindo duas saídas. Os fatos atualizados, estruturados, e um resumo curto do que aconteceu. E peça a fonte, o turno ou a aula, de cada mudança num fato.

Escolha o gatilho, uma contagem de tokens ou de turnos. E sempre mantenha os últimos turnos inteiros. De oito a doze é um ponto de partida comum. Ajuste pelo eval.

Rode a compactação fora do caminho crítico quando der, entre turnos ou em segundo plano. A aluna não deveria esperar o resumo da aula onze para receber a dica da aula doze.

Guarde o histórico inteiro fora do contexto, para auditoria e para refazer o resumo se ele der errado.

Registre toda compactação no trace, com os fatos antes e depois. Se o modo de solução mudou sem a aluna pedir, você vê na hora.

E meça de novo. O acerto nas perguntas que dependem dos primeiros turnos deve se manter ou subir. O custo por turno no fim das sessões deve cair.

Riscos

Agora, os riscos. Um resumo que perde o fato certo. Você pega com casos de eval que perguntam sobre fatos antigos, e comparando os fatos antes e depois no trace.

Um resumo que inventa. O modelo de compactação pode juntar coisas que nunca foram ditas juntas. A aluna pediu gabarito em todas as listas. Peça fatos com referência ao turno de origem, e recuse qualquer fato sem fonte.

Erros que se acumulam. Cada resumo é construído sobre o anterior. Um desvio pequeno na aula oito vira uma regra falsa na aula vinte. Guarde o histórico bruto e refaça a partir dele de vez em quando, não só a partir do último resumo.

E um cache de prompt que vive zerando. Se você compacta a cada turno, o começo do contexto muda toda vez, e o cache quase nunca acerta. Compacte em blocos, quando os turnos recentes passam de um teto, para o começo ficar estável entre compactações.

E o erro comum. Compactar só quando a janela enche. Se você espera a API recusar o contexto, a sessão já está cara e o modelo já está perdido no meio. O gatilho é um limite que você escolhe, abaixo da janela, no ponto em que o eval ainda acerta as perguntas antigas. Compactar cedo demais também machuca. Você perde detalhe da conversa atual. Por isso os últimos turnos ficam inteiros.

Um fato que muda

Mais um caso, com dinheiro envolvido. O bot de WhatsApp de um banco guarda uma chave Pix no estado. Um turno antigo tinha a chave errada, e ela foi corrigida depois. Depois da compactação, o estado ainda mostra a chave velha. O que falhou? A compactação tratou a correção como mais uma frase no resumo, não como uma atualização do campo da chave. Um fato durável precisa ser um campo. E a correção precisa sobrescrever o valor antigo, com o turno da correção como fonte. Senão o próximo Pix vai para o destino antigo.

Quando não usar

E quando essa é a ferramenta errada? Uma sessão de atendimento de três turnos, em que o cliente ainda está descrevendo o problema. Não existe passado para compactar. Resumir agora joga fora detalhe que a próxima resposta precisa.

E um assistente que cola trinta e sete políticas no prompt de sistema em toda chamada. Isso não é histórico de sessão. É conhecimento colado. Tire do prompt e busque o trecho atual.

Fechamento

Então, a ideia para levar. Separe o histórico pelo que ele serve. Fatos que precisam durar viram campos, com fonte. O passado vira uma história curta. O presente fica inteiro. Meça com perguntas sobre o começo, guarde o histórico bruto para auditoria e compacte em blocos.

Na próxima aula, vamos olhar o padrão completo para onde essa refatoração leva, inclusive agentes que compactam o próprio trabalho no meio da tarefa: context compaction. Até lá.

RefatoraçãoOrganizando dados

Trocar Histórico por Resumo

Replace History with Summary

Trocar Histórico por Resumo (Replace History with Summary) é uma refatoração de IA para sistemas com LLM, do grupo Organizando dados. Substituir turnos antigos por um resumo e por fatos guardados fora do contexto.

Elemento
16/35
Nível
Intermediário
Leitura
5 min
Atualizado
Nesta página 8
  1. 01Problema
  2. 02Solução
  3. 03Antes e depois
  4. 04Por que funciona
  5. 05Passo a passo seguro
  6. 06Riscos
  7. 07Desafio
  8. 08Teste seu entendimento
  9. ··Perguntas rápidas

Problema

A sessão carrega o histórico inteiro, que só cresce, confunde o modelo e encarece cada turno. É o smell Contexto Podre.

O tutor de matemática no WhatsApp da escola combinou, na aula 1: “só dicas, nunca a resposta pronta”. Na aula 6 a aluna pediu a lista de revisão com gabarito, e o tutor aceitou como exceção daquela lista. Na aula 12 ela pergunta a equação de uma questão nova. No histórico estão as duas regras, várias páginas de contas erradas, três mudanças de horário e um recado da mãe. O modelo devolve a resposta pronta. Ou, no dia seguinte, recusa até a lista de revisão, porque “a regra é só dicas”.

O paper “Lost in the Middle” (Liu et al., 2023) documentou o mesmo tipo de falha em leitura longa: modelos acham pior o que está no meio de um contexto grande do que o que está no começo ou no fim. Uma sessão de semanas é esse contexto, renovado a cada turno.

Os números abaixo são ilustrativos. Suponha um system prompt de 1.500 tokens e uns 200 tokens por turno (pergunta mais resposta). Na aula 12, com 40 turnos, cada chamada já manda cerca de 9.500 tokens de histórico. Na aula 40, passam de 17 mil, e a regra da aula 1 compete com tudo que veio depois.

Solução

Troque os turnos antigos por um resumo e guarde os fatos que precisam durar num estado explícito, fora do histórico bruto. Mande ao modelo o estado, o resumo e só os turnos recentes.

Antes e depois

 def answer(session, user_msg):
-    session.messages.append(user(user_msg))
-    reply = call_model(SYSTEM, session.messages)          # tudo, sempre
+    session.messages.append(user(user_msg))
+    if tokens(session.messages) > COMPACT_AT:
+        old, recent = split(session.messages, keep_last=8)
+        session.summary = summarize(session.summary, old)  # resumo acumulado
+        session.facts.update(extract_facts(old))           # fatos duráveis
+        session.messages = recent
+    context = [state_block(session.facts, session.summary), *session.messages]
+    reply = call_model(SYSTEM, context)
     session.messages.append(assistant(reply))
     return reply

Antes: o histórico inteiro entra em toda chamada.

flowchart LR
  U(["1. Mensagem"]):::io --> H[("2. Histórico inteiro")]:::store
  H --> M(["3. Modelo"]):::llm
  M --> R(["4. Resposta"]):::io

Depois: estado, resumo e turnos recentes, com a compactação fora do caminho principal.

flowchart LR
  U(["1. Mensagem"]):::io --> H[("2. Turnos recentes")]:::store
  F[("3. Fatos e resumo")]:::store --> M(["4. Modelo"]):::llm
  H --> M
  M --> R(["5. Resposta"]):::io
  H -->|"passou do limite"| C(["6. Compactar"]):::llm
  C --> F
  1. A mensagem nova chega.
  2. Só os últimos turnos ficam na forma bruta.
  3. Fatos duráveis (preferências, decisões, ids) e um resumo do resto ficam num bloco separado.
  4. O modelo recebe o bloco de estado, o resumo e os turnos recentes.
  5. A resposta sai e entra nos turnos recentes.
  6. Quando os turnos recentes passam do limite, um passo de compactação atualiza resumo e fatos e descarta os turnos antigos.

O que o modelo passa a ver

Depois da compactação da aula 12, o bloco de estado pode ser:

{
  "student": "Ana",
  "level": {"equations": "intermediario", "geometry": "iniciante"},
  "format": "dicas passo a passo",
  "solution_mode": "so_dicas",
  "solution_mode_exceptions": [
    {"scope": "lista de revisao aula 6", "mode": "gabarito completo"}
  ]
}

O resumo, em poucas linhas: “Aulas 1 a 11: equações do segundo grau, travou em completar quadrado. Aula 6: lista de revisão com gabarito, exceção combinada. Aula 11: começou geometria, Teorema de Pitágoras.” Os oito turnos recentes ficam inteiros. A regra vigente está numa linha só. O recado da mãe e as contas erradas da aula 3 não entram.

Por que funciona

O histórico bruto mistura três coisas: fatos que continuam valendo, contexto que explica o momento e ruído que não importa mais. O modelo recebe as três com o mesmo peso. Separar dá peso diferente a cada uma: fatos ficam num bloco curto e sempre presente, o resumo conta a história em poucas linhas, e o ruído sai.

O estado explícito resolve o caso da regra que muda. Em vez de o modelo achar duas regras contraditórias em pontos diferentes do histórico, existe uma linha só: solution_mode: so_dicas, com a exceção da lista da aula 6 ao lado. Quem atualiza essa linha é a compactação, e você consegue ler e testar o que ela gravou.

O custo fica estável: o tamanho do contexto deixa de depender da idade da sessão. Os últimos turnos têm tamanho limitado; o bloco de fatos cresce pouco; o resumo tem teto em palavras. O padrão de destino é Compactação de Contexto.

Checagem +20 XP de primeiraNa aula 12 o tutor devolve a resposta pronta, contra o combinado da aula 1. O histórico tem 40 turnos, inclusive a exceção da lista da aula 6. Por que um resumo sozinho, sem um bloco de fatos, ainda falha com frequência?

Passo a passo seguro

  1. Meça. Monte um eval com sessões longas reais (anonimizadas) e perguntas que dependem de algo dito no começo: a regra de dicas, o id da conta, o CEP de entrega. Registre acerto, custo por turno e tempo até o primeiro token no fim das sessões.
  2. Liste os fatos duráveis do seu domínio: ids, preferências, regras combinadas, decisões, exceções com escopo. Eles viram um schema, no mesmo espírito de Trocar Texto Livre por Saída Estruturada.
  3. Escreva o prompt de compactação pedindo duas saídas: fatos atualizados (estruturados) e um resumo curto do que aconteceu. Peça a origem (turno ou aula) de cada mudança de fato.
  4. Escolha o gatilho: número de tokens ou de turnos. Mantenha sempre os últimos turnos inteiros. Um teto de 8 a 12 turnos recentes é um ponto de partida comum; ajuste olhando o eval.
  5. Rode a compactação fora do caminho crítico quando der, entre turnos ou em segundo plano. O usuário não precisa esperar o resumo da aula 11 para receber a dica da aula 12.
  6. Guarde o histórico completo fora do contexto, para auditoria e para reconstruir o resumo se ele estiver errado.
  7. Registre no trace cada compactação, com fatos antes e depois. Se solution_mode mudou sem a aluna ter pedido, você vê na hora.
  8. Meça de novo. O acerto nas perguntas que dependem do começo deve se manter ou subir; o custo por turno no fim das sessões deve cair.

Riscos

  • Resumo que perde o fato certo. Um detalhe importante some na compactação. Detecte com casos de eval que perguntam sobre fatos antigos e com a comparação de fatos antes e depois no trace.
  • Resumo que inventa. O modelo de compactação pode juntar coisas que não foram ditas juntas (“a aluna pediu gabarito em todas as listas”). Peça fatos com referência ao turno de origem e recuse fato sem origem.
  • Erro que se acumula. Cada resumo é feito sobre o anterior. Um desvio pequeno na aula 8 vira regra falsa na aula 20. Guarde o histórico bruto e reconstrua de vez em quando a partir dele, não só a partir do último resumo.
  • Cache invalidado. Mudar o começo do contexto a cada compactação pode zerar o cache de prompt. Compacte em blocos, não a cada turno, para o prefixo (system prompt mais bloco de fatos) ficar estável entre compactações.

Erro comum: compactar só quando a janela enche

Se você espera a API recusar o contexto, a sessão já está cara e o modelo já está perdido no meio. O gatilho é um limite seu, abaixo da janela, no ponto em que o eval ainda acerta as perguntas antigas. Compactar cedo demais também dói: some detalhe da conversa atual. Por isso os últimos turnos ficam inteiros.

Checagem +20 XP de primeiraVocê compacta a cada turno para 'manter o contexto limpo'. O prefixo da chamada muda toda vez, o cache de prompt quase nunca acerta, e o custo por turno não caiu como o time esperava. Qual ajuste vem primeiro?

Desafio

Este prompt de compactação gera resumos bonitos que perdem informação. O que falta nele?

Resuma a conversa abaixo em um parágrafo, de forma clara e concisa.
Ver solução

Faltam três coisas: dizer o que precisa sobreviver, separar fatos de narrativa e tratar o resumo anterior.

Você atualiza a memória de uma sessão de tutoria.

Entrada: os fatos atuais (JSON), o resumo anterior e os turnos novos.

1. Atualize os fatos: nível da aluna por tópico, preferências de formato
   e regras combinadas. Se uma regra nova tem escopo limitado (uma lista,
   uma aula), registre o escopo. Cite o turno de origem de cada mudança.
2. Reescreva o resumo em até 120 palavras, incluindo o resumo anterior.
   Só o que ajuda a próxima aula: o que foi visto, onde ela travou.
3. Não invente nada que não está nos turnos.

Teste seu entendimento

Checagem +20 XP de primeiraO eval de sessões longas acerta as perguntas sobre a regra da aula 1, mas 8% das compactações inventam uma preferência que a aluna não disse. O histórico bruto está guardado. Qual é o próximo passo mais útil?

Checagem +20 XP de primeiraUm bot de banco no WhatsApp guarda, no estado, pix_key e o limite combinado da sessão. Um turno antigo tinha a chave errada, depois corrigida. Depois da compactação, o estado ainda mostra a chave antiga. O que falhou?

Checagem +20 XP de primeiraVocê mantém os últimos 8 turnos crus e compacta o resto. Uma pergunta da aluna na aula 12 depende de um exercício resolvido no turno que acabou de sair da janela recente. Como o desenho deve se comportar?

Checagem +20 XP de primeiraEm qual destes casos compactar o histórico é a ferramenta errada, e o que usar no lugar?

Perguntas rápidas

O que é Trocar Histórico por Resumo?

Trocar Histórico por Resumo (Replace History with Summary) é uma refatoração de IA para sistemas com LLM, do grupo Organizando dados. Substituir turnos antigos por um resumo e por fatos guardados fora do contexto.

Que problema Trocar Histórico por Resumo resolve?

Trata Contexto Podre.

Aonde Trocar Histórico por Resumo leva?

Ao padrão de projeto Compactação de Contexto e Memória de Curto Prazo.

Para ir além

Relações

Smells que trata 1
Aparece nas trilhas 1
Buscar