AI 超级智能体 - 基于mysql的消息存储
▼java复制代码package com.cestbon.aiagent.chatmemory; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.cestbon.aiagent.entity.ChatConversation; import com.cestbon.aiagent.entity.ChatMessage; import com.cestbon.aiagent.mapper.ChatConversationMapper; import com.cestbon.aiagent.mapper.ChatMessageMapper; import jakarta.annotation.Resource; import org.springframework.ai.chat.memory.ChatMemoryRepository; import org.springframework.ai.chat.messages.AssistantMessage; import org.springframework.ai.chat.messages.Message; import org.springframework.ai.chat.messages.UserMessage; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; import java.util.Date; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; @Component public class InMySqlChatMemoryRepository implements ChatMemoryRepository { @Resource private ChatConversationMapper chatConversationMapper; @Resource private ChatMessageMapper chatMessageMapper; @Override public List<String> findConversationIds() { return chatConversationMapper.selectList(null) .stream() .map(ChatConversation::getConversationId) .collect(Collectors.toList()); } @Override public List<Message> findByConversationId(String conversationId) { Assert.hasText(conversationId, "conversationId must not be empty"); QueryWrapper<ChatMessage> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("conversation_id", conversationId).orderByAsc("message_index") .in("role", "USER", "ASSISTANT"); List<ChatMessage> records = chatMessageMapper.selectList(queryWrapper); if (records == null || records.isEmpty()) { return List.of(); } return records.stream().map(this::convertToMessage) .filter(Objects::nonNull) .collect(Collectors.toList()); } private Message convertToMessage(ChatMessage chatMessage) { String role = chatMessage.getRole(); String content = chatMessage.getContent(); if ("USER".equals(role)) { return new UserMessage(content); } else if ("ASSISTANT".equals(role)) { return new AssistantMessage(content); } return null; } @Override @Transactional public void saveAll(String conversationId, List<Message> messages) { Assert.hasText(conversationId, "conversationId must not be empty"); Assert.notNull(messages, "messages must not be null"); // 查询当前对话,检查是否已存在 QueryWrapper<ChatConversation> conversationWrapper = new QueryWrapper<>(); conversationWrapper.eq("conversation_id", conversationId); ChatConversation existingConversation = chatConversationMapper.selectOne(conversationWrapper); // 如果对话不存在,则新建 if (existingConversation == null) { ChatConversation newConversation = new ChatConversation(); newConversation.setConversationId(conversationId); newConversation.setTitle(messages.getFirst().getText()); chatConversationMapper.insert(newConversation); } else { // 更新对话的updateTime existingConversation.setUpdateTime(new Date()); chatConversationMapper.updateById(existingConversation); } // TODO 当会话消息超过当前窗口时,应该调用llm总结当前会话的内容为一条消息,然后再维护当前窗口,而不是直接删除清空窗口 chatMessageMapper.delete(new QueryWrapper<ChatMessage>().eq("conversation_id", conversationId)); for (int i = 0; i < messages.size(); i++) { Message message = messages.get(i); ChatMessage chatMessage = new ChatMessage(); chatMessage.setConversationId(conversationId); chatMessage.setMessageIndex(i); chatMessage.setContent(message.getText()); chatMessage.setRole(message.getMessageType().name()); chatMessage.setMetadata(JSONUtil.toJsonStr(message.getMetadata())); chatMessage.setCreateTime(new Date()); chatMessageMapper.insert(chatMessage); } } @Override public void deleteByConversationId(String conversationId) { Assert.hasText(conversationId, "conversationId must not be empty"); chatMessageMapper.delete(new QueryWrapper<ChatMessage>().eq("conversation_id", conversationId)); chatConversationMapper.delete(new QueryWrapper<ChatConversation>().eq("conversation_id", conversationId)); } }
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
内容推荐
昨天学了三小时,但忘了打卡了,那就从头开始吧。[衰]day1 学习七小时学了mysql和tomcat底层
14
day5 今天学了四个小时,学了HttpServlerRequest和MySQL
11
day3学完HTTP协议复习了一些Javase的内容明天开始背面经
15
day2今天看完了Servlet,明天看HTTP。今天敲了敲坦克大战,想半天也实现不了,非得看课程。头疼。代码要还是敲了记忆才深刻,尤其是自己单独想通逻辑,然后不看视频就单独敲出来才能算初步学会,每天坚持,慢慢来吧
12
day1打卡今天主要看了韩顺平老师javaweb课程的Tomcat和Servlet的一小部分,前面的前端部分以前学过,就大概看了一下笔记复习了一下。今天感觉对tomcat和Servlet的理解有很大的提升,韩老师的课程很适合我。明天继续加油,明天应该看完Servlet差不多,这里自己第一次学就没学明白,明天就学明白Servlet就好,然后再练习一下SQL语句。
15

