Skip to content

Commit cd832f3

Browse files
committed
后端 - AI 能力接入
实现 AI 生成结果报告功能
1 parent d84aa1b commit cd832f3

File tree

4 files changed

+54
-20
lines changed

4 files changed

+54
-20
lines changed

AI_INTEGRATION_GUIDE.md

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515
- 支持通过配置文件动态配置模型参数
1616

1717
### 2. AI 服务接口
18-
- `LevelGenerationAiService`:关卡生成服务
19-
- `ResultReportAiService`:结果报告生成服务
20-
- 使用 `@SystemMessage` `@UserMessage` 注解定义提示词
18+
- `LevelGenerationAiService`:关卡生成服务,使用简单的薪资参数
19+
- `ResultReportAiService`:结果报告生成服务,接收拼接好的用户消息
20+
- 使用 `@SystemMessage` 引入提示词文件,`@UserMessage` 接收业务层拼接的消息
2121

2222
### 3. 服务实现类集成
2323
- `LevelServiceImpl`:集成关卡生成 AI 服务,包含降级处理
@@ -118,14 +118,19 @@ mvn test -Dtest=AiServiceTest
118118
- 不要将 API Key 提交到代码仓库
119119

120120
2. **模型选择**:
121-
- 当前使用 `qwen-max` 模型以获得最佳效果
122-
- 可根据成本考虑调整为 `qwen-turbo` 或其他模型
121+
- 当前使用 `qwen-plus` 模型平衡效果和成本
122+
- 可根据需求调整为 `qwen-max`(更好效果)或 `qwen-turbo`(更低成本)
123123

124-
3. **错误处理**:
124+
3. **消息拼接**:
125+
- `@UserMessage` 注解不支持多参数模板
126+
- 在业务层使用 Java 模板字符串 (`String.format("""...""")`) 拼接复杂消息
127+
- 这样可以更灵活地控制消息格式和内容
128+
129+
4. **错误处理**:
125130
- 所有 AI 调用都有降级机制
126131
- 日志记录详细的错误信息便于调试
127132

128-
4. **性能优化**:
133+
5. **性能优化**:
129134
- AI 调用可能较慢,建议在前端添加加载提示
130135
- 考虑添加缓存机制减少重复调用
131136

src/main/java/com/yupi/codertestbackend/service/ai/ResultReportAiService.java

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,12 @@
1010
public interface ResultReportAiService {
1111

1212
/**
13-
* 根据关卡信息和用户作答生成结果报告
13+
* 根据拼接好的用户消息生成结果报告
1414
*
15-
* @param levelName 关卡名称
16-
* @param levelDesc 关卡需求描述
17-
* @param userOptions 用户选择的选项(JSON字符串)
18-
* @param trueOptions 本关卡的正确选项(JSON字符串)
19-
* @param salary 用户当前薪资
15+
* @param userMessage 拼接好的用户消息内容
2016
* @return 生成的结果报告
2117
*/
2218
@SystemMessage(fromResource = "prompts/result-report-system.txt")
23-
@UserMessage("### 关卡名称\n{{levelName}}\n\n## 关卡的需求描述\n{{levelDesc}}\n\n## 用户选择的选项\n{{userOptions}}\n\n### 本关卡的正确选项\n{{trueOptions}}\n\n### 用户当前的薪资\n{{salary}}")
24-
ResultReportResponse generateResultReport(String levelName, String levelDesc,
25-
String userOptions, String trueOptions, Integer salary);
19+
@UserMessage("{{userMessage}}")
20+
ResultReportResponse generateResultReport(String userMessage);
2621
}

src/main/java/com/yupi/codertestbackend/service/impl/UserLevelServiceImpl.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,15 +64,32 @@ public UserLevel submitAnswer(SubmitAnswerRequest submitAnswerRequest, String us
6464
// 1. 解析关卡的正确答案
6565
List<String> trueOptions = extractTrueOptions(level.getOptions());
6666

67-
// 2. 调用AI生成详细的结果报告
68-
ResultReportResponse aiResponse = resultReportAiService.generateResultReport(
67+
// 2. 拼接用户消息并调用AI生成详细的结果报告
68+
String userMessage = String.format("""
69+
### 关卡名称
70+
%s
71+
72+
## 关卡的需求描述
73+
%s
74+
75+
## 用户选择的选项
76+
%s
77+
78+
### 本关卡的正确选项
79+
%s
80+
81+
### 用户当前的薪资
82+
%d
83+
""",
6984
level.getLevelName(),
7085
level.getLevelDesc(),
7186
JSONUtil.toJsonStr(userOptions),
7287
JSONUtil.toJsonStr(trueOptions),
7388
user.getSalary()
7489
);
7590

91+
ResultReportResponse aiResponse = resultReportAiService.generateResultReport(userMessage);
92+
7693
// 3. 将AI响应转换为UserLevel实体
7794
UserLevel userLevel = new UserLevel();
7895
userLevel.setUserId(userId);

src/test/java/com/yupi/codertestbackend/service/ai/AiServiceTest.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,17 +58,34 @@ void testResultReportGeneration() {
5858
try {
5959
log.info("开始测试结果报告生成服务...");
6060

61-
// 模拟测试数据
61+
// 模拟测试数据并拼接用户消息
6262
String levelName = "测试关卡";
6363
String levelDesc = "这是一个测试关卡描述";
6464
String userOptions = "[\"选项1\", \"选项2\"]";
6565
String trueOptions = "[\"选项1\", \"选项3\"]";
6666
Integer salary = 10000;
6767

68-
ResultReportResponse response = resultReportAiService.generateResultReport(
68+
String userMessage = String.format("""
69+
### 关卡名称
70+
%s
71+
72+
## 关卡的需求描述
73+
%s
74+
75+
## 用户选择的选项
76+
%s
77+
78+
### 本关卡的正确选项
79+
%s
80+
81+
### 用户当前的薪资
82+
%d
83+
""",
6984
levelName, levelDesc, userOptions, trueOptions, salary
7085
);
7186

87+
ResultReportResponse response = resultReportAiService.generateResultReport(userMessage);
88+
7289
log.info("结果报告生成成功:");
7390
log.info("得分: {}", response.getScore());
7491
log.info("评价: {}", response.getComment());

0 commit comments

Comments
 (0)