에이전트의 메모리
메모리를 저장하는 것은 이야기의 절반에 불과합니다. 중요한 점은 agent가 이를 사용한다는 것입니다. 즉, 답변하기 전에 관련 컨텍스트를 회상하고, 학습하면서 영구적인 사실을 다시 기록합니다. 두 가지 협력 메커니즘이 있습니다:
- 서비스를 연결하여 agent가 회상할 수 있도록 합니다.
- agent에 도구를 제공하여 의도적으로 검색하고 큐레이션할 수 있도록 합니다.
1. agent에 메모리 연결하기
MemoryService는 (app, user, project?)에 범위가 지정된 MemoryServiceAdapter를 통해 agent가 사용하는 adk_core::Memory 인터페이스에 연결됩니다. 이를 Runner에 연결하면 agent의 search_memory가 백엔드로 전달됩니다:
use adk_memory::{InMemoryMemoryService, MemoryServiceAdapter};
use std::sync::Arc;
let service = Arc::new(InMemoryMemoryService::new());
let memory: Arc<dyn adk_core::Memory> =
Arc::new(MemoryServiceAdapter::new(service.clone(), "support", "alice"));
let runner = Runner::builder()
.agent(agent)
.session_service(sessions)
.memory_service(memory) // ← the agent can now recall
.build()?;
이것이 준비되면 agent는 턴 동안 search_memory(query)를 호출할 수 있지만, 언제 호출할지는 회상을 어떻게 연결하느냐에 달려 있습니다. 이것이 도구가 존재하는 이유입니다.
2. 메모리 도구 (의미 저장소)
adk-tool (feature memory-tools)는 회상을 agent 동작으로 전환하는 두 가지 도구를 제공합니다:
| 도구 | 실행 방식 |
|---|---|
LoadMemoryTool | 에이전트가 회상이 필요하다고 판단할 때 다른 도구와 마찬가지로 호출합니다. |
PreloadMemoryTool | BeforeModelCallback로 실행되며, 모든 턴 시작 시 관련 메모리를 자동 주입합니다. |
use adk_tool::memory::{LoadMemoryTool, PreloadMemoryTool};
let load = LoadMemoryTool::builder()
.memory_service(service.clone())
.max_results(5)
.min_relevance_score(0.3)
.build()?;
let preload = PreloadMemoryTool::builder()
.memory_service(service.clone())
.max_results(3)
.build()?;
let agent = LlmAgentBuilder::new("assistant")
.model(model)
.tool(Arc::new(load)) // on-demand recall
.before_model_callback(preload.into_before_model_callback()) // automatic recall
.build()?;
preload는 "항상 기본을 기억하기 위해" 사용하고, load는 "관련 있을 때 찾아보기 위해" 사용합니다. 전체 참조는 다음을 확인하세요: 메모리 도구.
지식 그래프 도구
백엔드가 GraphMemoryService인 경우, adk-tool (기능 graph-memory-tools)는 에이전트에게 그래프를 스스로 큐레이션할 수 있는 두 가지 도구를 제공합니다. 이는 전사본을 덤프하는 대신 의도적으로 기억하도록 하기 위함입니다:
| 도구 | 모델이 이를 통해 수행하는 작업 | 매핑 대상 |
|---|---|---|
remember (RememberTool) | 엔티티에 대한 영구적인 사실 저장 ("이메일 선호") | create_entities / add_observations |
relate (RelateTool) | 유형화된 관계 기록 ("Alice → works_at → Acme") | create_relations |
그들의 설명은 모델이 안정적이고 재사용 가능한 사실(이름, 선호도, 목표, 관계)을 향하도록 안내하고 잡담에서 벗어나도록 합니다. 개별적으로 또는 도구 세트로 등록하세요:
use adk_tool::memory::{RememberTool, RelateTool, GraphMemoryToolset};
use std::sync::Arc;
let kg = Arc::new(GraphMemoryService::new("sqlite://mem.db").await?);
kg.migrate().await?;
// individually…
let agent = LlmAgentBuilder::new("coach")
.model(model)
.tool(Arc::new(RememberTool::new(kg.clone())))
.tool(Arc::new(RelateTool::new(kg.clone())))
.build()?;
// …or as one toolset
let toolset = GraphMemoryToolset::new(kg.clone());
이를 그래프의 profile_card와 세션 시작 시 주입하면, 사용자가 누구인지 미리 읽고 학습한 내용을 다시 쓰는 에이전트를 얻게 됩니다. — 이는 기억을 현실처럼 느끼게 하는 루프입니다.
실시간 세션에서
동일한 연결 방식은 IntegratedRealtimeRunner를 통해 음성/멀티모달 에이전트에서도 작동합니다. — remember/relate는 실시간 세션으로 자동 연결되며, MemoryService는 연결 시 컨텍스트를 주입하고 턴을 저장합니다. 실시간 → 메모리를 참조하세요.
완전한 패턴
realtime_voice (Mia와 함께하는 마음챙김) 예시는 종단 간 참조입니다: 파일 기반 GraphMemoryService는 Mia의 장기 기억이며; 그녀의 프로필 카드는 세션 시작 시 주입됩니다; 그녀는 remember/relate를 통해 대화 중에 사실을 큐레이션하고; 라이브 패널은 동일한 그래프를 읽고 씁니다. 이 페이지의 모든 부분이 함께 작동하는 것을 보려면 읽어보세요.
← 메모리 개요로 돌아가기