Agent 中的记忆
存储记忆只是故事的一半;关键在于 agent 会使用它——在回答之前回忆相关上下文,并在学习时将持久性事实写回。有两种协同机制:
- 附加服务 以便 agent 可以回忆。
- 赋予 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 在对话中整理事实;并且一个实时面板读写相同的图。阅读它以了解本页上的每个部分如何协同工作。
← 返回 记忆概述