【SpringAIAlibaba新手村系列】(8)持久化会话与 Redis 内存管理

张开发
2026/4/4 5:27:14 15 分钟阅读
【SpringAIAlibaba新手村系列】(8)持久化会话与 Redis 内存管理
第八章 持久化会话与 Redis 内存管理版本标注Spring AI:1.1.2Spring AI Alibaba:1.1.2.0s01 s02 s03 s04 s05 s06 s07 [ s08 ] s09 s10 s11 s12 s13 s14 s15 s16 s17 s18会话一旦能记住历史, 聊天才真正像聊天-- Redis 负责的不是回答, 而是上下文连续性。⚠️阅读提示本章中提到的短期记忆应直接理解为Agent 状态持久化。重点概念是ReactAgent、MemorySaver、RedisSaver、threadId。一、为什么需要会话记忆1.1 无状态的问题在之前的例子中每次调用 AI 都是独立的第一次调用 我你叫什么 AI我叫小爱 第二次调用AI已经完全忘了之前的事 我我叫什么 AI抱歉我不知道AI 没有记忆每次对话都是全新的。1.2 人类对话 vs AI 对话人类对话有记忆我我叫张三 AI你好张三我记住了 我我叫什么 AI你叫张三啊普通 AI 对话无记忆我我叫张三 AI你好张三 我我叫什么 ← 忘记之前说的了 AI抱歉我不知道1.3 解决方案ChatMemory在Spring AI Alibaba 1.1.2.0的理解方式里短期记忆本质上已经可以看成Agent 状态的一部分。简单说用户每说一句话都会进入当前会话线程的状态中模型每回复一句话也会写回这个状态中这些状态可以通过MemorySaver或RedisSaver持久化所以本章的核心不再只是把聊天记录丢进 Redis而是让 Agent 在一个 thread会话线程中持续记住上下文。二、会话记忆的实现方式2.1 内存版 ChatMemory最基本的实现是把 Agent 的短期状态保存在内存里ReactAgent agent ReactAgent.builder() .name(my_agent) .model(chatModel) .saver(new MemorySaver()) .build();这种方式的特点是简单适合开发和演示服务一重启记忆就没了不适合多实例部署2.2 Redis 版 ChatMemory本章重点把 Agent 状态持久化到 Redis 中优点持久化服务重启对话历史还在多实例共享多个服务实例可以共享同一个 Redis性能好Redis 读取速度很快RedisSaver redisSaver new RedisSaver(redissonClient); ReactAgent agent ReactAgent.builder() .name(my_agent) .model(chatModel) .saver(redisSaver) .build();2.3 实现原理┌─────────────────────────────────────────────────────────┐ │ Redis 持久化短期记忆原理 │ ├─────────────────────────────────────────────────────────┤ │ │ │ 用户A 发起 thread-001 会话 │ │ ┌──────┐ │ │ │用户A │ ──→ 写入状态 messages/thread-001 │ │ └──────┘ │ │ │ │ 用户A 再次发言 │ │ ┌──────┐ 从 Redis 读取 thread-001 状态 │ │ │用户A │ ──→ 恢复历史 messages ──→ 合并当前输入 │ │ └──────┘ ↓ │ │ 发送给 Agent/模型 │ │ [系统消息][历史消息][新问题] │ │ │ └─────────────────────────────────────────────────────────┘三、项目配置详解3.1 pom.xml 依赖!-- Spring AI Alibaba -- dependency groupIdcom.alibaba.cloud.ai/groupId artifactIdspring-ai-alibaba-starter-dashscope/artifactId /dependency !-- Redis 作为短期记忆持久化介质时需要的依赖请结合官方文档选择对应 saver 实现 --这里也要提醒一下理解重点记忆章节重点关注MemorySaver/RedisSaver/threadIdRedis 在这里主要扮演状态持久化介质会话记忆属于 Agent 状态的一部分所以学习时要抓住主线会话记忆属于 Agent 状态状态通过 Saver 持久化Redis 只是 Saver 的底层存储之一3.2 application.yml 配置server: port: 8008 spring: application: name: SAA-08Persistent # Redis 配置本地的 Redis data: redis: host: localhost port: 6379 # 可以用密码如果设置了的话 # password: 1234563.3 配置类package com.atguigu.study.config; import com.alibaba.cloud.ai.graph.RunnableConfig; import com.alibaba.cloud.ai.graph.agent.ReactAgent; import com.alibaba.cloud.ai.graph.checkpoint.savers.MemorySaver; import com.alibaba.cloud.ai.graph.checkpoint.savers.RedisSaver; import org.springframework.ai.chat.model.ChatModel; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.redisson.api.RedissonClient; /** * Agent 记忆配置类 */ Configuration public class SaaLLMConfig { /** * 开发环境使用 MemorySaver */ Bean public ReactAgent memoryAgent(ChatModel chatModel) { return ReactAgent.builder() .name(memory-agent) .model(chatModel) .saver(new MemorySaver()) .build(); } /** * 生产环境使用 RedisSaver */ Bean public ReactAgent redisMemoryAgent(ChatModel chatModel, RedissonClient redissonClient) { return ReactAgent.builder() .name(redis-memory-agent) .model(chatModel) .saver(new RedisSaver(redissonClient)) .build(); } }四、控制器代码package com.atguigu.study.controller; import jakarta.annotation.Resource; import com.alibaba.cloud.ai.graph.RunnableConfig; import com.alibaba.cloud.ai.graph.agent.ReactAgent; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; /** * 持久化会话控制器 * 展示如何使用 Redis 保存对话历史 */ RestController public class ChatMemory4RedisController { Resource(name redisMemoryAgent) private ReactAgent redisMemoryAgent; /** * 带会话记忆的对话 * * 核心点使用 threadId 指定会话线程 * * 接口http://localhost:8008/chatmemory/chat?msg你好userIduser001 * * 参数说明 * - msg用户的消息 * - userId用户ID用于区分不同用户的会话 * * 测试步骤 * 1. msg你好userIduser001 * 2. msg你还记得我刚才说什么吗userIduser001 * * 注意两次请求使用同一个 userId底层会映射到同一个 threadAI 就能记住之前的对话内容 */ GetMapping(/chatmemory/chat) public String chat(String msg, String userId) { RunnableConfig config RunnableConfig.builder() .threadId(userId) .build(); return redisMemoryAgent.call(msg, config).getText(); } }五、底层原理深入5.1 threadId 的作用在 Agent Framework 中短期记忆主要通过threadId来区分不同会话线程。你可以把它理解为一个threadId对应一段连续对话同一个threadId下历史消息会被持续追加不同threadId之间彼此隔离示例RunnableConfig config RunnableConfig.builder() .threadId(user001) .build();如果用户两次请求都使用threadId(user001)那么 Agent 就会自动读取同一条会话线程里的历史内容。5.2 Saver 是什么Saver可以理解成状态保存器它负责把 Agent 的短期记忆保存下来并在下次请求时恢复。常见的两种 SaverMemorySaver保存在内存中适合开发和测试RedisSaver保存在 Redis 中适合生产环境ReactAgent agent ReactAgent.builder() .name(my_agent) .model(chatModel) .saver(new MemorySaver()) .build();5.3 数据在 Redis 中的理解方式更准确的说法不是Redis 中只保存聊天记录列表而是Redis 中保存的是某个threadId对应的 Agent 状态其中messages是状态中的一个重要字段。所以理解重点应该放在Redis 保存的是会话线程状态消息历史只是这个状态的一部分后续如果需要还可以在状态中加入其他上下文信息5.4 为什么这里几乎没有使用 RedisTemplate很多学过传统 Spring Boot Redis 的同学看到这个项目时会有一个疑问以前操作 Redis 时不是经常用RedisTemplate吗为什么这里几乎没看到它这是因为本章的重点不是手写 Redis 增删改查而是使用框架提供的 Saver 机制来持久化 Agent 状态。如果按传统方式写你可能要自己做这些事情自己设计 key自己管理消息列表自己做序列化和反序列化自己控制会话隔离自己处理历史上下文恢复而在Spring AI Alibaba 1.1.2.0的推荐思路里这些底层细节尽量交给框架处理你关注的是threadId你关注的是Saver你关注的是 Agent 是否能恢复历史上下文也就是说代码里没有显式写RedisTemplate不代表没有用 Redis而是因为 Redis 的读写细节被框架封装起来了。什么时候仍然需要 RedisTemplate下面这些业务场景依然很适合自己使用RedisTemplate商品缓存验证码缓存排行榜令牌管理复杂自定义 Redis 结构简单总结RedisTemplate通用 Redis 操作工具RedisSaverAI Agent 短期记忆持久化工具RunnableConfig config RunnableConfig.builder() .threadId(user001) .build(); agent.call(你好, config);六、本章小结6.1 核心概念概念说明ReactAgentAgent Framework 的核心执行入口MemorySaver内存版短期记忆保存器适合开发测试RedisSaverRedis 版短期记忆保存器适合生产环境threadIdAgent Framework 中更推荐的会话线程标识messagesAgent 状态中的消息历史是短期记忆的重要组成部分6.2 使用流程1. 配置 Redisapplication.yml 2. 创建 ReactAgent 2. 配置 MemorySaver 或 RedisSaver 3. 调用时通过 RunnableConfig.threadId(...) 指定会话 4. Agent 自动从状态中恢复历史消息 5. 如有需要再通过 Hook 做裁剪、删除、总结6.3 注意事项不同用户使用不同的 userId这样每个用户的对话是独立存储的Redis 需要提前启动确保本地 Redis 在运行redis-server会话ID可以是用户ID或会话ID根据业务需求决定特别注意版本号本章按Spring AI Alibaba 1.1.2.0的官方文档思路整理学习时请重点关注ReactAgent、MemorySaver、RedisSaver、threadId等概念本章重点理解为什么需要会话记忆掌握ReactAgent Saver的短期记忆主线学会通过threadId区分不同用户会话下章剧透s09学会了对话记忆后下一章我们将开启多模态的学习——让 AI 根据文字描述生成图片Text to Image编辑者Flittly更新时间2026年3月相关资源Spring AI ChatMemory | Redis 官方文档

更多文章