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
保存所有
根据对话id查找
根据对话id删除

初始化时会查看表是否存在,不存在则创建

spring-ai和spring-ai-alibaba都提供了ChatMemoryRepository接口的jdbc实现JdbcChatMemoryRepository,并提供了自动装配的bean。区别主要在于支持的数据库和对表的初始化上面。

简单样例

以mysql为例,使用分为三步

第一步:添加依赖

		
			com.alibaba.cloud.ai
			spring-ai-alibaba-starter-memory
		

第二步:添加配置

spring:
  ai:
    chat:
      memory:
        repository:
          jdbc:
            mysql:
              jdbc-url: your_url
              username: your_username
              password: your_password
              driver-class-name: com.mysql.cj.jdbc.Driver
              enabled: 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接口,在构造函数中会查询是否存在聊天记忆表,若不存在则会创建。子类主要是各个数据库的语句(是否存在表、创建表、保存聊天记忆、查询聊天记忆、删除聊天记忆等)。

你可能感兴趣的:(spring-ai-alibaba 1.0.0.2 学习(十二)——聊天记忆扩展包)