基于MySQL的AI对话持久化简单实现——AI 超级智能体

在最新版的Spring AI中,官方提供的JdbcChatMemoryRepository已经可以比较简单的使用了。

依赖

text
复制代码
<properties> <spring-ai.version>1.1.0</spring-ai.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-bom</artifactId> <version>${spring-ai.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-model-chat-memory-repository-jdbc</artifactId> </dependency>

配置数据库

text
复制代码
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver # 配置数据源,请替换成您自己的数据库信息 url: jdbc:mysql://localhost:3306/lzx_ai_agent?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai username: root password: <your password> ai: chat: memory: repository: jdbc: initialize-schema: always
text
复制代码
CREATE DATABASE `lzx_ai_agent` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
text
复制代码
CREATE TABLE IF NOT EXISTS SPRING_AI_CHAT_MEMORY( conversation_id VARCHAR(36) NOT NULL, content TEXT NOT NULL, type VARCHAR(10) NOT NULL, `timestamp` TIMESTAMP NOT NULL, CONSTRAINT TYPE_CHECK CHECK (type IN ('USER', 'ASSISTANT', 'SYSTEM', 'TOOL')) );

LoveApp

text
复制代码
import org.springframework.ai.chat.memory.repository.jdbc.JdbcChatMemoryRepository; @Component public class LoveApp{ public LoveApp(ChatModel dashscopeChatModel, JdbcChatMemoryRepository chatMemoryRepository){ ChatMemory chatMemory = MessageWindowChatMemory.builder() .chatMemoryRepository(chatMemoryRepository) .maxMessages(10) .build(); ChatClient.Builder builder = ChatClient.builder(dashscopeChatModel); chatClient = builder.defaultSystem(SYSTEM_PROMPT) .defaultAdvisors(MessageChatMemoryAdvisor.builder(chatMemory).build(), new MyLoggerAdvisor()) .build(); } }

细心的同学会发现,表结构中没用主键ID和元数据信息。这是因为

  1. 主键ID
  • 存储策略 :Spring AI 使用"全量替换"策略 - 每次保存消息时,会先删除该 conversation_id 的所有旧消息,然后插入新消息
  • 查询优化 :通过 conversation_id + timestamp 组合可以唯一标识记录
  • 简化设计 :避免了复杂的主键管理,适合聊天历史的滑动窗口管理
  • 性能考虑 :对于聊天历史这种频繁写入的场景,简化的表结构有助于提高性能
  1. 元数据
  • 通用性 :元数据通常是应用特定的,不同应用有不同的元数据需求
  • 灵活性 :Spring AI 提供了扩展机制,允许自定义实现
  • 核心功能聚焦 :默认实现专注于核心功能 - 保存和检索消息
  • 可扩展性 :通过实现自定义 ChatMemoryRepository 可以添加元数据支持
  1. 官方态度 根据Spring AI官方文档:
  • 默认实现 :提供了基本的持久化功能,满足大多数场景需求
  • 扩展支持 :明确支持通过实现 JdbcChatMemoryRepositoryDialect 接口来自定义存储逻辑
  • 灵活性 :允许使用自定义的表结构和存储策略
  1. 如何添加主键和元数据 如果需要添加主键ID和元数据支持,你可以:
  • 自定义表结构 :
    • 创建包含主键和元数据字段的自定义表
    • 使用 spring.ai.chat.memory.repository.jdbc.schema 属性指定自定义脚本
  • 扩展实现 :
    • 实现自定义的 ChatMemoryRepository
    • 继承 JdbcChatMemoryRepository 并扩展功能
0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
可惜在哪
下载 APP