Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
99 commits
Select commit Hold shift + click to select a range
d3734b1
Merge pull request #47 from liche719/develop
liche719 Nov 27, 2025
fc7c4f2
fix:修复token已知相关问题
liche719 Nov 27, 2025
50d2b66
Merge pull request #49 from liche719/develop
liche719 Nov 27, 2025
67c0b76
完善主页响应码
linu223xprob1e Nov 28, 2025
e3318e6
Merge pull request #50 from jinyu918/feature-jinrun-dev_review_feedback
jinyu918 Nov 28, 2025
6ae8415
feat: 新增ocr提取题目错误日志跟踪
hxxxi-malog Nov 28, 2025
cd2f948
Merge pull request #51 from hxxxi-malog/develop
hxxxi-malog Nov 28, 2025
f424fd7
fix: 修正错题mapper文件
hxxxi-malog Nov 28, 2025
d41a7e1
Merge pull request #52 from hxxxi-malog/develop
hxxxi-malog Nov 28, 2025
1bdb34a
feat: 新增OCR错误追踪日志
hxxxi-malog Nov 28, 2025
35c066a
Merge pull request #53 from hxxxi-malog/develop
hxxxi-malog Nov 28, 2025
07cd61c
fix: 强制拉镜像
Nov 28, 2025
a89564e
fix: 修复ai解答过程中超时问题
hxxxi-malog Nov 28, 2025
3e6e6be
Merge pull request #54 from hxxxi-malog/develop
hxxxi-malog Nov 28, 2025
f3723d2
fix: 添加服务依赖关系 添加始终拉取最新镜像
Nov 28, 2025
1ed6bb5
test: 测试自动部署
Nov 28, 2025
05ea66b
Merge remote-tracking branch 'origin/develop' into develop
Nov 28, 2025
a64ca9e
fix: 删除依赖
Nov 28, 2025
947f27a
fix:修复返回码问题
liche719 Nov 28, 2025
8d4a500
fix: 优化SSE响应超时问题
hxxxi-malog Nov 28, 2025
2076462
Merge pull request #56 from hxxxi-malog/develop
hxxxi-malog Nov 28, 2025
522734b
Merge pull request #55 from liche719/develop
liche719 Nov 28, 2025
328d3e1
fix: 修改ai解题请求格式
hxxxi-malog Nov 28, 2025
8824da9
Merge pull request #57 from hxxxi-malog/develop
hxxxi-malog Nov 28, 2025
d281310
fix:防止服务器异常日志过多
liche719 Nov 28, 2025
ef3f67a
Merge remote-tracking branch 'origin/develop' into develop
liche719 Nov 28, 2025
c48a7cc
Merge pull request #58 from liche719/develop
liche719 Nov 28, 2025
7840235
fix: 优化ConversationController响应
hxxxi-malog Nov 28, 2025
e974e21
Merge pull request #59 from hxxxi-malog/develop
hxxxi-malog Nov 28, 2025
c5ad334
fix:
liche719 Nov 28, 2025
5043020
Merge pull request #60 from liche719/develop
liche719 Nov 28, 2025
103bb27
更改主页响应码
linu223xprob1e Nov 28, 2025
d19f489
Merge pull request #62 from jinyu918/develop
jinyu918 Nov 28, 2025
f1d7a27
fix: 优化ConversationController上下文存储功能
hxxxi-malog Nov 28, 2025
90f454e
Merge pull request #63 from hxxxi-malog/develop
hxxxi-malog Nov 28, 2025
3f8f43a
fix: 优化错因管理接口
hxxxi-malog Nov 28, 2025
644c942
Merge pull request #64 from hxxxi-malog/develop
hxxxi-malog Nov 28, 2025
c8d14ae
fix: 优化用户id获取方式
hxxxi-malog Nov 28, 2025
ee4d9b8
Merge pull request #65 from hxxxi-malog/develop
hxxxi-malog Nov 28, 2025
a622b0d
fix:
liche719 Nov 28, 2025
f79c49d
Merge pull request #66 from liche719/develop
liche719 Nov 28, 2025
20af719
fix:
liche719 Nov 28, 2025
d42acab
Merge pull request #67 from liche719/develop
liche719 Nov 28, 2025
ed744a2
feat:强化rag
liche719 Nov 28, 2025
749f76f
Merge remote-tracking branch 'origin/develop' into develop
liche719 Nov 28, 2025
a49e415
Merge pull request #68 from liche719/develop
liche719 Nov 28, 2025
8097079
完善响应码以及修复一点bug
linu223xprob1e Nov 28, 2025
3311cea
Merge branch 'develop' into develop
jinyu918 Nov 28, 2025
932a1e8
修复一点bug
linu223xprob1e Nov 28, 2025
ebd9d38
修复一点bug
linu223xprob1e Nov 28, 2025
1121a6c
Merge pull request #69 from jinyu918/develop
jinyu918 Nov 28, 2025
cab0d0d
更改jackson-annotations至同一版本
linu223xprob1e Nov 28, 2025
39fa494
Merge pull request #70 from jinyu918/develop
jinyu918 Nov 28, 2025
c2285d1
修改knowledge请求与响应类型
linu223xprob1e Nov 28, 2025
c1235ab
Merge pull request #71 from jinyu918/develop
jinyu918 Nov 28, 2025
af5812d
fix: 优化更新其他错误原因文本校验
hxxxi-malog Nov 28, 2025
821f34d
Merge pull request #72 from hxxxi-malog/develop
hxxxi-malog Nov 28, 2025
7ae832b
fix: 修复动态分析用户行为返回格式
hxxxi-malog Nov 28, 2025
8287f14
Merge pull request #73 from hxxxi-malog/develop
hxxxi-malog Nov 28, 2025
9b719a2
feat: 更新向量mapper配置
hxxxi-malog Nov 28, 2025
e7f7c65
feat:修复bug
liche719 Nov 28, 2025
a29f9b5
Merge pull request #74 from hxxxi-malog/develop
hxxxi-malog Nov 28, 2025
87fc181
Merge branch 'AchoBeta:develop' into develop
liche719 Nov 28, 2025
2e7b463
fix: 修复vectorMapper文件
hxxxi-malog Nov 28, 2025
f9bf347
feat:修复bug
liche719 Nov 28, 2025
474e77f
Merge pull request #76 from hxxxi-malog/develop
hxxxi-malog Nov 28, 2025
cd46485
fix: 修复vectorMapper文件映射
hxxxi-malog Nov 28, 2025
97268f0
Merge pull request #77 from hxxxi-malog/develop
hxxxi-malog Nov 28, 2025
e53962c
Revert "fix: 修复vectorMapper文件映射"
hxxxi-malog Nov 28, 2025
8cac7eb
fix: 修复vectorMapper文件
hxxxi-malog Nov 28, 2025
9b2112a
Merge pull request #78 from hxxxi-malog/develop
hxxxi-malog Nov 28, 2025
77ffb03
Revert "fix: 修复vectorMapper文件"
hxxxi-malog Nov 28, 2025
fb3bb26
Revert "fix: 修复vectorMapper文件"
hxxxi-malog Nov 28, 2025
93c7f5b
Revert "feat:修复bug"
hxxxi-malog Nov 28, 2025
d32e763
Revert "fix: 修复vectorMapper文件"
liche719 Nov 29, 2025
905a5b7
Revert "fix: 修复vectorMapper文件映射"
liche719 Nov 29, 2025
9b495df
Revert: "fix: 修复vectorMapper文件"
liche719 Nov 29, 2025
7c0731f
Revert "feat:修复bug"
liche719 Nov 29, 2025
edf5872
Revert "Revert "feat:修复bug""
liche719 Nov 29, 2025
45641f9
Revert "Revert "feat:修复bug""
liche719 Nov 29, 2025
7207053
fix: 修复vectorMapper文件暂时删除向量功能
hxxxi-malog Nov 29, 2025
6e3da2b
Merge pull request #84 from hxxxi-malog/develop
hxxxi-malog Nov 29, 2025
4df6bb8
fix: 修复vectorMapper文件暂时删除Metadata功能
hxxxi-malog Nov 29, 2025
106a3ce
Merge pull request #85 from hxxxi-malog/develop
hxxxi-malog Nov 29, 2025
ef67feb
fix:使用ai专属线程池
liche719 Nov 29, 2025
27be919
fix:使用ai专属线程池
liche719 Nov 29, 2025
42f00e2
sql优化,完善学习概况逻辑
linu223xprob1e Nov 29, 2025
f73db12
Merge pull request #87 from jinyu918/develop
jinyu918 Nov 29, 2025
ade36db
更改误操作导致的bug
linu223xprob1e Nov 29, 2025
9670438
Merge pull request #88 from jinyu918/develop
jinyu918 Nov 29, 2025
d27c4b9
fix:完善录入数据库时的字段
liche719 Nov 29, 2025
6a1795f
fix:完善录入数据库时的字段
liche719 Nov 29, 2025
d382a53
完善SubjectTransportMappeer
linu223xprob1e Nov 29, 2025
8a2eb51
Merge pull request #90 from jinyu918/develop
jinyu918 Nov 29, 2025
29e7afa
完善登出逻辑
linu223xprob1e Nov 29, 2025
e2e47c4
Merge pull request #91 from jinyu918/develop
jinyu918 Nov 29, 2025
9b68485
完善登出逻辑 -- 录入学习时间单位纠错
linu223xprob1e Nov 29, 2025
cbf1dc5
Merge pull request #92 from jinyu918/develop
jinyu918 Nov 29, 2025
809781b
Merge branch 'develop'
hxxxi-malog Nov 29, 2025
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
15 changes: 9 additions & 6 deletions .github/workflows/depoly.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,14 +58,17 @@ jobs:
script: |
set -e
cd ./refine
echo "pulling latest code..."
git pull
git checkout develop
git fetch --all
BRANCH_NAME="${{ github.ref_name }}"
echo "Detected branch: $BRANCH_NAME"
git checkout $BRANCH_NAME
git pull origin $BRANCH_NAME
echo "pull completed."
echo "Deploying..."
sh build.sh stop
sh build.sh rm && sh build.sh rmi
echo "Pulling latest Docker image..."
docker pull docker.cnb.cool/hamster-yhz/refine:latest
sh build.sh base && sh build.sh services
echo "Deployment completed."
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,5 @@ AchoBeta Refine 琢玉系统-2025年-J组-复试项目
一个面向学生的AI学习助手项目后端,通过上传错题,系统自动识题目内容、分错误原因、讲解知识点并生成个性化练习,帮助学生快速查漏补缺

> 快速了解项目结构 请阅读: `docs/PROJECT_GUIDE.md`
>
> 快速了解贡献指南 请阅读: `docs/CONTRIBUTING_GUIDE.md`
1 change: 1 addition & 0 deletions docs/dev-ops/docker-compose-app.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ services:
refine:
image: docker.cnb.cool/hamster-yhz/refine:latest
container_name: refine
pull_policy: always
restart: on-failure
ports:
- "8091:8091"
Expand Down
29 changes: 15 additions & 14 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,8 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<langchain4j.version>1.1.0-beta7</langchain4j.version>
<langchain4j.version>1.6.0-beta12</langchain4j.version>
<jackson.version>2.19.0</jackson.version>
</properties>

<licenses>
Expand All @@ -64,11 +65,11 @@

<dependencyManagement>
<dependencies>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-core</artifactId>
<version>1.1.0</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>dev.langchain4j</groupId>-->
<!-- <artifactId>langchain4j-core</artifactId>-->
<!-- <version>1.1.0</version>-->
<!-- </dependency>-->
<!-- PostgreSQL驱动 -->
<dependency>
<groupId>org.postgresql</groupId>
Expand All @@ -85,7 +86,7 @@
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-embeddings-all-minilm-l6-v2</artifactId>
<version>1.1.0-beta6</version>
<version>1.0.1-beta6</version>
</dependency>
<!-- 使用OpenAI的嵌入模型 -->
<dependency>
Expand All @@ -97,7 +98,12 @@
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.19.0</version>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
<!-- spring ai alibaba -->
<dependency>
Expand Down Expand Up @@ -202,11 +208,6 @@
<artifactId>java-jwt</artifactId>
<version>4.4.0</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.15</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
Expand All @@ -227,7 +228,7 @@
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j</artifactId>
<version>1.1.0</version>
<version>1.6.0</version>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,22 +1,30 @@
package com.achobeta.api.dto;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/**
* @Auth : Malog
* @Desc :
* @Desc : AI解题请求DTO
* @Time : 2025/11/7 11:17
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AiSolveRequestDTO implements Serializable {

/**
* 问题内容
*/
private String questionContext;
@NotBlank(message = "问题内容不能为空")
@Size(max = 10000, message = "问题内容长度不能超过10000字符")
private String question;

}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public class KeyPointsDTO {
/**
* 知识点id
*/
private int id;
private String id;
/**
* 知识点内容
*/
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.achobeta.api.dto;

import com.achobeta.types.annotation.FieldDesc;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import jakarta.validation.constraints.NotBlank;
import java.io.Serializable;

/**
* @Auth : Malog
* @Desc : 简化错因切换请求DTO
* @Time : 2025/11/10
*/
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class MistakeReasonToggleRequestDTO implements Serializable {

@NotBlank(message = "题目ID不能为空")
@FieldDesc(name = "题目ID")
private String questionId;

@NotBlank(message = "错因参数名不能为空")
@FieldDesc(name = "错因参数名")
private String reasonName;
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,6 @@
@Data
public class StudyNoteRequestDTO implements Serializable {

/**
* 用户ID
*/
@NotBlank(message = "用户ID不能为空")
private String userId;

/**
* 题目ID
*/
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.achobeta.api.dto;

import com.achobeta.types.annotation.FieldDesc;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import jakarta.validation.constraints.NotBlank;
import java.io.Serializable;

/**
* @Auth : Malog
* @Desc : 更新其他原因文本请求DTO
* @Time : 2025/11/10
*/
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class UpdateOtherReasonRequestDTO implements Serializable {

@NotBlank(message = "题目ID不能为空")
@FieldDesc(name = "题目ID")
private String questionId;

@NotBlank(message = "其他原因描述不能为空")
@FieldDesc(name = "其他原因描述")
private String otherReasonText;
}
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,10 @@ public void interceptorDo(JoinPoint point) {
checkLogin();
} catch (UnauthorizedException e) {
log.error("登录验证失败:{}", e.getMessage());
throw new AppException(e.getCode(),e.getMessage());
throw new AppException(e.getCode(), e.getMessage());
} catch (AppException e) {
log.error("全局拦截异常", e);
throw new AppException(e.getMessage());
throw new AppException(e.getCode(), e.getMessage());
} catch (Throwable e) {
log.error("全局拦截异常", e);
throw new AppException(GlobalServiceStatusCode.PARAM_FAILED_VALIDATE);
Expand Down Expand Up @@ -74,7 +74,7 @@ private void checkLogin() {
// 从请求头获取token
String token = request.getHeader("access-token");
if (StringTools.isEmpty(token)) {
throw new AppException(GlobalServiceStatusCode.UNAUTHORIZED); // token为空,未登录
throw new AppException(401, "token为空"); // token为空,未登录
}

// 先JWT技术验证,验签名、过期时间
Expand Down
Original file line number Diff line number Diff line change
@@ -1,48 +1,71 @@
package com.achobeta.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
* AI 专属线程池配置(用于 AI 流式调用、API 请求等业务逻辑)
* 核心优化:配置容错、参数合理性校验、资源占用控制、生产环境监控
*/
@Configuration
@Slf4j
public class AiThreadPoolConfig {

// 最大并发数
@Value("${ai.dashscope.max-concurrency}")
/**
* AI 最大并发数(从配置文件读取,默认值 10,避免配置缺失导致启动失败)
* 用途:限制 AI 调用的最大并发量,避免触发第三方 API(如 DashScope)限流
*/
@Value("${ai.dashscope.max-concurrency:10}")
private int aiMaxConcurrency;

@Bean
/**
* AI 专属线程池(业务层面:执行 AI 流式调用、模型推理等耗时操作)
*/
@Bean(name = "aiExclusiveThreadPool") // 明确 bean 名称,避免注入冲突
public ThreadPoolTaskExecutor aiExclusiveThreadPool() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
// 1. 基础参数计算(CPU 核心数)
int cpuCore = Runtime.getRuntime().availableProcessors();
log.info("系统 CPU 核心数:{},配置的 AI 最大并发数:{}", cpuCore, aiMaxConcurrency);

int baseCoreSize = cpuCore * 2 + 1;
// 2. 配置容错校验(避免无效配置)
if (aiMaxConcurrency < 1) {
log.warn("AI 最大并发数配置无效({}),使用默认值 10", aiMaxConcurrency);
aiMaxConcurrency = 10;
}

int corePoolSize = Math.max(baseCoreSize, aiMaxConcurrency);
// 3. 线程池参数优化(核心逻辑)
// 核心线程数:取「CPU核心数*2 +1」和「AI最大并发数的1/2」的较小值(避免空闲线程浪费)
int corePoolSize = Math.min(cpuCore * 2 + 1, aiMaxConcurrency / 2);
// 最大线程数:不超过配置的 AI 最大并发数(避免超预期并发导致限流/资源耗尽)
int maxPoolSize = Math.min(cpuCore * 4 + 1, aiMaxConcurrency);
// 队列容量:核心线程数*3(上限 50),平衡缓冲和内存占用(避免队列过大导致任务堆积)
int queueCapacity = Math.min(corePoolSize * 3, 50);

// 4. 初始化线程池
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(corePoolSize);
executor.setMaxPoolSize(maxPoolSize);
executor.setQueueCapacity(queueCapacity);
executor.setKeepAliveSeconds(120); // 空闲线程存活时间(120秒,适配 AI 长耗时调用)
executor.setThreadNamePrefix("ai-exclusive-thread-"); // 线程名前缀(日志排查)
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); // 拒绝策略

// 最大线程数:从配置文件读取,确保不超过系统承受能力
// 若配置值小于核心线程数,则强制使用核心线程数作为上限
executor.setMaxPoolSize(corePoolSize * 2);

// 设置缓冲队列大小,避免任务瞬间涌入导致OOM
executor.setQueueCapacity(corePoolSize * 5);
// 5. 线程池销毁时的优雅关闭(等待任务执行完成,避免任务丢失)
executor.setWaitForTasksToCompleteOnShutdown(true);
executor.setAwaitTerminationSeconds(30); // 等待 30 秒后强制关闭(适配 AI 长耗时任务)
executor.setAwaitTerminationMillis(30 * 1000L); // 兼容低版本 Spring(可选)

// 超过核心线程数的线程,空闲120秒后销毁,
executor.setKeepAliveSeconds(120);
// 6. 初始化并打印配置(生产环境监控关键)
executor.initialize();
log.info("AI 专属线程池初始化完成:核心线程数={},最大线程数={},队列容量={},拒绝策略={}",
corePoolSize, maxPoolSize, queueCapacity, executor.getThreadPoolExecutor().getRejectedExecutionHandler().getClass().getSimpleName());

// 线程名称前缀,便于日志排查
executor.setThreadNamePrefix("ai-exclusive-thread-");

// 当线程池和队列都满时,让提交任务的线程自己执行,避免任务丢失
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());

executor.initialize();//初始化
return executor;
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public void onResponse(ChatModelResponseContext responseContext) {

@Override
public void onError(ChatModelErrorContext errorContext) {
log.info("onError(): {}", errorContext.error().getMessage());
log.warn("onError(): {}", errorContext.error().getMessage());
}
};
}
Expand Down
Loading
Loading