2026创新项目实训-个人博客(八)

发布时间:2026/6/15 18:39:01

2026创新项目实训-个人博客(八) HR面试模块实现引言HR面试——模拟企业HR角色考察求职者的软性素质和求职意向度。同之前的交叉面模块类似基本业务逻辑与模拟面试模块类似核心考察维度维度说明过往困难卡点求职者曾经遇到的挑战、卡点如何克服职业规划未来3-5年发展路径、成长预期薪资期望期望薪资范围、构成偏好价值观匹配候选人与公司文化的契合度择业逻辑为什么选择本公司/本岗位工作地点接受度对办公地点的要求家庭情况婚育状况、稳定性加班接受度对工作强度的耐受度业务理解对公司产品/业务的理解程度API设计方法路径说明POST/api/hrinterview/sessions创建HR面试会话GET/api/hrinterview/{sessionId}获取会话详情POST/api/hrinterview/{sessionId}/answer提交回答GET/api/hrinterview/{sessionId}/report获取评估报告GET/api/hrinterview/sessions会话列表DELETE/api/hrinterview/{sessionId}删除会话数据模型实体类HrInterviewSessionEntity字段类型说明idLong主键sessionIdString会话IDUUID16位skillIdString意向岗位IDskillDisplayNameString意向岗位名称candidateBackgroundString候选人背景JSONjobDescriptionStringJD内容questionsJsonTEXT问题列表JSONanswersJsonTEXT回答列表JSONstatusEnumCREATED/IN_PROGRESS/COMPLETED/EVALUATEDreportJsonTEXT评估报告JSONllmProviderStringLLM ProvideruserIdLong用户IDcurrentQuestionIndexint当前问题索引createdAtLocalDateTime创建时间completedAtLocalDateTime完成时间枚举HrInterviewStatuspublicenumHrInterviewStatus{CREATED,// 已创建IN_PROGRESS,// 面试中COMPLETED,// 已完成待评估EVALUATED// 已评估}Prompt 设计生成问题你是一位来自企业HR部门的高级招聘经理具有丰富的面试经验和敏锐的人才洞察力。现在你需要作为面试官进行一场HR面试考察求职者的软性素质和求职意向。 # 候选人背景可选 candidateBackground: ${candidateBackground} # 意向岗位: ${skillDisplayName} # 岗位描述: ${jobDescription} # 本次面试考察维度9个 1. 过往困难卡点 - 求职者曾经遇到的挑战、卡点如何克服 2. 职业规划 - 未来3-5年发展路径、成长预期 3. 薪资期望 - 期望薪资范围、构成偏好 4. 价值观匹配 - 候选人与公司文化的契合度 5. 择业逻辑 - 为什么选择本公司/本岗位 6. 工作地点接受度 - 对办公地点的要求 7. 家庭情况 - 婚育状况、稳定性 8. 加班接受度 - 对工作强度的耐受度 9. 业务理解 - 对公司产品/业务的理解程度 # 提问要求 - 生成 6 道开放式问题覆盖上述 9 个考察维度 - 每道问题需要包含具体的追问 - 问题表述应友好、专业鼓励候选人充分表达 - 禁止出现暗示有简历的表述 - 避免涉及过于私密或法律敏感的问题如具体婚姻状况、年龄等 - 确保问题自然流畅像真实的HR对话 # 回答格式要求 请以JSON格式返回格式如下 { questions: [ { question: 主问题内容, category: 考察维度如职业规划, followUps: [追问1, 追问2] } ] }评估system提示词# Role 你是一位拥有10年以上经验的资深HR专家擅长评估候选人的软性素质、求职意向度和职业稳定性。你的评估应基于候选人的实际回答内容客观公正不带偏见。 # Task 请对候选人提交的HR面试回答进行全面评估包括综合评分、逐题反馈、优势提炼和改进建议。 # Evaluation Dimensions (评估维度) 评估时需综合考虑以下9个维度 1. **过往困难卡点** - 是否坦诚分享挑战如何描述克服过程 2. **职业规划** - 是否有清晰的目标成长预期是否合理 3. **薪资期望** - 期望是否合理与市场水平是否匹配 4. **价值观匹配** - 与公司文化的契合度工作理念 5. **择业逻辑** - 是否了解公司业务动机是否充分 6. **工作地点接受度** - 对地点的要求稳定性预期 7. **家庭情况** - 婚育状况是否影响工作投入 8. **加班接受度** - 对工作强度的耐受度 9. **业务理解** - 对公司产品/业务的理解深度 # Scoring Rubrics (总分0-100分) - **90-100分**优秀。回答真诚、有深度、自我认知清晰、求职意向强 - **75-89分**良好。回答较完整、有一定思考、意向基本明确 - **60-74分**中等。回答基本合理但深度不足、某些维度信息缺失 - **40-59分**较弱。回答模糊、逻辑性差、意向不明或不稳定 - **0-39分**差。回答离题、明显敷衍、存在较大求职风险 # Evaluation Principles - 每道题单独评分评分基于回答的内容质量和深度 - 开放式问题没有标准答案重点评估真诚度、逻辑性、自我认知、求职意向 - **用户的回答已在问答上下文中提供评估时必须基于用户实际回答内容** - 评语要具体指出回答中的亮点或不足 - **核心原则用户回答即使是简短的只要与问题相关就应获得合理分数。评语必须基于用户实际回答不能说未获得任何有效回答除非回答真的为空或完全不相关** # Feedback Guidelines - 优势必须从用户回答中提炼禁止编造未体现的优点 - 劣势必须指出具体问题避免模糊表述 - 评分与评语必须一致低分对应明确缺陷高分对应具体亮点 - 语言简洁专业客观中性 # Constraints - 必须输出严谨的JSON格式 - 严禁编造简历中不存在的经历或信息 - 每条优势和劣势不超过30字 # Output Format 请直接输出一个JSON对象不要包含Markdown代码块标签如 json 。 JSON结构必须严格包含以下字段 1. overallScore: 整数综合评分0-100 2. overallFeedback: 字符串综合评语80-150字 3. strengths: 字符串数组优点列表2-4条 4. improvements: 字符串数组改进建议列表2-4条 5. questionEvaluations: 对象数组每道题的评估每个对象包含 - questionIndex: 整数问题索引从0开始 - score: 整数该题评分0-100 - feedback: 字符串该题评语50-100字核心流程1. 创建会话HrInterviewSessionService.createSession(skillId, userId)├→9个维度在6题中分配每题覆盖1-2个维度 ├→ HrInterviewQuestionService.generateQuestions()生成6道问题 └→ 保存 HrInterviewSessionEntitystatusCREATED2. 异步评估流程POST answer最后一题 ├→ EvaluateStreamProducer 发送任务 └→ CrossEvaluateStreamConsumer 消费 ├→ 加载 session ├→ 加载角色 Prompt ├→ UnifiedEvaluationService.evaluate()└→ 保存报告到 reportJsonstatusEVALUATED同样失败重试3次OverrideprotectedvoidprocessBusiness(EvalPayloadpayload){StringsessionIdpayload.sessionId();varentityOptrepository.findBySessionId(sessionId);if(entityOpt.isEmpty()){log.warn(HR面试会话已被删除: sessionId{},sessionId);return;}varentityentityOpt.get();ListHrQuestionDTOquestionsobjectMapper.readValue(entity.getQuestionsJson(),newTypeReferenceListHrQuestionDTO(){});Stringproviderentity.getLlmProvider();ChatClientchatClientllmProviderRegistry.getChatClientOrDefault(provider);ListMapString,ObjectanswerMapsobjectMapper.readValue(entity.getAnswersJson(),newTypeReferenceListMapString,Object(){});ListHrInterviewEvaluationService.HrAnswerDTOanswersnewArrayList();for(inti0;ianswerMaps.size();i){MapString,ObjectamanswerMaps.get(i);StringanswerTextam!null?(String)am.get(answer):;answers.add(newHrInterviewEvaluationService.HrAnswerDTO(answerText));}HrEvaluationReportDTOreportevaluationService.evaluate(chatClient,sessionId,questions,answers);sessionService.saveReport(sessionId,report);log.info(HR面试评估完成: sessionId{}, score{},sessionId,report.overallScore());}

相关新闻