Mémoire dans les sessions Realtime
Une voix qui vous oublie entre deux appels donne lâimpression dâun kiosque. ADK-Rust permet Ă un agent realtime de se souvenir â de se rappeler ce quâil a appris sur un utilisateur avant de parler, et de sĂ©lectionner de nouveaux faits en cours de conversation â en branchant un MemoryService dans le IntegratedRealtimeRunner.
Il existe deux mécanismes coopératifs :
- Injection automatique du contexte + stockage des tours â la couche dâintĂ©gration le fait pour vous.
- MĂ©moire curĂ©e par lâagent via des outils â lâagent dĂ©cide ce qui mĂ©rite dâĂȘtre conservĂ©, Ă lâaide dâoutils de graphe de connaissances reliĂ©s.
1. Injection et stockage automatiques
Attachez un MemoryService et le runner gĂšre lâaller-retour :
let runner = IntegratedRealtimeRunner::builder()
.model(model)
.config(config)
.identity("support", &user_id, &session_id)
.session_service(sessions)
.memory_service(memory.clone())
.integration_config(IntegrationConfig {
inject_memory_context: true, // query memory at connect
max_memory_injection: 10, // cap injected items
store_to_memory: true, // write each completed turn back
persist_transcripts: true,
})
.build()?;
- Ă la connexion, la mĂ©moire est interrogĂ©e pour lâutilisateur et les rĂ©sultats sont intĂ©grĂ©s au contexte de la session, de sorte que lâagent le salue en connaissant dĂ©jĂ lâhistorique pertinent.
- à chaque tour, les échanges terminés sont réécrits dans la mémoire (lorsque
store_to_memory), afin que la session suivante sâappuie sur celle-ci.
Nâimporte quel MemoryService fonctionne â celui en mĂ©moire pour le dĂ©veloppement, ou le backend de graphe de connaissances ci-dessous.
2. Le backend de graphe de connaissances
adk-memory's GraphMemoryService stocke la mĂ©moire comme un graphe de connaissances bi-temporel : des entitĂ©s et des relations, chacune suivie selon le temps dâĂ©vĂ©nement (quand câĂ©tait vrai) et le temps dâingestion (quand le systĂšme lâa appris). Cela signifie que lâagent peut rĂ©pondre à « quel est le plan actuel de lâutilisateur ? » sans buter sur le fait quâil a pu ĂȘtre autrefois diffĂ©rent â les faits remplacĂ©s restent dans lâhistorique au lieu dâĂ©craser le prĂ©sent.
use adk_memory::GraphMemoryService;
use std::sync::Arc;
let kg = Arc::new(GraphMemoryService::new(/* backing store */));
Passez cela comme le memory_service et lâinjection automatique ci-dessus sâappuie dĂ©sormais sur le graphe.
3. Laisser lâagent organiser la mĂ©moire
Le schĂ©ma le plus puissant : donner Ă lâagent des outils pour Ă©crire directement dans le graphe, afin quâil se souvienne de maniĂšre dĂ©libĂ©rĂ©e plutĂŽt que de tout vider dans la transcription. adk-tool
(fonctionnalité graph-memory-tools) en fournit deux qui se branchent directement dans une session realtime :
| Outil | Ce que lâagent en fait |
|---|---|
RememberTool (remember) | Stocker un fait saillant (« prĂ©fĂšre lâe-mail au tĂ©lĂ©phone »). |
RelateTool (relate) | Relier deux entitĂ©s (« Order A-10293 â belongs-to â cet utilisateur »). |
Reliez-les avec .adk_tool(...) (voir Tools) :
use adk_tool::{RememberTool, RelateTool};
let runner = IntegratedRealtimeRunner::builder()
.model(model).config(config)
.identity("support", &user_id, &session_id)
.memory_service(kg.clone())
.adk_tool(Arc::new(RememberTool::new(kg.clone())))
.adk_tool(Arc::new(RelateTool::new(kg)))
.build()?;
Puis demandez Ă l'agent de les utiliser :
When you learn a durable fact about the customer (a preference, an account
detail, a decision), call `remember` to store it. Use `relate` to link orders
or items to the customer. Recall naturally â don't announce that you're saving.
La remĂ©moration est basĂ©e sur les jetons : le graphe renvoie les entitĂ©s/relations les plus pertinentes pour la conversation, bornĂ©es par max_memory_injection, afin que le contexte reste petit mĂȘme lorsque le graphe grandit.
Choisir une profondeur
- DĂ©mo sans Ă©tat â pas de
memory_service. Chaque session repart de zĂ©ro. - ContinuitĂ© entre les sessions â en mĂ©moire ou
GraphMemoryServiceavec injection/stockage automatiques. Aucun effort de la part de l'agent. - Un agent d'apprentissage â
GraphMemoryService+ outilsremember/relate, afin que l'agent construise un modĂšle propre et interrogeable de l'utilisateur plutĂŽt qu'une pile de transcription.
L'exemple de coaching MIA utilise le graphe + les outils afin que le coach se souvienne des objectifs et des préférences de l'utilisateur entre les sessions ; voir Examples.
Suivant : Building web apps â
Ce qui est repris dans une session reprise
IntegratedRealtimeRunner::connect construit un bloc de contexte et le préfixe à l'instruction systÚme avant la création de la session du fournisseur :
| Section | Source | Limite |
|---|---|---|
Earlier in this conversation: | Les événements de la session précédente | IntegrationConfig::max_history_injection (par défaut 20 tours) |
Relevant recalled context: | MemoryService::search | IntegrationConfig::max_memory_injection (par défaut 10 entrées) |
Les deux sont bornĂ©s, car lâinstruction est envoyĂ©e une fois Ă la crĂ©ation de la session et compte
dans le contexte du modÚle. Chaque tour est rendu comme role: text, tronqué à 400 caractÚres, et
les tours sans texte sont supprimés. Définir une borne à zéro désactive cette section.
IntegratedRealtimeRunner::instruction() renvoie ce avec quoi la session a été créée, de sorte que le
contexte transmis puisse ĂȘtre affirmĂ© plutĂŽt quâinfĂ©rĂ© :
runner.connect().await?;
let instruction = runner.instruction().await.unwrap_or_default();
assert!(instruction.contains("Relevant recalled context"));
Important : ce contexte avait dĂ©jĂ Ă©tĂ© chargĂ© puis supprimĂ© â la session prĂ©cĂ©dente avait Ă©tĂ© rĂ©cupĂ©rĂ©e dans
_sessionpuis supprimĂ©e, et la branche mĂ©moire a journalisĂ© « injecting memory entries into session context » Ă cĂŽtĂ© dâun commentaire indiquant que lâinjection Ă©tait une amĂ©lioration future. Une session reprise ne commençait avec ni lâun ni lâautre, alors que les journaux disaient le contraire.