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

Spring AI Alibaba 92|Graph Core · 为图添加持久化 · 完整示例:带工具调用的持久化对话

import com.alibaba.cloud.ai.graph.*;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.model.function.FunctionCallbackWrapper;

public class PersistenceExample {

    private static final Logger log = LoggerFactory.getLogger(PersistenceExample.class);

    public static void main(String[] args) {
        // 1. 配置状态策略
        KeyStrategyFactory keyStrategyFactory = () -> {
            HashMap<String, KeyStrategy> strategies = new HashMap<>();
            strategies.put("messages", new AppendStrategy());
            strategies.put("user_name", new ReplaceStrategy());
            return strategies;
        };

        // 2. 创建工具和节点
        SearchTool searchTool = new SearchTool();
        ChatClient.Builder builder = ChatClient.builder(chatModel);
        var agentNode = nodeasync(new AgentNode(builder, searchTool));

        // 3. 构建 Graph
        StateGraph workflow = new StateGraph(keyStrategyFactory)
            .addNode("agent", agentNode)
            .addEdge(StateGraph.START, "agent")
            .addEdge("agent", StateGraph.END);

        // 4. 配置持久化
        var checkpointer = new MemorySaver();
        var compileConfig = CompileConfig.builder()
            .checkpointSaver(checkpointer)
            .build();

        CompiledGraph graph = workflow.compile(compileConfig);

        // 5. 测试持久化对话
        var config = RunnableConfig.builder()
            .threadId("demo-session")
            .build();

        // 第一轮对话
        graph.invoke(Map.of("messages", "Hi, I'm Charlie"), config);

        // 第二轮对话 - 能记住名字
        var result = graph.invoke(Map.of("messages", "What's my name?"), config);
        log.info("Response: {}", result.data().get("messages"));

        // 第三轮对话 - 使用工具
        result = graph.invoke(Map.of("messages", "What's the weather like?"), config);
        log.info("Response: {}", result.data().get("messages"));

        // 查看状态历史
        List<StateSnapshot> history = graph.getStateHistory(config);
        log.info("Total conversation steps: {}", history.size());
    }
}
特性 说明
会话隔离 使用不同的 threadId 创建独立的会话
状态恢复 相同 threadId 可以恢复之前的状态
历史追踪 可以查看状态的历史版本
工具调用记忆 持久化包括工具调用的历史
内存高效 MemorySaver 适合开发和测试
可扩展 可以实现自定义 Checkpointer 用于持久化存储
  1. 多轮对话系统: 记住用户的上下文和偏好
  2. 客服机器人: 跨会话跟踪客户问题
  3. 工作流状态恢复: 长时间运行的任务可以中断和恢复
  4. A/B 测试: 比较不同会话的处理结果
  5. 审计和调试: 追踪完整的对话历史
特性 无持久化 有持久化 (MemorySaver)
记忆能力 ❌ 每次调用独立 ✅ 跨调用记忆
会话隔离 N/A ✅ 通过 threadId
状态恢复 ❌ 不支持 ✅ 支持
历史查询 ❌ 不支持 ✅ 支持
适用场景 单次查询 多轮对话
  • 等待用户输入 – 中断和恢复示例
  • 时光旅行 – 状态历史导航
  • 快速入门 – Graph 基础使用

本文整理自 Spring AI Alibaba 官方文档《为图添加持久化》:https://java2ai.com/docs/frameworks/graph-core/examples/persistence

赞(0)
未经允许不得转载:AI项目博客 » Spring AI Alibaba 92|Graph Core · 为图添加持久化 · 完整示例:带工具调用的持久化对话

评论 抢沙发

AI项目博客

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

关于本站文章归档

登录

找回密码

注册