This commit is contained in:
2026-01-22 22:24:43 +08:00
4 changed files with 54 additions and 15 deletions

View File

@@ -2,6 +2,7 @@ package com.vetti.web.controller.ai;
import com.vetti.common.core.controller.BaseController; import com.vetti.common.core.controller.BaseController;
import com.vetti.common.core.domain.R; import com.vetti.common.core.domain.R;
import com.vetti.hotake.domain.HotakeAiInterviewQuestionsInfo;
import com.vetti.hotake.domain.HotakeInitialScreeningQuestionsInfo; import com.vetti.hotake.domain.HotakeInitialScreeningQuestionsInfo;
import com.vetti.hotake.domain.HotakeRolesInfo; import com.vetti.hotake.domain.HotakeRolesInfo;
import com.vetti.hotake.domain.dto.*; import com.vetti.hotake.domain.dto.*;
@@ -177,7 +178,7 @@ public class HotakeAiCommonToolsController extends BaseController {
*/ */
@ApiOperation("AI面试问题生成") @ApiOperation("AI面试问题生成")
@PostMapping(value = "/aiInterviewQuestions") @PostMapping(value = "/aiInterviewQuestions")
public R<?> handleAiInterviewQuestions(@RequestBody HotakeRolesInfo rolesInfo) public R<HotakeAiInterviewQuestionsInfo> handleAiInterviewQuestions(@RequestBody HotakeRolesInfo rolesInfo)
{ {
return R.ok(hotakeAiCommonToolsService.getAiInterviewQuestions(rolesInfo)); return R.ok(hotakeAiCommonToolsService.getAiInterviewQuestions(rolesInfo));
} }

View File

@@ -2072,7 +2072,7 @@ public class AiCommonPromptConstants {
"4. Avoid cultural bias and discriminatory content\n" + "4. Avoid cultural bias and discriminatory content\n" +
"5. Don't design complex algorithm questions requiring long thinking time\n" + "5. Don't design complex algorithm questions requiring long thinking time\n" +
"\n" + "\n" +
"Please generate a high-quality, standardized set of AI interview questions based on the provided job information.\n"; "Please generate a high-quality, standardized set of AI interview questions based on the provided job information.Only return JSON structured data, no other data.\n";
return promptStr; return promptStr;
} }

View File

@@ -125,7 +125,7 @@ public interface IHotakeAiCommonToolsService {
* @param rolesInfo 岗位信息 * @param rolesInfo 岗位信息
* @return * @return
*/ */
public String getAiInterviewQuestions(HotakeRolesInfo rolesInfo); public HotakeAiInterviewQuestionsInfo getAiInterviewQuestions(HotakeRolesInfo rolesInfo);
/** /**

View File

@@ -13,14 +13,12 @@ import com.vetti.common.enums.RoleBenefitsEnum;
import com.vetti.common.exception.ServiceException; import com.vetti.common.exception.ServiceException;
import com.vetti.common.utils.SecurityUtils; import com.vetti.common.utils.SecurityUtils;
import com.vetti.common.utils.html.ReadHtmlByOkHttp; import com.vetti.common.utils.html.ReadHtmlByOkHttp;
import com.vetti.hotake.domain.HotakeInitScreQuestionsReplyRecordInfo; import com.vetti.hotake.domain.*;
import com.vetti.hotake.domain.HotakeInitialScreeningQuestionsInfo;
import com.vetti.hotake.domain.HotakeRolesApplyInfo;
import com.vetti.hotake.domain.HotakeRolesInfo;
import com.vetti.hotake.domain.dto.*; import com.vetti.hotake.domain.dto.*;
import com.vetti.hotake.domain.dto.VcDto.*; import com.vetti.hotake.domain.dto.VcDto.*;
import com.vetti.hotake.domain.dto.roleDto.*; import com.vetti.hotake.domain.dto.roleDto.*;
import com.vetti.hotake.domain.vo.*; import com.vetti.hotake.domain.vo.*;
import com.vetti.hotake.mapper.HotakeAiInterviewQuestionsInfoMapper;
import com.vetti.hotake.mapper.HotakeInitialScreeningQuestionsInfoMapper; import com.vetti.hotake.mapper.HotakeInitialScreeningQuestionsInfoMapper;
import com.vetti.hotake.mapper.HotakeRolesApplyInfoMapper; import com.vetti.hotake.mapper.HotakeRolesApplyInfoMapper;
import com.vetti.hotake.mapper.HotakeRolesInfoMapper; import com.vetti.hotake.mapper.HotakeRolesInfoMapper;
@@ -55,6 +53,9 @@ public class HotakeAiCommonToolsServiceImpl extends BaseServiceImpl implements I
@Autowired @Autowired
private HotakeInitialScreeningQuestionsInfoMapper hotakeInitialScreeningQuestionsInfoMapper; private HotakeInitialScreeningQuestionsInfoMapper hotakeInitialScreeningQuestionsInfoMapper;
@Autowired
private HotakeAiInterviewQuestionsInfoMapper hotakeAiInterviewQuestionsInfoMapper;
@Autowired @Autowired
private ChatGPTClient chatGPTClient; private ChatGPTClient chatGPTClient;
@@ -588,12 +589,20 @@ public class HotakeAiCommonToolsServiceImpl extends BaseServiceImpl implements I
@Override @Override
public String handleWebInfoExtract(HotakeWebInfoExtractVo webInfoExtractVo) { public String handleWebInfoExtract(HotakeWebInfoExtractVo webInfoExtractVo) {
//获取 //获取
String webContent = handleWebContentScraping(webInfoExtractVo.getWebUrl()); if(StrUtil.isEmpty(webInfoExtractVo.getWebUrl())){
throw new ServiceException("");
}
String webUrl = webInfoExtractVo.getWebUrl();
if(!webInfoExtractVo.getWebUrl().toLowerCase().contains("https")){
webUrl = webUrl.replaceAll("http","https");
}
String webContent = handleWebContentScraping(webUrl);
String prompt = AiCommonPromptConstants.initializationWebInfoExtractPrompt(); String prompt = AiCommonPromptConstants.initializationWebInfoExtractPrompt();
String userPrompt = "Please analyze the following company website:\n" + String userPrompt = "Please analyze the following company website:\n" +
"\n" + "\n" +
"URL: " + webInfoExtractVo.getWebUrl() + "\n" + "URL: " + webUrl + "\n" +
"\n" + "\n" +
"Content:\n" + "Content:\n" +
webContent; webContent;
@@ -973,19 +982,20 @@ public class HotakeAiCommonToolsServiceImpl extends BaseServiceImpl implements I
* @return * @return
*/ */
@Override @Override
public String getAiInterviewQuestions(HotakeRolesInfo rolesInfo) { public HotakeAiInterviewQuestionsInfo getAiInterviewQuestions(HotakeRolesInfo rolesInfo) {
HotakeRolesInfo hotakeRolesInfo = hotakeRolesInfoMapper.selectHotakeRolesInfoById(rolesInfo.getId());
String prompt = AiCommonPromptConstants.initializationAiInterviewQuestionsPrompt(); String prompt = AiCommonPromptConstants.initializationAiInterviewQuestionsPrompt();
String userPrompt_1 = "Please generate AI interview questions based on the following job description\n" + String userPrompt_1 = "Please generate AI interview questions based on the following job description\n" +
"\n" + "\n" +
"**Job Information**\n" + "**Job Information**\n" +
"Job Title" + rolesInfo.getRoleName() + "\n" + "Job Title" + hotakeRolesInfo.getRoleName() + "\n" +
"Technical Requirements" + rolesInfo.getRequiredSkillsJson() + "-" + rolesInfo.getNiceToHaveSkillsJson() + "\n" + "Technical Requirements" + hotakeRolesInfo.getRequiredSkillsJson() + "-" + hotakeRolesInfo.getNiceToHaveSkillsJson() + "\n" +
"Experience Requirements" + rolesInfo.getJobExperience() + "\n" + "Experience Requirements" + hotakeRolesInfo.getJobExperience() + "\n" +
"Interview Duration【】\n" + "Interview Duration【】\n" +
"Company Culture【】\n" + "Company Culture【】\n" +
"Special Requirements" + rolesInfo.getAboutRole() + "\n" + "Special Requirements" + hotakeRolesInfo.getAboutRole() + "\n" +
"`;"; "`;";
log.info("AI面试问题生成:{}", userPrompt_1); log.info("AI面试问题生成:{}", userPrompt_1);
//处理岗位信息补充 //处理岗位信息补充
@@ -1003,7 +1013,35 @@ public class HotakeAiCommonToolsServiceImpl extends BaseServiceImpl implements I
String resultJsonOne = resultStrOne.replaceAll("```json", "").replaceAll("```", ""); String resultJsonOne = resultStrOne.replaceAll("```json", "").replaceAll("```", "");
log.info("AI面试问题生成结果:{}", resultJsonOne); log.info("AI面试问题生成结果:{}", resultJsonOne);
return resultJsonOne; try{
Map mapData = JSONUtil.toBean(resultJsonOne,Map.class);
List<Map> questionMapList = (List<Map>)mapData.get("interview_questions");
if(CollectionUtil.isNotEmpty(questionMapList)){
HotakeAiInterviewQuestionsInfo questionsInfo = new HotakeAiInterviewQuestionsInfo();
questionsInfo.setQuestionTitle("General Questions");
questionsInfo.setFocusType("Personality & Culture");
questionsInfo.setRoleId(rolesInfo.getId());
questionsInfo.setRecruiterId(SecurityUtils.getUserId());
questionsInfo.setOverview("This is General Questions Overview");
BigDecimal times = BigDecimal.ZERO;
List<AiQuestionDto> questionDtoList = new ArrayList<>();
for(Map map : questionMapList){
AiQuestionDto questionDto = new AiQuestionDto();
questionDto.setQuestions(map.get("question_text").toString());
questionDtoList.add(questionDto);
times = times.add(new BigDecimal(map.get("estimated_time").toString()));
}
questionsInfo.setAiQuestionList(questionDtoList);
questionsInfo.setTimes(times.toString());
//进行数据更新
hotakeAiInterviewQuestionsInfoMapper.insertHotakeAiInterviewQuestionsInfo(questionsInfo);
return questionsInfo;
}
}catch (Exception e){
e.printStackTrace();
}
return new HotakeAiInterviewQuestionsInfo();
} }
/** /**