大家好,我是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?pwd=1234
提取码:0000
Spring 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接口,默认实现MessageWindowChatMemory |
| ChatMemoryRepository | 存储层,负责消息 CRUD | ChatMemoryRepository接口,支持多种存储后端 |
| ChatMemoryAdvisor | 拦截器,自动处理记忆注入 | MessageChatMemoryAdvisor和VectorStoreChatMemoryAdvisor |
二、内置 Chat Memory 类型与存储后端
2.1 内置记忆策略
Spring AI 2.0 提供两种主要记忆类型:
MessageWindowChatMemory(默认)
核心机制:维护固定大小消息窗口,超出上限时淘汰最早消息,永远保留 system 消息Spring
默认窗口大小:20 条消息Spring
适用场景:大多数简单多轮对话,平衡上下文完整性与 token 消耗
VectorStoreChatMemory(语义记忆)
核心机制:基于向量存储的语义检索,将对话内容向量化后存储,根据语义相似度召回相关历史
适用场景:长对话、需要精准语义匹配的复杂场景
2.2 支持的存储后端
| 存储类型 | 实现类 | 特点 | 适用场景 |
|---|---|---|---|
| 内存存储 | InMemoryChatMemoryRepository | 基于ConcurrentHashMap,轻量快速 | 开发测试、演示环境 |
| Redis | RedisChatMemoryRepository | 分布式、高性能、支持 TTL | 生产环境、多实例部署 |
| JDBC | JdbcChatMemoryRepository | 关系型数据库持久化 | 需要长期存储、事务支持 |
| Cassandra | CassandraChatMemoryRepository | 分布式 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=我是锋哥&convId=001 http://localhost:8080/aiplus?question=我是谁&convId=001已经带有记忆功能了。