添加适配评分
This commit is contained in:
@@ -0,0 +1,39 @@
|
||||
"""求职助手 - 岗位匹配评分 AI 引擎
|
||||
|
||||
根据简历与岗位在技能/学历/经验上的要求评估匹配度,输出 0-100 分。
|
||||
依赖:job_agent/prompts、model_config.JobAgentModel.MATCH_SCORE、parse_llm_json
|
||||
"""
|
||||
|
||||
import time
|
||||
|
||||
from langchain_core.output_parsers import StrOutputParser
|
||||
from langchain_core.prompts import ChatPromptTemplate
|
||||
|
||||
from app.ai.job_agent.prompts import RESUME_JOB_MATCH_SCORE_PROMPT
|
||||
from app.ai.model_config import JobAgentModel
|
||||
from app.core.logger import log
|
||||
from app.tool.json_helper import parse_llm_json
|
||||
|
||||
_score_chain = (
|
||||
ChatPromptTemplate.from_messages([("system", RESUME_JOB_MATCH_SCORE_PROMPT), ("human", "请开始评估。")])
|
||||
| JobAgentModel.MATCH_SCORE
|
||||
| StrOutputParser()
|
||||
)
|
||||
|
||||
|
||||
async def score_match(job_title: str, job_skill_tags: str, job_description: str, resume_text: str) -> int:
|
||||
"""评估简历与岗位匹配度,返回 0-100 整数分,失败返回 0"""
|
||||
t0 = time.monotonic()
|
||||
try:
|
||||
raw = await _score_chain.ainvoke({
|
||||
"job_title": job_title, "job_skill_tags": job_skill_tags or "无",
|
||||
"job_description": job_description or "无", "resume_text": resume_text or "暂无简历信息",
|
||||
})
|
||||
parsed = parse_llm_json(raw)
|
||||
score = int(parsed.get("score", 0))
|
||||
score = max(0, min(100, score)) # 兜底夹取到 0-100
|
||||
log.info(f"岗位匹配评分完成 score={score} ({round(time.monotonic() - t0, 2)}s)")
|
||||
return score
|
||||
except Exception as e:
|
||||
log.error(f"岗位匹配评分失败: {e} ({round(time.monotonic() - t0, 2)}s)")
|
||||
return 0
|
||||
@@ -38,3 +38,37 @@ RESUME_EXPERIENCE_OPTIMIZE_PROMPT = """你是一个求职投递助手。用户
|
||||
3. 适当使用岗位要求中的关键词润色描述,但不要编造内容
|
||||
4. description 字段是 [{{"id": "xxx", "text": "xxx"}}] 格式:修改时保留原 id 只改 text,新增段落生成随机8位字符串作为 id,删除段落直接移除
|
||||
5. 返回修改后的完整模块数据(JSON 格式,与输入格式一致)"""
|
||||
|
||||
|
||||
# ===== 岗位匹配评分 Prompt =====
|
||||
|
||||
RESUME_JOB_MATCH_SCORE_PROMPT = """你是一名资深招聘评估专家,负责客观评估候选人简历与目标岗位的匹配程度。请从【技能】【学历】【经验】三个维度逐项分析,再综合给出一个 0-100 的匹配分数。
|
||||
|
||||
【候选人简历】
|
||||
{resume_text}
|
||||
|
||||
【目标岗位】
|
||||
岗位名称:{job_title}
|
||||
技能标签:{job_skill_tags}
|
||||
岗位职责与要求:{job_description}
|
||||
|
||||
【评估维度与要点】
|
||||
1. 技能匹配(建议权重约 50%):候选人掌握的技能/工具/技术栈与岗位技能标签、JD 中要求的硬技能的覆盖程度;核心技能命中比软技能更重要,关注关键技能是否缺失。
|
||||
2. 学历匹配(建议权重约 20%):学历层次、院校、专业与岗位学历门槛及专业相关度;满足门槛即可得高分,明显高于要求不额外加分,低于门槛要扣分。
|
||||
3. 经验匹配(建议权重约 30%):工作/实习/项目/竞赛经历与岗位职责的相关性、年限、岗位层级、业务领域贴合度;优先看相关经历的深度与成果,而非堆数量。
|
||||
|
||||
【打分档位(用于校准总分)】
|
||||
- 90-100:高度匹配,核心技能基本全覆盖、学历达标、有强相关经验,可直接进入面试
|
||||
- 75-89:较匹配,主要要求满足,存在少量可弥补的差距
|
||||
- 60-74:基本匹配,满足部分核心要求,但有明显短板
|
||||
- 40-59:匹配度偏低,多数关键要求不满足
|
||||
- 0-39:基本不匹配或简历信息严重不足
|
||||
|
||||
【规则】
|
||||
1. 严格基于简历已有信息评估,简历中缺失或未提及的能力一律按"不具备"处理,不得臆测或脑补
|
||||
2. 客观打分,避免一律给高分;不相关的经历/技能不计入加分
|
||||
3. 岗位信息或简历信息明显不足时,应给保守分而非高分
|
||||
4. 先在心里完成三维度分析与加权,最终只输出一个综合整数分(0-100),越高代表越匹配
|
||||
|
||||
严格只返回 JSON,不要任何分析过程或其他内容:
|
||||
{{"score":85}}"""
|
||||
|
||||
@@ -24,6 +24,8 @@ class SkillGapModel:
|
||||
|
||||
class JobAgentModel:
|
||||
"""求职助手Agent模块"""
|
||||
# 岗位匹配评分:评估简历与岗位在技能/学历/经验上的匹配度,输出0-100分(评分要稳定,温度设0)
|
||||
MATCH_SCORE = LLM.DEEPSEEK_V4_FLASH.create(temperature=0)
|
||||
# 岗位简历-summary优化:针对具体岗位JD优化个人概述
|
||||
SUMMARY = LLM.DEEPSEEK_V4_FLASH.create(temperature=0.3)
|
||||
# 岗位简历-经历优化:针对具体岗位JD优化单条经历描述
|
||||
|
||||
Reference in New Issue
Block a user