Memoria
Dota a tus agentes de una memoria que sobreviva a una sola conversación. El estado de la sesión mantiene esta conversación; la memoria es el almacenamiento a largo plazo que un agente lee al inicio de un turno y al que escribe a medida que aprende, de modo que la siguiente sesión ya conozca al usuario.
Esta sección te guía desde cero: los dos tipos de memoria que ofrece ADK-Rust, los tipos principales, los backends, el grafo de conocimiento bi-temporal y cómo integrarlo todo en un agente.
¿Es tu primera vez con ADK-Rust? Lee primero la Introducción y Sesiones y estado: la memoria es la contraparte persistente de la sesión efímera.
Dos tipos de memoria
ADK-Rust incluye dos modelos de memoria complementarios detrás del mismo
trait MemoryService, para que un agente pueda usar cualquiera de ellos mediante una única interfaz:
| Almacén semántico | Grafo de conocimiento | |
|---|---|---|
| Forma | Un conjunto de entradas de texto consultables | Entidades, observaciones y relaciones tipadas |
| Recuperación | Búsqueda por similitud o palabras clave en las entradas | Tarjeta de perfil + búsqueda de nodos puntuada por tokens |
| Ideal para | «¿Qué hablamos sobre X?» | «¿Qué es cierto sobre este usuario ahora?» |
| Backends | InMemory, SQLite, Postgres, Redis, MongoDB, Neo4j | GraphMemoryService (SQLite, bitemporal) |
| Página | Conceptos · Backends | Grafo de conocimiento |
No tienes que elegir de forma global: selecciona por agente según necesites una recuperación al estilo de una transcripción o un modelo del usuario limpio y consultable.
El modelo mental
Agent turn
│ search_memory(query) ← recall relevant context at turn start
▼
adk_core::Memory ← the interface the agent sees
│ (MemoryServiceAdapter bridges to…)
▼
MemoryService ← add_session / search / delete_user …
├─ InMemoryMemoryService (dev)
├─ Sqlite/Postgres/Redis/… (semantic store)
└─ GraphMemoryService (bi-temporal knowledge graph)
- Un
MemoryServicees el backend de almacenamiento: almacena entradas (o nodos del grafo) y responde asearch. - Un
MemoryServiceAdapterlo envuelve como unadk_core::Memory, delimitado a un(app_name, user_id, project_id?), que es lo que realmente invoca elsearch_memoryde un agente. - El Runner contiene el
Memoryy lo expone al agente; las herramientas de memoria permiten al agente buscar y seleccionar memoria deliberadamente.
Instalación
# Semantic store — pick the backend you need
adk-memory = { version = "2.1.0", features = ["sqlite-memory"] }
# Bi-temporal knowledge graph
adk-memory = { version = "2.1.0", features = ["graph-memory"] }
| Función | Añade |
|---|---|
| (predeterminado) | InMemoryMemoryService — sin configuración, para desarrollo |
sqlite-memory | SqliteMemoryService — almacén semántico respaldado por archivos |
graph-memory | GraphMemoryService — grafo de conocimiento bitemporal (SQLite) |
database-memory | PostgresMemoryService con pgvector |
redis-memory | RedisMemoryService |
mongodb-memory | MongoMemoryService |
neo4j-memory | Neo4jMemoryService |
Inicio rápido en 60 segundos
Almacena un par de recuerdos y búscalos de nuevo:
use adk_memory::{InMemoryMemoryService, MemoryService, MemoryEntry, SearchRequest};
use adk_core::Content;
use chrono::Utc;
# async fn run() -> anyhow::Result<()> {
let memory = InMemoryMemoryService::new();
memory.add_session("support", "alice", "s1", vec![
MemoryEntry { content: Content::new("user").with_text("I prefer email over phone"),
author: "user".into(), timestamp: Utc::now() },
]).await?;
let hits = memory.search(SearchRequest {
app_name: "support".into(), user_id: "alice".into(),
query: "how should we contact this customer?".into(),
..Default::default()
}).await?;
for entry in hits.entries { println!("{:?}", entry.content); }
# Ok(()) }
En un agente real, no llamas a search manualmente; conectas el servicio al
Runner y dejas que el agente recuerde y organice la memoria por sí mismo.
Qué hacer a continuación
- Conceptos —
MemoryEntry, el traitMemoryService, búsqueda, delimitación por proyecto y eliminación conforme al RGPD. - Backends — los seis almacenes, las marcas de funcionalidades y cómo elegir.
- Grafo de conocimiento —
GraphMemoryServicey por qué es importante la temporalidad bitemporal. - Herramientas y agentes — integración de la memoria en los agentes;
remember/relatey las herramientas de memoria.