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 :

  1. Injection automatique du contexte + stockage des tours — la couche d’intĂ©gration le fait pour vous.
  2. 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 :

OutilCe 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 GraphMemoryService avec injection/stockage automatiques. Aucun effort de la part de l'agent.
  • Un agent d'apprentissage → GraphMemoryService + outils remember/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 :

SectionSourceLimite
Earlier in this conversation:Les événements de la session précédenteIntegrationConfig::max_history_injection (par défaut 20 tours)
Relevant recalled context:MemoryService::searchIntegrationConfig::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 _session puis 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.

Mémoire dans les sessions Realtime - Documentation ADK-Rust | ADK-Rust