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

单题答题改为流式返回

parent 1999bb9c
package cn.breeze.elleai.application.dto.response;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
/**
* AI单题点评结果
*/
@Data
public class SubmitAnswerStreamResultDto implements Serializable {
@Schema(description = "评分")
private Float score;
@Schema(description = "参考答案")
private String answer;
}
......@@ -9,6 +9,7 @@ import cn.breeze.elleai.domain.sparring.model.response.QaAssistantResponseModel;
import cn.breeze.elleai.domain.sparring.service.ChatCompletionService;
import cn.breeze.elleai.domain.sparring.service.KbService;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
......@@ -90,6 +91,46 @@ public class AiPlatformExtensionService {
return null;
}
/**
* 单题评分+点评
* @param sessionId
* @param userId
* @param businessId 单题答题记录ID
*/
public AiSingleEvaluateResultDto run4SingleQaScore(String sessionId, String userId, Integer businessId) {
Map<String, String> inputs = new HashMap<>();
inputs.put("scene", "single_qa_score");
inputs.put("business_id", String.valueOf(businessId));
JSONObject param = new JSONObject();
param.put("query", businessId);
param.put("inputs", inputs);
param.put("response_mode", "blocking");
param.put("conversation_id", "");
param.put("user", userId);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setBearerAuth(apiKey);
log.info("异步请求参数1,sessionId = {}", sessionId);
log.info("异步请求参数2,req = {}", JSONObject.toJSONString(param));
HttpEntity<String> postEntity = new HttpEntity<>(param.toJSONString(), headers);
ResponseEntity<String> response = restTemplate.postForEntity(difyBase + "/chat-messages", postEntity, String.class);
String body = response.getBody();
if(Objects.equals(response.getStatusCode(), HttpStatus.OK)) {
JSONObject bodyObject = JSONObject.parseObject(body);
String conversationId = bodyObject.getString("conversation_id");
String answer = bodyObject.getString("answer");
if(NumberUtil.isNumber(answer)) {
AiSingleEvaluateResultDto result = new AiSingleEvaluateResultDto();
result.setScore(Float.valueOf(answer));
result.setDifySessionId(conversationId);
return result;
}
}
return null;
}
/**
* 考试总点评
* @param sessionId
......
......@@ -3,6 +3,7 @@ package cn.breeze.elleai.controller.front;
import cn.breeze.elleai.application.dto.ApiResponse;
import cn.breeze.elleai.application.dto.PageResult;
import cn.breeze.elleai.application.dto.inner.AiSingleEvaluateResultDto;
import cn.breeze.elleai.application.dto.request.*;
import cn.breeze.elleai.application.dto.response.*;
import cn.breeze.elleai.application.service.AppExamineService;
......@@ -13,7 +14,14 @@ import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.http.codec.ServerSentEvent;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import java.time.Duration;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
@RestController
@RequestMapping(value = "/front/examine")
......@@ -150,4 +158,40 @@ public class ExamineMobileController {
return ApiResponse.ok("SUCCESS");
}
@Operation(summary = "考试答题")
@PostMapping(value = "submit_answer_stream")
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;
}
}
......@@ -7,10 +7,7 @@ import cn.breeze.elleai.domain.sparring.model.request.ExamineDetailRecordRequest
import cn.breeze.elleai.domain.sparring.model.request.ExamineEvaluateJobSaveModel;
import cn.breeze.elleai.domain.sparring.model.request.ExamineRecordDetailSaveModel;
import cn.breeze.elleai.domain.sparring.model.request.ExamineRecordSaveModel;
import cn.breeze.elleai.domain.sparring.model.response.ExamineDetailRecordResponseModel;
import cn.breeze.elleai.domain.sparring.model.response.ExamineEvaluateJobResponseModel;
import cn.breeze.elleai.domain.sparring.model.response.ExamineQaResponseModel;
import cn.breeze.elleai.domain.sparring.model.response.ExamineRecordDetailResponseModel;
import cn.breeze.elleai.domain.sparring.model.response.*;
import cn.breeze.elleai.domain.sparring.service.CommonService;
import cn.breeze.elleai.domain.sparring.service.ExamineService;
import cn.breeze.elleai.util.Codes;
......@@ -80,7 +77,11 @@ public class SingleJob extends QuartzJobBean {
// 更新答题点评信息
ExamineRecordDetailSaveModel detailSaveModel = new ExamineRecordDetailSaveModel();
detailSaveModel.setId(businessId);
// 判断对练类型,对练类型需要更新AI评分分数
ExamineRecordResponseModel model = examineService.examineRecordDetail(businessNo);
if(Objects.equals(model.getExamineMode(), 1)) {
detailSaveModel.setScore(evaluateResult.getScore());
}
detailSaveModel.setEvaluation(evaluateResult.getEvaluation());
examineService.saveExamineRecordDetail(detailSaveModel);
......
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