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 用于持久化存储 |
- 多轮对话系统: 记住用户的上下文和偏好
- 客服机器人: 跨会话跟踪客户问题
- 工作流状态恢复: 长时间运行的任务可以中断和恢复
- A/B 测试: 比较不同会话的处理结果
- 审计和调试: 追踪完整的对话历史
| 特性 |
无持久化 |
有持久化 (MemorySaver) |
| 记忆能力 |
❌ 每次调用独立 |
✅ 跨调用记忆 |
| 会话隔离 |
N/A |
✅ 通过 threadId |
| 状态恢复 |
❌ 不支持 |
✅ 支持 |
| 历史查询 |
❌ 不支持 |
✅ 支持 |
| 适用场景 |
单次查询 |
多轮对话 |
- 等待用户输入 – 中断和恢复示例
- 时光旅行 – 状态历史导航
- 快速入门 – Graph 基础使用
本文整理自 Spring AI Alibaba 官方文档《为图添加持久化》:https://java2ai.com/docs/frameworks/graph-core/examples/persistence