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

BackendCaracterísticaPersistenciaBúsquedaUsar cuando
InMemoryMemoryService(predeterminado)Solo procesoKeywordDesarrollo, pruebas, demos
SqliteMemoryServicesqlite-memoryUn archivoKeywordAplicaciones de nodo único, persistencia local
PostgresMemoryServicedatabase-memoryPostgres + pgvectorSimilitud vectorialBúsqueda semántica de producción
RedisMemoryServiceredis-memoryRedis (TTL opcional)KeywordCaché rápido, efímero, compartido
MongoMemoryServicemongodb-memoryMongoDBKeyword / vectorInfraestructura Mongo existente
Neo4jMemoryServiceneo4j-memoryNeo4jGrafoInfraestructura 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)

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ónGraphMemoryService.

Siguiente: Grafo de conocimiento →

Backends de Memoria - Documentación ADK-Rust | ADK-Rust