Spring Ai Chat Memory

Spring Ai Chat Memory

在前面的文章讲述如何使用各种各样的大模型进行智能对话,但通过实践我们发现大模型不能上下文关联,比如我第一次告诉它我叫张三,第二次问它我叫什么,它还是不知道。chat memory就是Spring ai提供的解决方案。本文主要简述提供的内存Memory、Advisor实现chat memory、jdbc存储chat memory和Redis存储chat memory。

什么是Chat memory

官方解释:
Large language models (LLMs) are stateless, meaning they do not retain information about previous interactions. This can be a limitation when you want to maintain context or state across multiple interactions. To address this, Spring AI provides chat memory features that allow you to store and retrieve information across multiple interactions with the LLM.
以上翻译就是说:大模型是一种无状态的,意味着不会保存之前对话的信息。当你想使用上下文信息实现多轮多花就产生了限制,为了解决这一问题,spring ai 就提供了chat memory 整个类别,允许你保存多轮对话信息。

Chat Memory和Chat History的区别

官方解释:
Chat Memory. The information that a large-language model retains and uses to maintain contextual awareness throughout a conversation.
Chat History. The entire conversation history, including all messages exchanged between the user and the model.
上面的官方解释,重要区分点就是chat memory表示一次会话的上下文对话记录;history memory表示所有的会话历史;

Chat memory的使用

在使用之前,我们首先需要做的是引入chat memory的依赖,如下:

  <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-autoconfigure-model-chat-memory</artifactId>
        </dependency>
1.MessageWindowChatMemory

MessageWindowChatMemory是sping ai提供的内置对象,存储在内存中。存储在 Map<String, List<Message>> chatMemoryStore = new ConcurrentHashMap(),底层调用saveAll方法完成新增,conversationId 表示会话的id,包含多轮对话。如下图源码所示:
在这里插入图片描述
具体使用方法如下代码所示:

    @Test
    public void testReReadAdvisor1(){
      ChatClient client = ChatClient.builder(deepSeekChatModel)
               // defaultAdvisors(new SimpleLoggerAdvisor())//SafeGuardAdvisor 敏感词定义,若出现敏感词中断
                .build();
        MessageWindowChatMemory memory = MessageWindowChatMemory.builder().build();
        String conversionId="20250512180601";
        UserMessage userMessage = new UserMessage("我叫张三");
        memory.add(conversionId,userMessage);
        System.out.println("question1:我叫张三");
        String response1 = client.prompt(new Prompt(memory.get(conversionId))).call().content();
        System.out.println("round1:"+response1);
        memory.add(conversionId,new UserMessage(response1));
        UserMessage reponseMessage = new UserMessage("我叫什么");
        System.out.println("question2:我叫什么");
        memory.add(conversionId,reponseMessage);
        St
Spring AI 提供了不同类型的聊天记忆存储库,包括基于 JDBC、Cassandra 和 Neo4j 的存储库,以下是对它们的详细介绍: ### 基于 JDBC 的聊天记忆存储库 JDBC 扩展包(如 `spring-ai-alibaba-starter-memory-jdbc`)主要包含抽象类 `JdbcChatMemoryRepository` 和 5 个数据库的子类。`JdbcChatMemoryRepository` 实现了 `ChatMemoryRepository` 接口,其构造函数会查询是否存在聊天记忆表,若不存在则会创建。子类则包含各个数据库的特定语句,如判断表是否存在、创建表、保存聊天记忆、查询聊天记忆、删除聊天记忆等操作 [^2]。 以下是一个简单示例,展示如何使用 JDBC 存储聊天历史信息(以 MySQL 为例): ```java import org.springframework.ai.memory.jdbc.JdbcChatMemoryRepository; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.core.JdbcTemplate; import javax.sql.DataSource; @Configuration public class ChatMemoryConfig { @Bean public JdbcChatMemoryRepository jdbcChatMemoryRepository(DataSource dataSource) { JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); return new JdbcChatMemoryRepository(jdbcTemplate); } } ``` ### 基于 Cassandra 的聊天记忆存储库 Cassandra 是一个高度可扩展的分布式 NoSQL 数据库,基于 Cassandra 的 Spring AI 聊天记忆存储库利用了其高可用性、可扩展性和容错性等特点,适合处理大量的聊天消息数据。当配置了 Cassandra 存储库后,Spring AI 会使用它来存储聊天消息,替代默认的内存存储库 [^1]。 使用时,需要添加 Cassandra 和 Spring AI 相关依赖,配置 Cassandra 连接信息,创建表示聊天消息的实体类,以及创建继承 `CassandraRepository` 的接口来操作聊天消息。以下是一个简化示例: ```java import com.datastax.oss.driver.api.mapper.annotations.Entity; import com.datastax.oss.driver.api.mapper.annotations.PartitionKey; import org.springframework.data.cassandra.repository.CassandraRepository; @Entity public class ChatMessage { @PartitionKey private String sessionId; private String message; private long timestamp; // 构造函数、Getter 和 Setter 方法 } public interface CassandraChatMemoryRepository extends CassandraRepository<ChatMessage, String> { // 可以添加自定义查询方法 } ``` ### 基于 Neo4j 的聊天记忆存储库 Neo4j 是一个图数据库,非常适合处理具有复杂关系的数据。基于 Neo4j 的 Spring AI 聊天记忆存储库可以利用图数据库的特性,更好地存储和查询聊天消息之间的关系。 要使用 Neo4j 存储聊天记忆,需要添加 Neo4j 和 Spring AI 相关依赖,配置 Neo4j 连接信息,创建表示聊天消息的实体类,以及创建继承 `Neo4jRepository` 的接口来操作聊天消息。以下是一个简单示例: ```java import org.springframework.data.neo4j.core.schema.Node; import org.springframework.data.neo4j.core.schema.Property; import org.springframework.data.neo4j.repository.Neo4jRepository; @Node public class ChatMessage { @Property private String sessionId; @Property private String message; @Property private long timestamp; // 构造函数、Getter 和 Setter 方法 } public interface Neo4jChatMemoryRepository extends Neo4jRepository<ChatMessage, Long> { // 可以添加自定义查询方法 } ``` ### 总结 Spring AI 支持多种类型的聊天记忆存储库,用户可以根据具体需求选择合适的存储方案。JDBC 适用于关系型数据库,Cassandra 适用于高并发、大规模数据存储,而 Neo4j 则适用于需要处理复杂关系数据的场景。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值