From 094efd3ecc2f87efbc10846c19ab666211f3619b Mon Sep 17 00:00:00 2001 From: PL <774412461@qq.com> Date: Wed, 4 Jun 2025 18:54:36 +0800 Subject: [PATCH] =?UTF-8?q?up=EF=BC=9A=E5=A4=84=E7=90=86AI=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E9=97=AE=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/dto/ai/ChatCompletionReqDto.java | 3 ++ .../service/impl/ChatMessageServiceImpl.java | 32 +++++++++----- .../service/impl/DeepSeekServiceImpl.java | 42 ++++++++++++------- 3 files changed, 51 insertions(+), 26 deletions(-) diff --git a/src/main/java/cn/teammodel/model/dto/ai/ChatCompletionReqDto.java b/src/main/java/cn/teammodel/model/dto/ai/ChatCompletionReqDto.java index 1f9696a..4747e69 100644 --- a/src/main/java/cn/teammodel/model/dto/ai/ChatCompletionReqDto.java +++ b/src/main/java/cn/teammodel/model/dto/ai/ChatCompletionReqDto.java @@ -17,6 +17,9 @@ public class ChatCompletionReqDto { @ApiModelProperty("模型类型: 科大讯飞:sparkMax;DeepSeek:deepseek-chat ;DeepSeek深度思考:deepseek-reasoner") private String model = "sparkMax"; + @ApiModelProperty("是否保存会话, true 默认保存; false 不保存") + private boolean isSave = true; + @NotBlank(message = "请输入消息内容") private String text; } \ No newline at end of file diff --git a/src/main/java/cn/teammodel/service/impl/ChatMessageServiceImpl.java b/src/main/java/cn/teammodel/service/impl/ChatMessageServiceImpl.java index c4614c2..5d79f98 100644 --- a/src/main/java/cn/teammodel/service/impl/ChatMessageServiceImpl.java +++ b/src/main/java/cn/teammodel/service/impl/ChatMessageServiceImpl.java @@ -12,6 +12,7 @@ import cn.teammodel.common.PK; import cn.teammodel.config.exception.ServiceException; import cn.teammodel.model.dto.ai.*; import cn.teammodel.model.dto.ai.comment.*; +import cn.teammodel.model.entity.TmdUserDetail; import cn.teammodel.model.entity.ai.ChatApp; import cn.teammodel.repository.ChatAppRepository; import cn.teammodel.repository.ChatSessionRepository; @@ -63,12 +64,17 @@ public class ChatMessageServiceImpl implements ChatMessageService { // 目前仅使用讯飞星火大模型 String appId = chatCompletionReqDto.getAppId(); SseEmitter sseEmitter; - // + + sseEmitter = completionBySession(chatCompletionReqDto, userId); + /* + //不保存/保存聊天记录 if (chatCompletionReqDto.getModel().equals("deepseek_chat") || chatCompletionReqDto.getModel().equals("deepseek-reasoner")) { sseEmitter = completionBySession(chatCompletionReqDto, userId); } else { sseEmitter = completionByApp(chatCompletionReqDto, false); } + */ + return sseEmitter; } @@ -161,8 +167,9 @@ public class ChatMessageServiceImpl implements ChatMessageService { String appId = chatCompletionReqDto.getAppId(); String userPrompt = chatCompletionReqDto.getText(); User user = SecurityUtil.getLoginUser(); - String userId = user.getId(); - String schoolId = user.getSchoolId(); + //String userId = user.getId(); + String userId = ((TmdUserDetail) SecurityUtil.getAuthentication().getPrincipal()).getClaims().getSubject(); + String schoolId = null; //user.getSchoolId(); // 查询 appId 获取 prompt // 通过 prompt 和 userprompt 生成结果 @@ -237,7 +244,6 @@ public class ChatMessageServiceImpl implements ChatMessageService { String sessionId = chatCompletionReqDto.getSessionId(); String mode = chatCompletionReqDto.getModel(); - ChatSession session = RepositoryUtil.findOne(chatSessionRepository.findBySessionId(sessionId), "该会话不存在"); if (!session.getUserId().equals(userId)) { throw new ServiceException(ErrorCode.NO_AUTH_ERROR.getCode(), "该会话不存在"); @@ -258,13 +264,17 @@ public class ChatMessageServiceImpl implements ChatMessageService { listener.setOnComplete((s) -> { log.info("callback: ws complete event emmit"); SseHelper.send(finalSseEmitter, "[DONE]"); - // 处理完成后的事件: 保存消息记录, 缓存更改 - ChatSession.Message message = ChatSession.Message.of(userPrompt, s,chatCompletionReqDto.getModel()); - HistoryCache.updateContext(sessionId, message); - CosmosPatchOperations options = CosmosPatchOperations.create() - .replace("/updateTime", Instant.now().toEpochMilli()) - .add("/history/-", message); - chatSessionRepository.save(sessionId, PK.of(PK.CHAT_SESSION), ChatSession.class, options); + //断开连接 + finalSseEmitter.complete(); + if (chatCompletionReqDto.isSave()){ + // 处理完成后的事件: 保存消息记录, 缓存更改 + ChatSession.Message message = ChatSession.Message.of(userPrompt, s,chatCompletionReqDto.getModel()); + HistoryCache.updateContext(sessionId, message); + CosmosPatchOperations options = CosmosPatchOperations.create() + .replace("/updateTime", Instant.now().toEpochMilli()) + .add("/history/-", message); + chatSessionRepository.save(sessionId, PK.of(PK.CHAT_SESSION), ChatSession.class, options); + } }); // 错误的回调 listener.setOnError((s) -> { diff --git a/src/main/java/cn/teammodel/service/impl/DeepSeekServiceImpl.java b/src/main/java/cn/teammodel/service/impl/DeepSeekServiceImpl.java index 853196f..448b0b5 100644 --- a/src/main/java/cn/teammodel/service/impl/DeepSeekServiceImpl.java +++ b/src/main/java/cn/teammodel/service/impl/DeepSeekServiceImpl.java @@ -143,7 +143,7 @@ public class DeepSeekServiceImpl implements DeepSeekService { SseEmitter sseEmitter = new SseEmitter(-1L); StringBuilder strContent = new StringBuilder(); StringBuilder strReasoning = new StringBuilder(); - executorService.execute(()-> { + //executorService.execute(()-> { try { log.info("流式回答开始,问题:{}", chatCompletionReqDto.getText()); try (CloseableHttpClient client = HttpClients.createDefault()) { @@ -152,13 +152,21 @@ public class DeepSeekServiceImpl implements DeepSeekService { httpPost.setHeader("Accept", "application/json"); httpPost.setHeader("Authorization", "Bearer " + DeepSeekClient.API_Key); - Map question = new HashMap<>(); - question.put("role", "user"); - question.put("content", chatCompletionReqDto.getText()); - + List> messages = new ArrayList<>(); + //助手的角色 + Map systemMessage = new HashMap<>(); + systemMessage.put("role", "system"); + systemMessage.put("content", "你是一个教师助手"); + messages.add(systemMessage); + //用户的消息 + Map userMessage = new HashMap<>(); + userMessage.put("role", "user"); + userMessage.put("content", chatCompletionReqDto.getText()); + messages.add(userMessage); + //向DeepSeek发送请求 Map requestMap = new HashMap<>(); requestMap.put("model", chatCompletionReqDto.getModel()); - requestMap.put("messages", Collections.singletonList(question)); + requestMap.put("messages", messages); requestMap.put("stream", true); requestMap.put("max_tokens", 1024); @@ -173,13 +181,17 @@ public class DeepSeekServiceImpl implements DeepSeekService { String jsonData = line.substring(6); if ("[DONE]".equals(jsonData)) { sseEmitter.send("[DONE]"); + //断开连接 + sseEmitter.complete(); // 会话完成,更新历史会话记录 - ChatSession.Message message = ChatSession.Message.of(chatCompletionReqDto.getText(), strContent.toString(),chatCompletionReqDto.getModel(),strReasoning.toString()); - HistoryCache.updateContext(chatCompletionReqDto.getSessionId(), message); - CosmosPatchOperations options = CosmosPatchOperations.create() - .replace("/updateTime", Instant.now().toEpochMilli()) - .add("/history/-", message); - chatSessionRepository.save(chatCompletionReqDto.getSessionId(), PK.of(PK.CHAT_SESSION), ChatSession.class, options); + if (chatCompletionReqDto.isSave()){ + ChatSession.Message message = ChatSession.Message.of(chatCompletionReqDto.getText(), strContent.toString(),chatCompletionReqDto.getModel(),strReasoning.toString()); + HistoryCache.updateContext(chatCompletionReqDto.getSessionId(), message); + CosmosPatchOperations options = CosmosPatchOperations.create() + .replace("/updateTime", Instant.now().toEpochMilli()) + .add("/history/-", message); + chatSessionRepository.save(chatCompletionReqDto.getSessionId(), PK.of(PK.CHAT_SESSION), ChatSession.class, options); + } break; } JsonNode node = objectMapper.readTree(jsonData); @@ -204,8 +216,8 @@ public class DeepSeekServiceImpl implements DeepSeekService { } } } - log.info("流式回答结束,{}",question); - sseEmitter.complete(); + log.info("流式回答结束,{}",messages); + //sseEmitter.complete(); } } catch (Exception e) { log.error("处理 Deepseek 请求时发生错误", e); @@ -215,7 +227,7 @@ public class DeepSeekServiceImpl implements DeepSeekService { log.error("处理 Deepseek 请求时发生错误", e); sseEmitter.completeWithError(e); } - }); + //}); return sseEmitter; }