From fa93d4ffe06433fc21f4d03fbabdf1693254ae5f Mon Sep 17 00:00:00 2001 From: Ttt Date: Fri, 13 Mar 2026 22:56:19 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=95=B0=E6=8D=AE=E5=BA=93=E6=8C=81?= =?UTF-8?q?=E4=B9=85=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 14 +++- .../src/main/resources/application-local.yml | 4 +- .../src/main/resources/application.yml | 10 +++ .../xservice/ai/agent/SimpleChatAgent.java | 5 +- .../ai/core/handler/MyStreamingHandler.java | 1 - .../xservice/ai/core/route/TaskRouter.java | 3 - .../ai/core/storage/DbPersistentStore.java | 80 ++++++++++++++++++- .../core/storage/MemoryPersistentStore.java | 5 +- .../ai/pojo/entity/AiSimpleChatMessageDO.java | 24 ++++++ .../manage/AiSimpleChatMessageManageImpl.java | 26 ++++++ .../manage/IAiSimpleChatMessageManage.java | 11 +++ .../mapper/IAiSimpleChatMessageMapper.java | 14 ++++ .../mapper/AiSimpleChatMessageMapper.xml | 30 +++++++ 13 files changed, 215 insertions(+), 12 deletions(-) create mode 100644 xservice-service/src/main/java/com/xiang/xservice/ai/pojo/entity/AiSimpleChatMessageDO.java create mode 100644 xservice-service/src/main/java/com/xiang/xservice/ai/repository/manage/AiSimpleChatMessageManageImpl.java create mode 100644 xservice-service/src/main/java/com/xiang/xservice/ai/repository/manage/IAiSimpleChatMessageManage.java create mode 100644 xservice-service/src/main/java/com/xiang/xservice/ai/repository/mapper/IAiSimpleChatMessageMapper.java create mode 100644 xservice-service/src/main/resources/mapper/AiSimpleChatMessageMapper.xml diff --git a/pom.xml b/pom.xml index 9bcfd4e..e8a648a 100644 --- a/pom.xml +++ b/pom.xml @@ -29,7 +29,7 @@ UTF-8 16.0.1 2.3.1 - 3.5.14 + 3.5.5 8.0.33 1.18.30 3.23.6 @@ -118,6 +118,11 @@ compile + + com.baomidou + mybatis-plus-spring-boot3-starter + ${mybatis-plus-spring-boot.version} + mysql mysql-connector-java @@ -141,6 +146,13 @@ 3.15.0 + + + com.alibaba.fastjson2 + fastjson2 + 2.0.51 + + org.springframework.boot spring-boot-starter diff --git a/xservice-server/src/main/resources/application-local.yml b/xservice-server/src/main/resources/application-local.yml index 0972201..bc138ef 100644 --- a/xservice-server/src/main/resources/application-local.yml +++ b/xservice-server/src/main/resources/application-local.yml @@ -1,8 +1,8 @@ spring: datasource: - url: jdbc:mysql://rm-bp15t34gqx62jm069ro.mysql.rds.aliyuncs.com:3306/xservice-ai-center?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true + url: jdbc:mysql://120.27.153.87:3306/xe-service-ai?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true username: root - password: xb#UWqnhH24&XpX + password: sdkljfikdfn@123 driver-class-name: com.mysql.cj.jdbc.Driver ai: diff --git a/xservice-server/src/main/resources/application.yml b/xservice-server/src/main/resources/application.yml index 994e2c3..4e85cd7 100644 --- a/xservice-server/src/main/resources/application.yml +++ b/xservice-server/src/main/resources/application.yml @@ -5,6 +5,11 @@ spring: profiles: active: local + cloud: + nacos: + config: + import-check: + enabled: false server: port: 38020 @@ -14,4 +19,9 @@ server: charset: UTF-8 enabled: true force: true +mybatis: + mapper-locations: + - classpath*:mapper/*/*.xml + configuration: + map-underscore-to-camel-case: true diff --git a/xservice-service/src/main/java/com/xiang/xservice/ai/agent/SimpleChatAgent.java b/xservice-service/src/main/java/com/xiang/xservice/ai/agent/SimpleChatAgent.java index b53aa7f..1f6f662 100644 --- a/xservice-service/src/main/java/com/xiang/xservice/ai/agent/SimpleChatAgent.java +++ b/xservice-service/src/main/java/com/xiang/xservice/ai/agent/SimpleChatAgent.java @@ -9,7 +9,9 @@ import com.xiang.xservice.ai.core.enums.ModelStrategyEnum; import com.xiang.xservice.ai.core.enums.ModelTypeEnum; import com.xiang.xservice.ai.core.handler.MyStreamingHandler; import com.xiang.xservice.ai.core.route.TaskRouter; +import com.xiang.xservice.ai.core.storage.DbPersistentStore; import com.xiang.xservice.ai.core.storage.MemoryPersistentStore; +import com.xiang.xservice.ai.repository.manage.IAiSimpleChatMessageManage; import dev.langchain4j.data.message.SystemMessage; import dev.langchain4j.data.message.UserMessage; import dev.langchain4j.memory.chat.ChatMemoryProvider; @@ -26,12 +28,13 @@ public class SimpleChatAgent implements BaseAgent { private final TaskRouter router; private final OpenAIBaseConfig openAIBaseConfig; + private final IAiSimpleChatMessageManage aiSimpleChatMessageManage; @Override public void chat(ModelTypeEnum modelType, Long id, String message) { - MemoryPersistentStore store = new MemoryPersistentStore(); + DbPersistentStore store = new DbPersistentStore(aiSimpleChatMessageManage); ChatMemoryProvider chatMemoryProvider = memoryId -> MessageWindowChatMemory.builder() .id(memoryId) diff --git a/xservice-service/src/main/java/com/xiang/xservice/ai/core/handler/MyStreamingHandler.java b/xservice-service/src/main/java/com/xiang/xservice/ai/core/handler/MyStreamingHandler.java index 75a0422..4add9cc 100644 --- a/xservice-service/src/main/java/com/xiang/xservice/ai/core/handler/MyStreamingHandler.java +++ b/xservice-service/src/main/java/com/xiang/xservice/ai/core/handler/MyStreamingHandler.java @@ -3,7 +3,6 @@ package com.xiang.xservice.ai.core.handler; import dev.langchain4j.model.StreamingResponseHandler; import dev.langchain4j.model.chat.response.ChatResponse; import dev.langchain4j.model.chat.response.StreamingChatResponseHandler; -import org.checkerframework.checker.units.qual.C; import org.springframework.stereotype.Component; @Component diff --git a/xservice-service/src/main/java/com/xiang/xservice/ai/core/route/TaskRouter.java b/xservice-service/src/main/java/com/xiang/xservice/ai/core/route/TaskRouter.java index 4d44fc8..a099dc9 100644 --- a/xservice-service/src/main/java/com/xiang/xservice/ai/core/route/TaskRouter.java +++ b/xservice-service/src/main/java/com/xiang/xservice/ai/core/route/TaskRouter.java @@ -3,15 +3,12 @@ package com.xiang.xservice.ai.core.route; import com.xiang.xservice.ai.core.entity.ModelConfig; import com.xiang.xservice.ai.core.enums.ModelStrategyEnum; import com.xiang.xservice.ai.core.provider.BaseProvider; -import dev.langchain4j.model.chat.ChatModel; import dev.langchain4j.model.chat.StreamingChatModel; -import org.checkerframework.checker.units.qual.C; import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; @Component public class TaskRouter { diff --git a/xservice-service/src/main/java/com/xiang/xservice/ai/core/storage/DbPersistentStore.java b/xservice-service/src/main/java/com/xiang/xservice/ai/core/storage/DbPersistentStore.java index 0ae3339..ea7e87f 100644 --- a/xservice-service/src/main/java/com/xiang/xservice/ai/core/storage/DbPersistentStore.java +++ b/xservice-service/src/main/java/com/xiang/xservice/ai/core/storage/DbPersistentStore.java @@ -1,23 +1,97 @@ package com.xiang.xservice.ai.core.storage; -import dev.langchain4j.data.message.ChatMessage; +import com.alibaba.fastjson2.JSON; +import com.google.common.collect.Lists; +import com.xiang.xservice.ai.pojo.entity.AiSimpleChatMessageDO; +import com.xiang.xservice.ai.repository.manage.IAiSimpleChatMessageManage; +import dev.langchain4j.data.message.*; import dev.langchain4j.store.memory.chat.ChatMemoryStore; +import lombok.RequiredArgsConstructor; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.stereotype.Component; +import java.time.LocalDateTime; import java.util.List; +/** + * 数据库持久化 + */ +@RequiredArgsConstructor public class DbPersistentStore implements ChatMemoryStore { + + private final IAiSimpleChatMessageManage aiSimpleChatMessageManage; + @Override public List getMessages(Object memoryId) { - return List.of(); + List msg = aiSimpleChatMessageManage.getMsgByMemoryId((Long) memoryId); + if (CollectionUtils.isEmpty(msg)) { + return Lists.newArrayList(); + } + List result = Lists.newArrayList(); + for (AiSimpleChatMessageDO chatMessageDO : msg) { + String role = chatMessageDO.getRole(); + switch (role) { + + case "SYSTEM": + result.add(SystemMessage.from(chatMessageDO.getMessage())); + break; + + case "USER": + result.add(UserMessage.from(chatMessageDO.getMessage())); + break; + + case "AI": + result.add(AiMessage.from(chatMessageDO.getMessage())); + break; + + default: + break; + } + } + return result; } @Override public void updateMessages(Object memoryId, List list) { + List result = Lists.newArrayList(); + for (ChatMessage chatMessage : list) { + StringBuilder str = new StringBuilder(); + String type = ""; + if (chatMessage instanceof SystemMessage systemMessage) { + str = new StringBuilder(systemMessage.text()); + type = "SYSTEM"; + } + if (chatMessage instanceof UserMessage userMessage) { + for (Content content : userMessage.contents()) { + if (content instanceof TextContent textContent) { + str.append(textContent.text()); + type = "USER"; + } + } + } + + if (chatMessage instanceof AiMessage aiMessage) { + str = new StringBuilder(aiMessage.text()); + type = "AI"; + } + + AiSimpleChatMessageDO message = AiSimpleChatMessageDO.builder() + .userId(1L) + .memoryId((Long) memoryId) + .message(str.toString()) + .createTime(LocalDateTime.now()) + .delFlag(0) + .role(type) + .build(); + result.add(message); + + } + aiSimpleChatMessageManage.saveBatch(result); } @Override public void deleteMessages(Object memoryId) { - + aiSimpleChatMessageManage.deleteByMemoryId((Long) memoryId); } } diff --git a/xservice-service/src/main/java/com/xiang/xservice/ai/core/storage/MemoryPersistentStore.java b/xservice-service/src/main/java/com/xiang/xservice/ai/core/storage/MemoryPersistentStore.java index ed91329..6288bd5 100644 --- a/xservice-service/src/main/java/com/xiang/xservice/ai/core/storage/MemoryPersistentStore.java +++ b/xservice-service/src/main/java/com/xiang/xservice/ai/core/storage/MemoryPersistentStore.java @@ -8,9 +8,12 @@ import dev.langchain4j.store.memory.chat.ChatMemoryStore; import java.util.List; import java.util.Map; +/** + * 内存持久化 + */ public class MemoryPersistentStore implements ChatMemoryStore { - private static Map> MAP = Maps.newHashMap(); + private final static Map> MAP = Maps.newHashMap(); @Override diff --git a/xservice-service/src/main/java/com/xiang/xservice/ai/pojo/entity/AiSimpleChatMessageDO.java b/xservice-service/src/main/java/com/xiang/xservice/ai/pojo/entity/AiSimpleChatMessageDO.java new file mode 100644 index 0000000..a85fa2e --- /dev/null +++ b/xservice-service/src/main/java/com/xiang/xservice/ai/pojo/entity/AiSimpleChatMessageDO.java @@ -0,0 +1,24 @@ +package com.xiang.xservice.ai.pojo.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@TableName("ai_simple_chat_message") +@Builder +public class AiSimpleChatMessageDO { + private Long id; + private Long userId; + private Long memoryId; + private String role; + private String message; + private LocalDateTime createTime; + private Integer delFlag; +} diff --git a/xservice-service/src/main/java/com/xiang/xservice/ai/repository/manage/AiSimpleChatMessageManageImpl.java b/xservice-service/src/main/java/com/xiang/xservice/ai/repository/manage/AiSimpleChatMessageManageImpl.java new file mode 100644 index 0000000..cbb8d4e --- /dev/null +++ b/xservice-service/src/main/java/com/xiang/xservice/ai/repository/manage/AiSimpleChatMessageManageImpl.java @@ -0,0 +1,26 @@ +package com.xiang.xservice.ai.repository.manage; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.xiang.xservice.ai.pojo.entity.AiSimpleChatMessageDO; +import com.xiang.xservice.ai.repository.mapper.IAiSimpleChatMessageMapper; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class AiSimpleChatMessageManageImpl extends ServiceImpl implements IAiSimpleChatMessageManage { + @Override + public List getMsgByMemoryId(Long memoryId) { + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.eq(AiSimpleChatMessageDO::getMemoryId, memoryId); + lambdaQueryWrapper.eq(AiSimpleChatMessageDO::getDelFlag, 0); + return baseMapper.selectList(lambdaQueryWrapper); + } + + @Override + public boolean deleteByMemoryId(Long memoryId) { + return baseMapper.deleteByMemoryId(memoryId) > 0; + } +} diff --git a/xservice-service/src/main/java/com/xiang/xservice/ai/repository/manage/IAiSimpleChatMessageManage.java b/xservice-service/src/main/java/com/xiang/xservice/ai/repository/manage/IAiSimpleChatMessageManage.java new file mode 100644 index 0000000..1de7bd9 --- /dev/null +++ b/xservice-service/src/main/java/com/xiang/xservice/ai/repository/manage/IAiSimpleChatMessageManage.java @@ -0,0 +1,11 @@ +package com.xiang.xservice.ai.repository.manage; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.xiang.xservice.ai.pojo.entity.AiSimpleChatMessageDO; + +import java.util.List; + +public interface IAiSimpleChatMessageManage extends IService { + List getMsgByMemoryId(Long memoryId); + boolean deleteByMemoryId(Long memoryId); +} diff --git a/xservice-service/src/main/java/com/xiang/xservice/ai/repository/mapper/IAiSimpleChatMessageMapper.java b/xservice-service/src/main/java/com/xiang/xservice/ai/repository/mapper/IAiSimpleChatMessageMapper.java new file mode 100644 index 0000000..99901e9 --- /dev/null +++ b/xservice-service/src/main/java/com/xiang/xservice/ai/repository/mapper/IAiSimpleChatMessageMapper.java @@ -0,0 +1,14 @@ +package com.xiang.xservice.ai.repository.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.xiang.xservice.ai.pojo.entity.AiSimpleChatMessageDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +@Mapper +@Repository +public interface IAiSimpleChatMessageMapper extends BaseMapper { + int deleteByMemoryId(@Param("id") Long memoryId); + +} diff --git a/xservice-service/src/main/resources/mapper/AiSimpleChatMessageMapper.xml b/xservice-service/src/main/resources/mapper/AiSimpleChatMessageMapper.xml new file mode 100644 index 0000000..f60324e --- /dev/null +++ b/xservice-service/src/main/resources/mapper/AiSimpleChatMessageMapper.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + id, + memory_id, + role, + message, + create_time, + user_id, + del_flag + + + + update ai_simple_chat_message set del_flag = 1 where memory_id = #{id} + + + \ No newline at end of file