A Compaction do Hermes Ganha um Padrão Lean: Modelos de Janela Grande Deixam de Acumular Tails de 170K Tokens

Imagine: está numa sessão maratona num modelo com contexto de 1M, chega a meio milhão de tokens, as coisas ficam lentas, então escreve /compress para emagrecer o contexto — e a sessão mal encolhe. Cada turno seguinte continua a enviar um «tail» de mais de cem mil tokens para o modelo, e a sua fatura incha silenciosamente. Não é impressão sua: a fórmula legada de compaction dimensiona o tail verbatim com o tamanho da janela e o threshold, por isso em modelos de janela grande acumula silenciosamente 100K–240K tokens de histórico verbatim em cada compaction. Um commit fundido a 26 de agosto (6e5413844e) inverteu o padrão: o novo modo lean mantém apenas um tail pequeno e limitado, e o espaço recuperado é dramático.
Porque É Que a Fórmula Antiga Começou a Acumular em Modelos Modernos
Quando a compaction corre, o Hermes divide a sessão num «summary» (memória de longo prazo) e num «tail» (conteúdo verbatim recente que mantém a continuidade). O orçamento padrão legado era threshold × target_ratio — uma fórmula desenhada em torno de janelas de 128K com disparo aos 50%, que produzia um tail razoável de ~13K tokens.
Mas à medida que as janelas dos modelos cresceram, a fórmula continuou a escalar proporcionalmente: uma sessão com janela de 1M com threshold 0,85 recebe um tail verbatim de 170K tokens (teto suave de 255K) no modo legado. Um /compress manual numa sessão de 540K acaba em ~290K — a acumulação torna a compaction inútil, e cada turno volta a enviar esses tokens para o modelo, queimando dinheiro duas vezes.
O Novo Padrão: Modo Lean (#87326 compaction-v2)
O modo lean trata o tail como uma pequena janela de recência em vez de um depósito de contexto. Concretamente:
- Orçamento do tail = 2,5% do tamanho da janela, com mínimo de 10K e teto de 25K tokens;
- A continuidade deixa de depender de um tail grande — ela assenta no summary melhorado: content digests, um índice de âncoras, mensagens do utilizador verbatim e ponteiros de recuperação
session_search; - A capacidade de recuperação foi validada numa avaliação antes/depois (
evals/compaction/results/), não a olho.
Comparação lado a lado (imports reais, janela de 1M @ threshold 0,85):
| Cenário | Orçamento do tail verbatim |
|---|---|
| Padrão antigo (legado) | 170.000 (teto 255.000) |
| Novo padrão (lean) | 25.000 (teto 37.500) |
| Regresso explícito ao legado | 170.000 (opt-out intacto) |
| Mudança a meio da sessão para um modelo de 400K (lean preservado) | 10.000 |
Também corrige um bug latente: o update_model() costumava reatribuir diretamente a fórmula legada ao recalcular orçamentos, revertendo silenciosamente um compressor lean para a acumulação em cada mudança de modelo a meio da sessão. O recálculo agora passa pela propriedade tail_token_budget, que conhece o modo (teste de regressão incluído).
Verificar e Ajustar a Definição
Inspecione a sua configuração atual:
hermes config get compression.tail_mode # agora tem lean como padrão
hermes config get compression.threshold # padrão 0.50 (disparo aos 50%)
hermes config get compression.target_ratio # padrão 0.20
Para repor o comportamento antigo, defina-o explicitamente no config.yaml:
compression:
tail_mode: legacy # fórmula antiga: 0.20 × threshold, acumula em janelas grandes
Nota: o compression.tail_mode também é agora uma chave de cache-busting do gateway — alterá-lo expulsa os agentes de gateway em cache tal como as mudanças em target_ratio, sem precisar de reiniciar o gateway por completo.
Quando Usar Cada Um
Para a maioria das pessoas, mantenha o padrão lean: poupa dinheiro, liberta espaço real no /compress, e o summary carrega ponteiros de recuperação como rede de segurança. Só se realmente encontrar «informação importante perdida» após a compaction (por exemplo, um output crítico de uma ferramenta numa sessão longa que o digest não cobriu) vale a pena voltar ao modo legado para comparar — ao preço de dezenas de milhares de tokens de input extra por turno.
Para Concluir
Esta mudança reequilibra «quanto texto original manter» de um acidente derivado de uma fórmula para engenharia limitada: a continuidade vem de um summary mais inteligente, e o tail é apenas uma janela recente. Se o /compress parecia inútil em modelos de janela grande, atualize para o build de dev mais recente e experimente novamente — a diferença é como o dia e a noite. A compaction é apenas uma peça da resistência em sessões longas: combine-a com max_turns ilimitados e exportação de sessão e as tarefas longas podem correr sem preocupações. Para o detalhe campo a campo dos orçamentos de contexto, veja o guia de configuração para tarefas longas.