메모리
에이전트에 단일 대화를 넘어 지속되는 메모리를 제공하세요. 세션 상태는 현재 대화를 유지합니다. 반면 메모리는 에이전트가 턴 시작 시 읽고 학습한 내용을 다시 기록하는 장기 저장소이므로, 다음 세션에서는 이미 사용자를 알고 있습니다.
이 섹션에서는 처음부터 다음 내용을 살펴봅니다. ADK-Rust가 제공하는 두 가지 메모리 유형, 핵심 타입, 백엔드, 양방향 시간 지식 그래프, 그리고 이 모든 것을 에이전트에 연결하는 방법입니다.
ADK-Rust이 처음이신가요? 먼저 소개와 세션 및 상태를 읽어 보세요. 메모리는 일시적인 세션에 대응하는 영구적인 요소입니다.
두 가지 메모리 유형
ADK-Rust는 동일한 MemoryService 트레이트 뒤에 서로 보완적인 두 가지 메모리 모델을 제공하므로, 에이전트는 하나의 인터페이스를 통해 둘 중 어느 것이든 사용할 수 있습니다:
| 의미 저장소 | 지식 그래프 | |
|---|---|---|
| 형태 | 검색 가능한 텍스트 항목 모음 | 엔터티, 관찰 내용 및 유형이 지정된 관계 |
| 검색 | 항목에 대한 유사성 / 키워드 검색 | 프로필 카드 + 토큰 점수 기반 노드 검색 |
| 가장 적합한 용도 | "X에 대해 무엇을 논의했나요?" | "현재 이 사용자에 대해 무엇이 사실인가요?" |
| 백엔드 | InMemory, SQLite, Postgres, Redis, MongoDB, Neo4j | GraphMemoryService (SQLite, 이중 시간) |
| 페이지 | 개념 · 백엔드 | 지식 그래프 |
전역적으로 하나를 선택할 필요는 없습니다 — transcript 스타일의 회상이 필요한지, 아니면 사용자의 깔끔하고 쿼리 가능한 모델이 필요한지에 따라 에이전트별로 선택하세요.
개념적 모델
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)
- **
MemoryService**는 저장소 백엔드입니다. 항목(또는 그래프 노드)을 저장하고search에 응답합니다. - **
MemoryServiceAdapter**는 이를adk_core::Memory로 래핑하고,(app_name, user_id, project_id?)범위로 지정합니다. 이것이 에이전트의search_memory가 실제로 호출하는 대상입니다. - Runner는
Memory를 보유하고 이를 에이전트에 노출합니다. 메모리 도구를 사용하면 에이전트가 의도적으로 메모리를 검색하고 선별할 수 있습니다.
설치
# 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"] }
| 기능 | 추가 사항 |
|---|---|
| (기본값) | InMemoryMemoryService — 설정 없이 사용 가능, 개발용 |
sqlite-memory | SqliteMemoryService — 파일 기반 의미 저장소 |
graph-memory | GraphMemoryService — 이중 시간 지식 그래프 (SQLite) |
database-memory | PostgresMemoryService 및 pgvector |
redis-memory | RedisMemoryService |
mongodb-memory | MongoMemoryService |
neo4j-memory | Neo4jMemoryService |
60초 빠른 시작
몇 가지 메모리를 저장하고 다시 검색합니다:
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(()) }
실제 에이전트에서는 search을 직접 호출하지 않습니다. 대신 서비스를
Runner에 연결하면 에이전트가 직접 메모리를 회상하고 선별하도록 합니다.