에이전트의 메모리

메모리를 저장하는 것은 이야기의 절반에 불과합니다. 중요한 점은 agent가 이를 사용한다는 것입니다. 즉, 답변하기 전에 관련 컨텍스트를 회상하고, 학습하면서 영구적인 사실을 다시 기록합니다. 두 가지 협력 메커니즘이 있습니다:

  1. 서비스를 연결하여 agent가 회상할 수 있도록 합니다.
  2. 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에이전트가 회상이 필요하다고 판단할 때 다른 도구와 마찬가지로 호출합니다.
PreloadMemoryToolBeforeModelCallback로 실행되며, 모든 턴 시작 시 관련 메모리를 자동 주입합니다.
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를 통해 대화 중에 사실을 큐레이션하고; 라이브 패널은 동일한 그래프를 읽고 씁니다. 이 페이지의 모든 부분이 함께 작동하는 것을 보려면 읽어보세요.

메모리 개요로 돌아가기