From 8c2a543bbb1d43a6eafcfab6c32d8eda2e68cbb9 Mon Sep 17 00:00:00 2001 From: PL <774412461@qq.com> Date: Wed, 16 Oct 2024 11:42:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=84=E7=90=86=E8=AF=84=E8=AF=AD=E6=99=BA?= =?UTF-8?q?=E8=82=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../teammodel/model/dto/ai/ChatModelDto.java | 6 +- .../model/dto/ai/comment/ChatCommentsDto.java | 6 + .../service/impl/ChatMessageServiceImpl.java | 381 +++++++++--------- src/main/resources/Json/ChatModel.json | 34 +- 4 files changed, 212 insertions(+), 215 deletions(-) diff --git a/src/main/java/cn/teammodel/model/dto/ai/ChatModelDto.java b/src/main/java/cn/teammodel/model/dto/ai/ChatModelDto.java index 9a5dc5f..298edd4 100644 --- a/src/main/java/cn/teammodel/model/dto/ai/ChatModelDto.java +++ b/src/main/java/cn/teammodel/model/dto/ai/ChatModelDto.java @@ -12,10 +12,10 @@ import java.util.List; public class ChatModelDto { public String type; public String name; - public String role; - public String chat; + public ArrayList role; + public ArrayList chat; public ArrayList cycleChats; - public String end; + public ArrayList end; } diff --git a/src/main/java/cn/teammodel/model/dto/ai/comment/ChatCommentsDto.java b/src/main/java/cn/teammodel/model/dto/ai/comment/ChatCommentsDto.java index c4bc272..e37d233 100644 --- a/src/main/java/cn/teammodel/model/dto/ai/comment/ChatCommentsDto.java +++ b/src/main/java/cn/teammodel/model/dto/ai/comment/ChatCommentsDto.java @@ -32,6 +32,12 @@ public class ChatCommentsDto { * 评语重复次数 */ private int repeat; + + /* + * 评语阶段 + */ + private int phase; + /** * 返回评语大概字数 */ diff --git a/src/main/java/cn/teammodel/service/impl/ChatMessageServiceImpl.java b/src/main/java/cn/teammodel/service/impl/ChatMessageServiceImpl.java index 52137ee..0195017 100644 --- a/src/main/java/cn/teammodel/service/impl/ChatMessageServiceImpl.java +++ b/src/main/java/cn/teammodel/service/impl/ChatMessageServiceImpl.java @@ -76,6 +76,7 @@ public class ChatMessageServiceImpl implements ChatMessageService { try { // 目前仅使用讯飞星火大模型 String appId = chatCommentsDto.getAppId(); + // 获取模板文本 String text = commentsTemplate(chatCommentsDto); if (!StringUtils.isEmpty(text)) { chatCommentsDto.setText(text); @@ -300,232 +301,220 @@ public class ChatMessageServiceImpl implements ChatMessageService { * @return */ private String commentsTemplate(ChatCommentsDto chatCommentsDto) { - StringBuilder builder = new StringBuilder(); - String strData = JSON.toJSONString(chatCommentsDto.getData()); - List chatModels = new ArrayList<>(); - ChatModelDto chatModel = null; - // 获取模型数据 - chatModels = jsonLoader.myJsonDataBean(); - - /* - //验证获取模型数据 异常问题 try { - String fileText = FileUtil.getFileText("Json/ChatModel.json"); - String jsonData = JSON.toJSONString(fileText); - //获取聊天字段中的数据 - Object obj = JSON.parseObject(jsonData).get("chatModel"); - String jsonData01 = JSON.toJSONString(obj); - //转换方式 - chatModels = JSON.parseObject(jsonData01, new TypeReference>() {}); + StringBuilder builder = new StringBuilder(); + String strData = JSON.toJSONString(chatCommentsDto.getData()); + //检查是否角色 + int phase = Math.max(chatCommentsDto.getPhase(), 0); + List chatModels = new ArrayList<>(); + ChatModelDto chatModel = null; + // 获取模型数据 + chatModels = jsonLoader.myJsonDataBean(); + //循环查找对应的模型数据 + for (ChatModelDto chatModelTemp : chatModels) { + //判断评语类型 + if (chatCommentsDto.getType().equals(chatModelTemp.getType())) { + chatModel = chatModelTemp; + break; + } + } - log.info("获取地址fileText:"+fileText+"----文件内容Data:"+ jsonData +"----获取模型集合Object:" + obj +"----获取模型集合String:"+ jsonData01 +"----获取模型集合机构:"+chatModels); - } catch (Exception e) { - throw new ServiceException(ErrorCode.OPERATION_ERROR.getCode(), "读取文件" + Arrays.toString(e.getStackTrace()) + e.getMessage()); - }*/ + if (chatModel != null) { + String role = ""; + if (phase > 2){ + role = chatModel.getRole().get(0); + }else + { + role = chatModel.getRole().get(1); + } - //循环查找对应的模型数据 - for (ChatModelDto chatModelTemp : chatModels) { - //判断评语类型 - if (chatCommentsDto.getType().equals(chatModelTemp.getType())) { - chatModel = chatModelTemp; - break; + //角色条件 + builder.append(String.format(chatModel.getRole().get(phase), chatCommentsDto.getPeriod(), chatCommentsDto.getSubject())); } - } - - if (chatModel != null) { - //角色条件 - builder.append(String.format(chatModel.getRole(), chatCommentsDto.getPeriod(), chatCommentsDto.getSubject())); - } - ChatModelDto finalChatModel = chatModel; - //模版 - switch (chatCommentsDto.getType()) { - //智育 总体评语模版 - case "wisdom": { - WisdomCommentsDto wisdomComments; - //转换问题 - try { - //转换方式 - wisdomComments = JSON.parseObject(strData, WisdomCommentsDto.class); - } catch (Exception e) { - throw new ServiceException(ErrorCode.PARAMS_ERROR.getCode(), "类型转换失败"); - } - if (wisdomComments.getName() == null) { - throw new ServiceException(ErrorCode.PARAMS_ERROR.getCode(), "请求参数异常"); - } + ChatModelDto finalChatModel = chatModel; + //模版 + switch (chatCommentsDto.getType()) { + //智育 总体评语模版 + case "wisdom": { + WisdomCommentsDto wisdomComments; + //转换问题 + try { + //转换方式 + wisdomComments = JSON.parseObject(strData, WisdomCommentsDto.class); + } catch (Exception e) { + throw new ServiceException(ErrorCode.PARAMS_ERROR.getCode(), "类型转换失败"); + } + if (wisdomComments.getName() == null) { + throw new ServiceException(ErrorCode.PARAMS_ERROR.getCode(), "请求参数异常"); + } - // 使用String.format方法生成最终的字符串 - builder.append(String.format( - finalChatModel.getChat(), - wisdomComments.getName(), - wisdomComments.getYear(), - wisdomComments.getSemester(), - wisdomComments.getJoinAll(), - wisdomComments.getLessonMiddle(), - wisdomComments.getOnLine(), - wisdomComments.getMarking(), - wisdomComments.getLevel(), - wisdomComments.getProportion(), - wisdomComments.getName() - )); - /* - //有平均分 - builder.append(String.format( - finalChatModel.getChat(), - wisdomComments.getName(), - wisdomComments.getYear(), - wisdomComments.getSemester(), - wisdomComments.getJoinAll(), - wisdomComments.getLessonMiddle(), - wisdomComments.getOnLine(), - wisdomComments.getMarking(), - wisdomComments.getAverage(), - wisdomComments.getLevel(), - wisdomComments.getProportion(), - wisdomComments.getName() - ));*/ - wisdomComments.getDims().forEach(item -> { - builder.append(String.format(finalChatModel.getCycleChats().get(0), - item.name, - item.data[0], - item.data[1], - item.data[2], - item.data[3], - item.data[4] + 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, + wisdomComments.getName(), + wisdomComments.getYear(), + wisdomComments.getSemester(), + wisdomComments.getJoinAll(), + wisdomComments.getLessonMiddle(), + wisdomComments.getOnLine(), + wisdomComments.getMarking(), + wisdomComments.getLevel(), + wisdomComments.getProportion(), + wisdomComments.getName() )); - }); - builder.append(String.format(finalChatModel.getEnd(), wisdomComments.getName())); - break; - } - //智育 表现模版 - case "wisdomExam": { - List examComments = new ArrayList<>(); - try { - examComments = JSON.parseObject(strData, new TypeReference>() { + wisdomComments.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] + )); + } }); - } catch (Exception e) { - throw new ServiceException(ErrorCode.PARAMS_ERROR.getCode(), "类型转换失败"); + builder.append(String.format(finalChatModel.getEnd().get(0), wisdomComments.getDims().size())); + break; } - if (examComments.size() <= 1) { - if (examComments.isEmpty()) { - throw new ServiceException(ErrorCode.PARAMS_ERROR.getCode(), "请求参数异常"); + //智育 表现模版 + case "wisdomExam": { + List examComments = new ArrayList<>(); + try { + examComments = JSON.parseObject(strData, new TypeReference>() { + }); + } catch (Exception e) { + throw new ServiceException(ErrorCode.PARAMS_ERROR.getCode(), "类型转换失败"); } - if (examComments.get(0).name == null) { - throw new ServiceException(ErrorCode.PARAMS_ERROR.getCode(), "请求参数异常"); + if (examComments.size() <= 1) { + if (examComments.isEmpty()) { + throw new ServiceException(ErrorCode.PARAMS_ERROR.getCode(), "请求参数异常"); + } + if (examComments.get(0).name == null) { + throw new ServiceException(ErrorCode.PARAMS_ERROR.getCode(), "请求参数异常"); + } } - } - int count = 1; - for (WisdomExamCommentsDto examComment : examComments) { - builder.append(String.format(finalChatModel.getCycleChats().get(0), count, examComment.getName(), - examComment.getTime(), examComment.getScore(), examComment.getScoreRate(), - examComment.getRanking())); - if (count < examComments.size()) { - count++; + int count = 1; + for (WisdomExamCommentsDto examComment : examComments) { + builder.append(String.format(finalChatModel.getCycleChats().get(0), count, examComment.getName(), + examComment.getTime(), examComment.getScore(), examComment.getScoreRate(), + examComment.getRanking())); + if (count < examComments.size()) { + count++; + } } + builder.append(String.format(finalChatModel.getEnd().get(0), count)); + break; } - builder.append(String.format(finalChatModel.getEnd(), count)); - break; - } - // 智育 学科评语模版 - case "windomSubject": { - List subjectComments; - try { - subjectComments = JSON.parseObject(strData, new TypeReference>() { - }); - } catch (Exception e) { - throw new ServiceException(ErrorCode.PARAMS_ERROR.getCode(), "请求参数异常"); - } - if (subjectComments.size() <= 1) { + // 智育 学科评语模版 + case "wisdomSubject": { + List subjectComments; + try { + subjectComments = JSON.parseObject(strData, new TypeReference>() { + }); + } catch (Exception e) { + throw new ServiceException(ErrorCode.PARAMS_ERROR.getCode(), "请求参数异常"); + } if (subjectComments.isEmpty()) { throw new ServiceException(ErrorCode.PARAMS_ERROR.getCode(), "请求参数异常"); } - } - builder.append(finalChatModel.getChat()); - String name = ""; - //拼接学科数组 - for (WisdomSubjectComments comments : subjectComments) { - 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)); + builder.append(finalChatModel.getChat()); + String name = ""; + //拼接学科数组 + for (WisdomSubjectComments comments : subjectComments) { + 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)); + } } - name = comments.getClaasRanking().name; - builder.append(String.format(finalChatModel.getCycleChats().get(2),name,comments.getClaasRanking().ranking, comments.getClaasRanking().scoreRate * 100,comments.getClaasRanking().average * 100)); - } - builder.append(String.format(finalChatModel.getEnd(), subjectComments.size(),name)); - break; - } - //艺术 考核指标纬度评语 - case "artLatitude":{ - List artLatitudes; - try { - artLatitudes = JSON.parseObject(strData, new TypeReference>() { - }); - } catch (Exception e) { - throw new ServiceException(ErrorCode.PARAMS_ERROR.getCode(), "请求参数异常"); + builder.append(String.format(finalChatModel.getEnd().get(0), subjectComments.size(),name)); + break; } - if (artLatitudes.size() <= 1) { - if (artLatitudes.isEmpty()) { + //艺术 考核指标纬度评语 + case "artLatitude":{ + List artLatitudes; + try { + artLatitudes = JSON.parseObject(strData, new TypeReference>() { + }); + } catch (Exception e) { throw new ServiceException(ErrorCode.PARAMS_ERROR.getCode(), "请求参数异常"); } - } - builder.append(finalChatModel.getChat()); - for (ArtLatitudeDto artLatitude : artLatitudes) - { - builder.append(String.format(finalChatModel.getCycleChats().get(0), artLatitude.getQuotaN1(),artLatitude.getQuotaP1(), artLatitude.getQuotaN2(),artLatitude.getQuotaP2(), artLatitude.getQuotaN3(),artLatitude.getQuotaP3(), artLatitude.getPercent(),artLatitude.getLevel())); - } + if (artLatitudes.size() <= 1) { + if (artLatitudes.isEmpty()) { + throw new ServiceException(ErrorCode.PARAMS_ERROR.getCode(), "请求参数异常"); + } + } + builder.append(finalChatModel.getChat()); + for (ArtLatitudeDto artLatitude : artLatitudes) + { + builder.append(String.format(finalChatModel.getCycleChats().get(0), artLatitude.getQuotaN1(),artLatitude.getQuotaP1(), artLatitude.getQuotaN2(),artLatitude.getQuotaP2(), artLatitude.getQuotaN3(),artLatitude.getQuotaP3(), artLatitude.getPercent(),artLatitude.getLevel())); + } - builder.append(finalChatModel.getEnd()); - break; - } - //艺术 学科评语模版 - case "artSubject":{ - List artSubjects; - try { - artSubjects = JSON.parseObject(strData, new TypeReference>() { - }); - } catch (Exception e) { - throw new ServiceException(ErrorCode.PARAMS_ERROR.getCode(), "请求参数异常"); + builder.append(finalChatModel.getEnd()); + break; } - if (artSubjects.size() <= 1) { - if (artSubjects.isEmpty()) { + //艺术 学科评语模版 + case "artSubject":{ + List artSubjects; + try { + artSubjects = JSON.parseObject(strData, new TypeReference>() { + }); + } catch (Exception e) { throw new ServiceException(ErrorCode.PARAMS_ERROR.getCode(), "请求参数异常"); } + if (artSubjects.size() <= 1) { + if (artSubjects.isEmpty()) { + throw new ServiceException(ErrorCode.PARAMS_ERROR.getCode(), "请求参数异常"); + } + } + builder.append(finalChatModel.getChat()); + for (ArtSubjectDto artSubject : artSubjects){ + builder.append(String.format(finalChatModel.getCycleChats().get(0), artSubject.getDimension(),artSubject.getBlock(), artSubject.getPoint(),artSubject.getScore(), artSubject.getTotalScore(),artSubject.getPercent())); + } + + builder.append(String.format(finalChatModel.getEnd().get(0),chatCommentsDto.getSubject())); + break; } - builder.append(finalChatModel.getChat()); - for (ArtSubjectDto artSubject : artSubjects){ - builder.append(String.format(finalChatModel.getCycleChats().get(0), artSubject.getDimension(),artSubject.getBlock(), artSubject.getPoint(),artSubject.getScore(), artSubject.getTotalScore(),artSubject.getPercent())); + //体育 + case "sport":{ + builder.append("请按照以下格式回复:\n"); + builder.append("1. 运动作品:\n"); + builder.append("2. 运动作品说明:\n"); + builder.append("3. 运动作品示例:\n"); + builder.append("4. 运动作品示例说明:\n"); + break; } + //德育 + case "moral":{ + builder.append(finalChatModel.getChat()); - builder.append(String.format(finalChatModel.getEnd(),chatCommentsDto.getSubject())); - break; - } - //体育 - case "sport":{ - builder.append("请按照以下格式回复:\n"); - builder.append("1. 运动作品:\n"); - builder.append("2. 运动作品说明:\n"); - builder.append("3. 运动作品示例:\n"); - builder.append("4. 运动作品示例说明:\n"); - break; + break; + } + default: + throw new ServiceException(ErrorCode.PARAMS_ERROR.getCode(), "评语类型异常"); } - //德育 - case "moral":{ - builder.append(finalChatModel.getChat()); - break; + if (chatCommentsDto.getSize() > 0) { + builder.append("限制条件:") + .append(chatCommentsDto.getSize()) + .append("字左右;【返回评语内容#不要开头提示语#】。"); + } else { + builder.append("字数限制在:200字左右;【#返回评语内容#,#不要内容提示语#】。"); } - default: - throw new ServiceException(ErrorCode.PARAMS_ERROR.getCode(), "评语类型异常"); - } - - if (chatCommentsDto.getSize() > 0) { - builder.append("字数限制在:") - .append(chatCommentsDto.getSize()) - .append("字左右"); - } else { - builder.append("字数限制在:200字左右"); + 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())); } - - return builder.toString(); } } diff --git a/src/main/resources/Json/ChatModel.json b/src/main/resources/Json/ChatModel.json index 3a6b353..846862e 100644 --- a/src/main/resources/Json/ChatModel.json +++ b/src/main/resources/Json/ChatModel.json @@ -3,42 +3,44 @@ { "type": "wisdom", "name": "智育 总体评语模版", - "role": "请扮演[%s%s]老师角色\n", - "chat": "%s同学,在%s学年度,第%s学期中,共计参加了%s次评测,其中课中评测%s次、线上评测%s次、阅卷评测%s次,素养等级为%s,已超过班级%s%% 同学。\n %s同学总体表现:", + "role": ["请扮演[%s%s]老师角色\n","请扮演[%s%s]老师角色\n"], + "chat": ["%s同学,在%s学年度,第%s学期中,共计参加了%s次评测,其中课中评测%s次、线上评测%s次、阅卷评测%s次,素养等级为%s,已超过班级%s%% 的同学。\n %s同学的总体表现:", + "%s,在%s学年度,第%s学期,共计参加了%s次评测,其中课中评测%s次、线上评测%s次、阅卷评测%s次,总体表现:" + ], "cycleChats": ["在%s中:学习态度为:%s、学习成效:%s、合作能力:%s、评价能力:%s、评价能力:%s ;\n"], - "end": "根据我提供的数据,对这 %s 次考试成绩表现做一个评价\n" + "end": ["根据我提供的数据,对这 %s 次考试成绩表现做一个评价\n"] }, { "type": "wisdomExam", "name": "智育 成绩表现模版", - "role": "请扮演[%s%s]老师角色\n", - "chat": "", + "role": ["请扮演[%s%s]老师角色\n","请扮演[%s%s]老师角色\n"], + "chat": [""], "cycleChats": ["参加第%s次,考试结果:名称:%s,时间:%s,得分:%s,考试得分率:%s %% 排名:%s ;\n"], - "end": "根据我提供的数据,对这 %s 次考试成绩表现做一个评价。\n" + "end": ["根据我提供的数据,对这 %s 次考试成绩表现做一个评价。\n"] }, { - "type": "windomSubject", + "type": "wisdomSubject", "name": "智育 学科评语模版", - "role": "请扮演[%s%s]老师角色\n ", - "chat": "各科评测表现", + "role": ["请扮演[%s%s]老师角色\n ","请扮演[%s%s]老师角色\n"], + "chat": ["各科评测表现"], "cycleChats":["科目:%s 班级top10"," 排名:%s,姓名:%s,得分率:%s %% ,\n " ,"%s在班级排名:%s,得分率:%s %%,排在班级平均得分率:(%s %%)"], - "end": "根据我提供的数据,对这%s门学科,【%s】在班级中的表现做一个评价。 \n" + "end": ["根据我提供的数据,对这%s门学科,【%s】在班级中的表现做一个评价。 \n"] }, { "type": "artLatitude", "name": "艺术 考核指标评语模版", - "role": "请扮演[%s%s]老师角色\n ", - "chat": "考核指标评纬度\n", + "role": ["请扮演[%s%s]老师角色\n ","请扮演[%s%s]老师角色\n"], + "chat": ["考核指标评纬度\n"], "cycleChats": [" 一级指标:%s( %s %%);二级指标:%s( %s %%);三级指标 %s( %s %%) ;得分率:%s %% 等级:%s\n"], - "end": "根据我提供的【考核指标纬度】做一个整体的评价。 \n" + "end": ["根据我提供的【考核指标纬度】做一个整体的评价。 \n"] }, { "type": "artSubject", "name": "艺术 学科评语模版", - "role": "请扮演[%s%s]老师角色\n ", - "chat": "%s学科\n", + "role": ["请扮演[%s%s]老师角色\n ","请扮演[%s%s]年级老师角色\n"], + "chat": ["%s学科\n"], "cycleChats": [" 考核纬度:%s;一级知识点:%s;二级知识点 %s;得分:%s/%s 得分率:%s\n"], - "end": "根据我提供的【%s学科】的表现做一个整体的评价。 \n" + "end": ["根据我提供的【%s学科】的表现做一个整体的评价。 \n"] } ] }