메모리 백엔드
모든 백엔드는 동일한 MemoryService trait를 구현하므로,
기능 플래그를 활성화하고 구성하여 하나를 선택합니다. Agent 코드는 변경되지 않습니다. 총 여섯 가지가 있습니다.
한눈에 보기
| 백엔드 | 기능 | 영속성 | 검색 | 사용 시점 |
|---|---|---|---|---|
InMemoryMemoryService | (기본값) | 프로세스 내에서만 | 키워드 | 개발, 테스트, 데모 |
SqliteMemoryService | sqlite-memory | 파일 | 키워드 | 단일 노드 앱, 로컬 영속성 |
PostgresMemoryService | database-memory | Postgres + pgvector | 벡터 유사성 | 프로덕션 시맨틱 검색 |
RedisMemoryService | redis-memory | Redis (선택 사항 TTL) | 키워드 | 빠르고, 일시적이며, 공유 캐시 |
MongoMemoryService | mongodb-memory | MongoDB | 키워드 / 벡터 | 기존 Mongo 인프라 |
Neo4jMemoryService | neo4j-memory | Neo4j | 그래프 | 기존 Neo4j 인프라 |
(bi-temporal **GraphMemoryService**는 일곱 번째이며, 별도의 페이지에서 다룹니다 —
Knowledge graph.)
InMemory — 여기부터 시작
설정 없음. 모든 것이 프로세스 내에 존재하며 종료 시 사라집니다.
use adk_memory::InMemoryMemoryService;
let memory = InMemoryMemoryService::new();
개발 및 테스트 스위트에 완벽합니다. 트레이트가 동일하므로 한 줄 변경으로 영구적인 백엔드로 교체할 수 있습니다.
SQLite — 파일
영구적이고, 단일 파일이며, 서버가 없습니다. 데스크톱 앱 및 단일 노드 서비스에 적합합니다.
use adk_memory::SqliteMemoryService;
let memory = SqliteMemoryService::new("sqlite://memory.db").await?;
// or build from an existing pool: SqliteMemoryService::from_pool(pool)
Postgres + pgvector — 프로덕션 시맨틱 검색
실제 유사성 검색을 위한 백엔드입니다. pgvector에 embeddings를 저장하고 인덱스 전략을 선택할 수 있습니다.
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는 정확한 (무차별 대입) 검색을 수행합니다 — 작은 세트에 적합합니다;
Hnsw (기본값) 및 IvfFlat는 큰 세트로 확장됩니다. Vector search에는
embedding provider가 필요합니다.
Redis, MongoDB, Neo4j
이미 인프라를 운영 중인 경우 다음을 사용하세요:
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(...) 및 Neo4jMemoryService::new(...)는 동일한
형태를 따릅니다. 이들 모두 Concepts의 (app, user, project) 격리를 준수합니다.
Embeddings
vector 유사성을 수행하는 백엔드(Postgres, 선택적으로 Mongo)는 텍스트를 vectors로 변환해야 합니다. EmbeddingProvider를 제공하세요:
#[async_trait]
pub trait EmbeddingProvider: Send + Sync {
async fn embed(&self, texts: &[String]) -> Result<Vec<Vec<f32>>>;
}
Keyword 백엔드(InMemory, SQLite, Redis)는 필요하지 않습니다. 인덱싱하는 embedding model과 쿼리하는 embedding model을 일치시키세요.
마이그레이션
SQL 기반 서비스는 스키마를 생성하고 업그레이드하기 위해 버전 관리되는 멱등성 마이그레이션을 실행하므로, 새 버전을 배포할 때 수동 DDL이 필요하지 않습니다. 시작 시 서비스의 migrate()를 호출하세요 (또는 생성자가 처리하도록 하세요).
선택
- 구축 / 테스트 → InMemory.
- 단일 노드, 영구적으로 유지하고 싶다면 → SQLite.
- 대규모 실제 semantic recall → Postgres + pgvector.
- 이미 Redis / Mongo / Neo4j를 운영 중이라면 → 해당 백엔드.
- 사용자의 쿼리 가능한 모델을 원하고, 대화 기록이 아니라면 →
GraphMemoryService.