Bladeren bron

init:first commit

Gogs 5 maanden geleden
commit
7d786ef817
27 gewijzigde bestanden met toevoegingen van 1215 en 0 verwijderingen
  1. 33 0
      .gitignore
  2. 173 0
      pom.xml
  3. 13 0
      src/main/java/com/yango/javaailangchain4j/JavaAiLangchain4jApplication.java
  4. 10 0
      src/main/java/com/yango/javaailangchain4j/assistant/Assistant.java
  5. 14 0
      src/main/java/com/yango/javaailangchain4j/assistant/MemoryChatAssistant.java
  6. 34 0
      src/main/java/com/yango/javaailangchain4j/assistant/SeparateChatAssistant.java
  7. 33 0
      src/main/java/com/yango/javaailangchain4j/config/Langchain4jConfig.java
  8. 15 0
      src/main/java/com/yango/javaailangchain4j/config/MemoryChatAssistantConfig.java
  9. 17 0
      src/main/java/com/yango/javaailangchain4j/config/SeparateChatAssistantConfig.java
  10. 27 0
      src/main/java/com/yango/javaailangchain4j/controller/ChatController.java
  11. 42 0
      src/main/java/com/yango/javaailangchain4j/controller/GpsresEvaluation.java
  12. 10 0
      src/main/java/com/yango/javaailangchain4j/dto/GpsrenEvalutionDto.java
  13. 14 0
      src/main/java/com/yango/javaailangchain4j/dto/courseKnowledgeMapInfo.java
  14. 147 0
      src/main/java/com/yango/javaailangchain4j/utils/Result.java
  15. 51 0
      src/main/java/com/yango/javaailangchain4j/utils/ResultCode.java
  16. 209 0
      src/main/java/generator/domain/CourseInfo.java
  17. 18 0
      src/main/java/generator/mapper/CourseInfoMapper.java
  18. 13 0
      src/main/java/generator/service/CourseInfoService.java
  19. 22 0
      src/main/java/generator/service/impl/CourseInfoServiceImpl.java
  20. 33 0
      src/main/resources/application.properties
  21. 36 0
      src/main/resources/generator/mapper/CourseInfoMapper.xml
  22. 32 0
      src/main/resources/knowledgeMap.txt
  23. 30 0
      src/test/java/com/yango/javaailangchain4j/AiserviceTest.java
  24. 86 0
      src/test/java/com/yango/javaailangchain4j/ChatMemoryTest.java
  25. 13 0
      src/test/java/com/yango/javaailangchain4j/JavaAiLangchain4jApplicationTests.java
  26. 65 0
      src/test/java/com/yango/javaailangchain4j/LLMTest.java
  27. 25 0
      src/test/java/com/yango/javaailangchain4j/PromptTest.java

+ 33 - 0
.gitignore

@@ -0,0 +1,33 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/

+ 173 - 0
pom.xml

@@ -0,0 +1,173 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>com.yango</groupId>
+    <artifactId>java-ai-langchain4j</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>java-ai-langchain4j</name>
+    <description>java-ai-langchain4j</description>
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <spring-boot.version>3.2.6</spring-boot.version>
+        <knife4j.version>4.3.0</knife4j.version>
+        <langchain4j.version>1.0.0-beta3</langchain4j.version>
+        <mybatis-plus.version>3.5.11</mybatis-plus.version>
+    </properties>
+    <dependencies>
+        <!-- web应用程序核心依赖 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.hibernate</groupId>
+            <artifactId>hibernate-validator</artifactId>
+            <version>7.0.1.Final</version>
+        </dependency>
+        <!-- 编写和运行测试用例 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <!-- 前后端分离中的后端接口测试工具 -->
+        <dependency>
+            <groupId>com.github.xiaoymin</groupId>
+            <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
+            <version>${knife4j.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>dev.langchain4j</groupId>
+            <artifactId>langchain4j-open-ai-spring-boot-starter</artifactId>
+            <version>${langchain4j.version}</version>
+        </dependency>
+        <!-- 接入ollama -->
+        <dependency>
+            <groupId>dev.langchain4j</groupId>
+            <artifactId>langchain4j-ollama-spring-boot-starter</artifactId>
+            <version>1.0.0-beta3</version>
+        </dependency>
+
+        <!-- 接入阿里云百炼平台 -->
+        <dependency>
+            <groupId>dev.langchain4j</groupId>
+            <artifactId>langchain4j-community-dashscope-spring-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>dev.langchain4j</groupId>
+            <artifactId>langchain4j-spring-boot-starter</artifactId>
+            <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>
+        </dependency>
+
+        <!-- MySQL 驱动 -->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>8.0.33</version>
+        </dependency>
+
+        <!-- Lombok(可选) -->
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+
+        <!-- fastjson 依赖 -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.83</version>
+        </dependency>
+
+        <!-- Jakarta Servlet API -->
+        <dependency>
+            <groupId>jakarta.servlet</groupId>
+            <artifactId>jakarta.servlet-api</artifactId>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+
+    <dependencyManagement>
+        <dependencies>
+            <!--引入SpringBoot依赖管理清单-->
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>${spring-boot.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <dependency>
+                <groupId>dev.langchain4j</groupId>
+                <artifactId>langchain4j-parent</artifactId>
+                <version>1.0.0-beta3</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <dependency>
+                <groupId>dev.langchain4j</groupId>
+                <artifactId>langchain4j-community-bom</artifactId>
+                <version>${langchain4j.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>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.10.1</version>
+                <configuration>
+                    <source>17</source>
+                    <target>17</target>
+                    <encoding>UTF-8</encoding>
+                </configuration>
+            </plugin>
+
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>${spring-boot.version}</version>
+                <executions>
+                    <execution>
+                        <id>repackage</id>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                        <configuration>
+                            <mainClass>com.yango.javaailangchain4j.JavaAiLangchain4jApplication</mainClass>
+                            <skip>true</skip>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

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

@@ -0,0 +1,13 @@
+package com.yango.javaailangchain4j;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class JavaAiLangchain4jApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(JavaAiLangchain4jApplication.class, args);
+    }
+
+}

+ 10 - 0
src/main/java/com/yango/javaailangchain4j/assistant/Assistant.java

@@ -0,0 +1,10 @@
+package com.yango.javaailangchain4j.assistant;
+
+import dev.langchain4j.service.spring.AiService;
+
+import static dev.langchain4j.service.spring.AiServiceWiringMode.EXPLICIT;
+
+@AiService(wiringMode = EXPLICIT, chatModel = "qwenChatModel")
+public interface Assistant {
+    String chat(String message);
+}

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

@@ -0,0 +1,14 @@
+package com.yango.javaailangchain4j.assistant;
+
+import dev.langchain4j.service.spring.AiService;
+
+import static dev.langchain4j.service.spring.AiServiceWiringMode.EXPLICIT;
+
+@AiService(
+        wiringMode = EXPLICIT,
+        chatModel = "qwenChatModel",
+        chatMemory = "chatMemory"
+)
+public interface MemoryChatAssistant {
+    String chat(String message);
+}

+ 34 - 0
src/main/java/com/yango/javaailangchain4j/assistant/SeparateChatAssistant.java

@@ -0,0 +1,34 @@
+package com.yango.javaailangchain4j.assistant;
+
+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",
+        chatMemoryProvider = "chatMemoryProvider"
+)
+public interface SeparateChatAssistant {
+    /**
+     * * 分离聊天记录
+     * @param memoryId 聊天id
+     * @param userMessage 用户消息
+     * @return
+     */
+    @SystemMessage("你是资深教育专家")
+    String chat(@MemoryId int memoryId, @UserMessage String userMessage);
+
+    @SystemMessage(fromResource = "knowledgeMap.txt")
+    String chat3(
+        @MemoryId int memoryId,
+        @UserMessage String userMessage,
+        @V("courseName") String courseName,
+        @V("coueseId") int courseId
+    );
+}

+ 33 - 0
src/main/java/com/yango/javaailangchain4j/config/Langchain4jConfig.java

@@ -0,0 +1,33 @@
+package com.yango.javaailangchain4j.config;
+import dev.langchain4j.community.model.dashscope.QwenChatModel;
+import dev.langchain4j.service.AiServices;
+import dev.langchain4j.model.chat.ChatLanguageModel;
+import com.yango.javaailangchain4j.assistant.Assistant;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class Langchain4jConfig {
+    // 从配置文件中读取 API Key 和模型名
+    @Value("${langchain4j.community.dashscope.chat-model.api-key}")
+    private String apiKey;
+
+    @Value("${langchain4j.community.dashscope.chat-model.model-name}")
+    private String modelName;
+
+    // 注册 qwenChatModel Bean,供 AiService wiringMode=EXPLICIT 使用
+//    @Bean(name = "qwenChatModel")
+//    public ChatLanguageModel qwenChatModel() {
+//        return QwenChatModel.builder()
+//                .apiKey(apiKey)
+//                .modelName(modelName)
+//                .build();
+//    }
+
+    // 注册 Assistant Bean,实现自动注入
+//    @Bean
+//    public Assistant assistant(ChatLanguageModel qwenChatModel) {
+//        return AiServices.create(Assistant.class, qwenChatModel);
+//    }
+}

+ 15 - 0
src/main/java/com/yango/javaailangchain4j/config/MemoryChatAssistantConfig.java

@@ -0,0 +1,15 @@
+package com.yango.javaailangchain4j.config;
+
+import dev.langchain4j.memory.ChatMemory;
+import dev.langchain4j.memory.chat.MessageWindowChatMemory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class MemoryChatAssistantConfig {
+    @Bean
+    ChatMemory chatMemory() {
+        //设置聊天记忆记录的message数量
+        return MessageWindowChatMemory.withMaxMessages(10);
+    }
+}

+ 17 - 0
src/main/java/com/yango/javaailangchain4j/config/SeparateChatAssistantConfig.java

@@ -0,0 +1,17 @@
+package com.yango.javaailangchain4j.config;
+
+import dev.langchain4j.memory.chat.ChatMemoryProvider;
+import dev.langchain4j.memory.chat.MessageWindowChatMemory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class SeparateChatAssistantConfig {
+    @Bean
+    ChatMemoryProvider chatMemoryProvider() {
+        return memoryId -> MessageWindowChatMemory.builder()
+                .id(memoryId)
+                .maxMessages(10)
+                .build();
+    }
+}

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

@@ -0,0 +1,27 @@
+package com.yango.javaailangchain4j.controller;
+
+import com.yango.javaailangchain4j.assistant.Assistant;
+import com.yango.javaailangchain4j.assistant.SeparateChatAssistant;
+import com.yango.javaailangchain4j.dto.courseKnowledgeMapInfo;
+import com.yango.javaailangchain4j.utils.Result;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/api/courseKnowledgeMap")
+public class ChatController {
+    @Autowired
+    private Assistant assistant;
+
+    // 接收前端发送的用户ID,问答,课程名称,课程ID,返回 AI 回复
+
+    @Autowired
+    private SeparateChatAssistant separateChatAssistant;
+    @PostMapping
+    public Result chatWithAi(@RequestBody courseKnowledgeMapInfo knowledgeMapInfo) {
+
+        return Result.success(separateChatAssistant.chat3(knowledgeMapInfo.getMemoryId(),knowledgeMapInfo.getUserMessage(),knowledgeMapInfo.getCourseName(),knowledgeMapInfo.getCourseId()));
+    }
+
+
+}

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

@@ -0,0 +1,42 @@
+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()));
+    }
+
+}

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

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

+ 14 - 0
src/main/java/com/yango/javaailangchain4j/dto/courseKnowledgeMapInfo.java

@@ -0,0 +1,14 @@
+package com.yango.javaailangchain4j.dto;
+
+import dev.langchain4j.service.MemoryId;
+import dev.langchain4j.service.UserMessage;
+import dev.langchain4j.service.V;
+import lombok.Data;
+@Data
+public class courseKnowledgeMapInfo {
+    private int memoryId;
+    private String userMessage;
+    private String courseName;
+    private int courseId;
+
+}

+ 147 - 0
src/main/java/com/yango/javaailangchain4j/utils/Result.java

@@ -0,0 +1,147 @@
+package com.yango.javaailangchain4j.utils;
+
+
+import com.alibaba.fastjson.JSONObject;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.Serializable;
+
+/**
+ * @descript: 返回结果类
+ * @Auther: zengjintao
+ * @Date: 2019/12/31 13:46
+ * @Version:2.1.0
+ */
+public final class Result<T> implements Serializable {
+
+    private T data;
+    private Integer code;
+    private static final String DEFAULT_SUCCESS_MESSAGE = "操作成功";
+    private static final String DEFAULT_FAIL_MESSAGE = "操作失败";
+    private String message = DEFAULT_SUCCESS_MESSAGE;
+
+    public Result(Integer code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public boolean isSuccess() {
+        return ResultCode.SUCCESS.equals(this.code);
+    }
+
+    public Result() {
+        this.code = ResultCode.SUCCESS;
+        this.message = DEFAULT_SUCCESS_MESSAGE;
+    }
+
+    public Result(Integer code) {
+        this.code = code;
+    }
+
+    public Result(Integer code, T data) {
+        this.code = code;
+        this.data = data;
+    }
+
+    public Result(ResultCode resultCode) {
+        this.code = resultCode.getCode();
+        this.message = resultCode.getMessage();
+    }
+
+    public Result(ResultCode resultCode, T data) {
+        this.code = resultCode.getCode();
+        this.message = resultCode.getMessage();
+        this.data = data;
+    }
+
+    public static <T> Result success(Integer code, String message, T data) {
+        return new Result(code, message, data);
+    }
+
+    public static <T> Result success(Integer code, T data) {
+        return new Result(code, DEFAULT_SUCCESS_MESSAGE, data);
+    }
+
+    public static <T> Result success() {
+        return new Result(ResultCode.SUCCESS, DEFAULT_SUCCESS_MESSAGE);
+    }
+
+    public static <T> Result success(Integer code, String message) {
+        return new Result(code, message);
+    }
+
+    public Result(Integer code, String message, T data) {
+        this.code = code;
+        this.message = message;
+        this.data = data;
+    }
+
+    public static <T> Result success(T data) {
+        return new Result(ResultCode.SUCCESS, DEFAULT_SUCCESS_MESSAGE, data);
+    }
+
+    public static <T> Result success(ResultCode resultCode) {
+        return new Result(resultCode.getCode(), resultCode.getMessage());
+    }
+
+    public static Result fail(Integer code) {
+        return new Result(code, DEFAULT_FAIL_MESSAGE);
+    }
+
+    public static Result fail(Integer code, String message) {
+        return new Result(code, message);
+    }
+
+    public static Result fail() {
+        return new Result(ResultCode.FAIL, DEFAULT_FAIL_MESSAGE);
+    }
+
+    public T getData() {
+        return data;
+    }
+
+    public void setData(T data) {
+        this.data = data;
+    }
+
+    public Integer getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+        if (code == ResultCode.FAIL) {
+            this.message = "数据请求失败";
+        }
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+
+    static final String contentType = "application/json; charset=utf-8";
+
+    public static void renderJson(HttpServletResponse response, Result result) {
+        String dataJson = JSONObject.toJSONString(result);
+        PrintWriter writer;
+        try {
+            response.setHeader("Pragma", "no-cache");
+            response.setHeader("Cache-Control", "no-cache");
+            response.setDateHeader("Expires", 0);
+            response.setContentType(contentType);
+            writer = response.getWriter();
+            writer.write(dataJson);
+            writer.flush();
+            return;
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+}

+ 51 - 0
src/main/java/com/yango/javaailangchain4j/utils/ResultCode.java

@@ -0,0 +1,51 @@
+package com.yango.javaailangchain4j.utils;
+/**
+ * 为方便处理ajax请求
+ * @author zengjintao
+ * @version 1.0
+ * @create_at 2017年6月28日上午9:28:04
+ */
+public class ResultCode {
+
+	public static final Integer UN_AUTH_ERROR_CODE = 401; //token 失效
+	public static final Integer NO_PERMISSION = 406; // 权限不足
+	public static final Integer SUCCESS = 1; //响应成功
+	public static final Integer FAIL = 0; //响应失败
+	public static final Integer CODE_ERROR = 2; //验证码错误
+
+	public static final Integer EXCEL_VERIFICATION_FAIL = 3; // excel 表格数据校验异常
+
+	public Integer code = SUCCESS;
+	public String message = "操作成功";
+
+	public int getCode() {
+		return code;
+	}
+
+	public String getMessage() {
+		return message;
+	}
+
+	public void setCode(Integer code) {
+		this.code = code;
+	}
+
+	public void setMessage(String message) {
+		this.message = message;
+	}
+
+	public ResultCode(Integer code, String message) {
+		this.code = code;
+		this.message = message;
+	}
+
+	public ResultCode() {
+	}
+
+	public ResultCode(Integer code) {
+		this.code = code;
+		if (code == FAIL) {
+			this.message = "操作失败";
+		}
+	}
+}

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

@@ -0,0 +1,209 @@
+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();
+    }
+}

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

@@ -0,0 +1,18 @@
+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> {
+
+}
+
+
+
+

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

@@ -0,0 +1,13 @@
+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> {
+
+}

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

@@ -0,0 +1,22 @@
+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{
+
+}
+
+
+
+

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

@@ -0,0 +1,33 @@
+server.port=8080
+
+# ??????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.username=root
+spring.datasource.password=root
+
+# MyBatis-Plus?????SQL??
+mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
+
+
+##langchain4j
+langchain4j.open-ai.chat-model.base-url=https://api.deepseek.com
+langchain4j.open-ai.chat-model.api-key=sk-9ba36d80f4ef4a56883f508ede43bc7d
+langchain4j.open-ai.chat-model.model-name=deepseek-reasoner
+##
+langchain4j.open-ai.chat-model.log-requests=true
+langchain4j.open-ai.chat-model.log-responses=true
+
+
+#ollama
+langchain4j.ollama.chat-model.base-url=http://localhost:11434
+langchain4j.ollama.chat-model.model-name=deepseek-r1:1.5b
+langchain4j.ollama.chat-model.temperature=0.8
+langchain4j.ollama.chat-model.timeout=PT60S
+
+##????????debug??
+#logging.level.root=debug
+
+langchain4j.community.dashscope.chat-model.api-key=sk-c8af7be399424a0c8085216f73508180
+langchain4j.community.dashscope.chat-model.model-name=qwen-max
+

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

@@ -0,0 +1,36 @@
+<?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>

+ 32 - 0
src/main/resources/knowledgeMap.txt

@@ -0,0 +1,32 @@
+你是教学知识系统构建专家,帮我为课程{{courseName}}自动生成完整的知识体系结构树,并将其结构转化为 SQL 插入语句,插入到知识点表 `ext_knowledge_point` 中。
+
+## 要求:
+1. 自动构建课程知识点结构,分为 3~4 级:
+   - 一级为模块(如:线性结构、算法基础)
+   - 二级为子主题(如:数组、链表、排序)
+   - 三级为概念或实现(如:快速排序、链表反转)
+   - 四级为更深一层(如:二叉搜索树、哈希冲突处理)
+
+2. SQL 插入语句包括:
+   - 一条 `INSERT INTO ext_knowledge_point (...) VALUES (...), (...), ...;`
+   - 所有知识点 id 从 `10001` 开始,递增,格式为 `{course_id}{四位顺序号}`,如 course_id=1 → 10001,10002,...
+   - 每个知识点应包含:
+     - `id`
+     - `course_id = {{coueseId}}`
+     - `point_name`
+     - `point_code`(自增长整型数字)
+     - `description`(自动补充一句话)
+     - `level`(0~3)
+     - `parent_id`(引用上级 ID,根节点为NULL)
+     - `sequence`(同级知识点排序)
+     - `resource_url`(如 `/stack`,小写英文,驼峰或短横线连接)
+     - `created_at`(创建时间)
+     - `updated_at`(更新时间)
+
+
+3. 输出格式整洁清晰,带层级注释(如 `-- Level 1: 子节点`)
+
+4. 所有语句为标准 MySQL 插入语法
+
+5. 结果只输出可一次性执行完成的sql语句
+

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

@@ -0,0 +1,30 @@
+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);
+    }
+
+
+}

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

@@ -0,0 +1,86 @@
+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);
+    }
+}

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

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

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

@@ -0,0 +1,65 @@
+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);
+    }
+
+
+
+}

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

@@ -0,0 +1,25 @@
+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);
+    }
+}
+
+