更新技能

This commit is contained in:
zk
2026-06-24 10:32:26 +08:00
parent 2f38c80207
commit 556302816b
4 changed files with 60 additions and 33 deletions
+13 -5
View File
@@ -28,17 +28,25 @@ _skill_gap_chain = (
)
async def analyze_skill_gap(skill_tags: list[str], resume_json: str) -> list[str]:
"""分析技能差距,返回缺失技能列表"""
async def analyze_skill_gap(skill_tags: list[str], resume_json: str) -> list[dict]:
"""分析技能差距,返回差距条目列表 [{keyword, title, description}]keyword 为缺失技能"""
try:
raw = await _skill_gap_chain.ainvoke({"skill_tags": str(skill_tags), "resume_json": resume_json})
result = parse_llm_json(raw)
if isinstance(result, list):
return [s for s in result if isinstance(s, str) and s in skill_tags]
return skill_tags # 解析异常降级:全部标记缺失
return result
return _fallback_gaps(skill_tags) # 解析异常降级:全部标记缺失
except Exception as e:
log.warning(f"AI技能差距分析失败: {e}")
return skill_tags # 降级:全部标记缺失
return _fallback_gaps(skill_tags) # 降级:全部标记缺失
def _fallback_gaps(skill_tags: list[str]) -> list[dict]:
"""降级:把全部岗位技能标记为缺失"""
return [
{"keyword": kw, "title": f"缺少{kw}", "description": "岗位要求该技能,简历暂未体现。"}
for kw in skill_tags
]
# ===== 定制简历 - summary 优化 =====
+10 -5
View File
@@ -3,7 +3,7 @@
注意:prompt 中的 JSON 示例花括号必须用 {{ }} 转义,避免被 ChatPromptTemplate 当作变量。
"""
SKILL_GAP_PROMPT = """你是一个技能匹配助手。给定岗位要求的技能标签列表和用户简历信息,判断用户简历中未覆盖的技能。
SKILL_GAP_PROMPT = """你是一个技能匹配助手。给定岗位要求的技能标签列表和用户简历信息,找出用户简历中未覆盖的技能并生成差距说明
【岗位技能标签】
{skill_tags}
@@ -13,10 +13,15 @@ SKILL_GAP_PROMPT = """你是一个技能匹配助手。给定岗位要求的技
规则:
1. 逐个判断岗位技能标签,用户简历中是否体现了该技能(包括直接提及、经历中隐含的技能)
2. 只输出用户简历未覆盖的技能,必须是岗位技能标签的子集,原文输出不要修改
3. 返回 JSON 数组格式,如:["Python", "SQL"]
4. 如果全部覆盖,返回空数组 []
5. 只返回 JSON 数组,不要其他内容"""
2. 只针对未覆盖的技能输出差距条目,已覆盖的技能不输出
3. 每个差距条目包含三个字段:
- keyword:缺失的技能,必须是岗位技能标签中的原文,不要修改
- title:差距点的简短标题,不超过 12 个字(例如"缺少 SQL 关键词"
- description:结合岗位要求的一句说明或建议,不超过 30 个字
4. 返回 JSON 数组格式,如:
[{{"keyword": "SQL", "title": "缺少 SQL 关键词", "description": "岗位要求数据查询分析能力,简历未体现。"}}]
5. 如果全部覆盖,返回空数组 []
6. 只返回 JSON 数组,不要其他内容"""
SUMMARY_OPTIMIZE_PROMPT = """你是一个简历优化助手。根据目标岗位信息,微调用户的个人概述。
+8 -7
View File
@@ -79,19 +79,20 @@ class SkillGapService:
return self._gap_result(10.0, job, detail.resume, [])
# 4. 拼 AI 输入
resume_json = _build_resume_json(detail)
# 5. AI 分析
missing = await analyze_skill_gap(skill_tags, resume_json)
# 6. 计算匹配分
score = round((len(skill_tags) - len(missing)) / len(skill_tags) * 10, 1)
return self._gap_result(score, job, detail.resume, missing)
# 5. AI 分析(返回差距条目 [{keyword, title, description}]
gaps = await analyze_skill_gap(skill_tags, resume_json)
# 6. 计算匹配分(缺失技能 = 差距条目的 keyword)
missing_count = len(gaps)
score = round((len(skill_tags) - missing_count) / len(skill_tags) * 10, 1)
return self._gap_result(score, job, detail.resume, gaps)
@staticmethod
def _gap_result(score: float, job: Job, resume: UserResume, missing: list[str]) -> dict:
def _gap_result(score: float, job: Job, resume: UserResume, gaps: list[dict]) -> dict:
return {
"score": score,
"job": {"jobId": str(job.id), "title": job.title, "skillTags": job.skill_tags or []},
"resume": {"resumeId": str(resume.id), "resumeName": resume.resume_name or "", "targetPosition": resume.target_position or ""},
"missingSkills": missing,
"gaps": gaps,
}
# ===== 生成定制简历 =====