Module 2 sur 10, leçon 1 sur 5
Anatomie : les composants et la mémoire
Nommer les modules d’un agent et choisir les types de mémoire dont il a réellement besoin.
Un agent se décrit comme un cycle de modules. Chacun dépend du précédent : une erreur en entrée se propage à toutes les décisions suivantes.
- Perception : recevoir et nettoyer les entrées (requête, API, journaux, capteurs).
- Raisonnement : évaluer les options.
- Planification : découper l’objectif en étapes et en dépendances.
- Action : exécuter, souvent par un appel d’outil.
- Communication : rendre compte à un humain ou à un autre agent.
- Apprentissage : tirer parti du résultat pour la suite.
Un point mérite d’être nuancé. Dans la plupart des agents LLM actuels, ces modules ne sont pas des composants séparés : raisonnement et planification se passent dans le même appel de modèle. Le découpage sert à penser le système, pas forcément à le coder.
Quatre mémoires
« Mémoire » recouvre des besoins très différents.
- Mémoire de travail : le contexte visible maintenant. Elle est plafonnée, et les performances se dégradent quand on la remplit trop.
- Mémoire sémantique : ce que l’agent sait en général. En pratique, ce sont souvent de simples fichiers Markdown chargés au démarrage.
- Mémoire procédurale : comment faire. Une description courte reste visible, les instructions détaillées ne sont chargées qu’au besoin.
- Mémoire épisodique : ce qui s’est passé. Une transcription brute sert peu ; un résumé des décisions et de leurs leçons sert beaucoup.
Oublier est une fonction
Une mémoire qui ne fait que grossir finit par polluer les décisions. Il faut décider ce qui expire, ce qui est résumé et ce qui est corrigé. Sur des données personnelles, c’est aussi une obligation légale.
Ajoutez une mémoire pour résoudre un problème observé, pas parce que le schéma en compte quatre.
Exemple : Faire tenir des souvenirs dans un budget
La fenêtre de contexte est un budget. Avant chaque appel, l’agent garde les souvenirs les plus utiles qui tiennent, pas tous.
function pickMemories(memories, budget) {
const sorted = [...memories].sort((a, b) => b.score - a.score);
const kept = [];
let used = 0;
for (const memory of sorted) {
if (used + memory.tokens > budget) continue;
kept.push(memory.id);
used += memory.tokens;
}
return kept;
}
const memories = [
{ id: 'refund-policy', score: 0.9, tokens: 300 },
{ id: 'full-transcript', score: 0.8, tokens: 900 },
{ id: 'last-order', score: 0.6, tokens: 100 },
];
pickMemories(memories, 500);
['refund-policy', 'last-order']
La transcription a un bon score mais ne tient pas, alors un souvenir plus petit prend sa place. C’est pour cela qu’une note condensée vaut mieux qu’une conversation sauvegardée.
Essayez dans l’éditeur
// Rough estimate: about 4 characters per token.const countTokens = (message) => Math.ceil(JSON.stringify(message.content).length / 4);function trimContext(messages, maxTokens) { // TODO return messages;}module.exports = { trimContext, countTokens };