xiatian 1 tháng trước cách đây
mục cha
commit
80a9f3fe4d

+ 10 - 1
pom.xml

@@ -25,7 +25,16 @@
         <qmth-boot-version>1.0.5</qmth-boot-version>
     </properties>
 	<dependencies>
-        
+              <dependency>
+        <groupId>dom4j</groupId>
+        <artifactId>dom4j</artifactId>
+        <version>1.6.1</version>
+      </dependency>
+      <dependency>
+        <groupId>org.jsoup</groupId>
+        <artifactId>jsoup</artifactId>
+        <version>1.14.2</version>
+      </dependency>
 		<dependency>
             <groupId>com.qmth.boot</groupId>
             <artifactId>starter-api</artifactId>

+ 10 - 0
src/main/java/cn/com/qmth/am/bean/ds/AutoScoreRequest.java

@@ -42,6 +42,8 @@ public class AutoScoreRequest {
     // 试题名称
     private String questionTitle;
 
+    private Long scoreId;
+
     public String getSubjectName() {
         return subjectName;
     }
@@ -129,4 +131,12 @@ public class AutoScoreRequest {
         this.questionTitle = questionTitle;
     }
 
+    public Long getScoreId() {
+        return scoreId;
+    }
+
+    public void setScoreId(Long scoreId) {
+        this.scoreId = scoreId;
+    }
+
 }

+ 1 - 1
src/main/java/cn/com/qmth/am/bean/ds/TextContent.java

@@ -5,7 +5,7 @@ public class TextContent extends OcrContent {
     private String type = "text";
 
     // private String text = "只输出图片中的内容";
-    private String text = "请原样输出图片中不带删除线的可见文字内容。不要对文字的语法错误、拼写错误进行修正,也不要补充缺失的标点或内容,更不要编造不存在的文字信息。";
+    private String text = "这是一张考生答题卡扫描图。请原样输出考生作答内容。";
 
     public String getType() {
         return type;

+ 50 - 29
src/main/java/cn/com/qmth/am/service/impl/DsMarkingServiceImpl.java

@@ -5,11 +5,12 @@ import java.math.RoundingMode;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.select.Elements;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -83,6 +84,8 @@ public class DsMarkingServiceImpl implements DsMarkingService {
         MarkingReq dreq = new MarkingReq(sysProperty.getMarkingModel());
         dreq.addMsg(ChatRole.user, question);
         String res = marking(dreq);
+        log.warn("*** | scoreId:" + request.getScoreId() + " | Prompt:\r\n" + question);
+        log.warn("*** | scoreId:" + request.getScoreId() + " | Res: \r\n" + res);
         DsChoice result = JSONObject.parseObject(res, DsChoice.class);
         try {
             String text = result.getMessage().getContent();
@@ -94,7 +97,7 @@ public class DsMarkingServiceImpl implements DsMarkingService {
                 int stepCount = request.getStandardAnswer().size();
                 String scoreStr = null;
                 // if (stepCount > 1) {
-                scoreStr = fomatStrByRex(text);
+                scoreStr = getScores(text);
                 // } else {
                 // scoreStr = fomatStr(text);
                 // }
@@ -112,7 +115,7 @@ public class DsMarkingServiceImpl implements DsMarkingService {
                 scoreResult.setTotalScore(Arrays.stream(scoreArray).mapToObj(BigDecimal::new)
                         .reduce(BigDecimal.ZERO, BigDecimal::add).setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue());
             } else if (PromptTemplate.TRANSLATION.equals(q.getPromptTemplate())) {
-                String scoreStr = fomatStrByRex(text);
+                String scoreStr = getScores(text);
                 double[] scoreArray = new double[1];
                 // 根据得分率与步骤总分计算实际得分,按最大精度保留小数位数
                 double score = Double.valueOf(scoreStr);
@@ -131,17 +134,34 @@ public class DsMarkingServiceImpl implements DsMarkingService {
         }
     }
 
-    private String fomatStrByRex(String scoreStr) {
-        scoreStr = scoreStr.replaceAll("\\s", "");
-        Pattern pattern = Pattern.compile("\\d+(\\.\\d+)*(,\\d+(\\.\\d+)*)*");
-        String[] ss = scoreStr.split("\\\\n");
-        for (String s : ss) {
-            Matcher matcher = pattern.matcher(s);
-            if (matcher.find()) {
-                return matcher.group();
-            }
-        }
-        throw new RuntimeException("解析出错");
+    // private String fomatStrByRex(String scoreStr) {
+    // int tag = scoreStr.lastIndexOf("</think>");
+    // if (tag != -1) {
+    // scoreStr = scoreStr.substring(tag).trim();
+    // }
+    // scoreStr = scoreStr.replaceAll("\\s", "");
+    // Pattern pattern = Pattern.compile("\\d+(\\.\\d+)*(,\\d+(\\.\\d+)*)*");
+    // String[] ss = scoreStr.split("\\\\n");
+    // for (String s : ss) {
+    // Matcher matcher = pattern.matcher(s);
+    // if (matcher.find()) {
+    // return matcher.group();
+    // }
+    // }
+    // throw new RuntimeException("解析出错");
+    // }
+
+    private String getScores(String res) {
+        Document doc = Jsoup.parse(res);
+        Elements divs = doc.getElementsByTag("final-res-scores");
+        return divs.text();
+    }
+
+    public static void main(String[] args) {
+        String s = "<think>\\n\\n</think>\\n\\n<answer>Translation</answer>\\n<score>0,0</score>";
+        Document doc = Jsoup.parse(s);
+        Elements divs = doc.getElementsByTag("final-res-scores");
+        System.out.println(divs.text());
     }
 
     // private String fomatStr(String scoreStr) {
@@ -171,20 +191,21 @@ public class DsMarkingServiceImpl implements DsMarkingService {
         return Math.max(0, BigDecimal.valueOf(value).stripTrailingZeros().scale());
     }
 
-    public static void main(String[] args) {
-        String scoreStr = "</think>。\\n\\n\\n 70 \\n\\n评分结果2个3,29,110 \\n\\n考生的回答完全覆盖了所有的关键内容,逻辑清晰,术语使用准确";
-        scoreStr = scoreStr.replaceAll("\\s", "");
-        Pattern pattern = Pattern.compile("\\d+(\\.\\d+)*(,\\d+(\\.\\d+)*)*");
-        String[] ss = scoreStr.split("\\\\n");
-        for (String s : ss) {
-            Matcher matcher = pattern.matcher(s);
-            if (matcher.find()) {
-
-                System.out.println(matcher.group());
-                return;
-            }
-        }
-    }
+    // public static void main(String[] args) {
+    // String scoreStr = "</think>。\\n\\n\\n 70 \\n\\n评分结果2个3,29,110
+    // \\n\\n考生的回答完全覆盖了所有的关键内容,逻辑清晰,术语使用准确";
+    // scoreStr = scoreStr.replaceAll("\\s", "");
+    // Pattern pattern = Pattern.compile("\\d+(\\.\\d+)*(,\\d+(\\.\\d+)*)*");
+    // String[] ss = scoreStr.split("\\\\n");
+    // for (String s : ss) {
+    // Matcher matcher = pattern.matcher(s);
+    // if (matcher.find()) {
+    //
+    // System.out.println(matcher.group());
+    // return;
+    // }
+    // }
+    // }
 
     @SuppressWarnings("deprecation")
     private String marking(ChatReq dreq) {

+ 1 - 0
src/main/java/cn/com/qmth/am/service/impl/StudentScoreServiceImpl.java

@@ -494,6 +494,7 @@ public class StudentScoreServiceImpl extends ServiceImpl<StudentScoreDao, Studen
             }
             dto.setQuestion(q);
             AutoScoreRequest req = new AutoScoreRequest();
+            req.setScoreId(score.getId());
             req.setQuestionBody(q.getContent());
             req.setStandardAnswer(q.getAnswer());
             req.setStudentAnswer(score.getAnswer());

+ 11 - 8
templates/common.ftl

@@ -1,23 +1,26 @@
-作为"${subjectName}"科目的评分教师,您的任务是依据详细的评分指南,对考生关于特定试题的答进行全面评估。请按照以下结构化流程进行细致评判:
+/no_think 作为"${subjectName}"科目${questionTitle}试题的评分教师,您的任务是依据详细的评分指南,对考生关于特定试题的答进行全面评估。请按照以下结构化流程进行细致评判:
 
 #### 试题内容:
 ${questionBody}
 
-#### 参考答案由${standardAnswer?size}条关键内容组成:
+#### 标准答案:
+由以下${standardAnswer?size}条关键内容组成:
 <#list standardAnswer as item> 
 ${item?counter}. ${item.content}
 </#list>
 
-#### 考生答:
+#### 考生答:
 ${studentAnswer}
 
 #### 评判细则:
-- **完整性检查**:对照考生答案与关键内容,确认是否全面包含所有指定要点。
-- **语义通畅性**:分析考生回答是否条理清晰、逻辑连贯。
-- **术语准确性**:考察考生对相关概念与术语使用的恰当程度。
+对照考生答案与关键内容,确认是否全面包含所有指定要点。
+分析考生作答是否条理清晰、逻辑连贯。
+考察考生对相关概念与术语使用的恰当程度。
 
 #### 评分操作指引:
-针对每一条关键内容,依据完整性、语义通畅性及术语准确性对考生回答进行细致评判,得分为介于0至100之间的整数,准确反映考生回答质量。
+针对每一条关键内容,依据完整性、语义通畅性及术语准确性对考生作答进行细致评判,得分为介于0至100之间的整数,准确反映考生作答质量。
+若考生作答仅包含试题名称或试题内容,没有有效作答,直接判为0分。
 
 #### 最终输出要求:
-直接输出${standardAnswer?size}条关键内容的评分结果,评分结果无需其他文字说明,各分数间以英文逗号分隔,分数项不要加序号且无需其他文字说明。
+直接输出${standardAnswer?size}条关键内容的评分结果,评分结果无需其他文字说明,<#if standardAnswer?? && (standardAnswer?size > 1) >各分数间以英文逗号分隔,</#if>分数项不要加序号且无需其他文字说明。
+示例输出格式:\n<answer>考生的作答内容前3个字</answer>\n<final-res-scores>分数</final-res-scores>

+ 7 - 6
templates/translation.ftl

@@ -1,10 +1,10 @@
-作为${subjectName}科目${questionTitle}试题评分员,请严格按照以下标准为考生作答进行打分:
+/no_think 作为${subjectName}科目${questionTitle}试题评分员,请严格按照以下标准为考生作答进行打分:
 
 # 试题内容
 ${questionBody}
 
 <#if standardAnswer?? && (standardAnswer?size > 0) >
-# 参考答案
+# 标准答案
 <#list standardAnswer as item> 
 ${item.content}
 </#list>
@@ -14,12 +14,13 @@ ${item.content}
 ${scoreGrades}
 
 # 评分流程
-1. 理解试题内容与评分规则,分析考生作答内容,对比参考答案,准确判断考生作答属于哪个档次
-2. 从所属档次的分值范围中选择一个合适的分数作为最终评分结果,能准确反映考生作答的情况
-3. 若考生作答仅包含试题名称或试题内容,没有有效作答,直接判为0分
+理解试题内容与评分规则,分析考生作答内容,对比参考答案,准确判断考生作答属于哪个档次
+从所属档次的分值范围中选择一个合适的分数作为最终评分结果,能准确反映考生作答的情况
+若考生作答仅包含试题名称或试题内容,没有有效作答,直接判为0分
 
 # 考生作答
 ${studentAnswer}
 
 # 输出要求:
-直接输出最终评分结果,用数字表示,无需其他文字说明。
+直接输出最终评分结果,用数字表示,无需其他文字说明。
+示例输出格式:\n<answer>考生的作答内容前3个字</answer>\n<score>分数</score>