Spring AI Alibaba(九)Memory
·
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 |
|
实现模式 |
组合模式(通过 |
继承模式(每个数据库独立子类实现) |
|
表初始化机制 |
需手动创建表 |
自动检查并创建表(若不存在) |
|
核心方法 |
支持增删改查(保存/查询/删除对话记录) |
同Spring AI,但新增表初始化逻辑 |
|
扩展性 |
通过新增 |
需为新数据库创建子类 |
设计差异详解 :
- 组合模式(Spring AI) :
通过Dialect接口封装不同数据库的SQL语法差异(如分页、表创建语句),核心类JdbcChatMemoryRepository内部根据数据库类型动态切换Dialect实现。优点是代码复用率高,但需维护复杂的方言适配逻辑。 - 继承模式(Spring AI Alibaba) :
为每个数据库(如MysqlChatMemoryRepository、OracleChatMemoryRepository)提供独立子类,直接硬编码对应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的自动装配机制
-
- 核心包结构 :
-
-
spring-ai-alibaba-starter-memory:聚合JDBC、Redis、Elasticsearch的依赖,但未按需拆分模块,可能导致冗余引入。spring-ai-alibaba-autoconfigure-memory:包含JDBC(5种数据库)、Redis、Elasticsearch的自动装配类,通过spring.ai.memory.<db>.enabled控制启用状态。
-
-
- 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. 未来优化方向
- 模块拆分 :建议将JDBC、Redis等存储模块独立为单独Starter,避免聚合依赖导致的冗余。
- 动态方言支持 :参考Spring AI设计,为Spring AI Alibaba的JDBC增加
Dialect机制,提升扩展性。 - Schema迁移工具 :集成Flyway/Liquibase,支持数据库表结构的版本化管理。
通过上述对比可见,Spring AI和Spring AI Alibaba的JDBC扩展包各有侧重,开发者需根据数据库生态、运维能力及扩展需求选择合适方案。
更多推荐



所有评论(0)