Commit c8b7e1de authored by 陈立彬's avatar 陈立彬

单题答题改为流式返回

parent e0628f0e
......@@ -1501,10 +1501,7 @@ public class AppExamineService {
* @param userPrincipal
* @param request
*/
public SubmitAnswerStreamResultDto submitAnswerStream(UserPrincipal userPrincipal, SubmitAnswerMobileRequestDto request) {
SubmitAnswerStreamResultDto resultDto = new SubmitAnswerStreamResultDto();
public Flux<ServerSentEvent<SubmitAnswerStreamResultDto>> submitAnswerStream(UserPrincipal userPrincipal, SubmitAnswerMobileRequestDto request) {
String userId = userPrincipal.getUserId();
Integer examineId = request.getExamineId();
String answer = request.getAnswer();
......@@ -1572,59 +1569,8 @@ public class AppExamineService {
Integer businessId = detailRecordId;
log.info("开始AI评分");
// 获取评分信息
AiSingleEvaluateResultDto evaluateResult = extensionService.run4SingleQaScore(businessNo, userId, businessId);
if(Objects.nonNull(evaluateResult)) {
log.info("获取到评分结果: "+ JSONObject.toJSONString(evaluateResult));
// 更新答题点评信息
ExamineRecordDetailSaveModel detailSaveModel = new ExamineRecordDetailSaveModel();
detailSaveModel.setId(businessId);
detailSaveModel.setScore(evaluateResult.getScore());
examineService.saveExamineRecordDetail(detailSaveModel);
// 定时任务
ExamineEvaluateJobResponseModel evaluateJob = commonService.getEvaluateJob(0, detailRecordId);
if(Objects.isNull(evaluateJob)) {
ExamineEvaluateJobSaveModel model = new ExamineEvaluateJobSaveModel();
model.setBusinessId(detailRecordId);
model.setBusinessNo(businessNo);
model.setType(0);
model.setStatus(0);
model.setUserId(userId);
model.setCreateTime(new Date());
commonService.saveEvaluateJob(model);
}
// 更新缓存
businessCache.setRecordId(recordId);
redisTemplate.opsForValue().set(examBusinessKey, JSONObject.toJSONString(businessCache), 1, TimeUnit.DAYS);
// 最后一题答题,完成考试,执行AI总点评
if(!businessCache.isHasNext()) {
this.completeExamine(userPrincipal, examineId, businessNo);
}
resultDto.setScore(evaluateResult.getScore());
ExamineQaDto examineQaDto = this.qaDetail(questionId);
if(Objects.nonNull(examineQaDto)) {
resultDto.setAnswer(examineQaDto.getAnswer());
}
return resultDto;
} else {
throw new InternalException(-1, "获取评分信息异常");
}
}
/**
* 单题评分+点评
* @param sessionId
* @param userId
* @param businessId 单题答题记录ID
*/
public Flux<ServerSentEvent<AiSingleEvaluateResultDto>> run4SingleEvaluateStream(String sessionId, String userId, Integer businessId) {
Map<String, String> inputs = new HashMap<>();
inputs.put("scene", "single_evaluate");
inputs.put("scene", "single_qa_score");
inputs.put("business_id", String.valueOf(businessId));
JSONObject param = new JSONObject();
param.put("query", businessId);
......@@ -1633,36 +1579,64 @@ public class AppExamineService {
param.put("conversation_id", "");
param.put("user", userId);
final StringBuffer evaluationBuffer = new StringBuffer();
final StringBuffer scoreBuffer = new StringBuffer();
final String[] difySessionId = {""};
String finalSessionId = sessionId;
final StringBuffer answerBuffer = new StringBuffer();
final StringBuffer replyBuffer = new StringBuffer();
final String[] score = new String[1];
return webClient.post().uri("/chat-messages").accept(MediaType.TEXT_EVENT_STREAM).bodyValue(param.toJSONString()).exchangeToFlux(r -> r.bodyToFlux(String.class))
.mapNotNull(v -> {
JSONObject json = JSONObject.parseObject(v);
String evaluation = json.getJSONObject("answer").getString("evaluation");
if (ObjectUtil.isNotNull(evaluation)) {
evaluationBuffer.append(evaluation);
}
if(ObjectUtil.isEmpty(difySessionId[0]) && ObjectUtil.isNotEmpty(json.getString("conversation_id"))) {
difySessionId[0] = json.getString("conversation_id");
String reply = json.getString("answer");
if(Objects.nonNull(reply)) {
replyBuffer.append(reply);
// ai评分正则
Pattern scorePattern = Pattern.compile("\"score\":\"(\\d+)\"");
Matcher scoreMatcher = scorePattern.matcher(replyBuffer.toString());
if (scoreMatcher.find() && StringUtils.isEmpty(score[0])) {
score[0] = scoreMatcher.group(1); // 提取第一个捕获组的内容
}
// 标准答案正则
Pattern answerPattern = Pattern.compile("\"answer\":\"([^\"]*)");
Matcher answerMatcher = answerPattern.matcher(replyBuffer.toString());
if (answerMatcher.find()) {
answerBuffer.append(answerMatcher.group(1));
}
}
String score = json.getJSONObject("answer").getString("score");
if (ObjectUtil.isNotNull(score)) {
scoreBuffer.append(score);
SubmitAnswerStreamResultDto result = new SubmitAnswerStreamResultDto();
if(StringUtils.isNotEmpty(score[0])) {
result.setScore(Float.valueOf(score[0]));
}
AiSingleEvaluateResultDto result = new AiSingleEvaluateResultDto();
result.setEvaluation(evaluationBuffer.toString());
result.setScore(Float.valueOf(scoreBuffer.toString()));
result.setDifySessionId(difySessionId[0]);
result.setAnswer(answerBuffer.toString());
return result;
}).doOnComplete(
() -> {
// 更新DIFY会话ID
System.out.println("更新");
// 更新答题点评信息
ExamineRecordDetailSaveModel detailSaveModel = new ExamineRecordDetailSaveModel();
detailSaveModel.setId(businessId);
detailSaveModel.setScore(Float.valueOf(score[0]));
examineService.saveExamineRecordDetail(detailSaveModel);
// 定时任务
ExamineEvaluateJobResponseModel evaluateJob = commonService.getEvaluateJob(0, detailRecordId);
if(Objects.isNull(evaluateJob)) {
ExamineEvaluateJobSaveModel model = new ExamineEvaluateJobSaveModel();
model.setBusinessId(detailRecordId);
model.setBusinessNo(businessNo);
model.setType(0);
model.setStatus(0);
model.setUserId(userId);
model.setCreateTime(new Date());
commonService.saveEvaluateJob(model);
}
// 更新缓存
businessCache.setRecordId(recordId);
redisTemplate.opsForValue().set(examBusinessKey, JSONObject.toJSONString(businessCache), 1, TimeUnit.DAYS);
// 最后一题答题,完成考试,执行AI总点评
if(!businessCache.isHasNext()) {
this.completeExamine(userPrincipal, examineId, businessNo);
}
}
).map(v -> ServerSentEvent.builder(v).build());
}
}
......@@ -164,34 +164,6 @@ public class ExamineMobileController {
public Flux<ServerSentEvent<SubmitAnswerStreamResultDto>> submitAnswerStream(@Parameter(hidden = true) UserPrincipal userPrincipal,
@RequestBody SubmitAnswerMobileRequestDto request) {
SubmitAnswerStreamResultDto resultDto = examineService.submitAnswerStream(userPrincipal, request);
// 拆分答案,流式返回
List<String> arrays = splitStringIntoArrays(resultDto.getAnswer());
return Flux.fromIterable(arrays)
.map(data -> {
SubmitAnswerStreamResultDto rs = new SubmitAnswerStreamResultDto();
rs.setAnswer(data);
rs.setScore(resultDto.getScore());
return ServerSentEvent.<SubmitAnswerStreamResultDto>builder().data(rs).build();
})
.delayElements(Duration.ofMillis(100))
.take(arrays.size());
}
/**
* 将答案拆分成最多10个数组
* @param input
* @return
*/
public static List<String> splitStringIntoArrays(String input) {
int maxArrays = 10;
List<String> arrays = new ArrayList<>();
int length = input.length();
int step = Math.max(1, length / maxArrays);
for (int i = 1; i <= length && arrays.size() < maxArrays; i += step) {
arrays.add(input.substring(0, i));
}
return arrays;
return examineService.submitAnswerStream(userPrincipal, request);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment