Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,6 @@ public class MistakeQuestionDTO {
// 科目
private String subject;
// 知识点id
private Integer knowledgePointId;
private String knowledgePointId;

}
12 changes: 6 additions & 6 deletions refine-app/src/main/resources/AnalyzeKnowledge.txt
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
我只给一道题目给你,请严格按照以下规则提取题目核心知识点,仅输出结果,不添加任何额外解释:

1. 领域分类优先:先明确题目所属大领域(如“化学”“Java编程”“数据结构”“小学数学”),再补充子分类(如需),最后聚焦核心考点;
1. 领域分类优先:先明确题目所属大领域(如“化学”“Java编程”“数据结构”“数学”),再补充子分类(如需),最后聚焦核心考点;
2. 去冗余去细节:忽略题目中的具体数值、案例、干扰项等非关键信息,只保留“考察什么能力/概念/公式/方法”;
3. 格式统一规范:采用“大领域-子分类-核心知识点”的层级结构(子分类可省略,核心知识点不超过15字);
3. 格式统一规范:采用“subject:大领域, knowledgeName:子分类+核心知识点”的层级结构(子分类可省略,核心知识点不超过15字);
4. 精准不泛化:不扩大知识点范围,也不缩小(如题目考“氧化还原反应配平”,不写成“化学反应”或“氧化还原反应细节”);
5. 多知识点限制:若题目跨多个考点,仅提取2个最核心的,用“|”分隔。

示例:
- 题目:“写出H₂+O₂=H₂O的配平化学方程式” → 输出:“化学-化学反应-氧化还原反应配平”
- 题目:“Spring Boot中如何通过注解实现属性注入?” → 输出:“Java编程-Spring Boot-@Value属性注入”
- 题目:“一个长方形长5cm、宽3cm,求它的周长” → 输出:“小学数学-几何图形-长方形周长计算”
- 题目:“简述哈希表的原理及解决冲突的方法” → 输出:“数据结构-哈希表-原理|哈希冲突解决”
- 题目:“写出H₂+O₂=H₂O的配平化学方程式” → 输出:“subject:化学, knowledgeName:化学反应-氧化还原反应配平”
- 题目:“Spring Boot中如何通过注解实现属性注入?” → 输出:“subject:Java编程, knowledgeName:Spring Boot-@Value属性注入”
- 题目:“一个长方形长5cm、宽3cm,求它的周长” → 输出:“subject:数学, knowledgeName:几何图形-长方形周长计算”
- 题目:“简述哈希表的原理及解决冲突的方法” → 输出:“subject:数据结构, knowledgeName:哈希表-原理|哈希冲突解决”
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,11 @@ public class QuestionEntity implements Serializable {
*/
private String questionText;

/**
* 学科
*/
private String subject;

/**
* 知识点名称
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,11 @@ public boolean saveMistakeQuestion(QuestionEntity questionEntity) {
return false;
}

if (questionEntity.getSubject() == null || questionEntity.getSubject().isEmpty()){
log.warn("学科为空,无法保存错题");
return false;
}

if (questionEntity.getKnowledgePointId() == null || questionEntity.getKnowledgePointId().isEmpty()) {
log.warn("知识点id为空,无法保存错题");
return false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,12 @@ public interface AiGenerationService {

// 知识点分析
@SystemMessage(fromResource = "AnalyzeKnowledge.txt")
String knowledgeAnalysis(String questionText);
knowledgePoint knowledgeAnalysis(String questionText);

record knowledgePoint(String subject, String knowledgeName) {
public boolean isEmpty() {
return subject == null || subject.isEmpty() || knowledgeName == null || knowledgeName.isEmpty();
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@

public interface IKnowledgeRepository {

String findKnowledgeNameById(Integer knowledgePointId);
String findKnowledgeNameById(String knowledgePointId);

}
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ public class MistakeQuestionEntity {
/**
* 知识点归属ID
*/
private Integer knowledgePointId;
private String knowledgePointId;

/**
* 学习笔记
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,5 @@
@Builder
public class MistakeKnowledgePO {
private String subject;
private Integer knowledgeId;
private String knowledgeId;
}
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public QuestionResponseDTO questionGeneration(String userId, String mistakeQuest

MistakeKnowledgePO po = mistakeRepository.findSubjectAndKnowledgeIdById(mistakeQuestionId);
String subject = po.getSubject();
Integer knowledgeId = po.getKnowledgeId();
String knowledgeId = po.getKnowledgeId();
String knowledgePointName = knowledgeRepository.findKnowledgeNameById(knowledgeId);

if (null == subject) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public class KnowledgeRepository implements IKnowledgeRepository {
private final KnowledgeMapper knowledgeMapper;

@Override
public String findKnowledgeNameById(Integer knowledgePointId) {
public String findKnowledgeNameById(String knowledgePointId) {
return knowledgeMapper.findKnowledgeNameById(knowledgePointId);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,9 @@ public boolean save(QuestionEntity questionEntity) {
mistakeQuestion.setQuestionId(questionEntity.getQuestionId());
mistakeQuestion.setQuestionContent(questionEntity.getQuestionText());
mistakeQuestion.setKnowledgePointId(questionEntity.getKnowledgePointId());
mistakeQuestion.setSubject(questionEntity.getSubject());

// 设置默认值
mistakeQuestion.setSubject("未分类"); // 默认学科
mistakeQuestion.setIsCareless(0);
mistakeQuestion.setIsUnfamiliar(0);
mistakeQuestion.setIsCalculateErr(0);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,15 @@
import com.achobeta.types.exception.AppException;
import jakarta.annotation.Resource;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;

@Repository
@RequiredArgsConstructor
@Slf4j
public class MistakeRepository implements IMistakeRepository {

@Resource
Expand All @@ -38,7 +40,7 @@ public void save(MistakeQuestionEntity mistakeEntity) {
public MistakeKnowledgePO findSubjectAndKnowledgeIdById(String mistakeQuestionId) {
MistakeKnowledgePO po = mistakeQuestionMapper.findSubjectAndKnowledgeIdById(mistakeQuestionId);
if (null == po) {
throw new AppException("可能是数据库一致性问题,mistakeQuestionId:"+mistakeQuestionId);
log.warn("可能是数据库一致性问题,mistakeQuestionId:"+mistakeQuestionId);
}
return po;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,6 @@ public interface IMistakeQuestionMapper {
"VALUES (#{userId}, #{questionId}, #{questionContent}, #{subject}, #{otherReason}, #{knowledgePointId}, #{createTime}, #{updateTime})")
void insert(MistakePO mistakePO);

@Select("SELECT subject, knowledge_point_id AS knowledgeId FROM MistakeQuestion WHERE id = #{mistakeQuestionId}")
@Select("SELECT subject, knowledge_point_id AS knowledgeId FROM MistakeQuestion WHERE question_id = #{mistakeQuestionId}")
MistakeKnowledgePO findSubjectAndKnowledgeIdById(String mistakeQuestionId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,6 @@ public interface KnowledgeMapper {
* @return 知识点名称
*/
@Select("SELECT knowledge_point_name FROM knowledgePoint WHERE knowledge_point_id = #{knowledgePointId}")
String findKnowledgeNameById(Integer knowledgePointId);
String findKnowledgeNameById(String knowledgePointId);

}
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public class MistakePO {
private String questionContent;
private String subject;
private String otherReason;
private Integer knowledgePointId;
private String knowledgePointId;
private LocalDateTime createTime;
private LocalDateTime updateTime; // 领域层Entity无需关注的字段
}
Original file line number Diff line number Diff line change
Expand Up @@ -77,22 +77,23 @@ public Response<QuestionInfoResponseDTO> extractFirst(@RequestPart("file") Multi

//TODO
// ai根据向量库(和mysql知识点表里的完全一致)(新建一个表)查询有没有相似知识点,再返回知识点名称
String knowledgeName = aiGenerationService.knowledgeAnalysis(questionEntity.getQuestionText());
if (knowledgeName == null || knowledgeName.isEmpty()) {
AiGenerationService.knowledgePoint knowledgePoint = aiGenerationService.knowledgeAnalysis(questionEntity.getQuestionText());
if (knowledgePoint == null || knowledgePoint.isEmpty()) {
log.warn("ai生成的知识点为空,请检查ai生成知识点的逻辑");
}
String knowledgePointId = UUID.fastUUID().toString();
//把新知识点录入数据库中
threadPoolExecutor.execute(() -> {
try {
keyPointsMapper.insertNewPoint4MistakeQuestion(userId, knowledgePointId, knowledgeName);
log.info("ai生成知识点录入表成功, knowledgeName:{} 题目id:{}", knowledgeName, questionEntity.getQuestionId());
keyPointsMapper.insertNewPoint4MistakeQuestion(userId, knowledgePointId, knowledgePoint.knowledgeName());
log.info("ai生成知识点录入表成功, knowledgeName:{} 题目id:{}", knowledgePoint, questionEntity.getQuestionId());
} catch (Exception e) {
log.error("ai生成知识点录入表失败, knowledgeName:{} 题目id:{}", knowledgeName, questionEntity.getQuestionId(), e);
log.error("ai生成知识点录入表失败, knowledgeName:{} 题目id:{}", knowledgePoint, questionEntity.getQuestionId(), e);
}
});

// 将错题数据保存到数据库中
questionEntity.setSubject(knowledgePoint.subject());
questionEntity.setKnowledgePointId(knowledgePointId);
boolean saveSuccess = mistakeQuestionService.saveMistakeQuestion(questionEntity);
if (!saveSuccess) {
Expand Down
Loading