基于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和元数据信息。这是因为
- 主键ID
- 存储策略 :Spring AI 使用"全量替换"策略 - 每次保存消息时,会先删除该 conversation_id 的所有旧消息,然后插入新消息
- 查询优化 :通过 conversation_id + timestamp 组合可以唯一标识记录
- 简化设计 :避免了复杂的主键管理,适合聊天历史的滑动窗口管理
- 性能考虑 :对于聊天历史这种频繁写入的场景,简化的表结构有助于提高性能
- 元数据
- 通用性 :元数据通常是应用特定的,不同应用有不同的元数据需求
- 灵活性 :Spring AI 提供了扩展机制,允许自定义实现
- 核心功能聚焦 :默认实现专注于核心功能 - 保存和检索消息
- 可扩展性 :通过实现自定义 ChatMemoryRepository 可以添加元数据支持
- 官方态度 根据Spring AI官方文档:
- 默认实现 :提供了基本的持久化功能,满足大多数场景需求
- 扩展支持 :明确支持通过实现 JdbcChatMemoryRepositoryDialect 接口来自定义存储逻辑
- 灵活性 :允许使用自定义的表结构和存储策略
- 如何添加主键和元数据 如果需要添加主键ID和元数据支持,你可以:
- 自定义表结构 :
- 创建包含主键和元数据字段的自定义表
- 使用 spring.ai.chat.memory.repository.jdbc.schema 属性指定自定义脚本
- 扩展实现 :
- 实现自定义的 ChatMemoryRepository
- 继承 JdbcChatMemoryRepository 并扩展功能
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
内容推荐
HR问我"为什么35岁想退休",我愣住了
5
图像复原和扩散模型怎么入门啊,纯新手小白啥都不会,求大佬们指点一下方向
0
Code Log-AI超级智能体项目,开发日志。SpringAI + RAG + MCP 全栈 | AI 超级智能体企业级实战(26年必学)
2
【入职求助贴】萌新刚入职某大厂做后端开发,目前还在试用期。最近遇到一个棘手的问题,想向大家求助一下。入职不久,leader 给我派了一个任务。跟我说是0.5天就可以解决,我刚毕业入职,做了一个星期没有做出来。实现一个收集定时成功任务的案例。听起来好像不复杂,但我自己摸索着做了一整个星期,到现在还没达到预期效果。这一周我基本是“边学边做”的状态,遇到卡点也会每天主动找 leader 沟通进度和疑问。
2
🐟友们,工作后,周末你们一般都干啥🤔
0
作者分享
Day 2
✅ 今天做了:
1. AI超级智能体项目做完了AI应用的后端接口,并用Vibe coding的方式生成了前端页面,并成功跑通。
⏰ 明天计划:明天写写论文吧
1
AI超级智能体——AI恋爱大师应用后端开发
3
Day 1
✅ 今天做了:学习项目AI超级智能体
- 编写了自定义违禁词校验Advisor
- 编写了一套简单的包含变量的 Prompt 模板,并保存为资源文件,从文件加载模板
- 用阿里云百炼平台的官方SDK开发了一个简单的多模态对话助手,能够让AI 解释图片
⏰ 明天计划:完成 AI 恋爱大师应用的开发
📚 今日感悟:写项目不能只跟着敲一遍,要多些自己的思考,多看官方参考文档和代码源码,看不懂可以问ai,要勤记录
3
AI 超级智能体项目——Prompt模板实现
3
AI 超级智能体项目——自定义违禁词校验Advisor
3
