Leçon 06 · Mémoire

Contexte saturé ? Savoir élager.

« L'agent peut oublier de façon stratégique et continuer indéfiniment. » L'oubli stratégique est une compétence d'ingénierie.

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

Pourquoi compacter ?

Un agent qui tourne longtemps voit ses messages[] gonfler : chaque read_file rapporte des milliers de tokens, chaque bash quelques centaines, sans compter le texte de raisonnement du modèle. Après 50 tours, le contexte peut dépasser 100 K tokens. Deux conséquences :

  • Limite du modèle atteinte : on touche la fenêtre de contexte ou le coût de chaque appel API augmente linéairement.
  • Dilution de l'attention : la tâche courante se noie dans des tool_results d'il y a 30 tours qui n'ont plus aucune pertinence.

L'idée de s06 : faire en sorte que l'agent oublie activement le contenu peu important, tout en conservant l'état clé. Trois niveaux de mécanismes, du plus léger au plus lourd.

Niveau 1 · micro_compact (tourne silencieusement à chaque tour)

Le niveau le moins coûteux. Avant chaque appel LLM, il remplace les anciens tool_results (au-delà des 3 derniers) par un placeholder :

# à partir du 10e tour, la plupart des tool_results deviennent :
{
  "type": "tool_result",
  "tool_use_id": "toolu_01A",
  "content": "[Previous: used bash]"   # de milliers de chars à quelques dizaines
}

Exception notable : les résultats de read_file ne sont pas compressés. Pourquoi ? Parce que la sortie d'un read est une référence — la comprimer obligerait le modèle à relire le fichier, ce qui coûterait encore plus cher.

PRESERVE_RESULT_TOOLS = {"read_file"}  # jamais compressé

Voir micro_compact consommer les anciens résultats au fil des tours

Simulez 10 tours en cliquant sur Step. À chaque tour, micro_compact tourne une fois. Observez les anciens tool_results se transformer en [Previous: ...] tandis que les 3 derniers restent intacts.

Niveau 2 · auto_compact (déclenché quand le seuil est dépassé)

Même avec micro actif, l'accumulation finit par exploser. s06 fixe un seuil (par défaut 50 000 tokens) :

  1. Estimation du nombre de tokens : len(str(messages)) // 4 (approximatif mais suffisant).
  2. Dépassement du seuil → écriture du transcript complet sur disque dans .transcripts/transcript_TIMESTAMP.jsonl (archive de sécurité).
  3. Le LLM génère un résumé de toute la conversation.
  4. Le tableau messages est entièrement remplacé par un seul message "[compressed] SUMMARY...".

Le coût est évident — les outputs d'outils précis et le ton de la conversation sont perdus, il ne reste que les grandes lignes. Mais l'agent peut continuer à travailler — c'est l'avantage fondamental.

Niveau 3 · le modèle appelle lui-même l'outil compact

auto_compact est déclenché automatiquement par le harness, sans que le modèle le sache. Le niveau 3 inverse la logique : donner au modèle un outil compact pour qu'il demande lui-même la compression — par exemple quand il estime que l'exploration précédente est terminée et qu'il veut repartir sur une nouvelle phase.

Appel du modèle :

tool_use("compact", focus="keep the API design decisions")

Le déclenchement est identique à auto, mais avec un paramètre focus qui indique au résumé ce qu'il doit prioritairement conserver. En pratique, c'est très utile — le modèle sait quelle partie de la session est « terminée » et peut donc cibler plus précisément que l'heuristique automatique du harness.

Quel niveau choisir ? Questions de jugement.

Pour chacun des scénarios suivants, décidez quel niveau — micro / auto / manual — est le plus approprié.

Interactif

Widget 1 · Micro Compact · voir les tool_results vieillir au fil des tours

Avancez pas à pas avec Step et observez comment les anciens tool_results sont remplacés par [Previous: used X], tandis que les 3 derniers restent complets. read_file n'est jamais compressé (surligné en vert).

Tour : 0 · Tokens : ~0
Interactif

Widget 2 · Threshold Simulator · quel niveau est actif selon le nombre de tokens ?

Déplacez le curseur pour modifier le nombre de tokens estimés et voyez quel niveau de compression s'active.

3000
Interactif

Widget 3 · Quel niveau ? · 6 scénarios à évaluer

Pour chaque scénario, choisissez micro / auto / manual et comprenez dans quel contexte chacun se déclenche naturellement.

Correct : 0 / 6