
Spring AI之会话记忆AdvisorsAdvisors相关文档地址Advisors基本使用Advisors实现会话记忆Advisors自定义执行循序Advisors会话记忆存储之JDBCMysqlAdvisors会话记忆存储之RedisAdvisors多层次记忆架构模仿人类Advisors相关文档地址中文Advisors-API英文Advisors-APIAdvisors是一个Interface接口Advisors基本使用packageorg.heiyu;importorg.junit.jupiter.api.Test;importorg.springframework.ai.chat.client.ChatClient;importorg.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;importorg.springframework.ai.chat.model.ChatModel;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.boot.test.context.SpringBootTest;SpringBootTestpublicclassChatClientAdvisorTest{// 方式一 创建ChatClient的时候配置全局默认Advsior推荐Testpublicvoidtest(AutowiredChatModelchatModel){ChatClientchatClientChatClient.builder(chatModel).defaultAdvisors(SimpleLoggerAdvisor.builder().build())// Advisor的日志打印拦截器.build();}// 方式二 chatCLient请求的时候设置AdvisorTestpublicvoidtest2(AutowiredChatModelchatModel){StringcontentchatClient.prompt(你好).call().content();System.out.println(content);ChatClientchatClientChatClient.builder(chatModel).build();chatClient.prompt(你好).advisors(SimpleLoggerAdvisor.builder().build()).call().content();}}日期打印Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended 2026-03-15T17:26:41.41708:00 DEBUG 10607 --- [ main] o.s.a.c.c.advisor.SimpleLoggerAdvisor : request: ChatClientRequest[promptPrompt{messages[UserMessage{content你好, metadata{messageTypeUSER}, messageTypeUSER}], modelOptionsorg.springframework.ai.deepseek.DeepSeekChatOptions38b22e1f}, context{}] 2026-03-15T17:26:45.53708:00 DEBUG 10607 --- [ main] o.s.a.c.c.advisor.SimpleLoggerAdvisor : response: { result : { metadata : { finishReason : STOP, contentFilters : [ ], empty : true }, output : { reasoningContent : null, prefix : null, toolCalls : [ ], media : [ ], messageType : ASSISTANT, metadata : { finishReason : STOP, index : 0, role : ASSISTANT, id : e7c65dd1-4271-41f6-848c-de46e8c45925, messageType : ASSISTANT }, text : 你好很高兴见到你 我是DeepSeek由深度求索公司创造的AI助手。无论你有什么问题、需要什么帮助或者只是想聊聊天我都很乐意为你提供支持\n\n我可以帮你解答各种问题协助处理文档进行创作和分析等等。有什么我可以为你做的吗 } }, metadata : { id : e7c65dd1-4271-41f6-848c-de46e8c45925, model : deepseek-chat, rateLimit : { requestsLimit : 0, requestsRemaining : 0, requestsReset : 0.0, tokensLimit : 0, tokensRemaining : 0, tokensReset : 0.0 }, usage : { promptTokens : 5, completionTokens : 64, totalTokens : 69, nativeUsage : { completion_tokens : 64, prompt_tokens : 5, total_tokens : 69, prompt_tokens_details : { cached_tokens : 0 } } }, promptMetadata : [ ], empty : false }, results : [ { metadata : { finishReason : STOP, contentFilters : [ ], empty : true }, output : { reasoningContent : null, prefix : null, toolCalls : [ ], media : [ ], messageType : ASSISTANT, metadata : { finishReason : STOP, index : 0, role : ASSISTANT, id : e7c65dd1-4271-41f6-848c-de46e8c45925, messageType : ASSISTANT }, text : 你好很高兴见到你 我是DeepSeek由深度求索公司创造的AI助手。无论你有什么问题、需要什么帮助或者只是想聊聊天我都很乐意为你提供支持\n\n我可以帮你解答各种问题协助处理文档进行创作和分析等等。有什么我可以为你做的吗 } } ] } 你好很高兴见到你 我是DeepSeek由深度求索公司创造的AI助手。无论你有什么问题、需要什么帮助或者只是想聊聊天我都很乐意为你提供支持控制台打印可以看到o.s.a.c.c.advisor.SimpleLoggerAdvisor打印啦日志具体日志内容大家可以结合学习的Spring AI Message 看下前提配置啦该目录的日志打印# 日志打印配置logging:level:org:springframework:ai:chat:client:advisor:DEBUGAdvisors实现会话记忆通过Advisor设置会话内存拦截器让会话有记忆// chatClient 之 实现聊天会话记忆// 通过Advisor设置会话内存拦截器让会话有记忆Testpublicvoidtest1(AutowiredChatModelchatModel,AutowiredChatMemorychatMemory){ChatClientchatClientChatClient.builder(chatModel).defaultAdvisors(MessageChatMemoryAdvisor.builder(chatMemory).build())// Advisor的日志打印拦截器.build();StringcontentchatClient.prompt(你好,我叫张三).call().content();System.out.println(content);Stringcontent1chatClient.prompt(我叫什么名字).call().content();System.out.println(content1);}如何实现会话记忆的隔离// chatClient// 通过Advisor设置会话内存拦截器让会话有记忆// 会话标识会话内存拦截器会根据会话标识进行会话内存的保存TestpublicvoidchatSessionUser(AutowiredChatModelchatModel,AutowiredChatMemorychatMemory){Longuser110001L;Longuser210001L;ChatClientchatClientChatClient.builder(chatModel).defaultAdvisors(MessageChatMemoryAdvisor.builder(chatMemory).build(),// 会话内存拦截器SimpleLoggerAdvisor.builder().build())// Advisor的日志打印拦截器.build();StringcontentchatClient.prompt(你好,我叫张三).advisors(advisorSpec-advisorSpec.param(ChatMemory.CONVERSATION_ID,user1))// 会话标识.call().content();System.out.println(content);Stringcontent1chatClient.prompt(我是谁).advisors(advisorSpec-advisorSpec.param(ChatMemory.CONVERSATION_ID,user1))// 会话标识.call().content();System.out.println(content1);Stringcontent2chatClient.prompt(我是谁).advisors(advisorSpec-advisorSpec.param(ChatMemory.CONVERSATION_ID,user2))// 会话标识.call().content();System.out.println(content2);}Advisors自定义执行循序创建Advisor的时候设置order值越小越先执行链式请求先进先出原则MessageChatMemoryAdvisor.builder(chatMemory).order(2).build()Advisors会话记忆存储之JDBCMysql第一步pom.xml 引入Jar包dependencygroupIdorg.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/dependency第二部配置application.ymlspring:ai:# 模型配置deepseek:api-key:xxxxxxxchat:options:model:deepseek-chattemperature:0.7base-url:https://api.deepseek.com# 数据库配置datasource:driver-class-name:com.mysql.cj.jdbc.Driverusername:xxxpassword:xxxurl:jdbc:mysql://xxxx/ai?useUnicodetruecharacterEncodingutf8autoReconnecttrueallowMultiQueriestrueuseSSLfalseTest测试模型调用packageorg.heiyu;importorg.junit.jupiter.api.Test;importorg.springframework.ai.chat.client.ChatClient;importorg.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;importorg.springframework.ai.chat.memory.ChatMemory;importorg.springframework.ai.chat.memory.MessageWindowChatMemory;importorg.springframework.ai.chat.memory.repository.jdbc.JdbcChatMemoryRepository;importorg.springframework.ai.chat.model.ChatModel;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.boot.test.context.SpringBootTest;importorg.springframework.boot.test.context.TestConfiguration;importorg.springframework.context.annotation.Bean;SpringBootTestpublicclassChatClientAdvisorMemoryTest{Testpublicvoidtest(AutowiredChatModelchatModel,AutowiredChatMemorychatMemory){ChatClientchatClientChatClient.builder(chatModel).defaultAdvisors(MessageChatMemoryAdvisor.builder(chatMemory).build()).build();StringcontentchatClient.prompt(你好?).advisors(advisorSpec-advisorSpec.param(ChatMemory.CONVERSATION_ID,10086L)).call().content();System.out.println(content);}TestConfigurationstaticclassConfig{BeanChatMemorychatMemory(JdbcChatMemoryRepositoryjdbcChatMemoryRepository){returnMessageWindowChatMemory.builder().chatMemoryRepository(jdbcChatMemoryRepository).maxMessages(2)// 保存记忆条数.build();}}}Advisors会话记忆存储之Redis待完善Advisors多层次记忆架构模仿人类近期记忆保留上下文窗口的最近几轮对话每轮对话完成后立即存储可通过ChatMemory中期记忆通过RAG检索的相关历史性对话每轮对话完成后异步将对话内容转化为向量并存入向量数据库向量数据库–相似性检索长期记忆关键信息的固化总结方式一定时批处理通过定时任务每天/每周对积累的对话进行总结和提炼提取关键信息用户编号重要事实等批处理方式降低计算成本适合大规模处理方式二关键点实时处理在对话中识别出关键信息点时立即提取并存储例如当用户表明表达编号提供个人信息或者持久性指令时采用写入出发器机制 在特定条件下自动更新长期记忆