Răsfoiți Sursa

修改core-ai,调整自动判分请求对象与返回数据对象中的若干字段类型,适配提示词模版修改

Signed-off-by: luoshi <luoshi@qmth.com.cn>
luoshi 11 luni în urmă
părinte
comite
6d0c0489f1

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

@@ -2,10 +2,11 @@ package com.qmth.boot.core.ai.model.llm;
 
 import org.springframework.validation.annotation.Validated;
 
+import javax.validation.Valid;
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Size;
-import java.util.LinkedList;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -20,16 +21,17 @@ public class AutoScoreRequest {
     @NotBlank(message = "试题内容不能为空")
     private String questionBody;
 
+    @NotNull(message = "标答不能为空")
     @Size(min = 1, message = "标答不能为空")
-    private List<StandardAnswer> standardAnswer = new LinkedList<>();
+    @Valid
+    private List<StandardAnswer> standardAnswer = new ArrayList<>();
 
+    @NotNull(message = "考生回答不能为空")
     private String studentAnswer;
 
-    @NotBlank(message = "总分不能为空")
-    private String totalScore;
+    private double totalScore;
 
-    @NotBlank(message = "间隔分不能为空")
-    private String intervalScore = "1";
+    private double intervalScore = 1;
 
     public String getSubjectName() {
         return subjectName;
@@ -61,7 +63,7 @@ public class AutoScoreRequest {
      * @param content 文本内容
      * @param score   格式化后的分数字符串
      */
-    public void addStandardAnswer(@NotNull String content, @NotNull String score) {
+    public void addStandardAnswer(@NotNull String content, @NotNull double score) {
         StandardAnswer answer = new StandardAnswer();
         answer.setContent(content);
         answer.setScore(score);
@@ -76,19 +78,19 @@ public class AutoScoreRequest {
         this.studentAnswer = studentAnswer;
     }
 
-    public String getTotalScore() {
+    public double getTotalScore() {
         return totalScore;
     }
 
-    public void setTotalScore(String totalScore) {
+    public void setTotalScore(double totalScore) {
         this.totalScore = totalScore;
     }
 
-    public String getIntervalScore() {
+    public double getIntervalScore() {
         return intervalScore;
     }
 
-    public void setIntervalScore(String intervalScore) {
+    public void setIntervalScore(double intervalScore) {
         this.intervalScore = intervalScore;
     }
 }

+ 9 - 3
core-ai/src/main/java/com/qmth/boot/core/ai/model/llm/StandardAnswer.java

@@ -1,13 +1,19 @@
 package com.qmth.boot.core.ai.model.llm;
 
+import org.springframework.validation.annotation.Validated;
+
+import javax.validation.constraints.NotNull;
+
 /**
  * 自动评分应用中按得分点构造的标答
  */
+@Validated
 public class StandardAnswer {
 
+    @NotNull(message = "标答不能为空")
     private String content;
 
-    private String score;
+    private double score;
 
     public String getContent() {
         return content;
@@ -17,11 +23,11 @@ public class StandardAnswer {
         this.content = content;
     }
 
-    public String getScore() {
+    public double getScore() {
         return score;
     }
 
-    public void setScore(String score) {
+    public void setScore(double score) {
         this.score = score;
     }
 }

+ 30 - 3
core-ai/src/main/java/com/qmth/boot/core/ai/service/AiService.java

@@ -10,6 +10,7 @@ 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.Pattern;
@@ -76,13 +77,39 @@ public class AiService {
                 .map(choice -> choice.getMessage().getContent()).findFirst().orElse("");
         try {
             AutoScoreResult scoreResult = new AutoScoreResult();
+            //依据总分与步骤分计算最大精度
+            int scale = Math
+                    .max(getDecimalPlaces(request.getIntervalScore()), getDecimalPlaces(request.getTotalScore()));
+            int stepCount = request.getStandardAnswer().size();
             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());
+            double[] scoreArray = new double[stepCount];
+            for (int i = 0; i < stepCount; i++) {
+                //根据得分率与步骤总分计算实际得分,按最大精度保留小数位数
+                double score = BigDecimal.valueOf(
+                        Math.min(Integer.parseInt(scores[i]), 100) * request.getStandardAnswer().get(i).getScore())
+                        .divide(BigDecimal.valueOf(100), scale, RoundingMode.HALF_UP).doubleValue();
+                scoreArray[i] = score;
+            }
+            scoreResult.setStepScore(scoreArray);
+            scoreResult.setTotalScore(
+                    Arrays.stream(scoreArray).mapToObj(BigDecimal::new).reduce(BigDecimal.ZERO, BigDecimal::add)
+                            .doubleValue());
             return scoreResult;
         } catch (Exception e) {
             return null;
         }
     }
+
+    private int getDecimalPlaces(double value) {
+        // 如果是整数,则转换为double类型
+        if (value == (int) value) {
+            value = (int) value;
+        }
+        // 取绝对值
+        value = Math.abs(value);
+        // 移除整数部分,只保留小数部分
+        value -= (int) value;
+        // 计算小数位数
+        return (int) Math.max(0, Math.floor(Math.log10(value)));
+    }
 }