Spring AI 2.0:Memory
一、简介大模型是没有记忆的Spring AI提供了聊天记录的持久化织入器Spring AI 提供了多种持久化方式支持内存默认InMemoryChatMemoryRepository、Redis、MongoDB、ES、其它数据库等。二、ChatMemory所谓记忆就是将历史之前的所有提示出和大模型返回的结果都作为下次的输入。ChatMemorychatMemoryMessageWindowChatMemory.builder().build();StringconversationIdxs001;// 当前对话唯一标识// 第一次对话将请求和响应添加到chatMemory中UserMessageuserMessage1newUserMessage(我叫张三);chatMemory.add(conversationId,userMessage1);ChatResponseresponse1chatModel.call(newPrompt(chatMemory.get(conversationId)));chatMemory.add(conversationId,response1.getResult().getOutput());// 第二次对话UserMessageuserMessage2newUserMessage(我是谁);chatMemory.add(conversationId,userMessage2);ChatResponseresponse2chatModel.call(newPrompt(chatMemory.get(conversationId)));chatMemory.add(conversationId,response2.getResult().getOutput());System.out.println(response2.getResult().getOutput().getText());// 删除会话chatMemory.clear(conversationId);InMemoryChatMemoryRepository默认存到MapString, ListMessage chatMemoryStore new ConcurrentHashMap();中Map的key表示conversationId用于区分用户的sessionIdconversationId如果没有听默认为default当数据多的时候会出现内存溢出OOM只适合简单Demo一下。MessageWindowChatMemory每个大模型的上下文长度都是有最大限制的窗口式会话内存保存对话历史可以设置最大消息条数默认20超过就丢弃最早消息。RedisChatMemoryRepositoryRedis相比Jdbc会更快。适合存储最近n条数据。propertiesjedis.version5.2.0/jedis.version/properties!-- Spring AI Alibaba Redis聊天记忆starter --dependencygroupIdcom.alibaba.cloud.ai/groupIdartifactIdspring-ai-alibaba-starter-memory-redis/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactIdexclusionsexclusiongroupIdio.lettuce/groupIdartifactIdlettuce-core/artifactId/exclusion/exclusions/dependency!-- Jedis Redis客户端 --dependencygroupIdredis.clients/groupIdartifactIdjedis/artifactIdversion${jedis.version}/version/dependencyspring:ai:memory:redis:host:127.0.0.1port:6379password:timeout:2000# key前缀redis里面的key spring:ai:memory:{sessionId}key-prefix:spring:ai:memoryBeanChatMemorychatMemory(RedisChatMemoryRepositoryredisChatMemoryRepository){returnMessageWindowChatMemory.builder().maxMessages(10)// 窗口大小保留最近10条消息.chatMemoryRepository(redisChatMemoryRepository).build();}JdbcChatMemoryRepositorydependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-starter-model-chat-memory-repository-jdbc/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-jdbc/artifactId/dependencydependencygroupIdcom.mysql/groupIdartifactIdmysql-connector-j/artifactIdscoperuntime/scope/dependencyspring:datasource:url:jdbc:mysql://127.0.0.1:3306/ai_chat?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghaiusername:rootpassword:你的密码driver-class-name:com.mysql.cj.jdbc.Driver默认使用schema‑mysql.sql会创建该表。CREATETABLEIFNOTEXISTSSPRING_AI_CHAT_MEMORY(conversation_idVARCHAR(36)NOTNULL,contentTEXTNOTNULL,typeVARCHAR(10)NOTNULL,timestampTIMESTAMPNOTNULL,CONSTRAINTSPRING_AI_CHAT_MEMORY_TYPE_CHECKCHECK(typeIN(USER,ASSISTANT,SYSTEM,TOOL)));CREATEINDEXIFNOTEXISTSSPRING_AI_CHAT_MEMORY_CONVERSATION_ID_TIMESTAMP_IDXONSPRING_AI_CHAT_MEMORY(conversation_id,timestamp);MongoDBChatMemoryRepositoryspring-ai 和 spirng-ai-alibaba 都有提供对应实现原生 Spring‑AI官方!-- SpringAI官方Mongo ChatMemory Repository --dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-starter-model-chat-memory-repository-mongodb/artifactId/dependency!-- 必须引入spring‑data‑mongodb --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-mongodb/artifactId/dependency// 自动注入starter会自动配置MongoChatMemoryRepositoryAutowiredprivateMongoChatMemoryRepositoryrepository;BeanpublicChatMemorychatMemory(){returnMessageWindowChatMemory.builder().chatMemoryRepository(repository).maxMessages(10)//滑动窗口保留最近N条消息.build();}spring:data:mongodb:uri:mongodb://127.0.0.1:27017/spring_ai_chatai:chat:memory:repository:mongo:create-indices:true#启动自动建索引ttl:2592000#消息过期时间单位秒0代表永不过期Spring‑AI‑AlibabadependencygroupIdcom.alibaba.cloud.ai/groupIdartifactIdspring-ai-alibaba-starter-memory-mongodb/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-mongodb/artifactId/dependencyBeanpublicChatClientchatClient(ChatModelchatModel,ChatMemorychatMemory){returnChatClient.builder(chatModel).defaultAdvisors(MessageChatMemoryAdvisor.builder(chatMemory).build()).build();}StringconvIdgetConversationId(sessionId);// userId _ sessionIdchatClient.prompt().user(你的问题).advisors(spec-spec.param(MessageChatMemoryAdvisor.CHAT_MEMORY_CONVERSATION_ID_KEY,convId).param(MessageChatMemoryAdvisor.CHAT_MEMORY_RETRIEVE_SIZE_KEY,10)).call();ElasticsearchChatMemoryRepository!-- spring‑ai‑alibaba ES chat memory 官方starter --dependencygroupIdcom.alibaba.cloud.ai/groupIdartifactIdspring-ai-alibaba-starter-memory-elasticsearch/artifactIdversion1.0.0.2/version/dependency!-- Spring Data Elasticsearch 底层驱动 --dependencygroupIdorg.springframework.data/groupIdartifactIdspring-data-elasticsearch/artifactId/dependencyspring:elasticsearch:uris:http://127.0.0.1:9200#username: elastic#password: xxxai:chat:memory:repository:elasticsearch:index-name:spring-ai-alibaba-chat-memory# ES索引名称自动创建BeanpublicChatMemorychatMemory(ChatMemoryRepositorychatMemoryRepository){returnMessageWindowChatMemory.builder().maxMessages(10).chatMemoryRepository(chatMemoryRepository).build();}BeanpublicRedisChatMemoryRepositorychatMemoryRepository(RedisTemplateString,ObjectredisTemplate){returnRedisChatMemoryRepository.builder().redisTemplate(redisTemplate).build();}BeanChatMemorychatMemory(JdbcChatMemoryRepositorychatMemoryRepository){returnMessageWindowChatMemory.builder().maxMessages(10).chatMemoryRepository(chatMemoryRepository).build();}/** * 直接注入alibaba官方ES ChatMemoryRepository自动读取yml配置 */BeanpublicChatMemorychatMemory(ElasticsearchChatMemoryRepositoryesChatMemoryRepository){returnMessageWindowChatMemory.builder().chatMemoryRepository(esChatMemoryRepository).maxMessages(20)//内存窗口上限ES中完整保存全部历史消息.build();}三、代码DataBuilderNoArgsConstructorAllArgsConstructorpublicclassChatDTO{/** * 用户的问题 */privateStringquestion;/** * 会话id */privateStringsessionId;}ConfigurationpublicclassSpringAiConfig{BeanpublicChatClientchatClient(DeepSeekChatModeldeepSeekChatModelChatMemorychatMemory){returnChatClient.builder(deepSeekChatModel).defaultAdvisors(MessageChatMemoryAdvisor.builder(chatMemory).build()).build();}}RestControllerpublicclassSpringAIController{AutowiredprivateChatClientchatClient;GetMapping(value/chat,producesMediaType.TEXT_EVENT_STREAM_VALUE)publicFluxStringchat(RequestParam(chatDto)ChatDTOchatDto){FluxStringcontentchatClient.prompt().user(chatDto.getMessage())// 消息持久化需要一个conversationId这里的值一般是前端传的seesionId.advasors(a-a.param(ChatMemory.CONVERSATION_ID,chatDto.getSessionId())).stream().content().withConcat(Flux.just([complete]));// 自定义一个结束标记前端解析到就不会再请求表示本轮会话全部结束returncontent;}GetMapping(/history)publicListMessagegetHistory(RequestParamStringsid){returnchatMemory.get(sid);}GetMapping(/clear)publicvoidclear(RequestParamStringsid){chatMemory.clear(sid);}}先告诉大模型我叫什么。再问大模型我叫什么四、AI多层次记忆架构模仿人类记忆整体分为近期记忆、中期记忆、长期记忆三层正好对应Spring AI里面不同组件。1. 近期记忆Short‑term保留上下文窗口最近N轮对话每轮对话结束立刻存储对应ChatMemory实现MessageWindowChatMemory底层存储Redis/MySQLJdbcChatMemoryRepository / RedisChatMemoryRepository特点直接放在prompt上下文传给大模型有窗口上限maxMessages例如10条超过就丢弃最早消息只能记住最近几轮老对话直接被裁剪掉。局限会话轮次一多早期历史会丢失。2. 中期记忆Middle‑termRAG向量检索历史对话解决“近期记忆窗口不够”的痛点流程每轮对话结束后异步把本轮对话文本转向量存入向量数据库。推理阶段用户提问时把用户问题向量化去向量库检索相似的旧对话把检索出来的历史拼入prompt。特点不受LLM上下文窗口限制可以检索很久之前对话缺点是相似度召回不一定能命中真正需要的内容存储向量数据库Milvus、DashScope向量库等。对比近期记忆是全部塞进prompt中期记忆是检索挑选一部分塞进prompt。3. 长期记忆Long‑term提炼固化关键事实、用户偏好不是原始聊天记录是高度摘要信息。不存完整对话只存结构化要点比如用户年龄、喜好、习惯、重要事实。两种实现方案方式① 定时批处理定时任务每日/每周批量读取该用户全部对话调用LLM做总结提取关键信息、用户偏好写入数据库作为长期记忆优点计算集中、成本低适合大量用户缺点不能实时感知用户刚说的新信息有延迟。方式② 关键点实时处理写入触发器每一轮对话额外调用一次LLM识别当前消息是否包含关键信息用户个人信息、偏好、永久性设置如果识别到立刻提取、更新长期记忆库优点实时生效说完立刻记住缺点每轮多一次LLM调用增加token开销。三层在请求链路中的执行顺序用户提问从长期记忆读出用户关键偏好放到System Prompt用用户问题去向量库检索中期记忆历史相关对话片段加入prompt取出近期记忆最近N轮完整对话拼入消息列表合并全部内容发给大模型模型返回结果写回保存本轮对话到近期记忆异步写入向量库中期记忆触发长期记忆更新逻辑批处理/实时触发器。三者对比总结记忆层级存储内容存储介质SpringAI对应组件近期记忆原始最近N轮消息Redis/MySQLChatMemory、MessageWindowChatMemory中期记忆全部历史对话向量向量数据库RAG向量检索长期记忆结构化摘要、用户偏好MySQL/Redis自己开发SpringAI无内置组件重点Spring AI只原生提供近期记忆中期记忆靠RAG长期记忆需要自己开发没有现成starter。落地选型建议简单对话机器人只用近期记忆Redis ChatMemory够用需要记住几千轮历史加中期记忆RAG向量库需要记住用户永久偏好记住用户姓名、喜好再实现一层长期记忆。

相关新闻

Go语言是什么?为什么2026年后端开发者都在学Go

Go语言是什么?为什么2026年后端开发者都在学Go

TL;DR 核心要点速览 Go编译型语言,执行速度比Python快10倍 Goroutine初始栈2KB,比线程轻100倍Channel是Go并发通信的核心原语GMP调度器自动管理goroutine调度Go标准库覆盖HTTP/JSON/加密等常用场景本篇是Go入门模块,建议按顺序学习 摘要:Go语言是2026年后端开发首选…

2026/8/22 16:32:39 阅读更多 →
数学建模竞赛解题心法:从问题分析到模型构建的完整指南

数学建模竞赛解题心法:从问题分析到模型构建的完整指南

1. 项目概述:从“解题”到“建模”的思维跃迁每年一到数学建模竞赛季,无论是国赛、美赛还是像华数杯这样的重要赛事,总能看到无数同学在各大平台焦急地寻找“思路”和“模型”。2023年华数杯B题,作为一个典型的综合性赛题&#xf…

2026/8/22 16:32:39 阅读更多 →
智能体轨迹安全检测:从海量数据中自动识别违规行为

智能体轨迹安全检测:从海量数据中自动识别违规行为

1. 项目概述:从海量智能体轨迹中嗅探安全风险最近在搞一个挺有意思的项目,核心任务就一句话:从成千上万条智能体(Agent)的运行轨迹里,自动、高效、准确地揪出那些潜在的安全违规行为。听起来是不是有点像在…

2026/8/22 16:32:39 阅读更多 →

最新新闻

免费批量下载B站视频的完整指南:downkyi搞定8K、HDR与去水印

免费批量下载B站视频的完整指南:downkyi搞定8K、HDR与去水印

免费批量下载B站视频的完整指南:downkyi搞定8K、HDR与去水印 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等…

2026/8/22 20:01:56 阅读更多 →
2026招聘平台效果实测与选择策略

2026招聘平台效果实测与选择策略

1. 招聘平台现状与核心痛点解析2026年的招聘市场已经形成了明显的垂直细分格局,不同行业、不同职级、不同求职场景下的平台选择差异显著。作为从业12年的人力资源顾问,我经手过237家企业招聘案例,实测发现:平台效果与行业匹配度的…

2026/8/22 20:01:56 阅读更多 →
智能简历筛选系统:原理、技术与应用实践

智能简历筛选系统:原理、技术与应用实践

1. 简历机筛流程的核心价值解析 在招聘旺季,HR部门每天需要处理数百份甚至上千份简历的场景已经成为常态。以赛力斯这样的头部企业为例,单次校招季收到的简历数量往往突破五位数。传统人工筛选方式不仅效率低下,还存在主观性强、标准不统一等…

2026/8/22 20:01:56 阅读更多 →
数学建模竞赛实战:从全球变暖数据到量化分析模型

数学建模竞赛实战:从全球变暖数据到量化分析模型

1. 从“全球变暖?”这个问号说起:一次竞赛题的深度拆解看到“全球变暖?”这个标题,后面跟着一个问号,很多人的第一反应可能是:这不是一个早已有定论的科学问题吗?怎么还成了研究生数学建模竞赛的…

2026/8/22 20:01:56 阅读更多 →
AI求职助手Career-Ops:简历优化与面试模拟全解析

AI求职助手Career-Ops:简历优化与面试模拟全解析

1. 项目概述Career-Ops是一个专为求职场景设计的智能辅助系统。它通过AI技术模拟人力资源专家的思维模式和工作流程,为求职者提供从简历优化到面试准备的全流程支持。不同于通用型求职工具,这个系统最大的特点是能够深度理解不同行业、岗位的差异化需求&…

2026/8/22 20:01:56 阅读更多 →
Python+Neo4j零基础构建知识图谱:从文本到关系网络的实战指南

Python+Neo4j零基础构建知识图谱:从文本到关系网络的实战指南

1. 先搞清楚知识图谱到底能帮你解决什么问题如果你经常听到“知识图谱”、“RAG”、“AI Agent”这些词,但感觉它们离实际开发很远,那这篇文章就是为你准备的。知识图谱不是只能用在搜索引擎或者大厂推荐系统里,它最直接的价值是把一堆零散、…

2026/8/22 20:00:56 阅读更多 →

日新闻

沉金PCB工艺实战指南:从设计到SMT焊接的可靠性保障

沉金PCB工艺实战指南:从设计到SMT焊接的可靠性保障

在电子硬件开发领域,PCB(印制电路板)的沉金工艺是提升产品可靠性和焊接质量的关键环节。对于需要高密度互连、长期稳定运行或高频信号传输的板卡,如“黍姐仿通行证”这类可能涉及身份识别、数据交互的硬件项目,选择正确…

2026/8/22 0:00:11 阅读更多 →
电气考研电路八月强化四步法:从知识体系到真题实战的闭环攻略

电气考研电路八月强化四步法:从知识体系到真题实战的闭环攻略

这次我们来看一个针对电气考研电路科目的学习规划项目。它不是软件工具,而是一套聚焦于8月份关键节点的备考策略。对于电气工程考研的同学来说,电路分析是专业课的重中之重,也是拉开分差的关键。进入8月,复习进入强化阶段&#xf…

2026/8/22 0:00:11 阅读更多 →
消除AI代码的“AI味”:Claude Code设计优化技能配置与实战指南

消除AI代码的“AI味”:Claude Code设计优化技能配置与实战指南

大家好,我是专注于前端开发与AI工具实践的技术博主。在日常使用 Claude Code 等AI编程助手时,你是否也遇到过这样的困扰:生成的代码功能上没问题,但代码风格、组件设计、交互逻辑总透着一股“AI味”——布局单调、样式简陋、交互生…

2026/8/22 0:00:11 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/21 3:21:33 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/22 8:09:09 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/21 6:07:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/22 18:08:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/22 7:31:03 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/22 3:22:48 阅读更多 →