學習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接口,在構造函數中會查詢是否存在聊天記憶表,若不存在則會創建。子類主要是各個數據庫的語句(是否存在表、創建表、保存聊天記憶、查詢聊天記憶、刪除聊天記憶等)。