同一用户在不同会话中应该能够访问相同的长期记忆。
import com.alibaba.cloud.ai.graph.agent.ReactAgent;
import com.alibaba.cloud.ai.graph.RunnableConfig;
import com.alibaba.cloud.ai.graph.checkpoint.savers.MemorySaver;
import com.alibaba.cloud.ai.graph.store.Store;
import com.alibaba.cloud.ai.graph.store.stores.MemoryStore;
import com.alibaba.cloud.ai.graph.store.StoreItem;
import org.springframework.ai.chat.model.ToolContext;
import org.springframework.ai.tool.ToolCallback;
import org.springframework.ai.tool.function.FunctionToolCallback;
import java.util.*;
import java.util.function.BiFunction;
// 定义请求和响应记录
record SaveMemoryRequest(List<String> namespace, String key, Map<String, Object> value) {}
record GetMemoryRequest(List<String> namespace, String key) {}
record MemoryResponse(String message, Map<String, Object> value) {}
// 创建记忆存储和工具
MemoryStore memoryStore = new MemoryStore();
ToolCallback saveMemoryTool = FunctionToolCallback.builder("saveMemory",
(BiFunction<SaveMemoryRequest, ToolContext, MemoryResponse>) (request, context) -> {
StoreItem item = StoreItem.of(request.namespace(), request.key(), request.value());
RunnableConfig runnableConfig = (RunnableConfig) context.getContext().get("config");
Store store = runnableConfig.store();
store.putItem(item);
return new MemoryResponse("已保存", request.value());
})
.description("保存到长期记忆")
.inputType(SaveMemoryRequest.class)
.build();
ToolCallback getMemoryTool = FunctionToolCallback.builder("getMemory",
(BiFunction<GetMemoryRequest, ToolContext, MemoryResponse>) (request, context) -> {
RunnableConfig runnableConfig = (RunnableConfig) context.getContext().get("config");
Store store = runnableConfig.store();
Optional<StoreItem> itemOpt = store.getItem(request.namespace(), request.key());
return new MemoryResponse(
itemOpt.isPresent() ? "找到" : "未找到",
itemOpt.map(StoreItem::getValue).orElse(Map.of())
);
})
.description("从长期记忆获取")
.inputType(GetMemoryRequest.class)
.build();
ReactAgent agent = ReactAgent.builder()
.name("session_agent")
.model(chatModel)
.tools(saveMemoryTool, getMemoryTool)
.saver(new MemorySaver())
.build();
// 会话1:保存信息
RunnableConfig session1 = RunnableConfig.builder()
.threadId("session_morning")
.addMetadata("user_id", "user_003")
.store(memoryStore)
.build();
agent.invoke(
"记住我的密码是 secret123。用 saveMemory 保存,namespace=['credentials'], key='user_003_password', value={'password': 'secret123'}。",
session1
);
// 会话2:检索信息(不同的线程,同一用户)
RunnableConfig session2 = RunnableConfig.builder()
.threadId("session_afternoon")
.addMetadata("user_id", "user_003")
.store(memoryStore)
.build();
agent.invoke(
"我的密码是什么?用 getMemory 获取,namespace=['credentials'], key='user_003_password'。",
session2
);
// 长期记忆在不同会话间持久化
本文整理自 Spring AI Alibaba 官方文档《记忆管理》:https://java2ai.com/docs/frameworks/agent-framework/advanced/memory

AI项目博客






