Spring AI与Spring AI Alibaba的JDBC扩展包对比及内存存储扩展

1. 功能对比与核心差异

Spring AI和Spring AI Alibaba均提供了基于JDBC的聊天记忆存储实现(JdbcChatMemoryRepository),但两者在设计、功能及适用场景上存在显著差异:

支持数据库

HSQL、MySQL、PostgreSQL、SQL Server

MySQL、Oracle、PostgreSQL、SQLite、SQL Server

实现模式

组合模式(通过Dialect动态适配不同数据库)

继承模式(每个数据库独立子类实现)

表初始化机制

需手动创建表

自动检查并创建表(若不存在)

核心方法

支持增删改查(保存/查询/删除对话记录)

同Spring AI,但新增表初始化逻辑

扩展性

通过新增Dialect即可支持新数据库

需为新数据库创建子类

设计差异详解

  • 组合模式(Spring AI)
    通过Dialect接口封装不同数据库的SQL语法差异(如分页、表创建语句),核心类JdbcChatMemoryRepository内部根据数据库类型动态切换Dialect实现。优点是代码复用率高,但需维护复杂的方言适配逻辑。
  • 继承模式(Spring AI Alibaba)
    为每个数据库(如MysqlChatMemoryRepositoryOracleChatMemoryRepository)提供独立子类,直接硬编码对应SQL语句。优点是逻辑直观,便于调试,但代码冗余度较高。

2. 简单样例解析

以MySQL为例,展示Spring AI Alibaba的JDBC存储接入流程:

(1)添加依赖
<dependency>
    <groupId>com.alibaba.cloud.ai</groupId>
    <artifactId>spring-ai-alibaba-starter-memory</artifactId>
</dependency>

该依赖默认包含JDBC、Redis、Elasticsearch的自动装配逻辑。

(2)配置参数
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

通过spring.ai.chat.memory.repository.jdbc.mysql前缀启用MySQL存储。

(3)代码调用
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.memory.MessageWindowChatMemory;
import org.springframework.ai.chat.memory.ChatMemoryRepository;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class ChatService {

    private final ChatClient chatClient;

    @Autowired
    public ChatService(ChatModel chatModel, MysqlChatMemoryRepository mysqlChatMemoryRepository) {
        // 1. 封装JDBC存储到MessageWindowChatMemory
        MessageWindowChatMemory chatMemory = MessageWindowChatMemory.builder()
            .chatMemoryRepository(mysqlChatMemoryRepository)  // 注入MySQL存储库
            .maxMessages(100)  // 设置最大记忆条目数
            .build();

        // 2. 构建ChatClient并绑定记忆管理
        this.chatClient = ChatClient.builder(chatModel)
            .defaultAdvisors(
                // 将记忆管理封装为Advisor,自动处理对话历史的存取
                MessageChatMemoryAdvisor.builder(chatMemory)
                    .build()
            )
            .build();
    }

    // 3. 调用接口:对话交互
    public String call(String query, String conversationId) {
        return chatClient.prompt()
            .user(query)
            .advisors(a -> a.param("conversation_id", conversationId))  // 传递会话ID
            .call()
            .content();
    }
}

通过MessageWindowChatMemory封装JDBC存储,结合ChatClient实现对话记忆管理。


3. 内部原理与模块设计
  • Spring AI Alibaba的自动装配机制
    1. 核心包结构
      • spring-ai-alibaba-starter-memory:聚合JDBC、Redis、Elasticsearch的依赖,但未按需拆分模块,可能导致冗余引入。
      • spring-ai-alibaba-autoconfigure-memory:包含JDBC(5种数据库)、Redis、Elasticsearch的自动装配类,通过spring.ai.memory.<db>.enabled控制启用状态。
    1. JDBC实现细节
      • JdbcChatMemoryRepository:抽象类,实现ChatMemoryRepository接口,核心逻辑包括:
        • 表存在性检查与自动创建:
        • 数据库操作(保存、查询、删除):子类需重写save(), find()等方法,提供数据库特定SQL。
      • 子类实现(如MysqlChatMemoryRepository):直接实现MySQL专属的SQL语句(如INSERT INTO chat_memory...)。

4. 扩展性与适用场景
  • Spring AI JDBC
    适合需要多数据库灵活适配 的场景(如SaaS平台需兼容PostgreSQL和SQL Server),通过新增Dialect即可支持新数据库。
  • Spring AI Alibaba JDBC
    更适合企业级数据库(如Oracle) 自动化运维 场景,自动表创建机制降低部署复杂度,但牺牲了部分扩展性。
  • 其他扩展存储
    Spring AI Alibaba还提供Redis(高性能实时存储)和Elasticsearch(全文检索优化)的扩展包,适用于对话记录需快速查询或分析的场景。

5. 未来优化方向
  1. 模块拆分 :建议将JDBC、Redis等存储模块独立为单独Starter,避免聚合依赖导致的冗余。
  2. 动态方言支持 :参考Spring AI设计,为Spring AI Alibaba的JDBC增加Dialect机制,提升扩展性。
  3. Schema迁移工具 :集成Flyway/Liquibase,支持数据库表结构的版本化管理。

通过上述对比可见,Spring AI和Spring AI Alibaba的JDBC扩展包各有侧重,开发者需根据数据库生态、运维能力及扩展需求选择合适方案。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐