Merge branch 'dev' of https://github.com/Vetti-AI/Vetti-Service into dev
This commit is contained in:
@@ -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));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,7 +125,7 @@ public interface IHotakeAiCommonToolsService {
|
|||||||
* @param rolesInfo 岗位信息
|
* @param rolesInfo 岗位信息
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public String getAiInterviewQuestions(HotakeRolesInfo rolesInfo);
|
public HotakeAiInterviewQuestionsInfo getAiInterviewQuestions(HotakeRolesInfo rolesInfo);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user