1. ChatMemory(InMemory/JDBC/Redis)会话记忆
Spring AI 中 ChatMemory 有 InMemory/JDBC/Redis 等实现,它们分别适用于什么场景?如何在多轮对话中正确使用会话记忆?
- ChatMemory 抽象与三种实现的能力差异
- 多轮对话中记忆的存取与消息构造
- 分布式场景下的会话状态共享
ChatMemory 是 Spring AI 提供的会话记忆抽象,负责在多轮对话中保存和检索历史消息。InMemoryChatMemory 将消息保存在 JVM 内存中,适合单实例、易失性、调试或原型场景;JdbcChatMemory 将记忆持久化到数据库,适合需要跨实例共享、重启不丢失的多实例部署;RedisChatMemory 使用 Redis 作为存储,适合高并发、分布式、需要快速读写的场景。使用时通过 ChatMemory 的 add/get/clear 方法维护会话,并通过 MessageChatMemoryAdvisor 等将历史消息注入到当前请求中。
会话记忆的核心是把"谁说了什么"转化为可检索的历史,从而让模型拥有上下文。选择哪种实现取决于状态的生命周期与一致性要求:内存态最快但不可靠,数据库态可靠但需考虑并发,Redis 态兼顾性能与共享。实际项目中通常把 ChatMemory 与 SessionId 绑定,按会话维度隔离记忆。
ChatMemory chatMemory = InMemoryChatMemory.builder().build();
// 或 JdbcChatMemory / RedisChatMemory 由 starter 自动装配
ChatClient client = ChatClient.builder(chatModel)
.defaultAdvisors(new MessageChatMemoryAdvisor(chatMemory))
.build();
String reply = client.prompt()
.user("你好")
.advisors(a -> a.param(ChatMemory.CONVERSATION_ID, "session-123"))
.call().content();