大家好我是Java1234_小锋老师最近更新《2027版本 Spring AI 2.0 开发Java Agent智能体 视频教程》专辑感谢大家支持。本课程主要介绍和讲解Spring AI 2.0简介Spring AI 2.0 HelloWorld搭建Advisors — 拦截器模式增强AI能力对话与提示词工程Prompt工具调用 (Function Calling / Tools) RAG(检索增强生成)MCP(模型 上下文协议)和多模态支持。等这个Spring AI2.0基础课程录制完成接下来要发布2个 企业级Java AI实战课程RAG 企业知识库系统和AI智能客服系统。大家可以点点关注后面更精彩。视频教程课件源码打包下载链接https://pan.baidu.com/s/1o-zRfndo1HHrS_uFroOiCw?pwd1234提取码0000Spring AI 2.0 开发Java Agent智能体 - 会话记忆(Chat Memory)一、Chat Memory 核心概念1.1 什么是 Chat Memory大型语言模型 (LLMs) 本质是无状态的无法保留历史对话信息。Spring AI 2.0 提供的Chat Memory功能解决了这一问题它能存储历史对话自动保存用户消息和 AI 响应到记忆仓库检索历史对话新请求时自动提取相关历史消息注入当前 Prompt会话隔离通过conversationId区分不同用户 / 会话确保上下文独立消息管理提供灵活策略如滑动窗口控制保留哪些历史消息1.2 核心组件架构组件作用核心接口 / 类ChatMemory策略层决定保留哪些消息ChatMemory接口默认实现MessageWindowChatMemoryChatMemoryRepository存储层负责消息 CRUDChatMemoryRepository接口支持多种存储后端ChatMemoryAdvisor拦截器自动处理记忆注入MessageChatMemoryAdvisor和VectorStoreChatMemoryAdvisor二、内置 Chat Memory 类型与存储后端2.1 内置记忆策略Spring AI 2.0 提供两种主要记忆类型MessageWindowChatMemory默认核心机制维护固定大小消息窗口超出上限时淘汰最早消息永远保留 system 消息Spring默认窗口大小20 条消息Spring适用场景大多数简单多轮对话平衡上下文完整性与 token 消耗VectorStoreChatMemory语义记忆核心机制基于向量存储的语义检索将对话内容向量化后存储根据语义相似度召回相关历史适用场景长对话、需要精准语义匹配的复杂场景2.2 支持的存储后端存储类型实现类特点适用场景内存存储InMemoryChatMemoryRepository基于ConcurrentHashMap轻量快速开发测试、演示环境RedisRedisChatMemoryRepository分布式、高性能、支持 TTL生产环境、多实例部署JDBCJdbcChatMemoryRepository关系型数据库持久化需要长期存储、事务支持CassandraCassandraChatMemoryRepository分布式 NoSQL高可用大规模分布式系统三、具体实例构建有记忆的对话应用我们先演示下没有以及的对话。请求http://localhost:8080/ai?question我是小锋我们再次请求http://localhost:8080/ai?question我是谁因为没有会话记忆所以每次请求访问都是独立的。但是如果我们做聊天机器人客服机器人那肯定是不行的我们需要让大模型记住历史会话上下文章。我们来实现下吧。首先在AiConfiguration里定义ChatMemory bean/** * 创建一个 ChatMemory 对象用于存储聊天记录。 * * return ChatMemory 对象用于存储聊天记录。 */ Bean public ChatMemory chatMemory(){ return MessageWindowChatMemory.builder() .maxMessages(10) // 设置消息窗口大小为 10 .chatMemoryRepository(new InMemoryChatMemoryRepository()) // 内存存储 .build(); }接着chatClient的advisors里加上chatMemory会话记忆/** * 创建一个 ChatClient 对象用于处理聊天请求。 * * param model OpenAiChatModel 对象用于处理聊天请求。 * return ChatClient 对象用于处理聊天请求。 */ Bean public ChatClient chatClient(OpenAiChatModel model,ChatMemory chatMemory){ return ChatClient .builder(model) // 创建 ChatClient 对象并设置模型为 model // .defaultAdvisors(new MySimpleLoggerAdvisor()) // 添加一个 MySimpleLoggerAdvisor记录请求日志 .defaultAdvisors( new SimpleLoggerAdvisor(), // 添加一个 SimpleLoggerAdvisor记录请求日志 MessageChatMemoryAdvisor.builder(chatMemory).build() // 添加一个 MessageChatMemoryAdvisor记录聊天记录 ) .build(); // 构建 ChatClient 对象 }然后MyAiChatController里加上一个会话ID设置保证聊天上下文独立。RequestMapping(/aiplus) public String aiplus(String question, String convId) { return chatClient.prompt() // 创建一个 Prompt 对象用于构建聊天请求。 .user( question) // 设置用户输入的文本。 .advisors(a-a.param(ChatMemory.CONVERSATION_ID,convId)) // 设置会话 ID .call() // 调用 ChatClient 对象的 call() 方法发送聊天请求给大模型并获取响应。 .content(); // 获取响应的文本内容。 }我们再来测试下http://localhost:8080/aiplus?question我是锋哥convId001 http://localhost:8080/aiplus?question我是谁convId001已经带有记忆功能了。