Pular para o conteúdo

Histórico de conversa

Uma conversa longa acaba batendo em um muro intransponível: a janela de contexto do modelo. Tudo nesta página existe por causa desse muro, e a parte interessante é o que é jogado fora, o que é mantido e o que pode ser recuperado.

Não são bem alternativas, e sim uma escada, do mais barato ao mais caro.

Mecanismo Custo Mantém Perde
Elisão Nada Cada palavra da narrativa Resultados antigos de ferramentas sem incidentes
Descarte de imagens Nada O texto ao redor delas Capturas de tela antigas
Instantâneos Nada Cada palavra, como pixels Legibilidade para um modelo sem visão
Resumo Uma chamada ao modelo Uma narrativa Os detalhes que ele não escolheu

A elisão e o descarte rodam primeiro porque são gratuitos e sem perdas no que importa: eles eliminam volume que ninguém ia reler.

Um resumo é o único dos quatro que gasta uma chamada ao modelo e o único que decide por você o que importava. Ambos são custos reais. A chamada é o mais interessante, por causa de quando ela acontece.

A compactação geralmente roda antes do muro, com base em um limite. Mas ela também roda de forma reativa, depois que o próprio provedor rejeita uma requisição por ser grande demais — a estimativa heurística subestimou o que o provedor realmente mediu. Nessa situação, um compactador que resume precisa fazer uma requisição para encolher o contexto, e a requisição que ele faz é justamente a que acabou de estourar.

A compactação por instantâneos renderiza o histórico descartado em páginas densas de glifos em pixels e as devolve como imagens.

A premissa é uma peculiaridade de cobrança: um modelo de visão cobra por uma imagem uma tarifa fixa ou proporcional à área, que não tem nada a ver com quantos caracteres há nela. Doze mil caracteres de conversa descartada custam o equivalente a doze mil caracteres em tokens de texto. Os mesmos caracteres renderizados em uma única página custam uma imagem.

O que faz valer a pena tê-lo, em vez de ser apenas engenhoso, é que ele não precisa de nenhuma chamada ao modelo, nenhuma chave e nenhuma rede. É a única estratégia sempre disponível durante a recuperação após estouro.

A forma da reconstrução é: início literal, meio em imagem, fim literal. O início é a tarefa e as restrições às quais tudo o que vem depois se refere; o fim é onde o trabalho está no momento. O meio é o que menos se relê e o que mais custa.

Os instantâneos são renderizados novamente a partir do texto de origem retido a cada passagem, nunca a partir dos pixels da passagem anterior. Converter uma imagem em imagem degrada os glifos uma geração por compactação, até que ninguém mais consiga lê-los.

Historicamente, toda execução de harness começava com um histórico vazio e reconstruía a continuidade a partir de um bloco <context> no prompt — um resumo da conversa, e não a conversa em si. Três consequências vieram disso:

  • Retomar era recontar. O modelo nunca via o próprio raciocínio anterior nem os bytes reais que suas ferramentas retornavam, apenas uma descrição deles.
  • Rebobinar morria com o processo. Um checkpoint é um índice na lista de mensagens ativas, então um reinício perdia todas as etiquetas que o modelo havia definido.
  • Tentar novamente não conseguia distinguir “nada a tentar de novo” de “nada carregado”. Depois de um reinício, o turno que falhou some do estado ativo de qualquer forma.

Os três problemas são resolvidos ao persistir a transcrição. Ela é salva em cada limite de turno e nunca no meio de um turno: um histórico capturado entre uma chamada de ferramenta e seu resultado é um que nenhum provedor aceitará, então uma falha nesse instante restaura o turno anterior, e não um meio turno que não pode ser reproduzido.

Uma execução retomada é reduzida às suas mensagens mais recentes, cortando em um limite que não seja um resultado de ferramenta órfão — um resultado cuja chamada foi cortada é uma requisição que os provedores rejeitam de imediato, e uma transcrição que não pode ser enviada é pior do que uma curta.

Cada mensagem registra aquela de que continua, e cada conversa nomeia sua ponta do branch atual. Essa única decisão é a funcionalidade inteira.

Criar um branch não grava nada. Isso apenas move o ponteiro. O caminho que você deixou ainda está lá, então voltar é outro movimento de ponteiro, e não uma restauração — e editar um prompt para executá-lo de novo deixa de custar a resposta com a qual você estava comparando.

Sem isso, toda forma de voltar atrás precisa ocultar ou excluir mensagens, e ocultar é uma mentira que o próximo leitor não consegue enxergar.

Branch Bifurcação
O que acontece O ponteiro se move O caminho é copiado
Para onde vai A mesma conversa Uma nova conversa
Custo Nada Uma cópia do branch

Uma bifurcação copia com ids novos, em vez de compartilhar linhas. Duas conversas que compartilhassem linhas mostrariam uma à outra suas mensagens posteriores, que é justamente a única coisa que uma bifurcação não pode fazer.

O par checkpoint / rewind dentro da execução marca um limite de turno limpo e retorna a ele depois de uma exploração, guardando um digest. Como os checkpoints são persistidos junto com a transcrição, uma etiqueta definida pelo modelo antes de um reinício ainda cai onde foi definida. Um checkpoint cujo destino não sobreviveu a um corte é descartado, não ajustado — rebobinar “até a etiqueta” e cair em outro lugar é exatamente a falha que uma etiqueta existe para evitar.