2026科研机构网站建设方案策划
2026-06-26
2026-06-26 0
摘要:在使用 Spring AI Alibaba 开发大模型应用时,你是否发现模型总是“记不住”上一轮对话的内容?这并非模型智商问题,而是缺少了“短时记忆”机制。本文将深入剖析 Spring AI Alibaba 中 Chat Memory 的设计哲学,从内存存储到 Redis 持久化,手把手带你构建具备上下文感知能力的智能应用,并附上生产环境的避坑指南。
在 LLM(大语言模型)的底层原理中,模型本身是无状态(Stateless) 的。每一次 API 调用对模型来说都是全新的开始,它并不知道你 3 秒前问了什么。
所谓的“多轮对话”,本质上是在每次请求时,将历史消息列表(History Messages) 连同当前用户输入一起打包发送给模型。
[系统提示词] + [历史消息1] + [历史消息2] + ... + [用户最新提问] --> LLM --> 回复
Spring AI Alibaba 封装了这一繁琐过程,提供了 ChatMemory 接口,让 Java 开发者能够像操作普通对象一样管理对话上下文。
在 Spring AI Alibaba 1.0+ 版本中,记忆模块的设计遵循了 Spring 一贯的抽象原则:
add, get, clear 等标准操作。核心变化提示:在旧版本中我们可能直接使用
ChatMemory,但在新版 Spring AI 中,推荐使用MessageChatMemoryAdvisor配合ChatClient,这是目前最优雅的声明式用法。
确保你的 pom.xml 包含 Spring AI Alibaba Starter:
<dependency><groupId>com.alibaba.cloud.aigroupId><artifactId>spring-ai-alibaba-starterartifactId><version>1.0.0-M6.1version>
dependency>
@Configuration
public class AiConfig {
@Bean public ChatMemory chatMemory() {
// 生产环境建议替换为 RedisChatMemoryRepository
return MessageWindowChatMemory.builder()
.chatMemoryRepository(new InMemoryChatMemoryRepository())
.maxMessages(20) // ️ 关键参数:保留最近20条消息
.build(); }
@Bean public ChatClient chatClient(ChatModel chatModel, ChatMemory chatMemory) {
return ChatClient.builder(chatModel)
.defaultSystem("你是一个专业的Java技术顾问,回答简洁明了。")
.defaultAdvisors( new MessageChatMemoryAdvisor(chatMemory) // 挂载记忆 Advisor
)
.build(); }
}
@RestController
@RequestMapping("/api/chat")
public class ChatController {
private final ChatClient chatClient;
public ChatController(ChatClient chatClient) {
this.chatClient = chatClient; }
@GetMapping public String chat(@RequestParam String message,
@RequestParam(defaultValue = "default") String conversationId) {
// conversationId 用于隔离不同用户/会话的记忆
return chatClient.prompt()
.user(message)
.advisors(a -> a.param(CHAT_MEMORY_CONVERSATION_ID_KEY, conversationId))
.call()
.content(); }
}
测试效果:
- 发送:“我叫张三” → 回复:“你好张三...”
- 发送:“我叫什么名字?” → 回复:“你叫张三。” 记忆生效!
在 Demo 中使用 InMemoryChatMemoryRepository 没问题,但在生产环境中,你必须考虑以下问题:
服务重启后内存数据会丢失。推荐方案:
RedisChatMemoryRepository。不要盲目设置 maxMessages=100!
永远不要使用默认 conversationId!必须从 JWT Token、Session ID 或业务订单号中提取唯一标识。否则会导致用户 A 看到用户 B 的聊天记录,这是严重的 P0 级安全事故。
如果对话超过了窗口限制,不要简单地丢弃旧消息。可以考虑:
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 模型完全不记得上文 | 未注册 MessageChatMemoryAdvisor | 检查 ChatClient 构建链 |
| 记住了别人的对话 | conversationId 固定或未传 | 确保每个会话有唯一 ID |
| 报错 Token Limit Exceeded | maxMessages 设置过大 | 减小窗口或启用 Token 级别的截断 |
| Redis 连接超时 | 序列化配置错误 | 检查 Message 对象的序列化器配置 |
Spring AI Alibaba 通过 Advisor 模式,将大模型短时记忆的实现从“手动拼接数组”提升到了“声明式配置”的高度。掌握 ChatMemory 不仅是实现多轮对话的基础,更是构建复杂 Agent 工作流的第一步。
下一步学习建议:
VectorStoreChatMemoryAdvisor 实现长短期记忆融合参考资料:
- Spring AI Alibaba 官方文档
- Spring AI Reference - Chat Memory
- 阿里云百炼平台 - 通义千问 API 文档
如果这篇文章对你有帮助,欢迎点赞收藏⭐关注三连支持!有问题欢迎评论区交流~