up:添加ai总结的

develop
PL 5 months ago
parent 7dff0ddea9
commit 8a5ec1021b

@ -0,0 +1,22 @@
package cn.teammodel.model.dto.ai.comment;
import lombok.Data;
import java.util.List;
/**
*
*/
@Data
public class ArtSummaryDto {
/**
*
*/
private List<ArtLatitudeDto> artLatitudes;
/**
*
*/
private List<ArtSubjectDto> artSubjects;
}

@ -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<WisdomExamCommentsDto> wisdomExam;
/**
* id
*/
private List<WisdomSubjectComments> wisdomSubject;
}

@ -2,6 +2,7 @@ package cn.teammodel.service;
import cn.teammodel.model.dto.ai.comment.ChatCommentsDto; import cn.teammodel.model.dto.ai.comment.ChatCommentsDto;
import cn.teammodel.model.dto.ai.ChatCompletionReqDto; import cn.teammodel.model.dto.ai.ChatCompletionReqDto;
import cn.teammodel.model.dto.ai.comment.WisdomSummaryDto;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
/** /**
@ -15,9 +16,21 @@ public interface ChatMessageService {
SseEmitter chatCompletion(ChatCompletionReqDto chatCompletionReqDto, String userId); SseEmitter chatCompletion(ChatCompletionReqDto chatCompletionReqDto, String userId);
/** /**
* AI * AI
* @param chatCommentsDto * @param chatCommentsDto
* @return * @return
*/ */
SseEmitter chatComments(ChatCommentsDto chatCommentsDto, String userId, String userName); SseEmitter chatComments(ChatCommentsDto chatCommentsDto, String userId, String userName);
/**
* AI
* @return
*/
SseEmitter chatSummary(WisdomSummaryDto chatSummaryDto, String userId, String userName);
/**
* AI
* @return
*/
SseEmitter chatAnalysis();
} }

@ -49,7 +49,6 @@ public class ChatMessageServiceImpl implements ChatMessageService {
@Resource @Resource
private JsonLoader jsonLoader; private JsonLoader jsonLoader;
@Override @Override
public SseEmitter chatCompletion(ChatCompletionReqDto chatCompletionReqDto, String userId) { 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)); //builder.append(String.format(finalChatModel.getEnd().get(0), subjectComments.size(),chatName));
break; 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":{ case "artLatitude":{
List<ArtLatitudeDto> artLatitudes; List<ArtLatitudeDto> artLatitudes;
@ -524,6 +659,48 @@ public class ChatMessageServiceImpl implements ChatMessageService {
//builder.append(String.format(finalChatModel.getEnd().get(0),chatName)); //builder.append(String.format(finalChatModel.getEnd().get(0),chatName));
break; break;
} }
//艺术 整体总结
case "artSummary":{
ArtSummaryDto summaryDto;
try {
summaryDto = JSON.parseObject(strData, new TypeReference<ArtSummaryDto>() {
});
} 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":{ case "sport":{
builder.append("请按照以下格式回复:\n"); builder.append("请按照以下格式回复:\n");
@ -542,7 +719,14 @@ public class ChatMessageServiceImpl implements ChatMessageService {
throw new ServiceException(ErrorCode.PARAMS_ERROR.getCode(), "评语类型异常"); 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; int size = chatCommentsDto.getSize() > 0 ? chatCommentsDto.getSize() : 200;
builder.append(String.format(limitChat, size)); builder.append(String.format(limitChat, size));
@ -553,7 +737,8 @@ public class ChatMessageServiceImpl implements ChatMessageService {
int length = limitTexts.size(); //数组大小 int length = limitTexts.size(); //数组大小
for (int i = 0; i < length; i++) { for (int i = 0; i < length; i++) {
String str = limitTexts.get(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) { if (i < length - 1) {
builder.append(""); builder.append("");
}else { }else {
@ -561,6 +746,8 @@ public class ChatMessageServiceImpl implements ChatMessageService {
} }
serialNumber += 1; serialNumber += 1;
} }
}else {
builder.append("。");
} }
return builder.toString(); return builder.toString();
@ -570,4 +757,27 @@ public class ChatMessageServiceImpl implements ChatMessageService {
throw new ServiceException(ErrorCode.OPERATION_ERROR.getCode(), Arrays.toString(e.getStackTrace())); 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()));
}
}
} }

@ -9,7 +9,7 @@
], ],
"cycleChats": ["在%s中学习态度为%s、学习成效%s、合作能力%s、评价能力%s、评价能力%s ;\n"], "cycleChats": ["在%s中学习态度为%s、学习成效%s、合作能力%s、评价能力%s、评价能力%s ;\n"],
"end": ["请根据我提供的数据,对%s的考试成绩表现做一个评价。\n"], "end": ["请根据我提供的数据,对%s的考试成绩表现做一个评价。\n"],
"limit": "。限制条件如下1、%s字左右2、直接返回评语的内容3、评语的开篇不允许出现提示语4、评语的开篇不允许出现特殊字符。" "limit": "。限制条件如下1、%s字左右2、直接返回评语和分析的内容3、评语的开篇不允许出现提示语4、评语的开篇不允许出现特殊字符。"
}, },
{ {
"type": "wisdomExam", "type": "wisdomExam",
@ -18,7 +18,7 @@
"chat": ["%s\n,"], "chat": ["%s\n,"],
"cycleChats": ["参加第%s次考试结果名称:%s时间:%s得分%s考试得分率%s %% 排名:%s ;\n","参加第%s次考试结果名称:%s时间:%s班级平均得分率%s %%,年级平均得分率:%s %%;\n","参加第%s次考试结果名称:%s时间:%s年级平均得分率%s %%;\n"], "cycleChats": ["参加第%s次考试结果名称:%s时间:%s得分%s考试得分率%s %% 排名:%s ;\n","参加第%s次考试结果名称:%s时间:%s班级平均得分率%s %%,年级平均得分率:%s %%;\n","参加第%s次考试结果名称:%s时间:%s年级平均得分率%s %%;\n"],
"end": ["请根据我提供的数据,对%s的考试成绩表现做一个评价。\n"], "end": ["请根据我提供的数据,对%s的考试成绩表现做一个评价。\n"],
"limit": "。限制条件如下1、%s字左右2、直接返回评语的内容3、评语的开篇不允许出现提示语4、评语的开篇不允许出现特殊字符。" "limit": "。限制条件如下1、%s字左右2、直接返回评语和分析的内容3、评语的开篇不允许出现提示语4、评语的开篇不允许出现特殊字符。"
}, },
{ {
"type": "wisdomSubject", "type": "wisdomSubject",
@ -27,7 +27,7 @@
"chat": ["的各科评测表现:","%s的各科评测表现\""], "chat": ["的各科评测表现:","%s的各科评测表现\""],
"cycleChats":["科目:%s 班级top10"," 排名:%s姓名%s得分率%s %% ,\n " ,"%s在班级排名%s,得分率:%s %%,排在班级平均得分率:(%s %%)"], "cycleChats":["科目:%s 班级top10"," 排名:%s姓名%s得分率%s %% ,\n " ,"%s在班级排名%s,得分率:%s %%,排在班级平均得分率:(%s %%)"],
"end": ["请根据我提供的数据,对这%s门学科对%s的表现做一个评价。 \n"], "end": ["请根据我提供的数据,对这%s门学科对%s的表现做一个评价。 \n"],
"limit": "。限制条件如下1、%s字左右2、直接返回评语的内容3、评语的开篇不允许出现提示语4、评语的开篇不允许出现特殊字符。" "limit": "。限制条件如下1、%s字左右2、直接返回评语和分析的内容3、评语的开篇不允许出现提示语4、评语的开篇不允许出现特殊字符。"
}, },
{ {
"type": "artLatitude", "type": "artLatitude",
@ -36,7 +36,7 @@
"chat": ["考核指标评纬度\n","%s的考核指标评纬度\n"], "chat": ["考核指标评纬度\n","%s的考核指标评纬度\n"],
"cycleChats": [" 一级指标:%s %s %%);二级指标:%s %s %%);三级指标 %s %s %% ;得分率:%s %% 等级:%s\n"], "cycleChats": [" 一级指标:%s %s %%);二级指标:%s %s %%);三级指标 %s %s %% ;得分率:%s %% 等级:%s\n"],
"end": ["请根据我提供的数据,对%s做一个整体的评价。 \n"], "end": ["请根据我提供的数据,对%s做一个整体的评价。 \n"],
"limit": "" "limit": "。限制条件如下1、%s字左右2、直接返回评语和分析的内容3、评语的开篇不允许出现提示语4、评语的开篇不允许出现特殊字符。"
}, },
{ {
"type": "artSubject", "type": "artSubject",
@ -45,7 +45,7 @@
"chat": ["%s的学科\n"], "chat": ["%s的学科\n"],
"cycleChats": [" 考核纬度:%s一级知识点%s二级知识点 %s得分%s/%s 得分率:%s\n"], "cycleChats": [" 考核纬度:%s一级知识点%s二级知识点 %s得分%s/%s 得分率:%s\n"],
"end": ["请根据我提供的数据,对%s的表现做一个整体的评价。 \n"], "end": ["请根据我提供的数据,对%s的表现做一个整体的评价。 \n"],
"limit": "。限制条件如下1、%s字左右2、直接返回评语的内容3、评语的开篇不允许出现提示语4、评语的开篇不允许出现特殊字符。" "limit": "。限制条件如下1、%s字左右2、直接返回评语和分析的内容3、评语的开篇不允许出现提示语4、评语的开篇不允许出现特殊字符。"
} }
] ]
} }

Loading…
Cancel
Save