From 8a5ec1021bbdec48f77504642ecbacb151308b33 Mon Sep 17 00:00:00 2001 From: PL <774412461@qq.com> Date: Thu, 9 Jan 2025 14:41:13 +0800 Subject: [PATCH] =?UTF-8?q?up:=E6=B7=BB=E5=8A=A0ai=E6=80=BB=E7=BB=93?= =?UTF-8?q?=E7=9A=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/dto/ai/comment/ArtSummaryDto.java | 22 ++ .../dto/ai/comment/WisdomSummaryDto.java | 27 +++ .../teammodel/service/ChatMessageService.java | 15 +- .../service/impl/ChatMessageServiceImpl.java | 216 +++++++++++++++++- src/main/resources/Json/ChatModel.json | 10 +- 5 files changed, 281 insertions(+), 9 deletions(-) create mode 100644 src/main/java/cn/teammodel/model/dto/ai/comment/ArtSummaryDto.java create mode 100644 src/main/java/cn/teammodel/model/dto/ai/comment/WisdomSummaryDto.java diff --git a/src/main/java/cn/teammodel/model/dto/ai/comment/ArtSummaryDto.java b/src/main/java/cn/teammodel/model/dto/ai/comment/ArtSummaryDto.java new file mode 100644 index 0000000..c3398c6 --- /dev/null +++ b/src/main/java/cn/teammodel/model/dto/ai/comment/ArtSummaryDto.java @@ -0,0 +1,22 @@ +package cn.teammodel.model.dto.ai.comment; + +import lombok.Data; + +import java.util.List; + +/** + * 艺术总结 + */ +@Data +public class ArtSummaryDto { + /** + * 艺术纬度 + */ + private List artLatitudes; + + /** + * 艺术科目 + */ + private List artSubjects; + +} diff --git a/src/main/java/cn/teammodel/model/dto/ai/comment/WisdomSummaryDto.java b/src/main/java/cn/teammodel/model/dto/ai/comment/WisdomSummaryDto.java new file mode 100644 index 0000000..5e87924 --- /dev/null +++ b/src/main/java/cn/teammodel/model/dto/ai/comment/WisdomSummaryDto.java @@ -0,0 +1,27 @@ +package cn.teammodel.model.dto.ai.comment; + +import lombok.Data; + +import java.util.List; + +/** + * 智慧 总结数据信息 + */ +@Data +public class WisdomSummaryDto { + /** + * 总体 + */ + private WisdomCommentsDto wisdom; + /** + * 预设的会话面具 id + */ + + private List wisdomExam; + + /** + * 预设的会话面具 id + */ + private List wisdomSubject; + +} diff --git a/src/main/java/cn/teammodel/service/ChatMessageService.java b/src/main/java/cn/teammodel/service/ChatMessageService.java index d161c21..ed067ac 100644 --- a/src/main/java/cn/teammodel/service/ChatMessageService.java +++ b/src/main/java/cn/teammodel/service/ChatMessageService.java @@ -2,6 +2,7 @@ package cn.teammodel.service; import cn.teammodel.model.dto.ai.comment.ChatCommentsDto; import cn.teammodel.model.dto.ai.ChatCompletionReqDto; +import cn.teammodel.model.dto.ai.comment.WisdomSummaryDto; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; /** @@ -15,9 +16,21 @@ public interface ChatMessageService { SseEmitter chatCompletion(ChatCompletionReqDto chatCompletionReqDto, String userId); /** - * AI 评语聊天 + * AI 评语 * @param chatCommentsDto * @return */ SseEmitter chatComments(ChatCommentsDto chatCommentsDto, String userId, String userName); + + /** + * AI 总结 + * @return + */ + SseEmitter chatSummary(WisdomSummaryDto chatSummaryDto, String userId, String userName); + + /** + * AI 分析 + * @return + */ + SseEmitter chatAnalysis(); } diff --git a/src/main/java/cn/teammodel/service/impl/ChatMessageServiceImpl.java b/src/main/java/cn/teammodel/service/impl/ChatMessageServiceImpl.java index f8cc3a1..4df25d0 100644 --- a/src/main/java/cn/teammodel/service/impl/ChatMessageServiceImpl.java +++ b/src/main/java/cn/teammodel/service/impl/ChatMessageServiceImpl.java @@ -49,7 +49,6 @@ public class ChatMessageServiceImpl implements ChatMessageService { @Resource private JsonLoader jsonLoader; - @Override public SseEmitter chatCompletion(ChatCompletionReqDto chatCompletionReqDto, String userId) { // 目前仅使用讯飞星火大模型 @@ -103,6 +102,29 @@ public class ChatMessageServiceImpl implements ChatMessageService { } } + /** + * AI 总结 + * @return + */ + @Override + public SseEmitter chatSummary(WisdomSummaryDto chatSummaryDto, String userId, String userName) + { + // 目前仅使用讯飞星火大模型 + // 获取模板文本 + //String text = commentsTemplate(chatCommentsDto); + return null; + } + + /** + * AI 分析 + * @return + */ + @Override + public SseEmitter chatAnalysis() { + return null; + } + + /** * 面具模式(暂时不存储聊天记录) */ @@ -475,6 +497,119 @@ public class ChatMessageServiceImpl implements ChatMessageService { //builder.append(String.format(finalChatModel.getEnd().get(0), subjectComments.size(),chatName)); break; } + //智育 整体总结 + case "wisdomSummary": { + WisdomSummaryDto summaryDto; + //转换问题 + try { + //转换方式 + summaryDto = JSON.parseObject(strData, WisdomSummaryDto.class); + } catch (Exception e) { + throw new ServiceException(ErrorCode.PARAMS_ERROR.getCode(), "类型转换失败"); + } + if (summaryDto.getWisdom().getName() == null) { + throw new ServiceException(ErrorCode.PARAMS_ERROR.getCode(), "请求参数异常"); + } + //循环查找对应的模型数据 + finalChatModel = chatModels.stream() + .filter(chatModelTemp -> "wisdom".equals(chatModelTemp.getType())) + .findFirst() + .orElse(null); + String chat = phase > 0 ? finalChatModel.getChat().get(1) : finalChatModel.getChat().get(0); + String cycleChat = finalChatModel.getCycleChats().get(0); + + // 使用String.format方法生成最终的字符串 + builder.append(String.format( + chat, + chatCommentsDto.getName(), + summaryDto.getWisdom().getYear(), + summaryDto.getWisdom().getSemester(), + summaryDto.getWisdom().getJoinAll(), + summaryDto.getWisdom().getLessonMiddle(), + summaryDto.getWisdom().getOnLine(), + summaryDto.getWisdom().getMarking(), + summaryDto.getWisdom().getLevel(), + summaryDto.getWisdom().getProportion(), + summaryDto.getWisdom().getName() + )); + summaryDto.getWisdom().getDims().forEach(item -> { + if(item.data.length >= 4) + { + builder.append(String.format(cycleChat, + item.name, + item.data[0], + item.data[1], + item.data[2], + item.data[3], + item.data[4] + )); + } + }); + + //循环查找对应的模型数据 + finalChatModel = chatModels.stream() + .filter(chatModelTemp -> "wisdomExam".equals(chatModelTemp.getType())) + .findFirst() + .orElse(null); + int count = 1; + boolean set =finalChatModel.getChat().size() >= 1; + if(finalChatModel.getChat().size() >= 1 && !chatCommentsDto.getName().isEmpty()){ + //昵称 + builder.append(String.format(finalChatModel.getChat().get(0), chatCommentsDto.getName())); + } + switch(phase){ + case 1:{ + for (WisdomExamCommentsDto examComment : summaryDto.getWisdomExam()) { + builder.append(String.format(finalChatModel.getCycleChats().get(1), count, examComment.getName(),examComment.getTime(), examComment.getClassRate(),examComment.getGradeRate())); + count++; + } + break; + } + case 2:{ + for (WisdomExamCommentsDto examComment : summaryDto.getWisdomExam()) { + builder.append(String.format(finalChatModel.getCycleChats().get(2), count, examComment.getName(),examComment.getTime(), examComment.getGradeRate())); + count++; + } + break; + } + default:{ + for (WisdomExamCommentsDto examComment : summaryDto.getWisdomExam()) { + builder.append(String.format(finalChatModel.getCycleChats().get(0), count, examComment.getName(),examComment.getTime(), examComment.getScore(), examComment.getScoreRate(),examComment.getRanking())); + count++; + } + break; + } + } + + //循环查找对应的模型数据 + finalChatModel = chatModels.stream() + .filter(chatModelTemp -> "wisdomSubject".equals(chatModelTemp.getType())) + .findFirst() + .orElse(null); + if(finalChatModel.getChat().size() >= 2 && !chatCommentsDto.getName().isEmpty()){ + builder.append(String.format(finalChatModel.getChat().get(1), chatCommentsDto.getName())); + } + else { + if (finalChatModel.getChat() != null) { + builder.append(finalChatModel.getChat().get(0)); + } + } + + String name = ""; + //拼接学科数组 + for (WisdomSubjectComments comments : summaryDto.getWisdomSubject()) { + builder.append(String.format(finalChatModel.getCycleChats().get(0), comments.subjectName)); + for (WisdomSubjectComments.StuInfo stuInfo : comments.getRankings()) { + builder.append(String.format(finalChatModel.getCycleChats().get(1), stuInfo.ranking,stuInfo.name, stuInfo.scoreRate*100)); + } + if (phase == 0) { + name = comments.getClaasRanking().name; + builder.append(String.format(finalChatModel.getCycleChats().get(2), name, comments.getClaasRanking().ranking, comments.getClaasRanking().scoreRate * 100, comments.getClaasRanking().average * 100)); + } + } + + break; + } //艺术 考核指标纬度评语 case "artLatitude":{ List artLatitudes; @@ -524,6 +659,48 @@ public class ChatMessageServiceImpl implements ChatMessageService { //builder.append(String.format(finalChatModel.getEnd().get(0),chatName)); break; } + //艺术 整体总结 + case "artSummary":{ + ArtSummaryDto summaryDto; + try { + summaryDto = JSON.parseObject(strData, new TypeReference() { + }); + } catch (Exception e) { + throw new ServiceException(ErrorCode.PARAMS_ERROR.getCode(), "请求参数异常"); + } + if (summaryDto.getArtLatitudes().size() <= 1 && summaryDto.getArtSubjects().size() <= 1) { + if (summaryDto.getArtLatitudes().isEmpty()) { + throw new ServiceException(ErrorCode.PARAMS_ERROR.getCode(), "请求参数异常"); + } + } + + //循环查找对应的模型数据 + finalChatModel = chatModels.stream() + .filter(chatModelTemp -> "artLatitude".equals(chatModelTemp.getType())) + .findFirst() + .orElse(null); + if(finalChatModel.getChat() != null && !chatCommentsDto.getName().isEmpty()) { + builder.append(String.format(finalChatModel.getChat().get(1), chatCommentsDto.getName())); + }else { + if (finalChatModel.getChat() != null) { + builder.append(finalChatModel.getChat().get(0)); + } + } + for (ArtLatitudeDto artLatitude : summaryDto.getArtLatitudes()){ + builder.append(String.format(finalChatModel.getCycleChats().get(0), artLatitude.getQuotaN1(),artLatitude.getQuotaP1(), artLatitude.getQuotaN2(),artLatitude.getQuotaP2(), artLatitude.getQuotaN3(),artLatitude.getQuotaP3(), artLatitude.getPercent(),artLatitude.getLevel())); + } + + //循环查找对应的模型数据 + finalChatModel = chatModels.stream() + .filter(chatModelTemp -> "artSubject".equals(chatModelTemp.getType())) + .findFirst() + .orElse(null); + builder.append(String.format(finalChatModel.getChat().get(0), chatCommentsDto.getSubject())); + for (ArtSubjectDto artSubject : summaryDto.getArtSubjects()){ + builder.append(String.format(finalChatModel.getCycleChats().get(0), artSubject.getDimension(),artSubject.getBlock(), artSubject.getPoint(),artSubject.getScore(), artSubject.getTotalScore(),artSubject.getPercent())); + } + break; + } //体育 case "sport":{ builder.append("请按照以下格式回复:\n"); @@ -542,7 +719,14 @@ public class ChatMessageServiceImpl implements ChatMessageService { throw new ServiceException(ErrorCode.PARAMS_ERROR.getCode(), "评语类型异常"); } - String limitChat = "。限制条件如下:1.返回评价内容在%s字左右;2.直接返回评价的内容;3.评价开头不要提示语;4.评价开头不允许出现特殊字符;"; + String limitChat = ""; + if("wisdomSummary".equals(chatCommentsDto.getType()) || "artSummary".equals(chatCommentsDto.getType())) + { + limitChat = "。限制条件如下:##依据提供的数据做一个在%s字左右的总结;##直接返回总结的内容;##总结开头不允许出现特殊字符"; + }else { + //String limitChat = "。限制条件如下:##返回评价内容在%s字左右;##直接返回评价的内容;##评价开头不要提示语;##评价开头不允许出现特殊字符;##在提供的数据做一个200字的分析;## 分析和评价分开表述。" + limitChat = "。限制条件如下:##依据提供的数据做一个在%s字左右的评价;##直接返回评价的内容;##评价开头不允许出现特殊字符"; + } int size = chatCommentsDto.getSize() > 0 ? chatCommentsDto.getSize() : 200; builder.append(String.format(limitChat, size)); @@ -553,7 +737,8 @@ public class ChatMessageServiceImpl implements ChatMessageService { int length = limitTexts.size(); //数组大小 for (int i = 0; i < length; i++) { String str = limitTexts.get(i); - builder.append(serialNumber).append(".").append(str); + //builder.append(serialNumber).append(".").append(str); + builder.append(";##").append(str); if (i < length - 1) { builder.append(";"); }else { @@ -561,6 +746,8 @@ public class ChatMessageServiceImpl implements ChatMessageService { } serialNumber += 1; } + }else { + builder.append("。"); } return builder.toString(); @@ -570,4 +757,27 @@ public class ChatMessageServiceImpl implements ChatMessageService { throw new ServiceException(ErrorCode.OPERATION_ERROR.getCode(), Arrays.toString(e.getStackTrace())); } } + + /** + * 评语总结 数据字串拼接 + * @param chatSummaryDto + * @return + */ + private String chatSummary(WisdomSummaryDto chatSummaryDto) { + try { + StringBuilder builder = new StringBuilder(); + + + + + return builder.toString(); + } catch (Exception e) { + log.info(Arrays.toString(e.getStackTrace())); + log.error("{}-{}", e.getMessage(), Arrays.toString(e.getStackTrace())); + throw new ServiceException(ErrorCode.OPERATION_ERROR.getCode(), Arrays.toString(e.getStackTrace())); + } + } + + + } diff --git a/src/main/resources/Json/ChatModel.json b/src/main/resources/Json/ChatModel.json index 75015ab..53a06b2 100644 --- a/src/main/resources/Json/ChatModel.json +++ b/src/main/resources/Json/ChatModel.json @@ -9,7 +9,7 @@ ], "cycleChats": ["在%s中:学习态度为:%s、学习成效:%s、合作能力:%s、评价能力:%s、评价能力:%s ;\n"], "end": ["请根据我提供的数据,对%s的考试成绩表现做一个评价。\n"], - "limit": "。限制条件如下:1、%s字左右;2、直接返回评语的内容;3、评语的开篇不允许出现提示语;4、评语的开篇不允许出现特殊字符。" + "limit": "。限制条件如下:1、%s字左右;2、直接返回评语和分析的内容;3、评语的开篇不允许出现提示语;4、评语的开篇不允许出现特殊字符。" }, { "type": "wisdomExam", @@ -18,7 +18,7 @@ "chat": ["%s\n,"], "cycleChats": ["参加第%s次,考试结果:名称:%s,时间:%s,得分:%s,考试得分率:%s %% 排名:%s ;\n","参加第%s次,考试结果:名称:%s,时间:%s,班级平均得分率:%s %%,年级平均得分率:%s %%;\n","参加第%s次,考试结果:名称:%s,时间:%s,年级平均得分率:%s %%;\n"], "end": ["请根据我提供的数据,对%s的考试成绩表现做一个评价。\n"], - "limit": "。限制条件如下:1、%s字左右;2、直接返回评语的内容;3、评语的开篇不允许出现提示语;4、评语的开篇不允许出现特殊字符。" + "limit": "。限制条件如下:1、%s字左右;2、直接返回评语和分析的内容;3、评语的开篇不允许出现提示语;4、评语的开篇不允许出现特殊字符。" }, { "type": "wisdomSubject", @@ -27,7 +27,7 @@ "chat": ["的各科评测表现:","%s的各科评测表现:\""], "cycleChats":["科目:%s 班级top10"," 排名:%s,姓名:%s,得分率:%s %% ,\n " ,"%s在班级排名:%s,得分率:%s %%,排在班级平均得分率:(%s %%)"], "end": ["请根据我提供的数据,对这%s门学科,对%s的表现做一个评价。 \n"], - "limit": "。限制条件如下:1、%s字左右;2、直接返回评语的内容;3、评语的开篇不允许出现提示语;4、评语的开篇不允许出现特殊字符。" + "limit": "。限制条件如下:1、%s字左右;2、直接返回评语和分析的内容;3、评语的开篇不允许出现提示语;4、评语的开篇不允许出现特殊字符。" }, { "type": "artLatitude", @@ -36,7 +36,7 @@ "chat": ["考核指标评纬度\n","%s的考核指标评纬度\n"], "cycleChats": [" 一级指标:%s( %s %%);二级指标:%s( %s %%);三级指标 %s( %s %%) ;得分率:%s %% 等级:%s\n"], "end": ["请根据我提供的数据,对%s做一个整体的评价。 \n"], - "limit": "" + "limit": "。限制条件如下:1、%s字左右;2、直接返回评语和分析的内容;3、评语的开篇不允许出现提示语;4、评语的开篇不允许出现特殊字符。" }, { "type": "artSubject", @@ -45,7 +45,7 @@ "chat": ["%s的学科\n"], "cycleChats": [" 考核纬度:%s;一级知识点:%s;二级知识点 %s;得分:%s/%s 得分率:%s\n"], "end": ["请根据我提供的数据,对%s的表现做一个整体的评价。 \n"], - "limit": "。限制条件如下:1、%s字左右;2、直接返回评语的内容;3、评语的开篇不允许出现提示语;4、评语的开篇不允许出现特殊字符。" + "limit": "。限制条件如下:1、%s字左右;2、直接返回评语和分析的内容;3、评语的开篇不允许出现提示语;4、评语的开篇不允许出现特殊字符。" } ] }