Backends de Memoria
Todos los backends implementan el mismo trait MemoryService, por lo que lo eliges habilitando una feature flag y construyéndolo — tu código de agent no cambia. Hay seis.
De un vistazo
| Backend | Característica | Persistencia | Búsqueda | Usar cuando |
|---|---|---|---|---|
InMemoryMemoryService | (predeterminado) | Solo proceso | Keyword | Desarrollo, pruebas, demos |
SqliteMemoryService | sqlite-memory | Un archivo | Keyword | Aplicaciones de nodo único, persistencia local |
PostgresMemoryService | database-memory | Postgres + pgvector | Similitud vectorial | Búsqueda semántica de producción |
RedisMemoryService | redis-memory | Redis (TTL opcional) | Keyword | Caché rápido, efímero, compartido |
MongoMemoryService | mongodb-memory | MongoDB | Keyword / vector | Infraestructura Mongo existente |
Neo4jMemoryService | neo4j-memory | Neo4j | Grafo | Infraestructura Neo4j existente |
(El GraphMemoryService bitemporal es un séptimo, cubierto en su propia página — Grafo de conocimiento.)
InMemory — empieza aquí
Configuración cero. Todo reside en el proceso y desaparece al salir.
use adk_memory::InMemoryMemoryService;
let memory = InMemoryMemoryService::new();
Perfecto para el desarrollo y el conjunto de pruebas; cámbialo por un backend duradero con un cambio de una sola línea porque el trait es idéntico.
SQLite — un archivo
Duradero, de un solo archivo, sin servidor. Ideal para aplicaciones de escritorio y servicios de nodo único.
use adk_memory::SqliteMemoryService;
let memory = SqliteMemoryService::new("sqlite://memory.db").await?;
// or build from an existing pool: SqliteMemoryService::from_pool(pool)
Postgres + pgvector — búsqueda semántica de producción
El backend para una verdadera búsqueda de similitud. Almacena embeddings en pgvector y te permite elegir la estrategia de índice.
use adk_memory::{PostgresMemoryService, VectorIndexType};
let memory = PostgresMemoryService::builder(pool, embedding_provider)
.vector_index(VectorIndexType::Hnsw { m: 32, ef_construction: 128 }) // or IvfFlat / None
.build()
.await?;
VectorIndexType::None realiza una búsqueda exacta (de fuerza bruta) — ideal para conjuntos pequeños;
Hnsw (el predeterminado) y IvfFlat escalan a conjuntos grandes. La búsqueda vectorial necesita un
proveedor de incrustaciones.
Redis, MongoDB, Neo4j
Utilice estos cuando ya ejecute la infraestructura:
use adk_memory::{RedisMemoryService, RedisMemoryConfig};
use std::time::Duration;
let memory = RedisMemoryService::new(RedisMemoryConfig {
url: "redis://localhost:6379".into(),
ttl: Some(Duration::from_secs(60 * 60 * 24 * 30)), // optional expiry
}).await?;
MongoMemoryService::new(...) y Neo4jMemoryService::new(...) siguen la misma
forma. Todos ellos respetan el aislamiento de (app, user, project) de
Conceptos.
Incrustaciones
Los backends que realizan similitud vectorial (Postgres, opcionalmente Mongo) necesitan convertir
texto en vectores. Proporcione un EmbeddingProvider:
#[async_trait]
pub trait EmbeddingProvider: Send + Sync {
async fn embed(&self, texts: &[String]) -> Result<Vec<Vec<f32>>>;
}
Los backends de palabras clave (InMemory, SQLite, Redis) no necesitan uno. Haga coincidir el modelo de incrustación con el que indexa con el que consulta.
Migraciones
Los servicios basados en SQL ejecutan migraciones versionadas e idempotentes para crear y
actualizar su esquema, por lo que desplegar una nueva versión no requiere DDL manual. Llame
al migrate() del servicio (o deje que la construcción lo maneje) al inicio.
Elección
- Construcción / pruebas → InMemory.
- Un nodo, desea que persista → SQLite.
- Recuperación semántica real a escala → Postgres + pgvector.
- Ya ejecuta Redis / Mongo / Neo4j → ese backend.
- Desea un modelo consultable del usuario, no una transcripción →
GraphMemoryService.
Siguiente: Grafo de conocimiento →