修改bug:招聘者:候选者列表中,工作经验的“年限时长“数据好想不太正确

This commit is contained in:
2026-02-04 09:34:23 +08:00
parent db762a0f03
commit 4085b44d0b
3 changed files with 67 additions and 4 deletions

View File

@@ -154,6 +154,25 @@ public class ResumeTextExtractor {
* 3. 设置合理的经验范围限制1-30年
* 4. 如果无法估算返回随机的合理值2-10年
*
* TODO: 修复工作年限计算错误 - Bug修复说明
* 问题:原有算法直接用 endYear - earliestYear 计算工作年限,
* 这会导致将教育时间也计算在内,例如:
* - 2006年上大学2025年工作 = 19年错误
* - 实际应该是2010年毕业后开始工作约15年
*
* 修复方案:
* 1. 优先使用AI解析的experienceYear字段已在AI提示词中修复
* 2. 此方法作为备用估算,采用保守策略:
* - 假设教育时间约4年本科
* - 从最早年份+4年开始计算工作经验
* - 这样可以避免将教育时间计入工作年限
* 3. 如果年份跨度小于4年说明可能没有教育经历直接计算
*
* 注意这只是备用估算方法主要依赖AI解析的准确结果
*
* 修改日期2026-02-04
* 修改人sxc
*
* @param text 简历文本
* @return 估算的工作经验年数
*/
@@ -178,9 +197,25 @@ public class ResumeTextExtractor {
int latestYear = years.get(years.size() - 1);
int currentYear = Year.now().getValue();
// 计算工作经验:从最早年份到最新年份(不超过当前年份)
// 计算工作经验:从最新年份(不超过当前年份)
int endYear = Math.min(latestYear, currentYear);
int experience = endYear - earliestYear;
// TODO: 修复点 - 排除教育时间
// 假设教育时间约4年从最早年份+4年开始计算工作经验
// 这样可以避免将大学时间计入工作年限
int yearSpan = endYear - earliestYear;
int experience;
if (yearSpan <= 4) {
// 如果年份跨度小于等于4年说明可能没有教育经历或者是短期工作
// 直接使用年份差
experience = yearSpan;
} else {
// 年份跨度大于4年假设前4年是教育时间
// 从最早年份+4年开始计算工作经验
int workStartYear = earliestYear + 4;
experience = endYear - workStartYear;
}
// 限制经验年数在合理范围内1-30年
return Math.max(1, Math.min(experience, 30));

View File

@@ -547,7 +547,21 @@ public class HotakeCvInfoServiceImpl extends BaseServiceImpl implements IHotakeC
List<Map<String, String>> list = new LinkedList();
Map<String, String> entity = new HashMap<>();
entity.put("role", "user");
entity.put("content", "从下面提供的文本中提取所有能识别到的简历信息只提取原文中存在的内容不要补充、不推测、不总结。需要提取的字段包括name姓名或人名、phone电话号码、email电子邮件地址、experienceYear根据工作经验计算出来的工作年限、position岗位或者简历中自己期望的职位等、location地点或者地址、家庭住址、links所有链接地址、currentWork(当前工作公司)、about关于我/自我介绍、skills_tools关键资格许可证、注册/会员资格、认证、languages语言能力,主要就是Languages下面的语言、experience工作经历,除了title、company、location、durationStart、durationEnd,其他的都放到description里面,并且description里面要根据换行符分成不同的content),日期要拆分成开始时间(durationStart)和结束时间(durationEnd)、education教育经历,日期要拆分成开始时间(durationStart)和结束时间(durationEnd))。请将提取结果以结构化 JSON 格式返回,格式如下:{ \\\"name\\\": \\\"\\\", \\\"phone\\\": \\\"\\\", \\\"currentWork\\\": \\\"\\\", \\\"position\\\": \\\"\\\", \\\"location\\\": \\\"\\\", \\\"email\\\": \\\"\\\", \\\"experienceYear\\\": \\\"\\\", \\\"links\\\": [{\\\"content\\\":\\\"\\\"}], \\\"about\\\": \\\"\\\", \\\"skillsTools\\\": [{\\\"content\\\":\\\"\\\"}], \\\"languages\\\": [{\\\"content\\\":\\\"\\\"}], \\\"experience\\\": [{\\\"title\\\": \\\"\\\", \\\"company\\\": \\\"\\\",\\\"location\\\": \\\"\\\",\\\"durationStart\\\": \\\"\\\",\\\"durationEnd\\\": \\\"\\\",\\\"description\\\": [{\\\"content\\\":\\\"\\\"}]}], \\\"education\\\": [{\\\"degree\\\": \\\"\\\",\\\"institution\\\": \\\"\\\",\\\"durationStart\\\": \\\"\\\",\\\"durationEnd\\\": \\\"\\\"}] }。字段不存在则返回 null 或空数组。只返回标准可解析的 JSON结构 ,不要多余的```json等信息" +
// TODO: 修复工作年限计算错误 - Bug修复说明
// 问题:之前的提示词中"experienceYear根据工作经验计算出来的工作年限"描述不够明确,
// 导致AI可能会将教育时间也计算在内或者简单地用最早年份到最新年份的差值
// 例如2006年上大学到2025年工作 = 19年错误实际应该是2010年毕业后开始工作约15年
//
// 修复方案:在提示词中明确工作年限的计算规则:
// 1. 只计算experience工作经历中的时间段不包括education教育经历
// 2. 累加所有工作经历的实际工作时长(年)
// 3. 如果工作结束时间是"Present"、"Current"、"至今"等,使用当前年份(2026)计算
// 4. 计算公式:总工作年限 = Σ(每段工作的结束年份 - 开始年份)
// 5. 结果保留整数,向下取整
//
// 修改日期2026-02-04
// 修改人sxc
entity.put("content", "从下面提供的文本中提取所有能识别到的简历信息只提取原文中存在的内容不要补充、不推测、不总结。需要提取的字段包括name姓名或人名、phone电话号码、email电子邮件地址、experienceYear工作年限重要只计算experience工作经历中的实际工作时长不包括education教育时间。计算方法累加所有工作经历的年数如果结束时间是Present/Current/至今则用2026年计算例如2018-01到2020-06工作2年+2021-03到Present工作5年=总共7年工作经验、position岗位或者简历中自己期望的职位等、location地点或者地址、家庭住址、links所有链接地址、currentWork(当前工作公司)、about关于我/自我介绍、skills_tools关键资格许可证、注册/会员资格、认证、languages语言能力,主要就是Languages下面的语言、experience工作经历,除了title、company、location、durationStart、durationEnd,其他的都放到description里面,并且description里面要根据换行符分成不同的content),日期要拆分成开始时间(durationStart)和结束时间(durationEnd)、education教育经历,日期要拆分成开始时间(durationStart)和结束时间(durationEnd))。请将提取结果以结构化 JSON 格式返回,格式如下:{ \\\"name\\\": \\\"\\\", \\\"phone\\\": \\\"\\\", \\\"currentWork\\\": \\\"\\\", \\\"position\\\": \\\"\\\", \\\"location\\\": \\\"\\\", \\\"email\\\": \\\"\\\", \\\"experienceYear\\\": \\\"\\\", \\\"links\\\": [{\\\"content\\\":\\\"\\\"}], \\\"about\\\": \\\"\\\", \\\"skillsTools\\\": [{\\\"content\\\":\\\"\\\"}], \\\"languages\\\": [{\\\"content\\\":\\\"\\\"}], \\\"experience\\\": [{\\\"title\\\": \\\"\\\", \\\"company\\\": \\\"\\\",\\\"location\\\": \\\"\\\",\\\"durationStart\\\": \\\"\\\",\\\"durationEnd\\\": \\\"\\\",\\\"description\\\": [{\\\"content\\\":\\\"\\\"}]}], \\\"education\\\": [{\\\"degree\\\": \\\"\\\",\\\"institution\\\": \\\"\\\",\\\"durationStart\\\": \\\"\\\",\\\"durationEnd\\\": \\\"\\\"}] }。字段不存在则返回 null 或空数组。只返回标准可解析的 JSON结构 ,不要多余的```json等信息" +
"不要解释说明,不要改写内容,其中日期字段要转换格式为:yyyy-MM例如 Apr 2016,要转换成 2016-04,并且只有年要补充固定月份01月例如2025要转换成2025-01。以下为待处理文本" + contents);
//根据AI做
list.add(entity);

View File

@@ -333,7 +333,21 @@ public class HotakeInitScreQuestionsReplyRecordInfoServiceImpl extends BaseServi
List<Map<String, String>> list = new LinkedList();
Map<String, String> entity = new HashMap<>();
entity.put("role", "user");
entity.put("content", "从下面提供的文本中提取所有能识别到的简历信息只提取原文中存在的内容不要补充、不推测、不总结。需要提取的字段包括name姓名或人名、phone电话号码、email电子邮件地址、experienceYear根据工作经验计算出来的工作年限、position岗位或者简历中自己期望的职位等、location地点或者地址、家庭住址、links所有链接地址、currentWork(当前工作公司)、about关于我/自我介绍、skills_tools关键资格许可证、注册/会员资格、认证、languages语言能力,主要就是Languages下面的语言、experience工作经历,除了title、company、location、durationStart、durationEnd,其他的都放到description里面,并且description里面要根据换行符分成不同的content),日期要拆分成开始时间(durationStart)和结束时间(durationEnd)、education教育经历,日期要拆分成开始时间(durationStart)和结束时间(durationEnd))。请将提取结果以结构化 JSON 格式返回,格式如下:{ \\\"name\\\": \\\"\\\", \\\"phone\\\": \\\"\\\", \\\"currentWork\\\": \\\"\\\", \\\"position\\\": \\\"\\\", \\\"location\\\": \\\"\\\", \\\"email\\\": \\\"\\\", \\\"experienceYear\\\": \\\"\\\", \\\"links\\\": [{\\\"content\\\":\\\"\\\"}], \\\"about\\\": \\\"\\\", \\\"skillsTools\\\": [{\\\"content\\\":\\\"\\\"}], \\\"languages\\\": [{\\\"content\\\":\\\"\\\"}], \\\"experience\\\": [{\\\"title\\\": \\\"\\\", \\\"company\\\": \\\"\\\",\\\"location\\\": \\\"\\\",\\\"durationStart\\\": \\\"\\\",\\\"durationEnd\\\": \\\"\\\",\\\"description\\\": [{\\\"content\\\":\\\"\\\"}]}], \\\"education\\\": [{\\\"degree\\\": \\\"\\\",\\\"institution\\\": \\\"\\\",\\\"durationStart\\\": \\\"\\\",\\\"durationEnd\\\": \\\"\\\"}] }。字段不存在则返回 null 或空数组。只返回标准可解析的 JSON结构 ,不要多余的```json等信息不要解释说明不要改写内容。以下为待处理文本" + contents);
// TODO: 修复工作年限计算错误 - Bug修复说明
// 问题:之前的提示词中"experienceYear根据工作经验计算出来的工作年限"描述不够明确,
// 导致AI可能会将教育时间也计算在内或者简单地用最早年份到最新年份的差值
// 例如2006年上大学到2025年工作 = 19年错误实际应该是2010年毕业后开始工作约15年
//
// 修复方案:在提示词中明确工作年限的计算规则:
// 1. 只计算experience工作经历中的时间段不包括education教育经历
// 2. 累加所有工作经历的实际工作时长(年)
// 3. 如果工作结束时间是"Present"、"Current"、"至今"等,使用当前年份(2026)计算
// 4. 计算公式:总工作年限 = Σ(每段工作的结束年份 - 开始年份)
// 5. 结果保留整数,向下取整
//
// 修改日期2026-02-04
// 修改人sxc
entity.put("content", "从下面提供的文本中提取所有能识别到的简历信息只提取原文中存在的内容不要补充、不推测、不总结。需要提取的字段包括name姓名或人名、phone电话号码、email电子邮件地址、experienceYear工作年限重要只计算experience工作经历中的实际工作时长不包括education教育时间。计算方法累加所有工作经历的年数如果结束时间是Present/Current/至今则用2026年计算例如2018-01到2020-06工作2年+2021-03到Present工作5年=总共7年工作经验、position岗位或者简历中自己期望的职位等、location地点或者地址、家庭住址、links所有链接地址、currentWork(当前工作公司)、about关于我/自我介绍、skills_tools关键资格许可证、注册/会员资格、认证、languages语言能力,主要就是Languages下面的语言、experience工作经历,除了title、company、location、durationStart、durationEnd,其他的都放到description里面,并且description里面要根据换行符分成不同的content),日期要拆分成开始时间(durationStart)和结束时间(durationEnd)、education教育经历,日期要拆分成开始时间(durationStart)和结束时间(durationEnd))。请将提取结果以结构化 JSON 格式返回,格式如下:{ \\\"name\\\": \\\"\\\", \\\"phone\\\": \\\"\\\", \\\"currentWork\\\": \\\"\\\", \\\"position\\\": \\\"\\\", \\\"location\\\": \\\"\\\", \\\"email\\\": \\\"\\\", \\\"experienceYear\\\": \\\"\\\", \\\"links\\\": [{\\\"content\\\":\\\"\\\"}], \\\"about\\\": \\\"\\\", \\\"skillsTools\\\": [{\\\"content\\\":\\\"\\\"}], \\\"languages\\\": [{\\\"content\\\":\\\"\\\"}], \\\"experience\\\": [{\\\"title\\\": \\\"\\\", \\\"company\\\": \\\"\\\",\\\"location\\\": \\\"\\\",\\\"durationStart\\\": \\\"\\\",\\\"durationEnd\\\": \\\"\\\",\\\"description\\\": [{\\\"content\\\":\\\"\\\"}]}], \\\"education\\\": [{\\\"degree\\\": \\\"\\\",\\\"institution\\\": \\\"\\\",\\\"durationStart\\\": \\\"\\\",\\\"durationEnd\\\": \\\"\\\"}] }。字段不存在则返回 null 或空数组。只返回标准可解析的 JSON结构 ,不要多余的```json等信息不要解释说明不要改写内容。以下为待处理文本" + contents);
//根据AI做
list.add(entity);
String resultCv = chatGPTClient.handleAiChat(JSONUtil.toJsonStr(list), "JX");