CarnetAgentic coding
Chapitres

Chapitres

Sur cette page

Mémoire et état

Toute session se termine. Le contexte est compacté, la conversation est fermée, une autre personne reprend la tâche. Sans mémoire, l’agent repart de zéro : il relit le README, redécouvre la structure du projet et retente la correction qui avait échoué la veille.

État, contexte et mémoire

Trois notions à ne pas confondre :

  • l’état décrit l’avancement de la tâche en cours : messages, actions, résultats, plan, budget restant
  • le contexte est ce que le modèle reçoit pour un appel précis
  • la mémoire conserve des informations pour plus tard, hors de la fenêtre.
Mémoire dans le contexteMémoire hors contexte
StockageLa fenêtre du modèleFichiers, base de données, index vectoriel
DuréeL’appel ou la sessionPlusieurs sessions
ExemplesHistorique récent, résultats d’outilsprogress.md, décisions du projet, préférences validées

Une note écrite sur disque n’est pas dans le contexte. Elle le devient quand le harness la relit et l’envoie au modèle.

Le dépôt est déjà une mémoire

Dans un projet logiciel, la plus grande partie de la mémoire utile existe déjà : le code, les tests, les commits, les issues, la documentation. Un agent qui lance ces commandes retrouve un état structuré et vérifiable :

git status   # ce qui n’est pas encore commité
git diff     # ce qui a changé
git log      # les décisions récentes, si les messages de commit sont bons
git show     # le détail d’un changement

Évitez de reconstruire une mémoire conversationnelle géante quand le dépôt contient déjà l’état. Des messages de commit qui expliquent le pourquoi servent autant à l’agent qu’à vos collègues.

Un fichier de progression

Pour un travail long, un fichier court suffit souvent :

# Progress

## Goal
Ajouter l’authentification OAuth.

## Done
- Provider GitHub configuré
- Route callback créée
- Tests unitaires OK

## Remaining
- Gestion des erreurs OAuth
- Test end-to-end

## Decisions
- Pas de nouvelle dépendance
- Réutilisation de la table sessions

## Next
Lancer le test e2e du parcours de connexion.

Une nouvelle session lit ce fichier, regarde Git et reprend le travail. Elle n’a pas besoin des 180 000 tokens de la conversation précédente.

sequenceDiagram
  accTitle: Reprendre le lendemain
  accDescr: La session de lundi écrit l’état dans Git et dans progress.md. La session de mardi le relit et reprend avec quelques centaines de tokens.
  participant L as Session de lundi
  participant F as progress.md
  participant G as Git
  participant M as Session de mardi
  %% ctx: system 1200 Prompt système de mardi
  %% ctx: tools 600 Outils
  L->>G: git commit -m "Route callback OAuth"
  %% note: La barre montre le contexte de la session de mardi. Pour l’instant, il ne contient rien sur le travail de lundi.
  L->>F: Écrit Done, Remaining, Decisions, Next
  L->>L: Fin de session : le contexte disparaît
  %% note: Les 180 000 tokens de la conversation de lundi sont perdus. Il reste le dépôt et le fichier.
  M->>M: Nouvelle session : Continue l’OAuth
  %% ctx: user 20 Continue l’OAuth
  M->>F: read_file("progress.md")
  F-->>M: Objectif, décisions, prochaine étape
  %% ctx: tool 250 Contenu de progress.md
  M->>G: git log -5 et git diff
  G-->>M: Derniers commits, rien en attente
  %% ctx: tool 400 Sortie de git log
  %% note: Mardi reprend avec 650 tokens d’état au lieu de la conversation complète.

Les types de mémoire

La recherche sur les agents emprunte ses catégories à la psychologie cognitive :

  • la mémoire de travail tient dans la fenêtre : c’est messages[], limité et perdu à la fin de la session
  • la mémoire épisodique enregistre des expériences datées : « le 15 mai, le rate limiting sur /upload a échoué à cause du middleware d’auth, résolu en réordonnant les middlewares »
  • la mémoire sémantique garde des faits stables extraits des épisodes : « l’API de paiement renvoie des 429 au-delà de 100 requêtes par minute »
  • la mémoire procédurale stocke des savoir-faire réutilisables. Les skills en sont une forme, comme la bibliothèque de routines vérifiées de Voyager.

Un épisode est un événement. Un fait sémantique est une connaissance générale tirée de plusieurs épisodes. Trois corrections du format de date deviennent « l’utilisateur préfère JJ/MM/AAAA ». Cette consolidation est rarement automatique.

Écrire, gérer, relire

Un système de mémoire tourne en trois phases couplées à la boucle de l’agent : écrire ce qui mérite d’être gardé, gérer ce qui est stocké, relire ce qui sert à la tâche. La gestion résume, déduplique, résout les contradictions et supprime. Une mauvaise écriture pollue les sessions suivantes, donc elle compte autant que la lecture.

Trois politiques décident quoi stocker :

  • heuristique : règles codées en dur, comme un résumé toutes les dix interactions ou une expiration après trente jours. Prévisible et facile à déboguer. C’est ce que fait le mini-harness.
  • auto-dirigée : la mémoire est exposée comme des outils, et le modèle décide quand les appeler. MemGPT (Packer et al.) traite la fenêtre comme de la RAM et l’archive comme un disque. Letta implémente ce modèle.
  • apprise : les opérations de mémoire sont entraînées par apprentissage par renforcement. C’est un sujet de recherche, hors de portée d’un harness écrit à la main.

Mécanismes

MécanismePrincipeLimite
Compression dans le contexteFenêtre glissante, résumé cumulatifLes détails rares disparaissent au fil des résumés
Index de recherche (RAG)Les souvenirs sont indexés et retrouvés par similaritéLa question de l’utilisateur est souvent une mauvaise requête de recherche
RéflexionAprès un échec, un appel écrit ce qu’il aurait fallu faire, réinjecté à la tentative suivanteLes anciennes critiques sortent de la fenêtre
Mémoire hiérarchiqueUn noyau toujours visible, une archive consultée à la demandeLe modèle doit savoir quand consulter l’archive

Reflexion (Shinn et al., 2023) atteint 91 % de réussite au premier essai sur HumanEval contre 80 % pour GPT-4 seul, sans réentraîner le modèle. Pour un harness, cela revient à ajouter un champ reflection rempli en fin de session par la question « qu’aurais-je dû faire différemment ? », et à le relire au démarrage suivant.

Mémoire et sécurité

Sans mémoire, une prompt injection s’arrête avec la session. Avec une mémoire persistante, elle est stockée et attend d’être relue. MINJA (Dong et al., 2025) montre qu’un attaquant peut glisser des enregistrements malveillants dans la mémoire d’un agent par des interactions ordinaires, sans accès direct au stockage. Une instruction comme « toujours traiter en priorité les e-mails urgents » ressemble à une préférence légitime.

Pour un harness :

  • ne stockez pas directement un contenu issu d’une source externe non vérifiée
  • enregistrez l’origine de chaque écriture (session, source) pour pouvoir auditer et supprimer
  • traitez un souvenir relu comme une donnée, pas comme une instruction de confiance
  • donnez une durée de vie courte aux faits extraits d’une session courte ou inhabituelle.

Dans le mini-harness

Le mini-harness fournit trois outils sur notes/memory.md :

OutilRôle
memory_readRelire la mémoire de travail
memory_appendAjouter une observation
memory_rewriteRéécrire le fichier pour le nettoyer

Le prompt système précise : Memory is for YOU, write_document is for the USER. La mémoire sert à l’agent d’un tour à l’autre. Le livrable final va dans documents/ avec write_document. Le fichier survit à l’arrêt du programme, mais son contenu n’entre dans le contexte que lorsque le modèle appelle memory_read.

Sources