尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
【SpringAI 17】MessageChatMemoryAdvisor核心类说明
MessageChatMemoryAdvisor 是 Spring AI 框架中用于实现‌多轮对话上下文记忆‌的核心组件。它基于 AOP面向切面编程的 Advisor 机制自动管理聊天历史的存储与检索使无状态的大语言模型LLM能够“记住”之前的对话内容。以下是对其核心功能、工作原理、配置方式及关键注意事项的详细解析。1. 核心功能与作用大模型本质上是无状态的每次请求都是独立的。MessageChatMemoryAdvisor 的作用是在请求发送给模型之前和之后自动拦截处理请求前Before‌根据当前的 conversationId会话 ID从 ChatMemory 中检索历史消息并将其作为上下文消息插入到当前的 Prompt 中。请求后After‌接收模型的响应将用户的最新提问和模型的回复保存到 ChatMemory 中以便下一轮对话使用。通过这种方式开发者无需手动维护 List即可实现连贯的多轮对话体验。2. 工作原理与执行流程MessageChatMemoryAdvisor 在 ChatClient 的执行链中运行具体流程如下获取会话 ID‌从请求上下文中提取 conversationId。如果未指定通常使用默认值如 “default”。加载历史‌调用 ChatMemory.get(conversationId) 获取该会话的历史消息列表。构建 Prompt‌将历史消息集合添加到当前请求的消息列表中。注意MessageChatMemoryAdvisor 是将历史消息作为标准的 User/Assistant/System 消息对象添加而不是拼接成纯文本字符串这与 PromptChatMemoryAdvisor 不同。执行模型调用‌将包含完整上下文的 Prompt 发送给 LLM。保存记忆‌获取模型返回的 AssistantMessage调用 ChatMemory.add(conversationId, messages) 将本轮的用户消息和助手回复持久化存储。3. 正确配置方式在较新版本的 Spring AI 中MessageChatMemoryAdvisor 的构造函数已私有化必须使用 ‌Builder 模式‌进行创建。3.1 定义 ChatMemory Bean首先需要一个 ChatMemory 的实现。推荐使用 MessageWindowChatMemory它可以限制保留的消息数量防止 Token 溢出。ConfigurationpublicclassChatMemoryConfig{BeanpublicChatMemorychatMemory(ChatMemoryRepositoryrepository){returnMessageWindowChatMemory.builder().chatMemoryRepository(repository)// 可以是 InMemory, Redis, MongoDB 等实现.maxMessages(20)// 只保留最近20条消息.build();}// 如果使用内存存储Spring AI 通常会自动提供 InMemoryChatMemoryRepository}3.2 集成到 ChatClient在构建 ChatClient 时将 Advisor 注册为默认顾问。ServicepublicclassChatService{privatefinalChatClientchatClient;publicChatService(ChatClient.Builderbuilder,ChatMemorychatMemory){this.chatClientbuilder// 【关键点】使用 Builder 模式创建 Advisor.defaultAdvisors(MessageChatMemoryAdvisor.builder(chatMemory).build()).build();}}3.3 调用时传递会话 ID关键为了实现多用户隔离或多会话管理必须在每次调用 prompt() 时动态传入 conversationId。否则所有请求将共享同一个默认会话历史导致数据混乱。publicStringchat(StringconversationId,StringuserMessage){returnchatClient.prompt().user(userMessage)// 【关键点】动态指定当前请求所属的会话 ID.advisors(advisorSpec-advisorSpec.param(ChatMemory.CONVERSATION_ID,conversationId)).call().content();}4. 与其他 Memory Advisor 的区别Spring AI 提供了多种记忆策略MessageChatMemoryAdvisor 是最常用的一种Advisor 类型记忆注入方式适用场景‌MessageChatMemoryAdvisor‌将历史消息作为标准的 Message 对象列表加入 Prompt。‌通用场景‌。最符合 LLM 的原生交互格式支持角色区分System/User/Assistant。‌PromptChatMemoryAdvisor‌将历史消息序列化为纯文本追加到 System Prompt 或用户消息中。某些特定模型对纯文本上下文支持更好或需要严格控制消息结构时。‌VectorStoreChatMemoryAdvisor‌结合向量数据库检索与当前问题语义相关的历史片段。‌长对话场景‌。当历史记录过长超出上下文窗口时只检索相关片段节省 Token。5. 高级特性与注意事项5.1 与 Tool Calling工具调用的交互在涉及函数调用Function Calling/Tool Use的场景中默认的 MessageChatMemoryAdvisor ‌不会‌存储中间的工具调用消息即 ToolExecutionResultMessage 或中间的 Assistant 工具请求。原因‌大多数 ChatMemoryRepository 实现不支持复杂工具消息类型的序列化且中间过程通常不需要长期记忆。现状‌它只存储最终的 User 输入和 Assistant 的最终自然语言回复。如果需要记忆工具调用过程需自定义 Advisor 或使用支持该特性的 Repository。执行顺序‌MessageChatMemoryAdvisor 的默认优先级高于 ToolCallingAdvisor确保工具调用能基于完整的上下文历史进行决策。5.2 生产环境存储建议开发/测试‌使用 InMemoryChatMemoryRepository默认重启服务后记忆丢失。生产环境‌务必使用持久化存储如 ‌Redis‌ 或 ‌MongoDB‌。Redis‌适合高并发、低延迟场景利用 List 结构存储消息配合 TTL 自动过期冷会话。MongoDB‌适合需要复杂查询或长期归档对话记录的场景。5.3 线程安全ChatMemory 的实现必须是线程安全的。InMemoryChatMemoryRepository 内部使用 ConcurrentHashMap是线程安全的。如果使用自定义 Repository需确保并发读写的安全性。总结MessageChatMemoryAdvisor 是 Spring AI 实现有状态对话的基石。使用时请牢记三点使用 ‌Builder 模式‌创建实例。务必在每次请求中动态传递 ‌conversationId‌ 以隔离会话。根据业务规模选择合适的 ‌ChatMemoryRepository‌内存、Redis 或 MongoDB以实现持久化。
RELATED

相关推荐

超级语言GEO是什么?从“AI有没有提到你”到企业AI认知管理

超级语言GEO是什么?从“AI有没有提到你”到企业AI认知管理

超级语言GEO是什么?从“AI有没有提到你”到企业AI认知管理 作者:超级语言GEO技术团队 超级语言GEO要解决的,不只是企业有没有被 AI 提到,而是 AI 能不能正确识别一家企业、读懂它的产品与能力、找到可信依据,并在用户…

📅 2026/9/11 21:20:19
Android安全工具开发:从资源整合到生态构建的完整指南

Android安全工具开发:从资源整合到生态构建的完整指南

1. 项目概述:为什么我们需要“终极”Android安全工具?在移动互联网的汪洋大海里,Android设备就像一艘艘承载着我们数字生活的方舟。从个人隐私、金融支付到企业数据,几乎所有的敏感信息都在这片“沙盒”中流转。作为一名在移动安全…

📅 2026/8/24 2:23:32
Nexus 3 Docker 安装与生产级配置实战指南

Nexus 3 Docker 安装与生产级配置实战指南

1. Nexus 1:安装及配置——从零搭建企业级二进制制品仓库的实操手记我第一次在团队里落地 Nexus 是三年前,当时我们还在用 GitHub Releases 手动传 jar 包、用共享文件夹存 Docker 镜像,CI 流水线一跑就卡在下载环节,Maven 依赖拉…

📅 2026/8/24 2:23:32
MORE NEWS

更多资讯

📰

Impeccable `/impeccable` 无参数路由指南:基于 Signals 的上下文感知命令菜单

Impeccable /impeccable 无参数路由指南:基于 Signals 的上下文感知命令菜单 【免费下载链接】impeccable The design language that makes your AI harness better at design. 项目地址: https://gitcode.com/GitHub_Trending/im/impeccable 当用户在对话中…

📰

qwen-code 通道 P0 身份与任务生命周期:为渠道常驻 Agent 建立身份边界与可观测生命周期

qwen-code 通道 P0 身份与任务生命周期:为渠道常驻 Agent 建立身份边界与可观测生命周期 【免费下载链接】qwen-code An open-source AI coding agent that lives in your terminal. 项目地址: https://gitcode.com/GitHub_Trending/qw/qwen-code 导读 本文…

📰

沈阳危房鉴定机构测评 老旧房屋安全评级处置推荐指南

一、危房鉴定:老旧建筑安全管理的核心技术环节随着沈阳城市更新进程加快,老旧小区、历史建筑、城乡自建房的安全问题备受关注。这类建筑建成年限久,部分存在结构老化、墙体开裂、地基沉降等病害,若不及时排查鉴定,可能…

📰

JAVA毕设选题推荐:基于SpringBoot的作业管理系统的研究与实现 基于SpringBoot的智慧作业批改系统【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

📰

2026雪茄柜十大品牌怎么选

对比结论先给结论:如果你的核心诉求是"把雪茄养好、跟着品吸节奏自动调整环境",茄蕾是当前市面上少有的"AI 主动养护"型选择;如果你更看重老牌稳定性和性价比,美晶、茄龙分别在"传统窖藏"和"入…

📰

WorkBuddy连接配置全攻略:从SSH到数据库,打通AI工作台

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬