Agent 中的记忆

存储记忆只是故事的一半;关键在于 agent 会使用它——在回答之前回忆相关上下文,并在学习时将持久性事实写回。有两种协同机制:

  1. 附加服务 以便 agent 可以回忆。
  2. 赋予 agent 工具 以便它可以有意识地搜索和管理。

1. 将记忆附加到 agent

一个 MemoryService 通过 MemoryServiceAdapter 桥接到 agent 使用的 adk_core::Memory 接口,作用域限定为 (app, user, project?)。将其附加到 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(功能 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结合,你将得到一个能够预先读取用户身份并写入所学内容的Agent——这个循环让记忆变得真实。

实时会话中

同样的连接方式也适用于通过 IntegratedRealtimeRunner 的语音/多模态Agent—— remember/relate 会自动桥接到实时会话中,并且 MemoryService 在连接时注入上下文并存储轮次。参见 实时 → 记忆

一个完整的模式

realtime_voice (与 Mia 的正念) 示例是端到端的参考:一个文件支持的 GraphMemoryService 是 Mia 的长期记忆;她的个人资料卡在会话开始时注入;她通过 remember/relate 在对话中整理事实;并且一个实时面板读写相同的图。阅读它以了解本页上的每个部分如何协同工作。

← 返回 记忆概述