当前位置: 首页 > ops >正文

SpringAI实现聊天记录保存到MySQL

数据库相关的准备

添加依赖

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.11</version>
</dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope>
</dependency>

添加配置

  datasource:url: jdbc:mysql://localhost:3306/test_activiti?useUnicode=true&characterEncoding=utf-8username: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driver

创建SQL脚本

create table chat_message
(id              bigint auto_incrementprimary key,conversation_id varchar(255)                        not null,role            varchar(50)                         not null,context         text                                not null,created_at      timestamp default CURRENT_TIMESTAMP null
);

创建实体类

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName("chat_message")
public class ChatMessage {@TableId(type = IdType.AUTO)private Long id;private String conversationId;private String role;private String context;private String createdAt;
}

创建mapper

@Mapper
public interface ChatMessageMapper extends BaseMapper<ChatMessage> {
}

SpringAI相关准备

不用阿里云的maven仓库,用默认的maven中央仓库。

版本控制

    <properties><java.version>21</java.version><spring-ai.version>1.0.0-SNAPSHOT</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-openai</artifactId></dependency>

因为我对接的阿里云百炼平台

添加配置

spring:ai:openai:base-url: https://dashscope.aliyuncs.com/compatible-mode/api-key: ${ALIYUN_AK}chat:options:model: qwen-max

我的api-key 存储在我环境变量中

编写代码

创建MysqlChatMemory实现ChatMemory

@Component
public class MysqlChatMemory implements ChatMemory {@Autowiredprivate ChatMessageMapper chatMessageMapper;@Overridepublic void add(String conversationId, Message message) {ChatMessage chatMessage = ChatMessage.builder().conversationId(conversationId).role(message.getMessageType().name()).context(message.getText()).build();chatMessageMapper.insert(chatMessage);}@Overridepublic void add(String conversationId, List<Message> messages) {messages.forEach(message -> add(conversationId, message));}@Overridepublic List<Message> get(String conversationId) {LambdaQueryWrapper<ChatMessage> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(ChatMessage::getConversationId, conversationId);return chatMessageMapper.selectList(queryWrapper).stream().map(e -> new UserMessage(e.getContext())).collect(Collectors.toList());}@Overridepublic void clear(String conversationId) {LambdaQueryWrapper<ChatMessage> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(ChatMessage::getConversationId, conversationId);chatMessageMapper.delete(queryWrapper);}
}

创建chatModel

创建一个就行,我这里为了实现0代码切换大模型。

@Configuration
public class BaiLianConfig {@Value("${spring.ai.openai.api-key}")private String apiKey;@Value("${spring.ai.openai.base-url}")private String baseUrl;private final String BAILIAN_DEEPSEEK_MODEL = "deepseek-v3";private final String BAILIAN_QWEN_MODEL = "qwen-max";@Beanpublic OpenAiChatModel deepSeek(){return OpenAiChatModel.builder().openAiApi(OpenAiApi.builder().apiKey(apiKey).baseUrl(baseUrl).build()).defaultOptions(OpenAiChatOptions.builder().model(BAILIAN_DEEPSEEK_MODEL).build()).build();}@Beanpublic OpenAiChatModel qwen(){return OpenAiChatModel.builder().openAiApi(OpenAiApi.builder().apiKey(apiKey).baseUrl(baseUrl).build()).defaultOptions(OpenAiChatOptions.builder().model(BAILIAN_QWEN_MODEL).build()).build();}}

创建controller

@Slf4j
@RestController
@RequestMapping("/memory")
public class ChatMemoryController {private final ChatClient chatClient;public ChatMemoryController(ChatModel deepSeek) {this.chatClient = ChatClient.builder(deepSeek).build();}@Autowiredprivate MysqlChatMemory mysqlChatMemory;@GetMapping("/mysql")public Flux<String> mysql(String question, String conversationId){MessageChatMemoryAdvisor advisor = MessageChatMemoryAdvisor.builder(mysqlChatMemory).conversationId(conversationId).order(5).build();return chatClient.prompt().system("你是我的学习助手名字叫小菜包").user(question).advisors(advisor).stream().content();}}

测试

就是为了测试我的会话id就是我自己设置的,后面到了项目中肯定不是这样使用的。

http://www.xdnf.cn/news/15218.html

相关文章:

  • 「日拱一码」025 机器学习——评价指标
  • Spring 框架中的设计模式:从实现到思想的深度解析
  • C++类模板继承部分知识及测试代码
  • 在 Android 库模块(AAR)中,BuildConfig 默认不会自动生成 VERSION_CODE 和 VERSION_NAME 字段
  • Linux之Zabbix分布式监控篇(一)
  • 云原生技术与应用-生产环境构建高可用Harbor私有镜像仓库
  • 网络通信模型对比:OSI与TCP/IP参考模型解析
  • BGP 路由优选属性(7)【MED】官方考试综合实验题【bgp】【acl】【ip-prefix】【route-policy】【icmp 环路】精讲
  • Frida绕过SSL Pinning (证书绑定)抓包;Frida注入;app无法抓包问题解决。
  • 哔哩哔哩第三方TV-BBLL最新版
  • Pyqt5 FlexRay
  • Redis事件机制
  • 特辑:Ubuntu,前世今生
  • Claude code在Windows上的配置流程
  • 基于Opencv的缺陷检测实战
  • cuDNN 的 IMPLICIT_GEMM 算法
  • 深入理解设计模式:建造者模式详解
  • Spring Boot 2.4+中bootstrap.yml加载顺序的源码深度解析
  • NLP:RNN文本生成案例分享
  • 常用控件QWidget
  • 第10讲——一元函数积分学的几何应用
  • 关于解决win 11安装mathtype报错的问题(toolbar.eql)
  • 计算机毕业设计ssm基于Web的高校食堂管理系统 基于SSM框架的大学智慧餐饮服务平台 JavaWeb校园食堂一站式订餐与供应链系统
  • 【kubernetes】--controller(DaemonSet)
  • SD卡初始化、命令及响应命令格式(详细)讲解
  • 分层架构的C++高并发内存池性能优化
  • 无法打开windows安全中心解决方案
  • DirectX Repair修复工具下载,.NET修复,DirectX修复
  • 2025 全球酒店用品厂家竞争力排行榜发布:扬州卓韵领衔,布草工厂实力重塑行业格局
  • 关于 验证码系统 详解