spring-ai-alibaba 1.0.0.2 学习(十二)——聊天记忆扩展包
学习spring-ai时提到过,spring-ai除了内置的InMemoryChatMemoryRepository,还提供jdbc、cassandra、neo4j三个扩展包。
而spring-ai-alibaba则提供了jdbc、redis、elasticsearch三个扩展包。
两者都提供了jdbc扩展包,有什么区别呢?
spring-ai jdbc和spring-ai-alibaba jdbc对比
spring-ai的jdbc扩展 | spring-ai-alibaba的jdbc扩展 | |
支持的数据库 | hsql mysql postgres sqlserver | mysql oracle postgres sqlite sqlserver |
JdbcChatMemoryRepository | 非抽象类 | 抽象类 |
实现兼容的方式 | 组合模式,内部包含一个dialect,根据数据库类型不同提供不同sql | 继承模式,不同数据库不同子类 |
功能 | 查找所有对话id 保存所有 根据对话id查找 根据对话id删除 | 查找所有对话id 初始化时会查看表是否存在,不存在则创建 |
spring-ai和spring-ai-alibaba都提供了ChatMemoryRepository接口的jdbc实现JdbcChatMemoryRepository,并提供了自动装配的bean。区别主要在于支持的数据库和对表的初始化上面。
简单样例
以mysql为例,使用分为三步
第一步:添加依赖
<dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-starter-memory</artifactId></dependency>
第二步:添加配置
spring:ai:chat:memory:repository:jdbc:mysql:jdbc-url: your_urlusername: your_usernamepassword: your_passworddriver-class-name: com.mysql.cj.jdbc.Driverenabled: true
第三步:代码调用
private final ChatClient chatClient;private final MessageWindowChatMemory messageWindowChatMemory;public MysqlMemoryController(ChatClient.Builder builder, MysqlChatMemoryRepository mysqlChatMemoryRepository) {this.messageWindowChatMemory = MessageWindowChatMemory.builder().chatMemoryRepository(mysqlChatMemoryRepository).maxMessages(100).build();this.chatClient = builder.defaultAdvisors(MessageChatMemoryAdvisor.builder(messageWindowChatMemory).build()).build();}@GetMapping("/call")public String call(@RequestParam(value = "query") String query,@RequestParam(value = "conversation_id") String conversationId) {return chatClient.prompt(query).advisors(a -> a.param(CONVERSATION_ID, conversationId)).call().content();}
内部原理及相关接口和实现类
spring-ai-alibaba-starter-memory:默认会引入jdbc、redis、elasticsearch和自动装配的jar包,且自动装配的jar包包含上述三个jar包的自动装配,不能按需取用,希望后面官方能够进行拆分管理。
自动装配包(spring-ai-alibaba-autoconfigure-memory):包含redis、elasticsearch和5种jdbc数据库的自动装配的类,是否开启主要使用spring.ai.memory.数据库.enabled进行配置,默认为false不开启。
jdbc扩展包(spring-ai-alibaba-starter-memory-jdbc):主要是抽象类JdbcChatMemoryRepository和5个数据库的子类。逻辑主要在JdbcChatMemoryRepository中,该类实现了ChatMemoryRepository接口,在构造函数中会查询是否存在聊天记忆表,若不存在则会创建。子类主要是各个数据库的语句(是否存在表、创建表、保存聊天记忆、查询聊天记忆、删除聊天记忆等)。