메모리

에이전트에 단일 대화를 넘어 지속되는 메모리를 제공하세요. 세션 상태는 현재 대화를 유지합니다. 반면 메모리는 에이전트가 턴 시작 시 읽고 학습한 내용을 다시 기록하는 장기 저장소이므로, 다음 세션에서는 이미 사용자를 알고 있습니다.

이 섹션에서는 처음부터 다음 내용을 살펴봅니다. ADK-Rust가 제공하는 두 가지 메모리 유형, 핵심 타입, 백엔드, 양방향 시간 지식 그래프, 그리고 이 모든 것을 에이전트에 연결하는 방법입니다.

ADK-Rust이 처음이신가요? 먼저 소개세션 및 상태를 읽어 보세요. 메모리는 일시적인 세션에 대응하는 영구적인 요소입니다.

두 가지 메모리 유형

ADK-Rust는 동일한 MemoryService 트레이트 뒤에 서로 보완적인 두 가지 메모리 모델을 제공하므로, 에이전트는 하나의 인터페이스를 통해 둘 중 어느 것이든 사용할 수 있습니다:

의미 저장소지식 그래프
형태검색 가능한 텍스트 항목 모음엔터티, 관찰 내용 및 유형이 지정된 관계
검색항목에 대한 유사성 / 키워드 검색프로필 카드 + 토큰 점수 기반 노드 검색
가장 적합한 용도"X에 대해 무엇을 논의했나요?""현재 이 사용자에 대해 무엇이 사실인가요?"
백엔드InMemory, SQLite, Postgres, Redis, MongoDB, Neo4jGraphMemoryService (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가 실제로 호출하는 대상입니다.
  • RunnerMemory를 보유하고 이를 에이전트에 노출합니다. 메모리 도구를 사용하면 에이전트가 의도적으로 메모리를 검색하고 선별할 수 있습니다.

설치

# 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-memorySqliteMemoryService — 파일 기반 의미 저장소
graph-memoryGraphMemoryService — 이중 시간 지식 그래프 (SQLite)
database-memoryPostgresMemoryServicepgvector
redis-memoryRedisMemoryService
mongodb-memoryMongoMemoryService
neo4j-memoryNeo4jMemoryService

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에 연결하면 에이전트가 직접 메모리를 회상하고 선별하도록 합니다.

다음 단계

  1. 개념MemoryEntry, MemoryService 트레이트, 검색, 프로젝트 범위 지정, GDPR 삭제.
  2. 백엔드 — 6가지 저장소, 기능 플래그 및 선택 방법.
  3. 지식 그래프GraphMemoryService 및 이중 시간성이 중요한 이유.
  4. 도구 및 에이전트 — 에이전트에 메모리 연결하기; remember/relate 및 메모리 도구.