Эх сурвалжийг харах

修改core-ai,调整自动判分请求对象结构与返回数据结构

Signed-off-by: luoshi <luoshi@qmth.com.cn>
luoshi 11 сар өмнө
parent
commit
ab9743d26d

+ 43 - 13
core-ai/src/main/java/com/qmth/boot/core/ai/model/llm/AutoScoreRequest.java

@@ -3,6 +3,10 @@ package com.qmth.boot.core.ai.model.llm;
 import org.springframework.validation.annotation.Validated;
 
 import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import java.util.LinkedList;
+import java.util.List;
 
 /**
  * 自动判分请求参数
@@ -13,15 +17,20 @@ public class AutoScoreRequest {
     @NotBlank(message = "科目名称不能为空")
     private String subjectName;
 
-    private String questionType;
-
     @NotBlank(message = "试题内容不能为空")
     private String questionBody;
 
-    private String standardAnswer;
+    @Size(min = 1, message = "标答不能为空")
+    private List<StandardAnswer> standardAnswer = new LinkedList<>();
 
     private String studentAnswer;
 
+    @NotBlank(message = "总分不能为空")
+    private String totalScore;
+
+    @NotBlank(message = "间隔分不能为空")
+    private String intervalScore = "1";
+
     public String getSubjectName() {
         return subjectName;
     }
@@ -30,14 +39,6 @@ public class AutoScoreRequest {
         this.subjectName = subjectName;
     }
 
-    public String getQuestionType() {
-        return questionType;
-    }
-
-    public void setQuestionType(String questionType) {
-        this.questionType = questionType;
-    }
-
     public String getQuestionBody() {
         return questionBody;
     }
@@ -46,14 +47,27 @@ public class AutoScoreRequest {
         this.questionBody = questionBody;
     }
 
-    public String getStandardAnswer() {
+    public List<StandardAnswer> getStandardAnswer() {
         return standardAnswer;
     }
 
-    public void setStandardAnswer(String standardAnswer) {
+    public void setStandardAnswer(List<StandardAnswer> standardAnswer) {
         this.standardAnswer = standardAnswer;
     }
 
+    /**
+     * 增加标答内容及分值
+     *
+     * @param content 文本内容
+     * @param score   格式化后的分数字符串
+     */
+    public void addStandardAnswer(@NotNull String content, @NotNull String score) {
+        StandardAnswer answer = new StandardAnswer();
+        answer.setContent(content);
+        answer.setScore(score);
+        this.standardAnswer.add(answer);
+    }
+
     public String getStudentAnswer() {
         return studentAnswer;
     }
@@ -61,4 +75,20 @@ public class AutoScoreRequest {
     public void setStudentAnswer(String studentAnswer) {
         this.studentAnswer = studentAnswer;
     }
+
+    public String getTotalScore() {
+        return totalScore;
+    }
+
+    public void setTotalScore(String totalScore) {
+        this.totalScore = totalScore;
+    }
+
+    public String getIntervalScore() {
+        return intervalScore;
+    }
+
+    public void setIntervalScore(String intervalScore) {
+        this.intervalScore = intervalScore;
+    }
 }

+ 24 - 0
core-ai/src/main/java/com/qmth/boot/core/ai/model/llm/AutoScoreResult.java

@@ -0,0 +1,24 @@
+package com.qmth.boot.core.ai.model.llm;
+
+public class AutoScoreResult {
+
+    private double totalScore;
+
+    private double[] stepScore;
+
+    public double getTotalScore() {
+        return totalScore;
+    }
+
+    public void setTotalScore(double totalScore) {
+        this.totalScore = totalScore;
+    }
+
+    public double[] getStepScore() {
+        return stepScore;
+    }
+
+    public void setStepScore(double[] stepScore) {
+        this.stepScore = stepScore;
+    }
+}

+ 27 - 0
core-ai/src/main/java/com/qmth/boot/core/ai/model/llm/StandardAnswer.java

@@ -0,0 +1,27 @@
+package com.qmth.boot.core.ai.model.llm;
+
+/**
+ * 自动评分应用中按得分点构造的标答
+ */
+public class StandardAnswer {
+
+    private String content;
+
+    private String score;
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public String getScore() {
+        return score;
+    }
+
+    public void setScore(String score) {
+        this.score = score;
+    }
+}

+ 11 - 29
core-ai/src/main/java/com/qmth/boot/core/ai/service/AiService.java

@@ -1,20 +1,17 @@
 package com.qmth.boot.core.ai.service;
 
 import com.qmth.boot.core.ai.client.LlmApiClient;
-import com.qmth.boot.core.ai.client.OcrApiClient;
 import com.qmth.boot.core.ai.model.llm.*;
-import com.qmth.boot.core.ai.model.ocr.OcrType;
 import com.qmth.boot.core.retrofit.utils.SignatureInfo;
-import com.qmth.boot.core.retrofit.utils.UploadFile;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
 import javax.validation.constraints.NotNull;
 import java.math.BigDecimal;
-import java.math.RoundingMode;
+import java.util.Arrays;
 import java.util.List;
-import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
@@ -29,9 +26,6 @@ public class AiService {
     @Resource
     private LlmApiClient llmApiClient;
 
-    @Resource
-    private OcrApiClient ocrApiClient;
-
     /**
      * 获取当前机构大模型接口调用次数余额
      *
@@ -76,31 +70,19 @@ public class AiService {
      * @param signature 使用当前机构AK作为鉴权信息
      * @return 得分率,保留最多三位小数;null表示无法获取判分结果
      */
-    public Double autoScore(@NotNull @Validated AutoScoreRequest request, @NotNull SignatureInfo signature) {
+    public AutoScoreResult autoScore(@NotNull @Validated AutoScoreRequest request, @NotNull SignatureInfo signature) {
         ChatResult result = llmApiClient.chatTemplate(signature, LlmAppType.AUTO_SCORE, request);
         String text = result.getChoices().stream().filter(choice -> choice.getMessage().getRole() == ChatRole.assistant)
                 .map(choice -> choice.getMessage().getContent()).findFirst().orElse("");
-        Matcher m = score_pattern.matcher(text);
-        if (m.find()) {
-            return new BigDecimal(Integer.parseInt(m.group(1))).divide(BigDecimal.valueOf(100), 3, RoundingMode.HALF_UP)
-                    .doubleValue();
-        } else {
+        try {
+            AutoScoreResult scoreResult = new AutoScoreResult();
+            String[] scores = StringUtils.split(text, ",");
+            scoreResult.setStepScore(Arrays.stream(scores).mapToDouble(Double::parseDouble).toArray());
+            scoreResult.setTotalScore(Arrays.stream(scoreResult.getStepScore()).mapToObj(BigDecimal::new)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add).doubleValue());
+            return scoreResult;
+        } catch (Exception e) {
             return null;
         }
     }
-
-    /**
-     * 使用预设模版进行自动判分,考生作答为图片
-     *
-     * @param request   自动判分请求参数
-     * @param image     图片内容
-     * @param signature 使用当前机构AK作为鉴权信息
-     * @return 得分率,保留最多三位小数;null表示无法获取判分结果
-     */
-    public Double autoScore(@NotNull @Validated AutoScoreRequest request, @NotNull byte[] image,
-            @NotNull SignatureInfo signature) {
-        request.setStudentAnswer(
-                ocrApiClient.forImage(signature, OcrType.HANDWRITING, UploadFile.build("image", "", image)));
-        return autoScore(request, signature);
-    }
 }