Aula 03 · planejamento

Deixe o agente gerenciar seu próprio progresso

“O agente pode acompanhar seu próprio progresso – e eu posso ver isso.” Deixe o modelo criar sua própria lista e então use um pequeno mecanismo para que ele lembre de atualizar a lista.

⏱ ~10 min · 📝 3 componentes interativos · 🧑‍💻 Baseado em shareAI-lab · s03_todo_write.py

autoplanejamento estruturado

Claude Code muitas vezes precisa executar vários passos ao trabalhar: grep para encontrar referências → ler alguns arquivos → alterar o código → executar testes. Se você deixar o modelo “avançar pelo tato”, verá que ele se sai bem nos primeiros passos, depois começa a esquecer no meio e finalmente desiste no meio do caminho.

A solução para s03 é fornecer uma ferramenta de manifesto: o modelo ajusta sua própria ferramenta todo para inserir itens de tarefa nele, e TodoManager verifica a estrutura, persiste e retorna a visualização atual. Isto tem duas vantagens:

  • O modelo é forçado a explicitar "o que fazer" - apenas escrevê-lo ajuda a esclarecer seu pensamento.
  • Os humanos podem ver o que estão pensando. A experiência de depuração é dez vezes melhor.
# visualização TODO, cada item é estruturado
[] #1: grep "TODO" em src/
[>] #2: leia src/app.py e liste os comentários # em andamento
[] #3: gerar remarcação resumida
[] #4: escreva para TODO_LIST.md

(0/4 concluído)

Uma regra rígida: há apenas um in_progress por vez

TodoManager.update() Há uma verificação:

se in_progress_count > 1:
    raise ValueError("Apenas uma tarefa pode estar em andamento por vez")

Pode parecer duro, mas na verdade está ajudando o modelo. Se você permitir 3 “ações” ao mesmo tempo, ele começará a lutar em todos os lugares e nunca terminará nenhuma delas. Avanço forçado de uma única missão, é forçado a completar cada uma antes de abrir a próxima.

O widget abaixo permite que você atue como modelo, envie várias cargas de tarefas e veja quais passam na verificação e quais são rejeitadas.

Lembrete irritante: nenhuma atualização por 3 rodadas consecutivas? cutuque

Mesmo que a ferramenta de tarefas seja fornecida, o modelo ocasionalmente "esquecerá" de atualizar a lista - ele fez muitas coisas, mas in_progress ainda está preso no item 2. A movimentação em s03 é um contador muito simples:

rounds_since_todo = 0
while Verdadeiro:
    resposta = LLM(mensagens, ferramentas)
    ...
    used_todo = qualquer(b.name == "todo" para b em usos de ferramentas)
    rounds_since_todo = 0 se used_todo else rounds_since_todo + 1
    se rounds_since_todo >= 3:
        results.append({"type":"text", "text":"<reminder>Atualize seus todos.</reminder>"})

Quando a contagem chegar a 3, inclua um lembrete na próxima rodada de mensagens do usuário. Quando o modelo vir isso, ele ajustará instintivamente o todo. Isto consiste em usar meios de engenharia para transformar uma restrição suave ("Por favor, mantenha-a atualizada") em um estímulo forçado.

Qual é o nome dessa rotina?

Nos círculos de design de agentes, isso é chamado de autoplanejamento estruturado com toques suaves — dando ao modelo um estado estruturado no qual ele deve escrever, complementado por lembretes oportunistas. O Código Claude usa um padrão semelhante no código real, mas mais restrito (baixa frequência, redação neutra).

Por que não escrever "atualizar tarefas a cada passo" no prompt do sistema? Escrever é possível, mas a obediência do modelo às instruções gerais no prompt do sistema diminuirá à medida que a conversa aumenta. Dividir as instruções em “lembretes que são constantemente reinjetados” é muito mais estável.
Interativo

Widget 1 · Kanban · todo pressione virar para evoluir

Clique em Etapa para ver como o modelo envia a tarefa de pendente para in_progress e para concluída. Observe que sempre há apenas um in_progress em cada rodada.

[ ] pending
[>] in_progress
[x] completed
准备开始…
Interativo

Widget 2 · Validação · Qual das 5 cargas de tarefas passou?

Passe um array de itens quando o modelo chamar a ferramenta todo. TodoManager executará uma série de verificações: o texto não está vazio, o status é legal, no máximo um em andamento e o número total ≤ 20. Clique para determinar se cada carga útil foi aprovada ou rejeitada.

答对 0 / 5
Interativo

Widget 3 · Nag Counter · O que acontecerá se o todo não for atualizado por 3 rodadas consecutivas?

Clique em Próximo turno para ver se o contador aciona a injeção de lembrete. Cada rodada seleciona aleatoriamente "ligar para fazer" ou "não ligar" - o desempenho do modelo na realidade também flutua dessa forma.

rounds_since_todo: 0