<think>根据需求,我们需要在项目中集成开源大模型(如通义大模型)来实现教师侧的备课与设计、考核内容生成、学情数据分析,学生侧的在线学习助手和实时练习评测助手,以及管理侧的大屏概览等功能。同时,需要支持本地知识库的上传和管理。
### 分析现有项目结构
当前项目是一个典型的Spring Boot应用,包含以下主要部分:
- `main/java/com/...`: 包含应用的主要Java代码,包括启动类、配置、控制器、实体、DAO、服务等。
- `main/resources`: 包含配置文件、前端资源、静态文件、MyBatis映射文件等。
- `test`: 测试代码。
### 需要添加的功能模块
1. **大模型集成模块**:用于调用开源大模型(如通义)的API。
2. **本地知识库管理模块**:允许用户上传和管理知识库文件(默认知识库放在项目目录中,如`resources/knowledge`)。
3. **教师侧功能**:
- 备课与设计:根据知识库生成教学内容(包括知识讲解、实训、时间分布等),并提供下载。
- 考核内容生成:生成题目和答案,支持下载(带答案和不带答案)。
4. **学生侧功能**:
- 在线学习助手:回答学生问题,结合知识库和教学内容。
- 实时练习评测:生成练习题,并自动批改和纠错。
5. **管理侧功能**:
- 用户管理(已有,可能需要扩展)。
- 课件资源管理:管理教师生成的课件和练习,支持导出。
- 大屏概览:统计教师和学生的使用情况,教学效率,学习效果等。
### 项目结构调整建议
1. **在`com`包下新建包`ai`**,用于存放与大模型交互相关的代码。
- `service`: 大模型服务接口和实现。
- `controller`: 提供AI相关接口(如生成教学内容、题目等)。
- `utils`: 大模型调用工具类。
2. **知识库存储**:
- 默认知识库:放在`resources/knowledge`目录下,项目启动时加载。
- 用户上传知识库:存储在服务器文件系统中(如`upload/knowledge`),并在数据库中记录知识库文件信息(可能需要新建实体和表)。
3. **教师侧功能**:
- 在`controller`包下新建`TeacherAIController`,处理备课、生成题目等请求。
- 在`service`包下新建`TeacherAIService`,实现调用大模型生成教学内容和题目的逻辑。
4. **学生侧功能**:
- 在`controller`包下新建`StudentAIController`,处理学生提问和练习评测请求。
- 在`service`包下新建`StudentAIService`,实现问题解答和练习评测逻辑。
5. **管理侧功能**:
- 课件资源管理:在现有的`FileController`中增加对课件资源的管理,或新建`ResourceController`。
- 大屏概览:新建`DashboardController`,提供统计数据接口。
6. **数据库调整**:
- 可能需要新增表来存储生成的教学内容、题目、答案、练习记录等。
- 例如:`teaching_content`, `exam_question`, `practice_record`等。
7. **前端调整**:
- 在`resources/front/pages`下新增教师备课、学生练习等页面。
- 在管理后台的前端(`static/admin`)中添加课件资源管理和大屏概览的页面。
### 代码示例
#### 1. 大模型服务接口
在`com.ai.service`包下创建`AIService`接口和实现类`AIServiceImpl`,用于封装大模型调用。
```java
package com.ai.service;
public interface AIService {
String generateTeachingContent(String knowledgeBase, String courseOutline);
String generateExamQuestions(String knowledgeBase, int questionCount, boolean withAnswers);
String answerQuestion(String question, String context);
String generatePracticeExercise(String userId, String history);
String evaluateAnswer(String answer, String correctAnswer);
}
```
#### 2. 实现类(示例使用通义大模型,假设有对应的SDK)
这里假设我们使用HTTP API调用通义大模型,具体URL和参数需根据通义文档调整。
```java
package com.ai.service.impl;
import com.ai.service.AIService;
import com.utils.HttpClientUtils;
import org.springframework.stereotype.Service;
@Service
public class AIServiceImpl implements AIService {
private static final String TONGYI_API_URL = "https://api.tongyi.com/v1/chat/completions";
private static final String API_KEY = "your_api_key";
@Override
public String generateTeachingContent(String knowledgeBase, String courseOutline) {
String prompt = "根据以下知识库和课程大纲,设计教学内容:\n知识库:" + knowledgeBase + "\n课程大纲:" + courseOutline;
return callTongyiAPI(prompt);
}
@Override
public String generateExamQuestions(String knowledgeBase, int questionCount, boolean withAnswers) {
String prompt = "根据以下知识库生成" + questionCount + "道题目" + (withAnswers ? "并附答案" : "") + ":\n" + knowledgeBase;
return callTongyiAPI(prompt);
}
@Override
public String answerQuestion(String question, String context) {
String prompt = "问题:" + question + "\n上下文:" + context + "\n请回答:";
return callTongyiAPI(prompt);
}
@Override
public String generatePracticeExercise(String userId, String history) {
// 根据用户历史练习情况生成练习题
String prompt = "根据用户" + userId + "的练习历史:" + history + ",生成一道练习题";
return callTongyiAPI(prompt);
}
@Override
public String evaluateAnswer(String answer, String correctAnswer) {
String prompt = "判断学生答案是否正确,并给出解析。学生答案:" + answer + "\n参考答案:" + correctAnswer;
return callTongyiAPI(prompt);
}
private String callTongyiAPI(String prompt) {
// 构造请求体,这里以通义API为例,实际根据API文档调整
String requestBody = "{\"model\":\"qwen-turbo\",\"messages\":[{\"role\":\"user\",\"content\":\"" + prompt + "\"}]}";
Map<String, String> headers = new HashMap<>();
headers.put("Authorization", "Bearer " + API_KEY);
headers.put("Content-Type", "application/json");
try {
String response = HttpClientUtils.post(TONGYI_API_URL, requestBody, headers);
// 解析响应,这里假设返回的JSON中choices[0].message.content是回答
// 实际解析需要根据通义API返回结构
JSONObject jsonResponse = new JSONObject(response);
return jsonResponse.getJSONArray("choices").getJSONObject(0).getJSONObject("message").getString("content");
} catch (Exception e) {
e.printStackTrace();
return "调用大模型失败";
}
}
}
```
#### 3. 教师侧控制器
在`com.controller`包下创建`TeacherAIController`:
```java
package com.controller;
import com.ai.service.AIService;
import com.utils.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/ai/teacher")
public class TeacherAIController {
@Autowired
private AIService aiService;
@PostMapping("/generateContent")
public R generateContent(String courseOutline) {
// 从默认知识库或用户上传的知识库中读取内容(这里简化,实际需要从数据库或文件中读取)
String knowledgeBase = "从知识库中读取的内容";
String content = aiService.generateTeachingContent(knowledgeBase, courseOutline);
return R.ok().put("content", content);
}
@PostMapping("/generateExam")
public R generateExam(int questionCount, boolean withAnswers) {
String knowledgeBase = "从知识库中读取的内容";
String exam = aiService.generateExamQuestions(knowledgeBase, questionCount, withAnswers);
return R.ok().put("exam", exam);
}
}
```
#### 4. 学生侧控制器
在`com.controller`包下创建`StudentAIController`:
```java
package com.controller;
import com.ai.service.AIService;
import com.utils.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/ai/student")
public class StudentAIController {
@Autowired
private AIService aiService;
@PostMapping("/ask")
public R askQuestion(String question) {
// 结合当前课程的知识库内容作为上下文
String context = "相关知识点上下文";
String answer = aiService.answerQuestion(question, context);
return R.ok().put("answer", answer);
}
@PostMapping("/generatePractice")
public R generatePractice(String userId) {
// 获取用户历史练习记录
String history = "用户历史练习记录";
String exercise = aiService.generatePracticeExercise(userId, history);
return R.ok().put("exercise", exercise);
}
@PostMapping("/evaluate")
public R evaluateAnswer(String answer, String correctAnswer) {
String result = aiService.evaluateAnswer(answer, correctAnswer);
return R.ok().put("result", result);
}
}
```
#### 5. 知识库管理
在`FileController`中增加知识库上传接口,或新建`KnowledgeBaseController`。
```java
// 在FileController中添加
@PostMapping("/uploadKnowledge")
public R uploadKnowledge(@RequestParam("file") MultipartFile file) throws IOException {
// 保存知识库文件到指定目录,如upload/knowledge
// 记录到数据库,关联用户
return R.ok();
}
```
### 数据库表设计建议
1. **知识库表(knowledge_base)**:
- id, user_id, file_name, file_path, create_time
2. **教学内容表(teaching_content)**:
- id, teacher_id, title, content, create_time
3. **题目表(exam_question)**:
- id, content_id, question, answer, options (如果是选择题), type (题型), difficulty
4. **练习记录表(practice_record)**:
- id, student_id, question_id, answer, is_correct, feedback, time
### 前端调整
- 教师备课页面:调用`/ai/teacher/generateContent`生成内容,并提供下载按钮(可生成Word或PDF)。
- 题目生成页面:调用`/ai/teacher/generateExam`生成题目,提供下载(带答案和不带答案)。
- 学生提问页面:调用`/ai/student/ask`获取答案。
- 练习页面:调用`/ai/student/generatePractice`生成练习,提交后调用`/ai/student/evaluate`进行批改。
### 注意事项
1. **大模型选择**:通义大模型需要申请API Key,注意API调用频率和费用。
2. **本地知识库处理**:上传的知识库文件需要解析(如TXT、PDF、Word等),提取文本供大模型使用。可以使用Apache Tika等工具。
3. **性能考虑**:大模型调用可能较慢,考虑异步处理(如使用Spring的@Async)。
4. **安全性**:对上传的文件进行安全检查,防止恶意文件。
### 项目结构变化
- 新增`ai`包,包含大模型相关代码。
- 新增控制器`TeacherAIController`和`StudentAIController`。
- 新增数据库表(需在entity包下新增实体,并创建Mapper和Service)。
- 前端新增页面。
### 默认知识库放置
在`resources`目录下创建`knowledge`文件夹,存放默认知识库文件。在应用启动时,可以加载这些文件到内存或数据库。
### 相关依赖
在`pom.xml`中添加HTTP客户端(如OkHttp或Apache HttpClient)和JSON处理库(如fastjson)。
```xml
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.9.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.78</version>
</dependency>
```
### 总结
以上方案将大模型集成到现有项目中,实现了教师备课、题目生成,学生问答和练习评测等功能。同时,通过文件上传管理知识库,并提供下载功能。需要根据实际的大模型API调整调用方式,并完善前后端交互。
§§相关问题§§:
1. 如何解析上传的PDF、Word等格式的知识库文件?
2. 如何设计数据库表来存储生成的教学内容和题目?
3. 如何实现异步调用大模型API以避免阻塞请求?
4. 如何保证大模型生成的内容与知识库的关联性和准确性?</think>为了将开源通义大模型集成到您的项目中,并实现所需功能,以下是详细的解决方案和项目结构调整建议:
### 1. 本地知识库管理
**实现方案:**
- 在`resources`目录下创建`knowledge-base`文件夹存放默认知识库
- 新增知识库管理模块(实体、DAO、Service、Controller)
- 实现文件上传接口管理用户上传的知识库
**代码示例:**
`KnowledgeBaseController.java`:
```java
@RestController
@RequestMapping("/knowledge")
public class KnowledgeBaseController {
@Autowired
private KnowledgeService knowledgeService;
// 上传知识库文件
@PostMapping("/upload")
public R uploadKnowledge(@RequestParam("file") MultipartFile file) {
return knowledgeService.uploadKnowledge(file);
}
// 获取知识库列表
@GetMapping("/list")
public R listKnowledge() {
return knowledgeService.getKnowledgeList();
}
}
```
`KnowledgeService.java`:
```java
@Service
public class KnowledgeService {
@Value("${knowledge.base.path}")
private String basePath;
public R uploadKnowledge(MultipartFile file) {
// 文件大小校验(<100MB)
if (file.getSize() > 100 * 1024 * 1024) {
return R.error("文件大小不能超过100MB");
}
// 保存文件到知识库目录
String fileName = FileUtil.saveFile(file, basePath);
// 保存记录到数据库
KnowledgeEntity entity = new KnowledgeEntity();
entity.setFileName(fileName);
entity.setOriginalName(file.getOriginalFilename());
knowledgeDao.insert(entity);
return R.ok().put("path", fileName);
}
}
```
### 2. 教师备课功能集成
**实现方案:**
- 新增`AIController`处理AI相关请求
- 集成通义大模型SDK(如通义千问)
- 实现教学内容生成接口
**代码示例:**
`AIController.java`:
```java
@RestController
@RequestMapping("/ai")
public class AIController {
@Autowired
private AIService aiService;
// 生成教学内容
@PostMapping("/generate-teaching-plan")
public R generateTeachingPlan(@RequestBody TeachingPlanRequest request) {
TeachingContent content = aiService.generateTeachingContent(
request.getCourseId(),
request.getKnowledgeIds()
);
return R.ok().put("data", content);
}
}
```
`AIServiceImpl.java`:
```java
@Service
public class AIServiceImpl implements AIService {
@Autowired
private KnowledgeDao knowledgeDao;
@Override
public TeachingContent generateTeachingContent(Long courseId, List<Long> knowledgeIds) {
// 1. 获取知识库内容
List<String> knowledgeContents = knowledgeDao.getContentsByIds(knowledgeIds);
String context = String.join("\n\n", knowledgeContents);
// 2. 构造大模型提示词
String prompt = "你是一名专业教师,请根据以下课程大纲和知识库内容设计教学方案:\n"
+ context + "\n\n"
+ "要求包含:知识讲解框架、实训练习设计、时间分配建议(总课时90分钟)";
// 3. 调用通义大模型API
String aiResponse = TongyiClient.generateText(prompt);
// 4. 解析响应并生成结构化教学内容
return TeachingContentParser.parse(aiResponse);
}
}
```
### 3. 考核内容生成
**实现方案:**
- 新增题目生成接口
- 支持带答案/不带答案两种模式
- 实现题目下载功能(PDF/Word)
**代码示例:**
`AIController.java` 新增:
```java
// 生成考核题目
@PostMapping("/generate-exam")
public R generateExamQuestions(@RequestBody ExamRequest request) {
ExamContent exam = aiService.generateExam(
request.getCourseId(),
request.getQuestionTypes(),
request.isIncludeAnswers()
);
return R.ok().put("data", exam);
}
// 下载题目(PDF)
@GetMapping("/download-exam/{examId}")
public void downloadExam(@PathVariable Long examId,
HttpServletResponse response) {
ExamContent exam = examService.getExamById(examId);
PdfUtil.generateExamPdf(exam, response);
}
```
### 4. 项目结构调整
需要新增/修改的模块:
```
src/main/java/com/
├── ai
│ ├── controller
│ │ └── AIController.java
│ ├── service
│ │ ├── AIService.java
│ │ └── impl
│ │ └── AIServiceImpl.java
│ └── client
│ └── TongyiClient.java
├── knowledge
│ ├── entity
│ │ └── KnowledgeEntity.java
│ ├── dao
│ │ └── KnowledgeDao.java
│ └── service
│ └── KnowledgeService.java
└── teaching
├── entity
│ ├── TeachingContent.java
│ └── ExamContent.java
└── util
└── PdfUtil.java
```
### 5. 配置文件修改
`application.yml` 新增配置:
```yaml
tongyi:
api-key: YOUR_API_KEY
endpoint: https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation
knowledge:
base-path: classpath:knowledge-base/
max-size-mb: 100
```
### 6. 前端调整建议
1. 教师侧新增页面:
- `resources/front/pages/teaching/ai-teaching-plan.html` 备课页面
- `resources/front/pages/exam/ai-exam-generator.html` 题目生成页面
2. 学生侧新增页面:
- `resources/front/pages/learning/ai-assistant.html` 学习助手
- `resources/front/pages/practice/ai-practice.html` 智能练习
3. 管理侧新增:
- `static/admin/src/views/modules/dashboard.vue` 教学数据大屏
- `static/admin/src/views/modules/knowledge` 知识库管理
### 7. 通义大模型集成
**通义千问集成示例:**
`TongyiClient.java`:
```java
public class TongyiClient {
private static final Logger logger = LoggerFactory.getLogger(TongyiClient.class);
public static String generateText(String prompt) {
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
// 构造请求体
String json = "{\"model\":\"qwen-turbo\",\"input\":{\"messages\":["
+ "{\"role\":\"system\",\"content\":\"你是一名专业助教\"},"
+ "{\"role\":\"user\",\"content\":\"" + prompt + "\"}]}}";
Request request = new Request.Builder()
.url("https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation")
.post(RequestBody.create(mediaType, json))
.addHeader("Authorization", "Bearer " + apiKey)
.build();
try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
JSONObject jsonResponse = new JSONObject(response.body().string());
return jsonResponse.getJSONObject("output")
.getJSONArray("choices")
.getJSONObject(0)
.getJSONObject("message")
.getString("content");
} catch (Exception e) {
logger.error("调用通义API失败", e);
return "生成失败,请稍后重试";
}
}
}
```
### 8. 非功能性需求实现
1. **知识库关联性验证**:
```java
// 在生成题目后验证关联性
public void validateQuestionRelevance(Question question, List<Long> knowledgeIds) {
List<String> knowledgePoints = knowledgeDao.getKeyPoints(knowledgeIds);
String prompt = "请验证以下题目是否涉及这些知识点:\n知识点: "
+ String.join(",", knowledgePoints)
+ "\n题目: " + question.getContent();
String validation = TongyiClient.generateText(prompt);
if (validation.contains("不相关")) {
throw new ValidationException("生成题目与知识库关联性不足");
}
}
```
2. **教学效率指数计算**:
```sql
-- 在DashboardController中使用的SQL
SELECT
AVG(TIMESTAMPDIFF(MINUTE, start_time, end_time)) AS avg_prep_time,
SUM(CASE WHEN correctness < 60 THEN 1 ELSE 0 END) * 100.0 / COUNT(*) AS low_score_rate
FROM teaching_sessions
WHERE course_id = #{courseId}
```
### 完整项目结构调整
```
C:.
├── main
│ ├── java
│ │ └── com
│ │ ├── ai
│ │ ├── knowledge
│ │ ├── teaching
│ │ └── utils # 新增AI相关工具类
│ └── resources
│ ├── knowledge-base # 知识库默认目录
│ ├── mapper
│ │ └── KnowledgeDao.xml # 新增
│ └── templates
│ └── exam-template.ftl # 考题模板
└── test
└── java
└── com
└── ai
└── AIServiceTest.java # 新增测试
```
### 关键注意事项
1. **知识库存储**:
- 默认知识库:`resources/knowledge-base/`
- 用户上传:存储在外部目录(如`/data/knowledge/`),避免打包时包含
2. **大模型调用优化**:
- 使用异步调用避免阻塞:`@Async`
- 实现结果缓存:`@Cacheable`
- 添加限流保护:Resilience4j
3. **安全性**:
- 知识库文件类型白名单(PDF/DOCX/TXT)
- 文件内容病毒扫描
- API调用频率限制
4. **性能考虑**:
- 大模型响应可能较慢(>5s),前端需要加载状态提示
- 大量知识库处理时分块调用API