瀏覽代碼

自动生成多条GPSREN

hxy 8 月之前
父節點
當前提交
3c8488f4e7

+ 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;
+}

+ 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
+    );
+}

+ 3 - 6
src/main/java/com/yango/javaailangchain4j/assistant/SeparateChatAssistant.java

@@ -1,5 +1,6 @@
 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;
@@ -49,12 +50,8 @@ public interface SeparateChatAssistant {
                  @UserMessage String userMessage
                  );
 
-//    @Tool
-//    Psre createPsre(
-//            @MemoryId int memoryId,
-//            @V("courseName") String courseName,
-//            @UserMessage String userMessage
-//    );
+
+
 
 
 

+ 15 - 2
src/main/java/com/yango/javaailangchain4j/controller/TeacherGpsrenController.java

@@ -1,11 +1,17 @@
 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 = "*")
@@ -21,7 +27,7 @@ public class TeacherGpsrenController {
     @CrossOrigin(origins = "*")
     @PostMapping("/ManuallyCreatedPsreByG")
     public Result getGpsren(@RequestBody ManuallyCreatePsren manuallyCreatePsren){
-        String temp = "根据这个G,生成PSRE以及这个G会涉及到的知识点";
+        String temp = "根据这个G,生成PSRE以及这个G会涉及到的知识点";
         return Result.success(separateChatAssistant.chat4(manuallyCreatePsren.getMemoryId(), manuallyCreatePsren.getCourseName(), manuallyCreatePsren.getUserMessage()+temp));
     }
 
@@ -29,6 +35,13 @@ public class TeacherGpsrenController {
      * 自动创建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;
+}

+ 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;
+
+}

+ 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> {
+
+}
+
+
+
+

+ 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;
+    }
+}

+ 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{
+
+}
+
+
+
+

+ 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;
+    }
+}

+ 5 - 0
src/main/resources/application.properties

@@ -5,6 +5,11 @@ spring.datasource.url=jdbc:mysql://www.fznnic.cn:3306/education?createDatabaseIf
 spring.datasource.username=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??

+ 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。

+ 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>