Le plus gros dĂ©fi avec les LLMs, câest quâils sont fondamentalement « stateless ». Sans une couche de gestion de session et de mĂ©moire, chaque requĂȘte est une page blanche. Pour un dĂ©veloppeur, la difficultĂ© est de savoir quoi stocker, oĂč le stocker et combien de temps le garder.
Pour transformer un simple chatbot en un agent intelligent, il faut mettre en place une architecture de contexte. Agent Development Kit (ADK) de Google répond à ce besoin en structurant la persistance autour de trois piliers : la Session, le State et la Memory.
En maĂźtrisant ces concepts, vous permettez Ă votre agent dâapprendre de ses interactions et de devenir plus pertinent au fil du temps, tout en gĂ©rant intelligemment la fenĂȘtre de contexte limitĂ©e des modĂšles.
đïž Architecture du contexte dans ADK
đŠ Session, State et Memory
Il est crucial de diffĂ©rencier ces trois piliers pour ne pas surcharger la mĂ©moire de travail de lâagent :
- « Session » : Le conteneur de la discussion actuelle (le « thread »). Elle contient la liste chronologique des événements.
- « State » : Le « bloc-notes » temporaire. On y stocke des donnĂ©es de travail (ex: un panier dâachat) qui disparaissent ou sâarchivent Ă la fin de la discussion.
- « Memory » : La bibliothĂšque dâarchives inter-sessions. Elle est consultable via une recherche sĂ©mantique pour ramener du contexte passĂ© dans le prĂ©sent.
đ§ MĂ©moire court-terme vs long-terme
Pour concevoir un agent performant, il faut séparer les flux comme le fait le cerveau humain :
- Short-Term Memory (Sessions & State) : MĂ©moire de travail active uniquement durant la conversation en cours . Elle sert Ă suivre la progression ou stocker des calculs intermĂ©diaires. Une fois la session fermĂ©e, cette mĂ©moire disparaĂźt (ou est envoyĂ©e vers lâarchivage).
- Long-Term Memory (Memory Bank) : Elle ne contient pas le texte brut, mais des faits consolidĂ©s (ex: « Lâutilisateur prĂ©fĂšre Python »). Lâagent consulte cette archive au dĂ©but de chaque nouvelle session pour ne pas repartir de zĂ©ro.
đ SessionService : Garantir la continuitĂ©
Lâobjet Session est le composant fondamental du suivi. Sans lui, chaque interaction repartirait de zĂ©ro.
Une session se définit par plusieurs propriétés clés :
- Identification : Elle lie un identifiant unique (
id), un nom dâapplication (app_name) et un identifiant utilisateur (userId). - Historique (
events) : Une sĂ©quence chronologique de tous les objets Event (messages utilisateur, rĂ©ponses de lâagent, appels dâoutils) survenue dans ce thread. - Ătat (
state) : Un dictionnaire de donnĂ©es temporaires servant de « bloc-notes » Ă lâagent durant lâinteraction. - Suivi dâactivitĂ© (
lastUpdateTime) : Un horodatage indiquant la derniĂšre interaction dans la session.

Le choix du service dépend de votre besoin de persistance et de contrÎle :
| Service | Persistance | Usage recommandé |
|---|---|---|
| InMemorySessionService | Nulle | Développement local et tests unitaires. |
| VertexAiSessionService | ĂlevĂ©e | Production managĂ©e sur Google Cloud. |
| DatabaseSessionService | ĂlevĂ©e | ContrĂŽle total sur votre propre base (PostgreSQL, SQLite). |
đĄ Le Rewind : Annuler et corriger
Le Rewind permet de faire revenir une session à un état précédent via un
invocation_id. Cela restaure le State tel quâil Ă©tait avant une erreur de lâagent, permettant de repartir sur une base saine sans perdre tout lâhistorique.
đ State : Le bloc-notes dynamique de lâagent
Dans ADK, lâattribut state dâune session est un dictionnaire clĂ©-valeur servant de mĂ©moire de travail. Contrairement Ă lâhistorique complet des Ă©vĂ©nements, il stocke des dĂ©tails structurĂ©s nĂ©cessaires au tour de conversation actuel (ex: statut dâauthentification, Ă©tape dâun formulaire).
đĄ Gestion de la portĂ©e via les prĂ©fixes
ADK utilise des préfixes pour définir automatiquement la visibilité et la durée de vie des données:
| PrĂ©fixe | PortĂ©e (Scope) | Persistance | Cas dâusage |
|---|---|---|---|
| Aucun | Session actuelle | LiĂ©e au service de session | Ătape dâun tunnel dâachat. |
| user: | Identité utilisateur | Partagée entre toutes ses sessions | Préférences, nom. |
| app: | Application globale | Partagée entre tous les utilisateurs | Version API, code promo. |
| temp: | Invocation en cours | ĂphĂ©mĂšre (effacĂ©e aprĂšs la rĂ©ponse) | Calculs intermĂ©diaires. |
Exemple dâutilisation
# The ADK automatically replaces {user:name} with the value found in state
agent = adk.LlmAgent(
instruction="Greet the user by saying: Hello {user:name}!"
)
# Updating state within a tool safely
@adk.tool
async def set_preference(color: str, context: adk.ToolContext):
context.state["user:fav_color"] = color # Captured and persisted automatically
return f"Preference saved."
đ§ MemoryService : Choisir son moteur de connaissances
Dans ADK, le MemoryService est lâinterface qui gĂšre lâarchivage et la rĂ©cupĂ©ration des connaissances Ă long terme. Sa mission est double : ingĂ©rer les informations pertinentes dâune session terminĂ©e (add_session_to_memory) et permettre Ă lâagent de les retrouver via une recherche (search_memory).
Il existe deux implémentations principales selon vos besoins en persistance et en intelligence :
| Caractéristique | InMemoryMemoryService | VertexAiMemoryBankService |
|---|---|---|
| Persistance | Nulle (perdue au redĂ©marrage) | ĂlevĂ©e (ManagĂ©e par Vertex AI) |
| Extraction | Stocke lâhistorique brut | Intelligente (extraite et consolidĂ©e par LLM) |
| Type de recherche | Mots-clés basiques | Sémantique avancée (Embeddings) |
| Usage idéal | Prototypage et tests rapides | Production et apprentissage continu |
đ Le workflow complet
Pour bien comprendre comment ces composants interagissent, voici le cycle de vie dâune information, de sa captation Ă sa rĂ©utilisation:
- Interaction : Lâutilisateur Ă©change avec lâagent via une Session. Chaque message et action est enregistrĂ© comme un Event, et le State gĂšre les donnĂ©es de travail immĂ©diates.
- Archivage : Lorsquâune session est jugĂ©e riche en informations, lâapplication appelle
add_session_to_memory(session). Le systĂšme extrait les faits marquants de lâhistorique et les consolide dans leMemoryService. - MĂ©moire : Dans une session future, lâagent utilise un outil dĂ©diĂ© (
LoadMemoryToolouPreloadMemoryTool) sâil dĂ©tecte un besoin de contexte passĂ©. - Recherche SĂ©mantique : Lâoutil interroge le service de mĂ©moire (
search_memory). Sâil sâagit de la Memory Bank, une recherche par similaritĂ© vectorielle est effectuĂ©e pour trouver les souvenirs les plus proches du sens de la requĂȘte. - Restitution & RĂ©ponse : Le service renvoie les souvenirs pertinents (
MemoryResult). Lâagent les intĂšgre alors dans ses instructions systĂšme pour formuler une rĂ©ponse personnalisĂ©e et historiquement cohĂ©rente.
đ€ Vers une IA qui apprend vraiment
En maĂźtrisant ce trio, Session, State et Memory, vous sortez enfin du mode âstatelessâ des LLM. Cette architecture, propulsĂ©e par ADK et Google Cloud, garantit que vos agents ne se contentent pas de rĂ©pondre, mais sâadaptent et valorisent chaque interaction sur le long terme.