AI项目博客
记录 AI 工程实践与大模型应用

Spring AI Alibaba 61|记忆管理 · 跨会话记忆

同一用户在不同会话中应该能够访问相同的长期记忆。

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

赞(0)
未经允许不得转载:AI项目博客 » Spring AI Alibaba 61|记忆管理 · 跨会话记忆

评论 抢沙发

AI项目博客

专注 AI 工程化落地 —— 覆盖智能体、大模型、Java AI 与 Python 的学习笔记,以及 AI 平台的项目实战记录。

关于本站文章归档

登录

找回密码

注册