Spring AI 教程

ChatMemoryRepository 接口

提示:如果不能访问 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 中,提供了一个默认实现,如下图:

ChatMemoryRepository 接口

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

ChatMemoryRepository 接口

上述几个 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 注册账号,通过代理访问。  

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号