Explorar o código

init tow commit

coderxiaoc hai 4 meses
pai
achega
5fd30fcd0d
Modificáronse 49 ficheiros con 1268 adicións e 587 borrados
  1. 38 12
      pom.xml
  2. 14 0
      src/main/java/com/yango/javaailangchain4j/Aientity/GPSREN.java
  3. 13 0
      src/main/java/com/yango/javaailangchain4j/Aientity/GpsresEvaluation.java
  4. 16 0
      src/main/java/com/yango/javaailangchain4j/Aientity/Psre.java
  5. 5 1
      src/main/java/com/yango/javaailangchain4j/JavaAiLangchain4jApplication.java
  6. 27 0
      src/main/java/com/yango/javaailangchain4j/assistant/AutoGreateGpsrenAssistant.java
  7. 1 0
      src/main/java/com/yango/javaailangchain4j/assistant/MemoryChatAssistant.java
  8. 36 2
      src/main/java/com/yango/javaailangchain4j/assistant/SeparateChatAssistant.java
  9. 26 0
      src/main/java/com/yango/javaailangchain4j/config/FreeMarkerConfig.java
  10. 1 0
      src/main/java/com/yango/javaailangchain4j/controller/ChatController.java
  11. 0 42
      src/main/java/com/yango/javaailangchain4j/controller/GpsresEvaluation.java
  12. 90 0
      src/main/java/com/yango/javaailangchain4j/controller/GpsresEvaluationController.java
  13. 47 0
      src/main/java/com/yango/javaailangchain4j/controller/TeacherGpsrenController.java
  14. 42 0
      src/main/java/com/yango/javaailangchain4j/domain/GoalInfo.java
  15. 112 0
      src/main/java/com/yango/javaailangchain4j/domain/StepModel.java
  16. 13 0
      src/main/java/com/yango/javaailangchain4j/dto/AutoCreatePsren.java
  17. 15 0
      src/main/java/com/yango/javaailangchain4j/dto/EvaluationPsren.java
  18. 0 10
      src/main/java/com/yango/javaailangchain4j/dto/GpsrenEvalutionDto.java
  19. 11 0
      src/main/java/com/yango/javaailangchain4j/dto/ManuallyCreatePsren.java
  20. 16 0
      src/main/java/com/yango/javaailangchain4j/exception/GlobalExceptionHandler.java
  21. 18 0
      src/main/java/com/yango/javaailangchain4j/mapper/GoalInfoMapper.java
  22. 18 0
      src/main/java/com/yango/javaailangchain4j/mapper/StepModelMapper.java
  23. 13 0
      src/main/java/com/yango/javaailangchain4j/service/GoalInfoService.java
  24. 58 0
      src/main/java/com/yango/javaailangchain4j/service/PsrenService.java
  25. 13 0
      src/main/java/com/yango/javaailangchain4j/service/StepModelService.java
  26. 50 0
      src/main/java/com/yango/javaailangchain4j/service/TemplateProcessingService.java
  27. 22 0
      src/main/java/com/yango/javaailangchain4j/service/impl/GoalInfoServiceImpl.java
  28. 31 0
      src/main/java/com/yango/javaailangchain4j/service/impl/StepModelServiceImpl.java
  29. 42 0
      src/main/java/com/yango/javaailangchain4j/tools/CreateGpsren.java
  30. 38 0
      src/main/java/com/yango/javaailangchain4j/tools/createPase.java
  31. 0 209
      src/main/java/generator/domain/CourseInfo.java
  32. 0 18
      src/main/java/generator/mapper/CourseInfoMapper.java
  33. 0 13
      src/main/java/generator/service/CourseInfoService.java
  34. 0 22
      src/main/java/generator/service/impl/CourseInfoServiceImpl.java
  35. 13 3
      src/main/resources/application.properties
  36. 76 0
      src/main/resources/autoCreateGpsren.txt
  37. 0 36
      src/main/resources/generator/mapper/CourseInfoMapper.xml
  38. 35 0
      src/main/resources/mapper/GoalInfoMapper.xml
  39. 22 0
      src/main/resources/mapper/StepModelMapper.xml
  40. 63 0
      src/main/resources/teacherGpsren.txt
  41. 63 0
      src/main/resources/teacherGpsrenEval.txt
  42. 6 0
      src/main/resources/templates/evaluation-template.ftl
  43. 0 30
      src/test/java/com/yango/javaailangchain4j/AiserviceTest.java
  44. 0 86
      src/test/java/com/yango/javaailangchain4j/ChatMemoryTest.java
  45. 0 13
      src/test/java/com/yango/javaailangchain4j/JavaAiLangchain4jApplicationTests.java
  46. 0 65
      src/test/java/com/yango/javaailangchain4j/LLMTest.java
  47. 0 25
      src/test/java/com/yango/javaailangchain4j/PromptTest.java
  48. 21 0
      src/test/java/com/yango/javaailangchain4j/service/StepModelServiceTes.java
  49. 143 0
      src/test/java/com/yango/javaailangchain4j/service/TemplateProcessingServiceTest.java

+ 38 - 12
pom.xml

@@ -15,6 +15,8 @@
         <knife4j.version>4.3.0</knife4j.version>
         <langchain4j.version>1.0.0-beta3</langchain4j.version>
         <mybatis-plus.version>3.5.11</mybatis-plus.version>
+        <spring-cloud.version>2023.0.3</spring-cloud.version>
+        <spring-cloud-alibaba.version>2023.0.3.2</spring-cloud-alibaba.version>
     </properties>
     <dependencies>
         <!-- web应用程序核心依赖 -->
@@ -46,6 +48,9 @@
             <artifactId>langchain4j-open-ai-spring-boot-starter</artifactId>
             <version>${langchain4j.version}</version>
         </dependency>
+
+
+
         <!-- 接入ollama -->
         <dependency>
             <groupId>dev.langchain4j</groupId>
@@ -64,11 +69,12 @@
             <version>1.0.0-beta3</version>
         </dependency>
 
+
         <!-- MyBatis-Plus 依赖 -->
         <dependency>
             <groupId>com.baomidou</groupId>
-            <artifactId>mybatis-plus-boot-starter</artifactId>
-            <version>3.5.5</version>
+            <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
+            <version>3.5.9</version>
         </dependency>
 
         <!-- MySQL 驱动 -->
@@ -98,8 +104,23 @@
             <artifactId>jakarta.servlet-api</artifactId>
             <scope>provided</scope>
         </dependency>
+
+        <!-- freemarker 模板引擎 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-freemarker</artifactId>
+            <version>3.2.6</version>
+        </dependency>
+
+        <!-- nacos 服务注册与发现 -->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+        </dependency>
     </dependencies>
 
+
+
     <dependencyManagement>
         <dependencies>
             <!--引入SpringBoot依赖管理清单-->
@@ -125,18 +146,23 @@
                 <scope>import</scope>
             </dependency>
 
-
+            <dependency>
+                <groupId>org.springframework.cloud</groupId>
+                <artifactId>spring-cloud-dependencies</artifactId>
+                <version>${spring-cloud.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <dependency>
+                <groupId>com.alibaba.cloud</groupId>
+                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
+                <version>${spring-cloud-alibaba.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
         </dependencies>
 
-
     </dependencyManagement>
-<!--    <parent>-->
-<!--        <groupId>org.springframework.boot</groupId>-->
-<!--        <artifactId>spring-boot-starter-parent</artifactId>-->
-<!--        <version>2.1.3.RELEASE</version>-->
-<!--        <relativePath/>-->
-<!--    </parent>-->
-
     <build>
         <plugins>
             <plugin>
@@ -162,11 +188,11 @@
                         </goals>
                         <configuration>
                             <mainClass>com.yango.javaailangchain4j.JavaAiLangchain4jApplication</mainClass>
-                            <skip>true</skip>
                         </configuration>
                     </execution>
                 </executions>
             </plugin>
+
         </plugins>
     </build>
 

+ 14 - 0
src/main/java/com/yango/javaailangchain4j/Aientity/GPSREN.java

@@ -0,0 +1,14 @@
+package com.yango.javaailangchain4j.Aientity;
+
+import lombok.Data;
+
+@Data
+public class GPSREN {
+    private String knowledge;
+    private String G;
+    private String P;
+    private String S;
+    private String R;
+    private String E;
+    private String N;
+}

+ 13 - 0
src/main/java/com/yango/javaailangchain4j/Aientity/GpsresEvaluation.java

@@ -0,0 +1,13 @@
+package com.yango.javaailangchain4j.Aientity;
+
+import lombok.Data;
+
+@Data
+public class GpsresEvaluation {
+    public String G;
+    public String P;
+    public String S;
+    public String R;
+    public String E;
+    public String N;
+}

+ 16 - 0
src/main/java/com/yango/javaailangchain4j/Aientity/Psre.java

@@ -0,0 +1,16 @@
+package com.yango.javaailangchain4j.Aientity;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class Psre {
+    private String knowledge;
+    private String P;
+    private String S;
+    private String R;
+    private String E;
+}

+ 5 - 1
src/main/java/com/yango/javaailangchain4j/JavaAiLangchain4jApplication.java

@@ -1,11 +1,15 @@
 package com.yango.javaailangchain4j;
 
+import dev.langchain4j.service.spring.AiService;
+import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.FilterType;
 
 @SpringBootApplication
+@MapperScan("com.yango.javaailangchain4j.mapper")
 public class JavaAiLangchain4jApplication {
-
     public static void main(String[] args) {
         SpringApplication.run(JavaAiLangchain4jApplication.class, args);
     }

+ 27 - 0
src/main/java/com/yango/javaailangchain4j/assistant/AutoGreateGpsrenAssistant.java

@@ -0,0 +1,27 @@
+package com.yango.javaailangchain4j.assistant;
+
+import com.yango.javaailangchain4j.Aientity.GPSREN;
+import dev.langchain4j.service.MemoryId;
+import dev.langchain4j.service.SystemMessage;
+import dev.langchain4j.service.UserMessage;
+import dev.langchain4j.service.V;
+import dev.langchain4j.service.spring.AiService;
+
+import static dev.langchain4j.service.spring.AiServiceWiringMode.EXPLICIT;
+
+@AiService(
+        wiringMode = EXPLICIT,
+        chatMemory = "chatMemory",
+        chatModel = "qwenChatModel",
+//        chatModel = "ollamaChatModel",
+        chatMemoryProvider = "chatMemoryProvider",
+        tools="createGpsren"
+)
+public interface AutoGreateGpsrenAssistant {
+    @SystemMessage(fromResource = "autoCreateGpsren.txt")
+    GPSREN autoCreateGpsre(
+            @MemoryId int memoryId,
+            @V("courseName") String courseName,
+            @UserMessage String userMessage
+    );
+}

+ 1 - 0
src/main/java/com/yango/javaailangchain4j/assistant/MemoryChatAssistant.java

@@ -7,6 +7,7 @@ import static dev.langchain4j.service.spring.AiServiceWiringMode.EXPLICIT;
 @AiService(
         wiringMode = EXPLICIT,
         chatModel = "qwenChatModel",
+//        chatModel = "openAiChatModel",
         chatMemory = "chatMemory"
 )
 public interface MemoryChatAssistant {

+ 36 - 2
src/main/java/com/yango/javaailangchain4j/assistant/SeparateChatAssistant.java

@@ -1,5 +1,8 @@
 package com.yango.javaailangchain4j.assistant;
 
+import com.yango.javaailangchain4j.Aientity.GPSREN;
+import com.yango.javaailangchain4j.Aientity.Psre;
+import dev.langchain4j.agent.tool.Tool;
 import dev.langchain4j.service.MemoryId;
 import dev.langchain4j.service.SystemMessage;
 import dev.langchain4j.service.UserMessage;
@@ -12,7 +15,9 @@ import static dev.langchain4j.service.spring.AiServiceWiringMode.EXPLICIT;
         wiringMode = EXPLICIT,
         chatMemory = "chatMemory",
         chatModel = "qwenChatModel",
-        chatMemoryProvider = "chatMemoryProvider"
+//        chatModel = "ollamaChatModel",
+        chatMemoryProvider = "chatMemoryProvider",
+        tools="createPase"
 )
 public interface SeparateChatAssistant {
     /**
@@ -23,7 +28,14 @@ public interface SeparateChatAssistant {
      */
     @SystemMessage("你是资深教育专家")
     String chat(@MemoryId int memoryId, @UserMessage String userMessage);
-
+    /**
+     * * 获取知识图谱
+     * @param memoryId 聊天id
+     * @param userMessage 用户消息
+     * @param courseName 课程名称
+     * @param courseId 课程id
+     * @return
+     */
     @SystemMessage(fromResource = "knowledgeMap.txt")
     String chat3(
         @MemoryId int memoryId,
@@ -31,4 +43,26 @@ public interface SeparateChatAssistant {
         @V("courseName") String courseName,
         @V("coueseId") int courseId
     );
+
+    @SystemMessage(fromResource = "teacherGpsren.txt")
+    Psre chat4(@MemoryId int memoryId,
+                 @V("courseName") String courseName,
+                 @UserMessage String userMessage
+                 );
+
+
+
+
+
+
+    @SystemMessage(fromResource = "teacherGpsren.txt")
+    String chat5(@MemoryId int memoryId,
+                 @V("courseName") String courseName,
+                 @V("stepName") String stepName,
+                 @V("standardAnswer") String standardAnswer,
+                 @V("studentAnswer") String studentAnswer,
+                 @V("goal") String goal,
+                 @UserMessage String userMessage
+    );
+
 }

+ 26 - 0
src/main/java/com/yango/javaailangchain4j/config/FreeMarkerConfig.java

@@ -0,0 +1,26 @@
+package com.yango.javaailangchain4j.config;
+
+import freemarker.core.TemplateClassResolver;
+import freemarker.template.ObjectWrapper;
+import org.springframework.context.annotation.Bean;
+
+@org.springframework.context.annotation.Configuration
+public class FreeMarkerConfig {
+
+    @Bean(name = "customFreeMarkerConfiguration")
+    public freemarker.template.Configuration freeMarkerConfiguration() {
+        freemarker.template.Configuration configuration = new freemarker.template.Configuration(freemarker.template.Configuration.VERSION_2_3_32);
+        configuration.setNamingConvention(freemarker.template.Configuration.AUTO_DETECT_NAMING_CONVENTION);
+        configuration.setObjectWrapper(ObjectWrapper.DEFAULT_WRAPPER);
+        configuration.setDefaultEncoding("UTF-8");
+        configuration.setNumberFormat("0.##");
+        configuration.setTemplateExceptionHandler(freemarker.template.TemplateExceptionHandler.RETHROW_HANDLER);
+        configuration.setLogTemplateExceptions(false);
+        configuration.setWrapUncheckedExceptions(true);
+        configuration.setFallbackOnNullLoopVariable(false);
+        configuration.setAPIBuiltinEnabled(false);
+        configuration.setNewBuiltinClassResolver(TemplateClassResolver.SAFER_RESOLVER);
+
+        return configuration;
+    }
+}

+ 1 - 0
src/main/java/com/yango/javaailangchain4j/controller/ChatController.java

@@ -9,6 +9,7 @@ import org.springframework.web.bind.annotation.*;
 
 @RestController
 @RequestMapping("/api/courseKnowledgeMap")
+@CrossOrigin(origins = "*")
 public class ChatController {
     @Autowired
     private Assistant assistant;

+ 0 - 42
src/main/java/com/yango/javaailangchain4j/controller/GpsresEvaluation.java

@@ -1,42 +0,0 @@
-package com.yango.javaailangchain4j.controller;
-
-
-import com.yango.javaailangchain4j.assistant.SeparateChatAssistant;
-import com.yango.javaailangchain4j.dto.GpsrenEvalutionDto;
-import com.yango.javaailangchain4j.utils.Result;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-@RestController
-@RequestMapping("/api/gps")
-public class GpsresEvaluation {
-    @Autowired
-    private SeparateChatAssistant separateChatAssistant;
-    @RequestMapping("/Gevaluation")
-    public Result Gevaluation(@RequestBody GpsrenEvalutionDto gpsrenEvalutionDto) {
-        return Result.success(separateChatAssistant.chat(gpsrenEvalutionDto.getUserid(), gpsrenEvalutionDto.getMessage()));
-    }
-    @RequestMapping("/Pevaluation")
-    public Result Pevaluation(@RequestBody GpsrenEvalutionDto gpsrenEvalutionDto) {
-        return Result.success(separateChatAssistant.chat(gpsrenEvalutionDto.getUserid(), gpsrenEvalutionDto.getMessage()));
-    }
-    @RequestMapping("/Sevaluation")
-    public Result Sevaluation(@RequestBody GpsrenEvalutionDto gpsrenEvalutionDto) {
-        return Result.success(separateChatAssistant.chat(gpsrenEvalutionDto.getUserid(), gpsrenEvalutionDto.getMessage()));
-    }
-    @RequestMapping("/Revaluation")
-    public Result Revaluation(@RequestBody GpsrenEvalutionDto gpsrenEvalutionDto) {
-        return Result.success(separateChatAssistant.chat(gpsrenEvalutionDto.getUserid(), gpsrenEvalutionDto.getMessage()));
-    }
-    @RequestMapping("/Eevaluation")
-    public Result Eevaluation(@RequestBody GpsrenEvalutionDto gpsrenEvalutionDto) {
-        return Result.success(separateChatAssistant.chat(gpsrenEvalutionDto.getUserid(), gpsrenEvalutionDto.getMessage()));
-    }
-    @RequestMapping("/Nevaluation")
-    public Result Nevaluation(@RequestBody GpsrenEvalutionDto gpsrenEvalutionDto) {
-        return Result.success(separateChatAssistant.chat(gpsrenEvalutionDto.getUserid(), gpsrenEvalutionDto.getMessage()));
-    }
-
-}

+ 90 - 0
src/main/java/com/yango/javaailangchain4j/controller/GpsresEvaluationController.java

@@ -0,0 +1,90 @@
+package com.yango.javaailangchain4j.controller;
+
+
+import com.yango.javaailangchain4j.assistant.SeparateChatAssistant;
+import com.yango.javaailangchain4j.dto.EvaluationPsren;
+
+import com.yango.javaailangchain4j.service.StepModelService;
+import com.yango.javaailangchain4j.service.TemplateProcessingService;
+import com.yango.javaailangchain4j.utils.Result;
+import freemarker.template.TemplateException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/api")
+@CrossOrigin(origins = "*")
+public class GpsresEvaluationController {
+    @Autowired
+    private SeparateChatAssistant separateChatAssistant;
+
+    @Autowired
+    private TemplateProcessingService templateProcessingService;
+    @Autowired
+    private StepModelService stepModelService;
+
+    // // fixme:从数据库获取模板的方法(你需要根据实际情况实现)
+    private String getTemplateFromDatabase(String stepName) {
+        // 临时返回示例模板字符串
+        return "现在学生在${courseName}课程中的${stepName}环节,Goal是${goal}。\n"
+                + "学生的答案是${studentAnswer},\n"
+                + "标准答案是${standardAnswer}。\n"
+                + "答案不要再把学生答案和标准答案复述一遍了,以纯文本格式返回。\n"
+                + "根据标准答案和学生答案,给出该环节的评分和建议,总分${score}分。";
+
+//        String name = stepName; // 你要查询的步骤名称
+//        String prompt = stepModelService.getPromptByName(stepName);
+//        return prompt;
+    }
+
+    @CrossOrigin(origins = "*")
+    @PostMapping( "/psrenEvalution")
+    public Result Pevaluation(@RequestBody EvaluationPsren evaluationPsren) throws IOException, TemplateException {
+        String courseName = evaluationPsren.getCourseName();
+        String stepName = evaluationPsren.getStepName();
+        String goal = evaluationPsren.getGoal();
+        String standardAnswer = evaluationPsren.getStandardAnswer();
+        String studentAnswer = evaluationPsren.getStudentAnswer();
+        int score = evaluationPsren.getScore();
+        /*String userMessage = String.format("现在学生在%s课程中的%s环节,Goal是%s,学生的答案是%s,标准答案是%s,答案不要再把学生答案和标准答案复述一遍了,以纯文本格式返回" +
+                "根据标准答案和学生答案,给出该环节的评分和建议,总分%d分",courseName,stepName,goal,studentAnswer,standardAnswer, score);*/
+
+        // 准备模板数据
+        Map<String, Object> templateData = new HashMap<>();
+        templateData.put("courseName", courseName);
+        templateData.put("stepName", stepName);
+        templateData.put("goal", goal);
+        templateData.put("studentAnswer", studentAnswer);
+        templateData.put("standardAnswer", standardAnswer);
+        templateData.put("score", score);
+
+        // 从数据库读取的模板字符串
+        String templateString = getTemplateFromDatabase(stepName); // 你的数据库读取方法
+
+        // 使用模板处理服务处理模板
+        String userMessage = templateProcessingService.processTemplate(
+                templateString, templateData, "evaluationTemplate-" + stepName);
+
+        System.out.println("模板数据: " + userMessage);
+
+        String s = separateChatAssistant.chat5(
+                evaluationPsren.getMemoryId(),
+                evaluationPsren.getCourseName(),
+                evaluationPsren.getStepName(),
+                evaluationPsren.getStandardAnswer(),
+                evaluationPsren.getStandardAnswer(),
+                evaluationPsren.getGoal(),
+                userMessage
+        );
+
+        return Result.success(s);
+    }
+
+
+
+
+}

+ 47 - 0
src/main/java/com/yango/javaailangchain4j/controller/TeacherGpsrenController.java

@@ -0,0 +1,47 @@
+package com.yango.javaailangchain4j.controller;
+
+import com.yango.javaailangchain4j.Aientity.GPSREN;
+import com.yango.javaailangchain4j.assistant.AutoGreateGpsrenAssistant;
+import com.yango.javaailangchain4j.assistant.SeparateChatAssistant;
+import com.yango.javaailangchain4j.dto.AutoCreatePsren;
+import com.yango.javaailangchain4j.dto.ManuallyCreatePsren;
+import com.yango.javaailangchain4j.service.PsrenService;
+import com.yango.javaailangchain4j.utils.Result;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/api/teracherGpsren")
+@CrossOrigin(origins = "*")
+public class TeacherGpsrenController {
+    @Autowired
+    private SeparateChatAssistant separateChatAssistant;
+    /**
+     * 手动创建PSRE
+     * 获取GPS-REN教学法相关的AI助手回复
+     * @param manuallyCreatePsren 包含memoryId、courseName和userMessage的对象
+     * @return 包含AI助手回复结果的Result对象
+     */
+    @CrossOrigin(origins = "*")
+    @PostMapping("/ManuallyCreatedPsreByG")
+    public Result getGpsren(@RequestBody ManuallyCreatePsren manuallyCreatePsren){
+        String temp = "根据这个G,生成PSRE以及这个G会涉及到的知识点";
+        return Result.success(separateChatAssistant.chat4(manuallyCreatePsren.getMemoryId(), manuallyCreatePsren.getCourseName(), manuallyCreatePsren.getUserMessage()+temp));
+    }
+
+    /**
+     * 自动创建PSRE
+     * 获取GPS-REN教学法相关的AI助手回复
+     */
+    @Autowired
+    private PsrenService psrenService;
+    @CrossOrigin(origins = "*")
+    @PostMapping("/AutoCreatedPsreByG")
+    public Result setGpsren(@RequestBody AutoCreatePsren autoCreatePsren){
+        List<GPSREN> gpsrens = psrenService.generateGPSRENList(autoCreatePsren);
+        return Result.success(gpsrens);
+    }
+
+}

+ 42 - 0
src/main/java/com/yango/javaailangchain4j/domain/GoalInfo.java

@@ -0,0 +1,42 @@
+package com.yango.javaailangchain4j.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.time.LocalDateTime;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * 导向目标设定表, 学科 -->
+ * @TableName goal_info
+ */
+@Data
+@TableName(value ="goal_info")
+public class GoalInfo {
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    private Integer subjectId;
+    private Integer schoolType;
+    private Integer courseSectionId;
+    private Integer courseId;
+    private Integer gradeId;
+    private String content;
+
+    private String gOriented;
+    private String pScoreStd;
+    private String sScoreStd;
+    private String rScoreStd;
+    private String eScoreStd;
+    private String nScoreStd;
+
+    private String knowPoints;
+
+    private Integer publishFlag;
+    private Integer createUser;
+    private LocalDateTime createDate;
+    private LocalDateTime updateDate;
+}

+ 112 - 0
src/main/java/com/yango/javaailangchain4j/domain/StepModel.java

@@ -0,0 +1,112 @@
+package com.yango.javaailangchain4j.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * 环节模板表
+ * @TableName step_model
+ */
+@TableName(value ="step_model")
+@Data
+public class StepModel {
+    /**
+     *
+     */
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     *
+     */
+    private String name;
+
+    /**
+     * 提示词
+     */
+    private String prompt;
+
+    /**
+     * 智能体id
+     */
+    private Integer agentid;
+
+    /**
+     * 预留字段
+     */
+    private String reserve;
+
+    /**
+     * 分数
+     */
+    private Integer score;
+
+    /**
+     *
+     */
+    private Date createDate;
+
+    /**
+     *
+     */
+    private Date updateDate;
+
+    @Override
+    public boolean equals(Object that) {
+        if (this == that) {
+            return true;
+        }
+        if (that == null) {
+            return false;
+        }
+        if (getClass() != that.getClass()) {
+            return false;
+        }
+        StepModel other = (StepModel) that;
+        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
+            && (this.getName() == null ? other.getName() == null : this.getName().equals(other.getName()))
+            && (this.getPrompt() == null ? other.getPrompt() == null : this.getPrompt().equals(other.getPrompt()))
+            && (this.getAgentid() == null ? other.getAgentid() == null : this.getAgentid().equals(other.getAgentid()))
+            && (this.getReserve() == null ? other.getReserve() == null : this.getReserve().equals(other.getReserve()))
+            && (this.getScore() == null ? other.getScore() == null : this.getScore().equals(other.getScore()))
+            && (this.getCreateDate() == null ? other.getCreateDate() == null : this.getCreateDate().equals(other.getCreateDate()))
+            && (this.getUpdateDate() == null ? other.getUpdateDate() == null : this.getUpdateDate().equals(other.getUpdateDate()));
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
+        result = prime * result + ((getName() == null) ? 0 : getName().hashCode());
+        result = prime * result + ((getPrompt() == null) ? 0 : getPrompt().hashCode());
+        result = prime * result + ((getAgentid() == null) ? 0 : getAgentid().hashCode());
+        result = prime * result + ((getReserve() == null) ? 0 : getReserve().hashCode());
+        result = prime * result + ((getScore() == null) ? 0 : getScore().hashCode());
+        result = prime * result + ((getCreateDate() == null) ? 0 : getCreateDate().hashCode());
+        result = prime * result + ((getUpdateDate() == null) ? 0 : getUpdateDate().hashCode());
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", id=").append(id);
+        sb.append(", name=").append(name);
+        sb.append(", prompt=").append(prompt);
+        sb.append(", agentid=").append(agentid);
+        sb.append(", reserve=").append(reserve);
+        sb.append(", score=").append(score);
+        sb.append(", createDate=").append(createDate);
+        sb.append(", updateDate=").append(updateDate);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 13 - 0
src/main/java/com/yango/javaailangchain4j/dto/AutoCreatePsren.java

@@ -0,0 +1,13 @@
+package com.yango.javaailangchain4j.dto;
+
+import lombok.Data;
+
+@Data
+public class AutoCreatePsren {
+    private int memoryId;
+    private int subjectId;
+    private String userMessage;
+    private String courseName;
+    private int number;
+
+}

+ 15 - 0
src/main/java/com/yango/javaailangchain4j/dto/EvaluationPsren.java

@@ -0,0 +1,15 @@
+package com.yango.javaailangchain4j.dto;
+
+import lombok.Data;
+
+@Data
+public class EvaluationPsren {
+    private int memoryId;
+    private String courseName;//课程名称
+    private String stepName;//环节名称
+    private String goal;//目标道姓
+    private String standardAnswer;
+    private String studentAnswer;
+    private int score ;
+
+}

+ 0 - 10
src/main/java/com/yango/javaailangchain4j/dto/GpsrenEvalutionDto.java

@@ -1,10 +0,0 @@
-package com.yango.javaailangchain4j.dto;
-
-import lombok.Data;
-
-@Data
-public class GpsrenEvalutionDto {
-    private int userid;
-    private String message;
-}
-

+ 11 - 0
src/main/java/com/yango/javaailangchain4j/dto/ManuallyCreatePsren.java

@@ -0,0 +1,11 @@
+package com.yango.javaailangchain4j.dto;
+
+import lombok.Data;
+
+@Data
+public class ManuallyCreatePsren {
+    private int memoryId;
+    private String userMessage;
+    private String courseName;
+
+}

+ 16 - 0
src/main/java/com/yango/javaailangchain4j/exception/GlobalExceptionHandler.java

@@ -0,0 +1,16 @@
+package com.yango.javaailangchain4j.exception;
+
+import com.yango.javaailangchain4j.utils.Result;
+import com.yango.javaailangchain4j.utils.ResultCode;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+@RestControllerAdvice
+public class GlobalExceptionHandler {
+    @ExceptionHandler(Exception.class)
+    public Result handleException(Exception e) {
+        e.printStackTrace();
+        return Result.fail(ResultCode.FAIL, StringUtils.hasLength(e.getMessage()) ? e.getMessage() : "操作失败");
+    }
+}

+ 18 - 0
src/main/java/com/yango/javaailangchain4j/mapper/GoalInfoMapper.java

@@ -0,0 +1,18 @@
+package com.yango.javaailangchain4j.mapper;
+
+import com.yango.javaailangchain4j.domain.GoalInfo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author hxy
+* @description 针对表【goal_info(导向目标设定表, 学科 --> )】的数据库操作Mapper
+* @createDate 2025-08-05 15:08:09
+* @Entity javaailangchain4j.domain.GoalInfo
+*/
+public interface GoalInfoMapper extends BaseMapper<GoalInfo> {
+
+}
+
+
+
+

+ 18 - 0
src/main/java/com/yango/javaailangchain4j/mapper/StepModelMapper.java

@@ -0,0 +1,18 @@
+package com.yango.javaailangchain4j.mapper;
+
+import com.yango.javaailangchain4j.domain.StepModel;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author hxy
+* @description 针对表【step_model(环节模板表)】的数据库操作Mapper
+* @createDate 2025-07-31 17:02:00
+* @Entity javaailangchain4j.domain.StepModel
+*/
+public interface StepModelMapper extends BaseMapper<StepModel> {
+
+}
+
+
+
+

+ 13 - 0
src/main/java/com/yango/javaailangchain4j/service/GoalInfoService.java

@@ -0,0 +1,13 @@
+package com.yango.javaailangchain4j.service;
+
+import com.yango.javaailangchain4j.domain.GoalInfo;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+* @author hxy
+* @description 针对表【goal_info(导向目标设定表, 学科 --> )】的数据库操作Service
+* @createDate 2025-08-05 15:08:09
+*/
+public interface GoalInfoService extends IService<GoalInfo> {
+
+}

+ 58 - 0
src/main/java/com/yango/javaailangchain4j/service/PsrenService.java

@@ -0,0 +1,58 @@
+package com.yango.javaailangchain4j.service;
+
+import com.yango.javaailangchain4j.Aientity.GPSREN;
+import com.yango.javaailangchain4j.assistant.AutoGreateGpsrenAssistant;
+import com.yango.javaailangchain4j.domain.GoalInfo;
+import com.yango.javaailangchain4j.dto.AutoCreatePsren;
+import com.yango.javaailangchain4j.mapper.GoalInfoMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class PsrenService {
+    @Autowired
+    private AutoGreateGpsrenAssistant autoGreateGpsrenAssistant;
+    @Autowired
+    private GoalInfoMapper goalInfoMapper;
+
+    @Autowired
+    private GoalInfoService goalInfoService;
+
+
+    public List<GPSREN> generateGPSRENList(AutoCreatePsren autoCreatePsren) {
+        List<GPSREN> result = new ArrayList<>();
+        List<GoalInfo> insertList = new ArrayList<>();
+
+        for (int i = 0; i < autoCreatePsren.getNumber(); i++) {
+            String temp = String.format("你是一名专业教师助手,请根据以下课程名称%s,生成一个完整的GPSREN教学方案,课程使用的是java语言", autoCreatePsren.getCourseName());
+            GPSREN gpsren = autoGreateGpsrenAssistant.autoCreateGpsre(autoCreatePsren.getMemoryId(), autoCreatePsren.getCourseName(), autoCreatePsren.getUserMessage()+temp);
+            GoalInfo entity = new GoalInfo();
+            entity.setSubjectId(autoCreatePsren.getSubjectId());
+            entity.setContent(autoCreatePsren.getUserMessage()); // 原始内容
+            entity.setGOriented(gpsren.getG().replace("\n", "\\n"));
+            entity.setPScoreStd(gpsren.getP().replace("\n", "\\n"));
+            entity.setSScoreStd(gpsren.getS().replace("\n", "\\n"));
+            entity.setRScoreStd(gpsren.getR().replace("\n", "\\n"));
+            entity.setEScoreStd(gpsren.getE().replace("\n", "\\n"));
+            entity.setNScoreStd(gpsren.getN().replace("\n", "\\n"));
+            entity.setKnowPoints(gpsren.getKnowledge());
+
+            entity.setPublishFlag(0);
+            entity.setCreateUser(1); // 替换为当前登录用户
+            entity.setCreateDate(LocalDateTime.now());
+            entity.setUpdateDate(LocalDateTime.now());
+            // 保存到数据库
+           goalInfoMapper.insert(entity);
+
+//            insertList.add(entity);
+            result.add(gpsren);
+        }
+
+//        goalInfoService.saveBatch(insertList, 100);
+        return result;
+    }
+}

+ 13 - 0
src/main/java/com/yango/javaailangchain4j/service/StepModelService.java

@@ -0,0 +1,13 @@
+package com.yango.javaailangchain4j.service;
+
+import com.yango.javaailangchain4j.domain.StepModel;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+* @author hxy
+* @description 针对表【step_model(环节模板表)】的数据库操作Service
+* @createDate 2025-07-31 17:02:00
+*/
+public interface StepModelService extends IService<StepModel> {
+    String getPromptByName(String name);
+}

+ 50 - 0
src/main/java/com/yango/javaailangchain4j/service/TemplateProcessingService.java

@@ -0,0 +1,50 @@
+package com.yango.javaailangchain4j.service;
+
+import freemarker.template.Configuration;
+import freemarker.template.Template;
+import freemarker.template.TemplateException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Service;
+import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
+
+import java.io.IOException;
+import java.util.Map;
+
+@Service
+public class TemplateProcessingService {
+
+    @Autowired
+    @Qualifier("customFreeMarkerConfiguration")
+    private Configuration freemarkerConfig;
+
+    /**
+     * 使用FreeMarker模板引擎处理模板字符串
+     *
+     * @param templateString 模板字符串
+     * @param templateData 模板数据
+     * @param templateName 模板名称,用于调试
+     * @return 处理后的字符串
+     * @throws IOException IO异常
+     * @throws TemplateException 模板异常
+     */
+    public String processTemplate(String templateString, Map<String, Object> templateData, String templateName)
+            throws IOException, TemplateException {
+        Template template = new Template(templateName, templateString, freemarkerConfig);
+        return FreeMarkerTemplateUtils.processTemplateIntoString(template, templateData);
+    }
+
+    /**
+     * 使用FreeMarker模板引擎处理模板字符串(使用默认模板名称)
+     *
+     * @param templateString 模板字符串
+     * @param templateData 模板数据
+     * @return 处理后的字符串
+     * @throws IOException IO异常
+     * @throws TemplateException 模板异常
+     */
+    public String processTemplate(String templateString, Map<String, Object> templateData)
+            throws IOException, TemplateException {
+        return processTemplate(templateString, templateData, "defaultTemplate");
+    }
+}

+ 22 - 0
src/main/java/com/yango/javaailangchain4j/service/impl/GoalInfoServiceImpl.java

@@ -0,0 +1,22 @@
+package com.yango.javaailangchain4j.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yango.javaailangchain4j.domain.GoalInfo;
+import com.yango.javaailangchain4j.service.GoalInfoService;
+import com.yango.javaailangchain4j.mapper.GoalInfoMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author hxy
+* @description 针对表【goal_info(导向目标设定表, 学科 --> )】的数据库操作Service实现
+* @createDate 2025-08-05 15:08:09
+*/
+@Service
+public class GoalInfoServiceImpl extends ServiceImpl<GoalInfoMapper, GoalInfo>
+    implements GoalInfoService{
+
+}
+
+
+
+

+ 31 - 0
src/main/java/com/yango/javaailangchain4j/service/impl/StepModelServiceImpl.java

@@ -0,0 +1,31 @@
+package com.yango.javaailangchain4j.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yango.javaailangchain4j.domain.StepModel;
+import com.yango.javaailangchain4j.service.StepModelService;
+import com.yango.javaailangchain4j.mapper.StepModelMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+* @author hxy
+* @description 针对表【step_model(环节模板表)】的数据库操作Service实现
+* @createDate 2025-07-31 17:02:00
+*/
+@Service
+public class StepModelServiceImpl extends ServiceImpl<StepModelMapper, StepModel>
+    implements StepModelService{
+
+    @Override
+    public String getPromptByName(String name) {
+        StepModel model = this.getOne(new QueryWrapper<StepModel>()
+                .eq("name", name)
+                .select("prompt")); // 只查prompt字段
+        return model != null ? model.getPrompt() : null;
+    }
+}
+
+
+
+

+ 42 - 0
src/main/java/com/yango/javaailangchain4j/tools/CreateGpsren.java

@@ -0,0 +1,42 @@
+package com.yango.javaailangchain4j.tools;
+
+import com.yango.javaailangchain4j.Aientity.GPSREN;
+import com.yango.javaailangchain4j.Aientity.Psre;
+import dev.langchain4j.agent.tool.Tool;
+import dev.langchain4j.memory.ChatMemory;
+import dev.langchain4j.memory.chat.MessageWindowChatMemory;
+import dev.langchain4j.service.MemoryId;
+import dev.langchain4j.service.UserMessage;
+import org.springframework.stereotype.Component;
+
+@Component
+public class CreateGpsren {
+    private final ChatMemory chatMemory;
+
+    public CreateGpsren () {
+        this.chatMemory = MessageWindowChatMemory.withMaxMessages(100); // 示例内存管理
+    }
+
+    public CreateGpsren(ChatMemory chatMemory) {
+        this.chatMemory = chatMemory;
+    }
+
+    @Tool(name = "返回结果类",value = "根据课程名称和用户消息生成 GPSREN 结构") // 类似 @AiFunction
+    public GPSREN CreateGpsren(
+            @MemoryId int memoryId, // 类似 @MemoryId
+            // 类似 @V("courseName")
+            @UserMessage String userMessage                 // 类似 @UserMessage
+    ) {
+        // 你的业务逻辑,例如:
+//        GPSREN gpsren = new GPSREN();
+//        gpsren.setKnowledge("Knowledge课程知识: 待生成" );
+//        gpsren.setG("G目标导向: 待生成");
+//        gpsren.setP("P问题: 待生成");
+//        gpsren.setS("S分解: 待生成");
+//        gpsren.setR("R结果: 待生成");
+//        gpsren.setE("E评估: 待生成");
+//        gpsren.setN("N知识总结: 待生成");
+//        return gpsren;
+        return null;
+    }
+}

+ 38 - 0
src/main/java/com/yango/javaailangchain4j/tools/createPase.java

@@ -0,0 +1,38 @@
+package com.yango.javaailangchain4j.tools;
+
+import com.yango.javaailangchain4j.Aientity.Psre;
+import dev.langchain4j.agent.tool.Tool;
+import dev.langchain4j.memory.ChatMemory;
+import dev.langchain4j.memory.chat.MessageWindowChatMemory;
+import dev.langchain4j.model.openai.OpenAiChatModel;
+import dev.langchain4j.service.MemoryId;
+import dev.langchain4j.service.UserMessage;
+import org.springframework.stereotype.Component;
+
+@Component
+public class createPase {
+
+    private final ChatMemory chatMemory;
+
+    public createPase () {
+        this.chatMemory = MessageWindowChatMemory.withMaxMessages(10); // 示例内存管理
+    }
+
+    @Tool(name = "返回结果类",value = "根据课程名称和用户消息生成 PSRE 结构") // 类似 @AiFunction
+    public Psre createPsre(
+            @MemoryId int memoryId, // 类似 @MemoryId
+            // 类似 @V("courseName")
+            @UserMessage String userMessage                 // 类似 @UserMessage
+    ) {
+        // 你的业务逻辑,例如:
+        Psre psre = new Psre();
+        psre.setKnowledge("课程知识: 待生成" );
+        psre.setP("问题: 待生成");
+        psre.setS("解决方案: 待生成");
+        psre.setR("原因: 待分析");
+        psre.setE("示例: 待提供");
+        return psre;
+    }
+
+
+}

+ 0 - 209
src/main/java/generator/domain/CourseInfo.java

@@ -1,209 +0,0 @@
-package generator.domain;
-
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import java.math.BigDecimal;
-import java.util.Date;
-import lombok.Data;
-
-/**
- * 课程信息表
- * @TableName course_info
- */
-@TableName(value ="course_info")
-@Data
-public class CourseInfo {
-    /**
-     * 
-     */
-    @TableId(type = IdType.AUTO)
-    private Integer id;
-
-    /**
-     * 
-     */
-    private String name;
-
-    /**
-     * 
-     */
-    private Integer gradeInfoId;
-
-    /**
-     * 
-     */
-    private Integer schoolType;
-
-    /**
-     * 
-     */
-    private Integer subjectId;
-
-    /**
-     * 
-     */
-    private Date createDate;
-
-    /**
-     * 
-     */
-    private Date updateDate;
-
-    /**
-     * 课程编号
-     */
-    private String code;
-
-    /**
-     * 排序
-     */
-    private String sort;
-
-    /**
-     * 
-     */
-    private Integer parentId;
-
-    /**
-     * 
-     */
-    private String headImg;
-
-    /**
-     * 课程简介
-     */
-    private String represent;
-
-    /**
-     * 是否推荐到系统首页
-     */
-    private Integer recommendIndexFlag;
-
-    /**
-     * 
-     */
-    private Integer studyNumber;
-
-    /**
-     * 状态 (0 下架 1 草稿 2. 已上架)
-     */
-    private Integer status;
-
-    /**
-     * 评价分数
-     */
-    private BigDecimal valuateMark;
-
-    /**
-     * 评论数量
-     */
-    private Integer commentNumber;
-
-    /**
-     * 课时数量
-     */
-    private Integer sectionNodeNumber;
-
-    /**
-     * 章节数量
-     */
-    private Integer sectionNumber;
-
-    /**
-     * 课程发布时间
-     */
-    private Date pushTime;
-
-    @Override
-    public boolean equals(Object that) {
-        if (this == that) {
-            return true;
-        }
-        if (that == null) {
-            return false;
-        }
-        if (getClass() != that.getClass()) {
-            return false;
-        }
-        CourseInfo other = (CourseInfo) that;
-        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
-            && (this.getName() == null ? other.getName() == null : this.getName().equals(other.getName()))
-            && (this.getGradeInfoId() == null ? other.getGradeInfoId() == null : this.getGradeInfoId().equals(other.getGradeInfoId()))
-            && (this.getSchoolType() == null ? other.getSchoolType() == null : this.getSchoolType().equals(other.getSchoolType()))
-            && (this.getSubjectId() == null ? other.getSubjectId() == null : this.getSubjectId().equals(other.getSubjectId()))
-            && (this.getCreateDate() == null ? other.getCreateDate() == null : this.getCreateDate().equals(other.getCreateDate()))
-            && (this.getUpdateDate() == null ? other.getUpdateDate() == null : this.getUpdateDate().equals(other.getUpdateDate()))
-            && (this.getCode() == null ? other.getCode() == null : this.getCode().equals(other.getCode()))
-            && (this.getSort() == null ? other.getSort() == null : this.getSort().equals(other.getSort()))
-            && (this.getParentId() == null ? other.getParentId() == null : this.getParentId().equals(other.getParentId()))
-            && (this.getHeadImg() == null ? other.getHeadImg() == null : this.getHeadImg().equals(other.getHeadImg()))
-            && (this.getRepresent() == null ? other.getRepresent() == null : this.getRepresent().equals(other.getRepresent()))
-            && (this.getRecommendIndexFlag() == null ? other.getRecommendIndexFlag() == null : this.getRecommendIndexFlag().equals(other.getRecommendIndexFlag()))
-            && (this.getStudyNumber() == null ? other.getStudyNumber() == null : this.getStudyNumber().equals(other.getStudyNumber()))
-            && (this.getStatus() == null ? other.getStatus() == null : this.getStatus().equals(other.getStatus()))
-            && (this.getValuateMark() == null ? other.getValuateMark() == null : this.getValuateMark().equals(other.getValuateMark()))
-            && (this.getCommentNumber() == null ? other.getCommentNumber() == null : this.getCommentNumber().equals(other.getCommentNumber()))
-            && (this.getSectionNodeNumber() == null ? other.getSectionNodeNumber() == null : this.getSectionNodeNumber().equals(other.getSectionNodeNumber()))
-            && (this.getSectionNumber() == null ? other.getSectionNumber() == null : this.getSectionNumber().equals(other.getSectionNumber()))
-            && (this.getPushTime() == null ? other.getPushTime() == null : this.getPushTime().equals(other.getPushTime()));
-    }
-
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
-        result = prime * result + ((getName() == null) ? 0 : getName().hashCode());
-        result = prime * result + ((getGradeInfoId() == null) ? 0 : getGradeInfoId().hashCode());
-        result = prime * result + ((getSchoolType() == null) ? 0 : getSchoolType().hashCode());
-        result = prime * result + ((getSubjectId() == null) ? 0 : getSubjectId().hashCode());
-        result = prime * result + ((getCreateDate() == null) ? 0 : getCreateDate().hashCode());
-        result = prime * result + ((getUpdateDate() == null) ? 0 : getUpdateDate().hashCode());
-        result = prime * result + ((getCode() == null) ? 0 : getCode().hashCode());
-        result = prime * result + ((getSort() == null) ? 0 : getSort().hashCode());
-        result = prime * result + ((getParentId() == null) ? 0 : getParentId().hashCode());
-        result = prime * result + ((getHeadImg() == null) ? 0 : getHeadImg().hashCode());
-        result = prime * result + ((getRepresent() == null) ? 0 : getRepresent().hashCode());
-        result = prime * result + ((getRecommendIndexFlag() == null) ? 0 : getRecommendIndexFlag().hashCode());
-        result = prime * result + ((getStudyNumber() == null) ? 0 : getStudyNumber().hashCode());
-        result = prime * result + ((getStatus() == null) ? 0 : getStatus().hashCode());
-        result = prime * result + ((getValuateMark() == null) ? 0 : getValuateMark().hashCode());
-        result = prime * result + ((getCommentNumber() == null) ? 0 : getCommentNumber().hashCode());
-        result = prime * result + ((getSectionNodeNumber() == null) ? 0 : getSectionNodeNumber().hashCode());
-        result = prime * result + ((getSectionNumber() == null) ? 0 : getSectionNumber().hashCode());
-        result = prime * result + ((getPushTime() == null) ? 0 : getPushTime().hashCode());
-        return result;
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder sb = new StringBuilder();
-        sb.append(getClass().getSimpleName());
-        sb.append(" [");
-        sb.append("Hash = ").append(hashCode());
-        sb.append(", id=").append(id);
-        sb.append(", name=").append(name);
-        sb.append(", gradeInfoId=").append(gradeInfoId);
-        sb.append(", schoolType=").append(schoolType);
-        sb.append(", subjectId=").append(subjectId);
-        sb.append(", createDate=").append(createDate);
-        sb.append(", updateDate=").append(updateDate);
-        sb.append(", code=").append(code);
-        sb.append(", sort=").append(sort);
-        sb.append(", parentId=").append(parentId);
-        sb.append(", headImg=").append(headImg);
-        sb.append(", represent=").append(represent);
-        sb.append(", recommendIndexFlag=").append(recommendIndexFlag);
-        sb.append(", studyNumber=").append(studyNumber);
-        sb.append(", status=").append(status);
-        sb.append(", valuateMark=").append(valuateMark);
-        sb.append(", commentNumber=").append(commentNumber);
-        sb.append(", sectionNodeNumber=").append(sectionNodeNumber);
-        sb.append(", sectionNumber=").append(sectionNumber);
-        sb.append(", pushTime=").append(pushTime);
-        sb.append("]");
-        return sb.toString();
-    }
-}

+ 0 - 18
src/main/java/generator/mapper/CourseInfoMapper.java

@@ -1,18 +0,0 @@
-package generator.mapper;
-
-import generator.domain.CourseInfo;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-
-/**
-* @author hxy
-* @description 针对表【course_info(课程信息表)】的数据库操作Mapper
-* @createDate 2025-07-25 02:22:55
-* @Entity generator.domain.CourseInfo
-*/
-public interface CourseInfoMapper extends BaseMapper<CourseInfo> {
-
-}
-
-
-
-

+ 0 - 13
src/main/java/generator/service/CourseInfoService.java

@@ -1,13 +0,0 @@
-package generator.service;
-
-import generator.domain.CourseInfo;
-import com.baomidou.mybatisplus.extension.service.IService;
-
-/**
-* @author hxy
-* @description 针对表【course_info(课程信息表)】的数据库操作Service
-* @createDate 2025-07-25 02:22:55
-*/
-public interface CourseInfoService extends IService<CourseInfo> {
-
-}

+ 0 - 22
src/main/java/generator/service/impl/CourseInfoServiceImpl.java

@@ -1,22 +0,0 @@
-package generator.service.impl;
-
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import generator.domain.CourseInfo;
-import generator.service.CourseInfoService;
-import generator.mapper.CourseInfoMapper;
-import org.springframework.stereotype.Service;
-
-/**
-* @author hxy
-* @description 针对表【course_info(课程信息表)】的数据库操作Service实现
-* @createDate 2025-07-25 02:22:55
-*/
-@Service
-public class CourseInfoServiceImpl extends ServiceImpl<CourseInfoMapper, CourseInfo>
-    implements CourseInfoService{
-
-}
-
-
-
-

+ 13 - 3
src/main/resources/application.properties

@@ -1,10 +1,18 @@
 server.port=8080
+spring.application.name=ai-langchain4j
+spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
 
 # ??????MySQL 8+?
-spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
-spring.datasource.url=jdbc:mysql://localhost:3306/education?useSSL=false&serverTimezone=Asia/Shanghai
+spring.datasource.url=jdbc:mysql://www.fznnic.cn:3306/education?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&useSSL=false&allowMultiQueries=true
 spring.datasource.username=root
-spring.datasource.password=root
+spring.datasource.password=f2fa84b09815fe08
+spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
+spring.datasource.hikari.max-lifetime=900000
+spring.datasource.hikari.maximum-pool-size=100
+spring.datasource.hikari.connection-timeout=30000
+spring.datasource.hikari.minimum-idle=10
+spring.datasource.hikari.idle-timeout=30000
+
 
 # MyBatis-Plus?????SQL??
 mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
@@ -31,3 +39,5 @@ langchain4j.ollama.chat-model.timeout=PT60S
 langchain4j.community.dashscope.chat-model.api-key=sk-c8af7be399424a0c8085216f73508180
 langchain4j.community.dashscope.chat-model.model-name=qwen-max
 
+
+

+ 76 - 0
src/main/resources/autoCreateGpsren.txt

@@ -0,0 +1,76 @@
+你是一个教育专家,现在我们课题组弄了一个名为GPS-REN的AI教学法
+其中G表示Goal-Oriented,目标导向,以具体问题驱动学习过程。
+P表示Problem Definition问题定义用专业语言精确完备地描述问题从而向A获取更优结果。
+S表示Systematic Breakdown系统拆解系统性拆解问题复杂问题分解为简单问题逐步向A获取高质量结果。
+R表示Result Integration结果整合运用AI工具获取结果,并整合。
+E表示Evaluation结果评估设计评估方案评估结果质量。
+N表示New Knowledge总结新知识总结新知识实现学习闭环。
+现在我给你一个完整的示例:
+G目标导向:求二维迷宫从起点到终点的最短路径
+P问题描述:编写一个Python程序,用于解决二维迷宫中寻找最短路径的问题。该迷宫用*的矩阵来表示,矩阵中的每一个元素代表迷宫中的一个格子,其中值为1的格子表示障碍物,不能通行;值为0的格子是可以自由通行的空格;值为2的格子代表起点;值为3的格子代表终点。程序的目标是找出从起点到终点的最短路径。输入要求:程序首先会接受一个正整数,它代表了迷宫矩阵的维度大小,接着,程序会依次接收n行数据,每行数据n个用空格隔开的整数,这些整数共同构成了迷宫矩阵。输出要求:如果存在从起点到终点的最短路径,程序需要将该路径上的所有格子标记为*,并输出这个标记后的迷官矩阵;如果不存在这样的路径,则输出false。
+S系统拆解:将起点放入队列从队列中取出一个点查找相邻的点将以访问的点标为4.
+R结果整合:from collections import deque
+
+      def find_path(maze, start, end):
+          directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]  # 上下左右
+          queue = deque()
+          queue.append((start[0], start[1], 0))
+          maze[start[0]][start[1]] = 1  # 标记访问
+
+          while queue:
+              x, y, steps = queue.popleft()
+
+              if x == end[0] and y == end[1]:
+                  return steps
+
+              for dx, dy in directions:
+                  nx, ny = x + dx, y + dy
+                  if 0 <= nx < len(maze) and 0 <= ny < len(maze[0]) and maze[nx][ny] == 0:
+                      queue.append((nx, ny, steps + 1))
+                      maze[nx][ny] = 1
+
+          return -1
+
+      if __name__ == "__main__":
+          maze = [
+              [0, 1, 0, 0, 0],
+              [0, 1, 0, 1, 0],
+              [0, 0, 0, 0, 0],
+              [0, 1, 1, 1, 0],
+              [0, 0, 0, 1, 0]
+          ]
+          start = (0, 0)
+          end = (4, 4)
+          steps = find_path(maze, start, end)
+          print(f"最短路径: {steps}" if steps != -1 else "无路径")
+E结果评估:1.正确性验证,测试用例示例:// 测试1:普通迷宫maze1 = [
+                                    [0, 0, 0],
+                                    [0, 1, 0],
+                                    [0, 0, 0]
+                                ]
+                                assert find_path(maze1, (0, 0), (2, 2)) == 4
+                   // 测试2:无解迷宫:maze2 = [
+                                   [0, 1],
+                                   [1, 0]
+                               ]
+                               assert find_path(maze2, (0, 0), (1, 1)) == -1
+                   // 测试3:起点即终点
+                   assert find_path(maze1, (0, 0), (0, 0)) == 0
+                   print("All tests passed!")
+                   2. 健壮性问题:
+                   当迷宫不是矩形时(如[[0], [0,1]]),原代码len(maze[0])会始终以第一行为基准,可能导致后续行访问时越界。
+
+N总结新知识:起点和终点定位(1)变量初始化:startX、startY、endX和endY分别用于存储起点和终点的坐标,初始值设为-1表示尚未找到。(2)遍历迷宫:使用嵌套的fo循环遍历整个迷官,当遇到值为2的格子时,记录其坐标作为起点;当遇到值为3的格子时,记录其坐标作为终点。(3)检查起点和终点是否存在:如果starXi或endX仍为-1,说明迷宫中缺少起点或终点,程序输出false并终止。 BFS搜索相关数据结构和初始化(1)visited数组:二维布尔数组visited,用于标记迷宫中每个格子是否已经被访问过,初始值都为false。(2)prev数组:三位整数数组prev用于记录每个格子的前驱节点, prev[x]yIO]和orev[x]yI1]分别表示格子(x,y)的前驱节点的x和y坐标。(3)Queue队列:Queue是java中的一个接口,LinkedLists实现了该接口,用于实现BFS算法的队列。将起点加入队列,并将其标记为已访问。(4)found标志:布尔变量found用于标记是否找到了终点,初始值为false
+请根据用户的请求,生成一个符合 GPSREN 教学模型的结构化数据,必须以 JSON 格式输出
+格式如下:
+{
+  "knowledge": "...",
+  "G": "...",
+  "P": "...",
+  "S": "...",
+  "R": "...",
+  "E": "...",
+  "N": "..."
+}
+
+请不要添加额外说明,只输出完整 JSON。

+ 0 - 36
src/main/resources/generator/mapper/CourseInfoMapper.xml

@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper
-        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
-        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="generator.mapper.CourseInfoMapper">
-
-    <resultMap id="BaseResultMap" type="generator.domain.CourseInfo">
-            <id property="id" column="id" />
-            <result property="name" column="name" />
-            <result property="gradeInfoId" column="grade_info_id" />
-            <result property="schoolType" column="school_type" />
-            <result property="subjectId" column="subject_id" />
-            <result property="createDate" column="create_date" />
-            <result property="updateDate" column="update_date" />
-            <result property="code" column="code" />
-            <result property="sort" column="sort" />
-            <result property="parentId" column="parent_id" />
-            <result property="headImg" column="head_img" />
-            <result property="represent" column="represent" />
-            <result property="recommendIndexFlag" column="recommend_index_flag" />
-            <result property="studyNumber" column="study_number" />
-            <result property="status" column="status" />
-            <result property="valuateMark" column="valuate_mark" />
-            <result property="commentNumber" column="comment_number" />
-            <result property="sectionNodeNumber" column="section_node_number" />
-            <result property="sectionNumber" column="section_number" />
-            <result property="pushTime" column="push_time" />
-    </resultMap>
-
-    <sql id="Base_Column_List">
-        id,name,grade_info_id,school_type,subject_id,create_date,
-        update_date,code,sort,parent_id,head_img,
-        represent,recommend_index_flag,study_number,status,valuate_mark,
-        comment_number,section_node_number,section_number,push_time
-    </sql>
-</mapper>

+ 35 - 0
src/main/resources/mapper/GoalInfoMapper.xml

@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="javaailangchain4j.mapper.GoalInfoMapper">
+
+<!--    <resultMap id="BaseResultMap" type="com.yango.javaailangchain4j.domain.GoalInfo">-->
+<!--        <id property="id" column="id" />-->
+<!--        <result property="subjectId" column="subject_id" />-->
+<!--        <result property="schoolType" column="school_type" />-->
+<!--        <result property="courseSectionId" column="course_section_id" />-->
+<!--        <result property="courseId" column="course_id" />-->
+<!--        <result property="gradeId" column="grade_id" />-->
+<!--        <result property="content" column="content" />-->
+<!--        <result property="gOriented" column="g_oriented" />-->
+<!--        <result property="pScoreStd" column="p_score_std" />-->
+<!--        <result property="sScoreStd" column="s_score_std" />-->
+<!--        <result property="rScoreStd" column="r_score_std" />-->
+<!--        <result property="eScoreStd" column="e_score_std" />-->
+<!--        <result property="nScoreStd" column="n_score_std" />-->
+<!--        <result property="knowPoints" column="know_points" />-->
+<!--        <result property="publishFlag" column="publish_flag" />-->
+<!--        <result property="createUser" column="create_user" />-->
+<!--        <result property="createDate" column="create_date" />-->
+<!--        <result property="updateDate" column="update_date" />-->
+<!--    </resultMap>-->
+
+
+    <sql id="Base_Column_List">
+        id,subject_id,school_type,course_section_id,course_id,grade_id,
+        content,g_oriented,p_score_std,s_score_std,r_score_std,
+        e_score_std,n_score_std,know_points,publish_flag,create_user,
+        create_date,update_date
+    </sql>
+</mapper>

+ 22 - 0
src/main/resources/mapper/StepModelMapper.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yango.javaailangchain4j.mapper.StepModelMapper">
+
+    <resultMap id="BaseResultMap" type="com.yango.javaailangchain4j.domain.StepModel">
+            <id property="id" column="id" />
+            <result property="name" column="name" />
+            <result property="prompt" column="prompt" />
+            <result property="agentid" column="agentid" />
+            <result property="reserve" column="reserve" />
+            <result property="score" column="score" />
+            <result property="createDate" column="create_date" />
+            <result property="updateDate" column="update_date" />
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,name,prompt,agentid,reserve,score,
+        create_date,update_date
+    </sql>
+</mapper>

+ 63 - 0
src/main/resources/teacherGpsren.txt

@@ -0,0 +1,63 @@
+你是一个教育专家,现在我们课题组弄了一个名为GPS-REN的AI教学法
+其中G表示Goal-Oriented,目标导向,以具体问题驱动学习过程。
+P表示Problem Definition问题定义用专业语言精确完备地描述问题从而向A获取更优结果。
+S表示Systematic Breakdown系统拆解系统性拆解问题复杂问题分解为简单问题逐步向A获取高质量结果。
+R表示Result Integration结果整合运用AI工具获取结果,并整合。
+E表示Evaluation结果评估设计评估方案评估结果质量。
+N表示New Knowledge总结新知识总结新知识实现学习闭环。
+现在我给你一个完整的示例:
+G目标导向:求二维迷宫从起点到终点的最短路径
+P问题描述:编写一个Python程序,用于解决二维迷宫中寻找最短路径的问题。该迷宫用*的矩阵来表示,矩阵中的每一个元素代表迷宫中的一个格子,其中值为1的格子表示障碍物,不能通行;值为0的格子是可以自由通行的空格;值为2的格子代表起点;值为3的格子代表终点。程序的目标是找出从起点到终点的最短路径。输入要求:程序首先会接受一个正整数,它代表了迷宫矩阵的维度大小,接着,程序会依次接收n行数据,每行数据n个用空格隔开的整数,这些整数共同构成了迷宫矩阵。输出要求:如果存在从起点到终点的最短路径,程序需要将该路径上的所有格子标记为*,并输出这个标记后的迷官矩阵;如果不存在这样的路径,则输出false。
+S系统拆解:将起点放入队列从队列中取出一个点查找相邻的点将以访问的点标为4.
+R结果整合:from collections import deque
+
+      def find_path(maze, start, end):
+          directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]  # 上下左右
+          queue = deque()
+          queue.append((start[0], start[1], 0))
+          maze[start[0]][start[1]] = 1  # 标记访问
+
+          while queue:
+              x, y, steps = queue.popleft()
+
+              if x == end[0] and y == end[1]:
+                  return steps
+
+              for dx, dy in directions:
+                  nx, ny = x + dx, y + dy
+                  if 0 <= nx < len(maze) and 0 <= ny < len(maze[0]) and maze[nx][ny] == 0:
+                      queue.append((nx, ny, steps + 1))
+                      maze[nx][ny] = 1
+
+          return -1
+
+      if __name__ == "__main__":
+          maze = [
+              [0, 1, 0, 0, 0],
+              [0, 1, 0, 1, 0],
+              [0, 0, 0, 0, 0],
+              [0, 1, 1, 1, 0],
+              [0, 0, 0, 1, 0]
+          ]
+          start = (0, 0)
+          end = (4, 4)
+          steps = find_path(maze, start, end)
+          print(f"最短路径: {steps}" if steps != -1 else "无路径")
+E结果评估:1.正确性验证,测试用例示例:// 测试1:普通迷宫maze1 = [
+                                    [0, 0, 0],
+                                    [0, 1, 0],
+                                    [0, 0, 0]
+                                ]
+                                assert find_path(maze1, (0, 0), (2, 2)) == 4
+                   // 测试2:无解迷宫:maze2 = [
+                                   [0, 1],
+                                   [1, 0]
+                               ]
+                               assert find_path(maze2, (0, 0), (1, 1)) == -1
+                   // 测试3:起点即终点
+                   assert find_path(maze1, (0, 0), (0, 0)) == 0
+                   print("All tests passed!")
+                   2. 健壮性问题:
+                   当迷宫不是矩形时(如[[0], [0,1]]),原代码len(maze[0])会始终以第一行为基准,可能导致后续行访问时越界。
+
+N总结新知识:起点和终点定位(1)变量初始化:startX、startY、endX和endY分别用于存储起点和终点的坐标,初始值设为-1表示尚未找到。(2)遍历迷宫:使用嵌套的fo循环遍历整个迷官,当遇到值为2的格子时,记录其坐标作为起点;当遇到值为3的格子时,记录其坐标作为终点。(3)检查起点和终点是否存在:如果starXi或endX仍为-1,说明迷宫中缺少起点或终点,程序输出false并终止。 BFS搜索相关数据结构和初始化(1)visited数组:二维布尔数组visited,用于标记迷宫中每个格子是否已经被访问过,初始值都为false。(2)prev数组:三位整数数组prev用于记录每个格子的前驱节点, prev[x]yIO]和orev[x]yI1]分别表示格子(x,y)的前驱节点的x和y坐标。(3)Queue队列:Queue是java中的一个接口,LinkedLists实现了该接口,用于实现BFS算法的队列。将起点加入队列,并将其标记为已访问。(4)found标志:布尔变量found用于标记是否找到了终点,初始值为false

+ 63 - 0
src/main/resources/teacherGpsrenEval.txt

@@ -0,0 +1,63 @@
+你是一个教育评审专家,现在我们课题组弄了一个名为GPS-REN的AI教学法
+其中G表示Goal-Oriented,目标导向,以具体问题驱动学习过程。
+P表示Problem Definition问题定义用专业语言精确完备地描述问题从而向A获取更优结果。
+S表示Systematic Breakdown系统拆解系统性拆解问题复杂问题分解为简单问题逐步向A获取高质量结果。
+R表示Result Integration结果整合运用AI工具获取结果,并整合。
+E表示Evaluation结果评估设计评估方案评估结果质量。
+N表示New Knowledge总结新知识总结新知识实现学习闭环。
+现在我给你一个完整的示例:
+G目标导向:求二维迷宫从起点到终点的最短路径
+P问题描述:编写一个Python程序,用于解决二维迷宫中寻找最短路径的问题。该迷宫用*的矩阵来表示,矩阵中的每一个元素代表迷宫中的一个格子,其中值为1的格子表示障碍物,不能通行;值为0的格子是可以自由通行的空格;值为2的格子代表起点;值为3的格子代表终点。程序的目标是找出从起点到终点的最短路径。输入要求:程序首先会接受一个正整数,它代表了迷宫矩阵的维度大小,接着,程序会依次接收n行数据,每行数据n个用空格隔开的整数,这些整数共同构成了迷宫矩阵。输出要求:如果存在从起点到终点的最短路径,程序需要将该路径上的所有格子标记为*,并输出这个标记后的迷官矩阵;如果不存在这样的路径,则输出false。
+S系统拆解:将起点放入队列从队列中取出一个点查找相邻的点将以访问的点标为4.
+R结果整合:from collections import deque
+
+      def find_path(maze, start, end):
+          directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]  # 上下左右
+          queue = deque()
+          queue.append((start[0], start[1], 0))
+          maze[start[0]][start[1]] = 1  # 标记访问
+
+          while queue:
+              x, y, steps = queue.popleft()
+
+              if x == end[0] and y == end[1]:
+                  return steps
+
+              for dx, dy in directions:
+                  nx, ny = x + dx, y + dy
+                  if 0 <= nx < len(maze) and 0 <= ny < len(maze[0]) and maze[nx][ny] == 0:
+                      queue.append((nx, ny, steps + 1))
+                      maze[nx][ny] = 1
+
+          return -1
+
+      if __name__ == "__main__":
+          maze = [
+              [0, 1, 0, 0, 0],
+              [0, 1, 0, 1, 0],
+              [0, 0, 0, 0, 0],
+              [0, 1, 1, 1, 0],
+              [0, 0, 0, 1, 0]
+          ]
+          start = (0, 0)
+          end = (4, 4)
+          steps = find_path(maze, start, end)
+          print(f"最短路径: {steps}" if steps != -1 else "无路径")
+E结果评估:1.正确性验证,测试用例示例:// 测试1:普通迷宫maze1 = [
+                                    [0, 0, 0],
+                                    [0, 1, 0],
+                                    [0, 0, 0]
+                                ]
+                                assert find_path(maze1, (0, 0), (2, 2)) == 4
+                   // 测试2:无解迷宫:maze2 = [
+                                   [0, 1],
+                                   [1, 0]
+                               ]
+                               assert find_path(maze2, (0, 0), (1, 1)) == -1
+                   // 测试3:起点即终点
+                   assert find_path(maze1, (0, 0), (0, 0)) == 0
+                   print("All tests passed!")
+                   2. 健壮性问题:
+                   当迷宫不是矩形时(如[[0], [0,1]]),原代码len(maze[0])会始终以第一行为基准,可能导致后续行访问时越界。
+
+N总结新知识:起点和终点定位(1)变量初始化:startX、startY、endX和endY分别用于存储起点和终点的坐标,初始值设为-1表示尚未找到。(2)遍历迷宫:使用嵌套的fo循环遍历整个迷官,当遇到值为2的格子时,记录其坐标作为起点;当遇到值为3的格子时,记录其坐标作为终点。(3)检查起点和终点是否存在:如果starXi或endX仍为-1,说明迷宫中缺少起点或终点,程序输出false并终止。 BFS搜索相关数据结构和初始化(1)visited数组:二维布尔数组visited,用于标记迷宫中每个格子是否已经被访问过,初始值都为false。(2)prev数组:三位整数数组prev用于记录每个格子的前驱节点, prev[x]yIO]和orev[x]yI1]分别表示格子(x,y)的前驱节点的x和y坐标。(3)Queue队列:Queue是java中的一个接口,LinkedLists实现了该接口,用于实现BFS算法的队列。将起点加入队列,并将其标记为已访问。(4)found标志:布尔变量found用于标记是否找到了终点,初始值为false

+ 6 - 0
src/main/resources/templates/evaluation-template.ftl

@@ -0,0 +1,6 @@
+现在学生在${courseName}课程中的${stepName}环节,
+Goal是${goal},
+学生的答案是${studentAnswer},
+标准答案是${standardAnswer},
+答案不要再把学生答案和标准答案复述一遍了,
+以纯文本格式返回根据标准答案和学生答案,给出该环节的评分和建议,总分${score}分

+ 0 - 30
src/test/java/com/yango/javaailangchain4j/AiserviceTest.java

@@ -1,30 +0,0 @@
-package com.yango.javaailangchain4j;
-
-import com.yango.javaailangchain4j.assistant.Assistant;
-import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-
-@SpringBootTest
-public class AiserviceTest {
-//    @Autowired
-//    private QwenChatModel qwenChatModel;
-//    @Test
-//    public void testQwen() {
-//        //创建AIService
-//        Assistant assistant = AiServices.create(Assistant.class, qwenChatModel);
-//        //调用service的接口
-//        String answer = assistant.chat("Hello");
-//        System.out.println(answer);
-//    }
-
-    @Autowired
-    private Assistant assistant;
-    @Test
-    public void testAssistant() {
-        String answer = assistant.chat("Hello");
-        System.out.println(answer);
-    }
-
-
-}

+ 0 - 86
src/test/java/com/yango/javaailangchain4j/ChatMemoryTest.java

@@ -1,86 +0,0 @@
-package com.yango.javaailangchain4j;
-
-import com.yango.javaailangchain4j.assistant.Assistant;
-import com.yango.javaailangchain4j.assistant.MemoryChatAssistant;
-import com.yango.javaailangchain4j.assistant.SeparateChatAssistant;
-import dev.langchain4j.community.model.dashscope.QwenChatModel;
-import dev.langchain4j.data.message.AiMessage;
-import dev.langchain4j.data.message.UserMessage;
-import dev.langchain4j.memory.chat.MessageWindowChatMemory;
-import dev.langchain4j.model.chat.response.ChatResponse;
-import dev.langchain4j.service.AiServices;
-import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-
-import java.util.Arrays;
-
-@SpringBootTest
-public class ChatMemoryTest {
-    @Autowired
-    private Assistant assistant;
-    @Test
-    public void testChatMemory() {
-        String answer1 = assistant.chat("我是环环");
-        System.out.println(answer1);
-        String answer2 = assistant.chat("我是谁");
-        System.out.println(answer2);
-    }
-
-    @Autowired
-    private QwenChatModel qwenChatModel;
-    @Test
-    public void testChatMemory2() {
-        //第一轮对话
-        UserMessage userMessage1 = UserMessage.userMessage("我是环环");
-        ChatResponse chatResponse1 = qwenChatModel.chat(userMessage1);
-        AiMessage aiMessage1 = chatResponse1.aiMessage();
-        //输出大语言模型的回复
-        System.out.println(aiMessage1.text());
-        //第二轮对话
-        UserMessage userMessage2 = UserMessage.userMessage("你知道我是谁吗");
-        ChatResponse chatResponse2 = qwenChatModel.chat(Arrays.asList(userMessage1,
-                aiMessage1, userMessage2));
-        AiMessage aiMessage2 = chatResponse2.aiMessage();
-        //输出大语言模型的回复
-        System.out.println(aiMessage2.text());
-    }
-
-    @Test
-    public void testChatMemory3() {
-        //创建chatMemory
-        MessageWindowChatMemory chatMemory = MessageWindowChatMemory.withMaxMessages(10);
-       //创建AIService
-        Assistant assistant = AiServices
-                .builder(Assistant.class)
-                .chatLanguageModel(qwenChatModel)
-                .chatMemory(chatMemory)
-                .build();
-        //调用service的接口
-        String answer1 = assistant.chat("我是环环");
-        System.out.println(answer1);
-        String answer2 = assistant.chat("我是谁");
-        System.out.println(answer2);
-    }
-    @Autowired
-    private MemoryChatAssistant memoryChatAssistant;
-    @Test
-    public void testChatMemory4() {
-        String answer1 = memoryChatAssistant.chat("我是李白");
-        System.out.println(answer1);
-        String answer2 = memoryChatAssistant.chat("我是谁");
-        System.out.println(answer2);
-    }
-
-    @Autowired
-    private SeparateChatAssistant separateChatAssistant;
-    @Test
-    public void testChatMemory5() {
-        String answer1 = separateChatAssistant.chat(1,"我是环环");
-        System.out.println(answer1);
-        String answer2 = separateChatAssistant.chat(1,"我是谁");
-        System.out.println(answer2);
-        String answer3 = separateChatAssistant.chat(2,"我是谁");
-        System.out.println(answer3);
-    }
-}

+ 0 - 13
src/test/java/com/yango/javaailangchain4j/JavaAiLangchain4jApplicationTests.java

@@ -1,13 +0,0 @@
-package com.yango.javaailangchain4j;
-
-import org.junit.jupiter.api.Test;
-import org.springframework.boot.test.context.SpringBootTest;
-
-@SpringBootTest
-class JavaAiLangchain4jApplicationTests {
-
-    @Test
-    void contextLoads() {
-    }
-
-}

+ 0 - 65
src/test/java/com/yango/javaailangchain4j/LLMTest.java

@@ -1,65 +0,0 @@
-package com.yango.javaailangchain4j;
-
-import dev.langchain4j.community.model.dashscope.QwenChatModel;
-import dev.langchain4j.model.chat.ChatLanguageModel;
-import dev.langchain4j.model.ollama.OllamaChatModel;
-import dev.langchain4j.model.openai.OpenAiChatModel;
-import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-
-@SpringBootTest
-public class LLMTest {
-    @Test
-    public void testmodel() {
-        OpenAiChatModel model = OpenAiChatModel.builder()
-                .baseUrl("http://langchain4j.dev/demo/openai/v1")
-                .apiKey("demo")
-                .modelName("gpt-4o-mini")
-                .build();
-
-        String answer= model.chat("你好");
-        System.out.print(answer);
-
-    }
-
-    @Autowired
-    private OpenAiChatModel openAiChatModel;
- //   private ChatLanguageModel chatLanguageModel;
-    @Test
-    public void testSpringBoot() {
-        //向模型提问
-        String answer = openAiChatModel.chat("你是谁");
-  //      String answer = chatLanguageModel.chat("你是谁");
-        //输出结果
-        System.out.println(answer);
-    }
-
-    /**
-     * ollama接入
-     */
-    @Autowired
-    private OllamaChatModel ollamaChatModel;
-    @Test
-    public void testOllama() {
-        //向模型提问
-        String answer = ollamaChatModel.chat("你好");
-        //输出结果
-        System.out.println(answer);
-    }
-    /**
-     * 通义千问大模型
-     */
-    @Autowired
-    private QwenChatModel qwenChatModel;
-    @Test
-    public void testDashScopeQwen() {
-        //向模型提问
-        String answer = qwenChatModel.chat("你好,你是谁?");
-        //输出结果
-        System.out.println(answer);
-    }
-
-
-
-}

+ 0 - 25
src/test/java/com/yango/javaailangchain4j/PromptTest.java

@@ -1,25 +0,0 @@
-package com.yango.javaailangchain4j;
-
-import com.yango.javaailangchain4j.assistant.SeparateChatAssistant;
-import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-
-@SpringBootTest
-public class PromptTest {
-    @Autowired
-    private SeparateChatAssistant separateChatAssistant;
-    @Test
-    public void testSystemMessage() {
-        String answer = separateChatAssistant.chat(3,"今天几号");
-        System.out.println(answer);
-    }
-
-    @Test
-    public void testUserInfo() {
-        String answer = separateChatAssistant.chat3(10, "生成一条完整可执行sql语句,不要其它注解和任何解释,只要sql","数据结构", 1);
-        System.out.println(answer);
-    }
-}
-
-

+ 21 - 0
src/test/java/com/yango/javaailangchain4j/service/StepModelServiceTes.java

@@ -0,0 +1,21 @@
+package com.yango.javaailangchain4j.service;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+public class StepModelServiceTes {
+
+    @Autowired
+    private  StepModelService stepModelService;
+
+    @Test
+    public void testGetPromptByName() {
+        String name = "P"; // 你要查询的步骤名称
+        String prompt = stepModelService.getPromptByName(name);
+
+        System.out.println("查询到的 prompt 为:");
+        System.out.println(prompt);
+    }
+}

+ 143 - 0
src/test/java/com/yango/javaailangchain4j/service/TemplateProcessingServiceTest.java

@@ -0,0 +1,143 @@
+package com.yango.javaailangchain4j.service;
+
+import freemarker.core.TemplateClassResolver;
+import freemarker.template.Configuration;
+import freemarker.template.ObjectWrapper;
+import freemarker.template.TemplateException;
+import freemarker.template.TemplateExceptionHandler;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+class TemplateProcessingServiceTest {
+
+    @Mock
+    private Configuration freemarkerConfig;
+
+    @InjectMocks
+    private TemplateProcessingService templateProcessingService;
+
+    @BeforeEach
+    void setUp() {
+        MockitoAnnotations.openMocks(this);
+
+        // 设置更多 Configuration 属性,避免执行时报错
+        when(freemarkerConfig.getIncompatibleImprovements())
+                .thenReturn(Configuration.VERSION_2_3_32);
+        // 自动检测命名约定
+        when(freemarkerConfig.getNamingConvention())
+                .thenReturn(Configuration.AUTO_DETECT_NAMING_CONVENTION);
+
+        when(freemarkerConfig.getLocale()).thenReturn(java.util.Locale.getDefault());
+        when(freemarkerConfig.getTemplateExceptionHandler())
+                .thenReturn(TemplateExceptionHandler.RETHROW_HANDLER);
+
+        // 设置必要的配置避免执行时报错
+        when(freemarkerConfig.getObjectWrapper())
+                .thenReturn(ObjectWrapper.DEFAULT_WRAPPER);
+        when(freemarkerConfig.getDefaultEncoding())
+                .thenReturn("UTF-8");
+        when(freemarkerConfig.getWrapUncheckedExceptions())
+                .thenReturn(true);
+        when(freemarkerConfig.getFallbackOnNullLoopVariable())
+                .thenReturn(false);
+        when(freemarkerConfig.getNewBuiltinClassResolver())
+                .thenReturn(TemplateClassResolver.SAFER_RESOLVER);
+        when(freemarkerConfig.getNumberFormat())
+                .thenReturn("0.##");
+    }
+
+    @Test
+    void testProcessTemplateWithCustomTemplateName() throws IOException, TemplateException {
+        // 准备测试数据
+        String templateString = "Hello ${name}!";
+        Map<String, Object> templateData = new HashMap<>();
+        templateData.put("name", "World");
+        String templateName = "testTemplate";
+
+        // 执行测试
+        String result = templateProcessingService.processTemplate(templateString, templateData, templateName);
+
+        // 验证结果
+        assertNotNull(result);
+    }
+
+    @Test
+    void testProcessTemplateWithDefaultTemplateName() throws IOException, TemplateException {
+        // 准备测试数据
+        String templateString = "Hello ${name}!";
+        Map<String, Object> templateData = new HashMap<>();
+        templateData.put("name", "World");
+
+        // 执行测试
+        String result = templateProcessingService.processTemplate(templateString, templateData);
+
+        // 验证结果
+        assertNotNull(result);
+    }
+
+    @Test
+    void testProcessTemplateWithMultipleVariables() throws IOException, TemplateException {
+        // 准备测试数据
+        String templateString = "学生${studentName}在${courseName}课程中获得了${score}分";
+        Map<String, Object> templateData = new HashMap<>();
+        templateData.put("studentName", "张三");
+        templateData.put("courseName", "数学");
+        templateData.put("score", 95);
+
+        // 执行测试
+        String result = templateProcessingService.processTemplate(templateString, templateData);
+
+        // 验证结果包含预期内容
+        assertNotNull(result);
+    }
+
+    @Test
+    void testProcessTemplateWithEmptyTemplate() throws IOException, TemplateException {
+        // 准备测试数据
+        String templateString = "";
+        Map<String, Object> templateData = new HashMap<>();
+
+        // 执行测试
+        String result = templateProcessingService.processTemplate(templateString, templateData);
+
+        // 验证结果
+        assertEquals("", result);
+    }
+
+    @Test
+    void testProcessTemplateWithNullData() throws IOException, TemplateException {
+        // 准备测试数据
+        String templateString = "Static text";
+
+        // 执行测试
+        String result = templateProcessingService.processTemplate(templateString, null);
+
+        // 验证结果
+        assertEquals("Static text", result);
+    }
+
+    @Test
+    void testProcessTemplateWithNewlines() throws IOException, TemplateException {
+        // 准备测试数据
+        String templateString = "Line 1\nLine 2\n${variable}";
+        Map<String, Object> templateData = new HashMap<>();
+        templateData.put("variable", "Line 3");
+
+        // 执行测试
+        String result = templateProcessingService.processTemplate(templateString, templateData);
+
+        // 验证结果包含换行符
+        assertNotNull(result);
+        assertTrue(result.contains("\n"));
+    }
+}