Leçon 03 · planification

Laissez l’agent gérer sa propre progression

"L'agent peut suivre sa propre progression et je peux le voir." Laissez le modèle créer sa propre liste, puis utilisez un petit mécanisme pour lui permettre de se souvenir de mettre à jour la liste.

⏱ ~10 min · 📝 3 widgets interactifs · 🧑‍💻 Basé sur shareAI-lab · s03_todo_write.py

auto-planification structurée

Claude Code doit souvent effectuer plusieurs étapes lorsqu'il travaille : grep pour trouver des références → lire quelques fichiers → modifier le code → exécuter des tests. Si vous laissez le modèle "avancer au ressenti", vous verrez qu'il réussit bien dans les premiers pas, puis commence à oublier au milieu, et finalement abandonne à mi-chemin.

La solution à s03 est de lui donner un outil manifeste : le modèle ajuste son propre outil todo pour y insérer des éléments de tâche, et TodoManager vérifie la structure, persiste et renvoie la vue actuelle. Cela présente deux avantages :

  • Le modèle est obligé d'expliciter "ce qu'il doit faire" : le simple fait de l'écrire l'aide à clarifier sa réflexion.
  • Les humains peuvent voir ce qu'il pense. L'expérience de débogage est dix fois meilleure.
Vue # TODO, chaque élément est structuré
[ ] #1 : grep "TODO" sur src/
[>] #2 : lire src/app.py et lister les commentaires # en cours
[ ] #3 : générer une démarque récapitulative
[ ] #4 : écrire dans TODO_LIST.md

(0/4 terminé)

Une règle stricte : il n'y a qu'un seul in_progress à la fois

TodoManager.update() Il y a une vérification :

if in_progress_count > 1 :
    raise ValueError("Une seule tâche peut être en cours à la fois")

Cela peut paraître dur, mais cela aide en réalité le modèle. Si vous autorisez 3 "faires" en même temps, il commencera à se battre partout et n'en terminera jamais aucun. Avancement forcé d'une seule mission, il est obligé de terminer chacune d'entre elles avant d'ouvrir la suivante.

Le widget ci-dessous vous permet d'agir en tant que modèle, de soumettre diverses charges utiles de tâches et de voir celles qui réussissent la vérification et celles qui sont rejetées.

Rappel : aucune mise à jour pendant 3 tours consécutifs ? pique-le

Même si l'outil todo est fourni, le modèle "oubliera" occasionnellement de mettre à jour la liste - il a fait beaucoup de choses, mais in_progress est toujours bloqué dans l'élément 2. Le déplacement dans s03 est un compteur très simple :

rounds_since_todo = 0
pendant Vrai :
    réponse = LLM (messages, outils)
    ...
    used_todo = any(b.name == "todo" pour b dans tool_uses)
    rounds_since_todo = 0 if used_todo else rounds_since_todo + 1
    if rounds_since_todo >= 3 :
        results.append({"type":"text", "text":"<reminder>Mettez à jour vos tâches.</reminder>"})

Lorsque le nombre atteint 3, incluez un rappel dans la prochaine série de messages utilisateur. Lorsque le modèle le verra, il ajustera instinctivement la tâche. Il s'agit d'utiliser des moyens d'ingénierie pour transformer une contrainte douce ("Veuillez la maintenir à jour") en un stimulus forcé.

Quel est le nom de cette routine ?

Dans les cercles de conception d'agents, cela s'appelle une auto-planification structurée avec des coups de pouce doux : donner au modèle un état structuré dans lequel il doit écrire, complété par des rappels opportunistes. Claude Code utilise un modèle similaire dans le code réel, mais plus sobre (basse fréquence, formulation neutre).

Pourquoi ne pas simplement écrire « mettre à jour la tâche à chaque étape » dans l'invite du système ? L'écriture est possible, mais l'obéissance du modèle aux instructions générales de l'invite du système diminuera à mesure que la conversation s'allonge. Le découpage des instructions en « rappels constamment réinjectés » est beaucoup plus stable.
Interactif

Widget 1 · Kanban · todo appuyer tour à tour pour évoluer

Cliquez sur Étape pour voir comment le modèle fait passer la tâche de en attente à in_progress à terminée. Notez qu'il n'y a toujours qu'un seul in_progress à chaque tour.

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

Widget 2 · Validation · Laquelle des 5 charges utiles Todo a réussi ?

Transmettez un tableau d'éléments lorsque le modèle appelle l'outil todo. TodoManager exécutera une série de vérifications : le texte n'est pas vide, le statut est légal, au plus un in_progress et le nombre total ≤ 20. Cliquez pour déterminer si chaque charge utile est acceptée ou rejetée.

答对 0 / 5
Interactif

Widget 3 · Nag Counter · Que se passera-t-il si la tâche n'est pas mise à jour pendant 3 tours consécutifs ?

Cliquez sur Tour suivant pour voir si le compteur déclenche une injection de rappel. Chaque tour sélectionne au hasard « appeler à faire » ou « ne pas appeler » - les performances du modèle en réalité fluctuent également de cette manière.

rounds_since_todo: 0