Orkas Orkas
Início Blog Arquitetura
Arquitetura

Deteção de loop não é deteção de estagnação: identificar agentes que andam às voltas sem se repetirem

O Orkas tem três proteções contra ciclos repetitivos. Nenhuma delas deteta um modelo capaz que estagna, porque as três perguntam se está a repetir-se — e um modelo bloqueado nunca se repete. Aqui está o ponto cego, a definição de progresso do lado da saída que fomos buscar ao BEACON e o que pretendemos medir antes de mudar seja o que for.

Esta é a primeira de uma série de notas de conceção sobre agentes de longo horizonte, motivada por uma leitura atenta do BEACON (Universidade de Zhejiang, arXiv:2605.06078).

Para que um agente consiga lidar com uma tarefa longa, achamos que duas coisas têm de funcionar bem:

  • Continua a progredir rumo ao objetivo. Isto divide-se em compactação de contexto (o que é seguro esquecer), conceção de marcos (como saber que um passo realmente terminou) e prevenção de estagnação (quando fica bloqueado, algo tem de o detetar).
  • Consegue refletir e melhorar.

Esta publicação aborda a prevenção de estagnação, porque foi a que mais nos custou.

Em resumo Um agente que anda às voltas sem se repetir também tem de ser detetado A deteção de estagnação está incluída no Orkas: uma execução longa avisa quando está bloqueada, em vez de gastar silenciosamente o resto do orçamento.
Descarregar o Orkas — grátis

O sintoma

Recebemos relatos de utilizadores e também observámos internamente: algumas tarefas muito longas deixam de avançar a meio.

Olhe para os registos e o agente está ocupado — a ler ficheiros, a pesquisar, a executar comandos, sem parar. Mas, meia hora depois, nada avançou.

A nossa primeira explicação foi a perda de contexto: a compactação descartou o registo de que um caminho já tinha sido tentado, pelo que o agente foi tentar novamente. Ao analisar o código e os registos em conjunto, percebemos que isso era apenas metade da história.

Já tínhamos proteções — três camadas delas

CamadaCritérioLimiares
Repetição exataNome da ferramenta + argumentos canonizados, idênticos byte a byteLOOP_WARN=3 aviso / LOOP_HARD=5 paragem forçada
Quase duplicadoIdênticos exceto nos campos voláteis de identificador / marca temporalNEAR_DUP_LOOP_WARN=6 / NEAR_DUP_LOOP_HARD=12
Convergência de ciclos sem progresso≥2 compactações e ≥75% do orçamento do ciclo de ferramentas consumidoSPIN_CONVERGENCE_MIN_COMPACTIONS=2
SPIN_CONVERGENCE_TOOL_LOOP_RATIO=0.75

O comentário nessa terceira camada diz, literalmente: Sinal composto de "pode estar a andar às voltas após perda de contexto". Alguém já tinha previsto isto. Por isso, o problema nunca foi não termos construído nada — foi o que construímos não conseguir detetá-lo.

O ponto cego: as três são detetores do lado da entrada

A assinatura em que todas as camadas se baseiam é nome da ferramenta + argumentos canonizados. Isto responde exatamente a uma pergunta: está a fazer a mesma coisa duas vezes?

Mas um modelo capaz que está bloqueado não repete chamadas. Faz assim:

ler arquivo A → grep X → reler A com outro intervalo de linhas
  → rodar um comando ligeiramente diferente → ler arquivo B → grep de novo …

Cada chamada tem uma assinatura distinta. As três camadas ficam em silêncio. E, ao longo de todo esse período, o número de mudanças de estado verificáveis é zero: nenhum ficheiro efetivamente reescrito, nenhum comando a produzir um resultado novo, nada de irreversível a acontecer.

A deteção de ciclos repetitivos não é deteção de estagnação. A primeira analisa as entradas. A segunda tem de analisar as saídas.

O artigo fornece exatamente essa definição do lado da saída

A recompensa dentro do segmento no BEACON:

r_t = R_ms · γ^(t_k − t)    se o segmento termina em um marco
    = 0                     caso contrário

Um segmento que não termina num marco recebe exatamente zero, independentemente de quantas ações continha. A contagem de ações nunca entra na fórmula. É a formalização mais limpa de ocupado ≠ a progredir que já vimos.

A camada do valor de referência é ainda mais exigente. O valor de referência é o retorno médio por passo do grupo, pelo que um segmento que levou 8 passos quando o grupo precisou, em média, de 5 tem o valor de vantagem inteiro empurrado para valores negativos, e a penalização aumenta com o excesso. Andar às voltas não é apenas deixar de receber uma recompensa; é ser penalizado de forma ativa e proporcional.

A Figura 8 do artigo mostra uma trajetória que falhou em que as duas últimas ações recebem um idêntico −2,20. Essa cauda — o trecho após o último marco que nunca alcança outro — é a forma matemática de andar às voltas. E é comum: as trajetórias que concluem pelo menos um subobjetivo mas falham a tarefa mantêm-se em 39–47% das amostras.

Uma ablação descarta os critérios de ativação baseados na contagem de passos

ParticionamentoPontuaçãovs. valor de referência (72,8)
Divisão aleatória em 574,2+1,4
Marcos reais91,4+17,2

Dividir por contagens arbitrárias de passos vale quase nada. Dividir pela estrutura real vale muito.

Agora reveja o nosso critério da terceira camada — 75% do orçamento do ciclo consumido. É um critério de ativação baseado numa contagem arbitrária de passos. Pergunta quanto gastou, não o que alcançou. A forma correta é:

✗  se passos > N                          → intervir
✓  se passos > N E zero marcos verificados → intervir

O segundo não é ativado indevidamente numa tarefa longa que está a progredir, porque essa tarefa atinge marcos pelo caminho. O primeiro é.

Há também um ciclo de realimentação positiva

Coloque as constantes lado a lado. A compactação é ativada a 82% da janela de contexto. A convergência de ciclos sem progresso exige duas compactações mais 75% do orçamento do ciclo antes de ser ativada.

giro → contexto enche → compactação dispara → estado durável some no resumo
     → re-deduzir o que se perdeu → mais giro

O detetor de ciclos sem progresso infere que o agente está a andar às voltas ao observar que a compactação ocorreu repetidamente — mas a compactação é precisamente o passo que causa a amnésia. Deteta um sintoma a jusante e ainda tem de esperar que o ciclo dê duas voltas.

Pior: a sua intervenção é induzir o modelo a voltar a apoiar-se no próprio estado duradouro. Se o estado duradouro é precisamente o que foi compactado, não resta nada em que se apoiar. Isto é um remendo na camada de instruções para um problema na camada de estado.

O que vamos acrescentar: deteção de estagnação do lado da saída

Uma quarta camada, construída sobre dois contadores. Ambos derivados mecanicamente de observações de ferramentas que o sistema anfitrião já regista; nenhum exige discernimento do modelo.

Passos desde o último marco verificado. A métrica de progresso mais simples possível, usada no critério composto acima e não isoladamente.

Mudanças de estado novas, desduplicadas. A mais útil das duas:

  • Uma leitura de um ficheiro cujo hash do conteúdo coincide com o de uma leitura anterior não é informação nova — reler o mesmo ficheiro noutro intervalo de linhas deixa o hash inalterado.
  • Um comando cujo nome, código de saída e hash da saída coincidem com os de uma execução anterior não é informação nova.
  • Uma escrita em que o hash posterior é igual ao hash anterior significa que nada foi efetivamente escrito.

Este contador visa precisamente o caso que a correspondência por assinatura não deteta: todas as ações diferentes, ganho de informação zero. O critério é mecânico e não exige compreensão semântica.

Depois, a pressão deve ser contínua em vez de um único empurrão:

exponha o contador no contexto para o modelo enxergar
  → force uma revisão do plano (admita que este caminho morreu)
    → pergunte ao usuário
      → aborte, mas preserve os marcos já alcançados

Esse último degrau importa. Se a execução vai parar, deve parar preservando o que conquistou — que é precisamente aquele progresso parcial de 39–47% que o artigo mediu e que estava a ser deitado fora.

O que o artigo não nos dá

O BEACON é um método de treino. Molda os gradientes para que a política treinada tenha menos tendência para divagar, mas não tem nenhum mecanismo próprio de deteção ou intervenção em tempo de execução. Fornece uma definição de progresso, não um controlador. Cabe-nos conceber os limiares, os níveis de escalonamento e as condições de interrupção.

O seu valor de referência por passo também precisa de um comprimento médio de segmento do grupo como referência. Em produção, uma dada tarefa de utilizador costuma ser executada exatamente uma vez, pelo que não há grupo. O melhor substituto disponível são estatísticas históricas de tarefas semelhantes, consideravelmente mais ruidosas e sem nenhuma das garantias de isolamento de variância do artigo.

O primeiro movimento é medir, não corrigir

Antes de mudar qualquer lógica de decisão, queremos instrumentar e responder a uma pergunta a que hoje não conseguimos responder: das estagnações que ocorrem em produção, quantas são do tipo amnésia e quantas do tipo sem gradiente?

  • Maioritariamente acompanhadas de ganho de informação zero enquanto as assinaturas de chamada diferem todas → tipo sem gradiente. As três camadas atuais não o conseguem detetar devido à sua estrutura, e a deteção do lado da saída é a correção.
  • Maioritariamente acompanhadas de releitura de conteúdo já compactado → tipo amnésia. O que precisa ser corrigido é o que a compactação preserva.

Essas duas conclusões exigem investimentos completamente diferentes. Medir primeiro é mais barato do que conceber primeiro, e a instrumentação é quase gratuita porque as observações já existem.

Tudo o que está acima assenta numa noção que esta nota tem usado sem definir: um marco verificado. A próxima nota trata disso. Porque é que uma etapa declarada concluída não é prova de que o esteja, quais são as duas metades que já existem no produto sem nunca terem sido ligadas, e um critério que o artigo não tem: analisar a irreversibilidade, não a importância.