提示:如果不能访问 OpenAI,请点击 AiCode API 注册账号,通过代理访问。
在 Spring AI 1.0.0 中,ChatMemoryRepository 接口是聊天记忆存储的核心抽象,定义了对聊天会话消息进行持久化、检索和管理的标准操作。它为不同的存储实现(如内存存储、数据库存储等)提供了统一的接口规范。
ChatMemoryRepository 负责管理聊天会话(conversationId)与对应消息列表(List<Message>)的映射关系,是聊天记忆(ChatMemory)组件的底层数据存储层。上层的 ChatMemory 实现(如 MessageWindowChatMemory)通过调用该接口的方法,实现消息的持久化和检索。
例如:下面是 ChatMemory 默认实现 MessageWindowChatMemory 类的部分源码
package org.springframework.ai.chat.memory;
//...
public final class MessageWindowChatMemory implements ChatMemory {
private static final int DEFAULT_MAX_MESSAGES = 20;
private final ChatMemoryRepository chatMemoryRepository;
private final int maxMessages;
//...
public void add(String conversationId, List<Message> messages) {
//...
this.chatMemoryRepository.saveAll(conversationId, processedMessages);
}
public List<Message> get(String conversationId) {
//...
return this.chatMemoryRepository.findByConversationId(conversationId);
}
public void clear(String conversationId) {
//...
this.chatMemoryRepository.deleteByConversationId(conversationId);
}
//...
}
ChatMemoryRepository 接口包含以下四个关键方法,定义了对聊天消息的基本操作:
List<String> findConversationIds() 返回当前存储中所有存在的会话 ID(conversationId)列表。
List<Message> findByConversationId(String conversationId) 根据指定的会话 ID(conversationId),检索该会话下的所有消息列表。
void saveAll(String conversationId, List<Message> messages) 将指定会话(conversationId)的消息列表(messages)持久化存储。
void deleteByConversationId(String conversationId) 删除指定消息 ID(conversationId)对应的所有消息,清除该会话的记忆。
接口源码定义如下:
package org.springframework.ai.chat.memory;
import java.util.List;
import org.springframework.ai.chat.messages.Message;
/**
* 聊天记忆存储库接口,定义了聊天会话消息的持久化和管理操作规范。
* 作为聊天记忆功能的底层存储抽象,支持不同存储实现(如内存、数据库等)的统一接入。
*/
public interface ChatMemoryRepository {
/**
* 查询所有存在的会话ID列表。
* 用于获取系统中当前所有活跃或已保存的聊天会话标识。
*
* @return 所有会话ID的列表,无会话时返回空列表
*/
List<String> findConversationIds();
/**
* 根据会话ID查询对应的消息列表。
* 用于检索指定聊天会话的历史消息记录。
*
* @param conversationId 会话唯一标识,不可为null
* @return 该会话的消息列表,会话不存在时返回空列表
*/
List<Message> findByConversationId(String conversationId);
/**
* 保存指定会话的消息列表。
* 通常用于更新会话的消息记录(如新增消息后保存或裁剪窗口后更新)。
*
* @param conversationId 会话唯一标识,不可为null
* @param messages 待保存的消息列表,不可为null(空列表表示清空该会话消息)
*/
void saveAll(String conversationId, List<Message> messages);
/**
* 根据会话ID删除对应的所有消息。
* 用于清理指定会话的历史记录。
*
* @param conversationId 会话唯一标识,不可为null
*/
void deleteByConversationId(String conversationId);
}Spring AI 1.0.0 中,提供了一个默认实现,如下图:

上图虽然现实了四个实现类,但是仅有 InMemoryChatMemoryRepository 是默认实现,其他并不位于spring-ai-model-1.0.0.jar 包中。如下图:

上述几个 ChatMemoryRepository 接口的实现类,它们分别适用于不同的存储场景,作用如下:
InMemoryChatMemoryRepository 基于内存的实现,使用 ConcurrentHashMap 存储会话 ID 与消息列表的映射,适合开发环境或简单场景。
JdbcChatMemoryRepository 基于 JDBC(Java Database Connectivity)的实现,用于将聊天记忆(会话及对应消息)持久化存储到关系型数据库(如 MySQL、PostgreSQL 等)中,适合需要持久化且依赖关系型数据库的场景。
CassandraChatMemoryRepository 针对 Apache Cassandra 数据库的实现,Cassandra 是分布式 NoSQL 数据库,该实现可将聊天记忆存储到 Cassandra 中,适用于分布式、高可扩展且对读写性能要求较高的场景。
Neo4jChatMemoryRepository 基于 Neo4j 图数据库的实现,Neo4j 擅长处理具有复杂关系的数据,若聊天场景中消息间存在复杂关联关系,可使用该实现将聊天记忆存储到 Neo4j 中,便于进行关系型查询和分析。
此外,用户可根据需求自定义实现(如基于 Redis、数据库等持久化存储),只需实现 ChatMemoryRepository 接口并注册为 Spring Bean 即可。
上面了解了 ChatMemoryRepository 的接口定义和具体实现类,那么,在什么情况下才需要使用 ChatMemoryRepository 呢?
(1) 与 ChatMemory 配合:ChatMemory(如 MessageWindowChatMemory)负责消息窗口的裁剪(如限制消息数量),而 ChatMemoryRepository 负责实际存储裁剪后的消息。
(2)多会话管理:通过 conversationId 区分不同用户或不同场景的聊天会话,实现会话隔离。
(3)灵活切换存储:通过接口抽象,可在不同环境(开发用内存存储,生产用 Redis)中无缝切换存储实现。
总的来说,ChatMemoryRepository 接口是 Spring AI 聊天记忆功能的核心抽象,它定义了会话消息的存储、检索和删除规范,通过不同的实现类可适配多种存储场景,同时为上层组件提供了统一的操作接口,简化了聊天记忆的管理逻辑。用户通过自定义实现该接口,可以满足更多丰富的使用场景。
提示:如果不能访问 OpenAI,请点击 AiCode API 注册账号,通过代理访问。