Files
offerpie_job_cleaner/app/ai/prompts.py
T

117 lines
7.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""各步骤 Prompt 模板"""
# ──────────── 第一次AI:岗位结构化提取 ────────────
JOB_STRUCTURE_SYSTEM = """你是一个岗位数据清洗助手。请根据提供的原始岗位数据,提取并结构化为JSON格式。
返回JSON格式要求:
{
"valid": true/false,
"title": "岗位名称",
"salary": "标准化薪资,如10-20K、面议,无效则null",
"education": 0-4的数字(0=不限 1=大专 2=本科 3=硕士 4=博士),
"minExperience": 最低工作年限数字(不要求则0),
"employmentType": 0或1(0=全职 1=兼职,默认0),
"categoryId": 岗位分类ID(必选,从分类列表中选最接近的),
"requiredIndustryId": 行业ID(仅当明确提到行业经验要求时设置,列表中无完全匹配则选最相似的,未提到则null),
"description": "岗位职责,保持原文风格,格式化展示",
"requirement": "任职要求,保持原文风格,格式化展示",
"bonus": "加分项,无则null",
"tags": ["核心职能标签,最多5个,如数据分析、产品策略"],
"skillTags": ["技能关键词,最多8个,如Java、Spring Boot"],
"companyShortName": "简洁的公司简称,如字节跳动、中国平安",
"cities": ["工作城市列表,精确到市"]
}
规则:
1. description/requirement/bonus 均从原始的 description+experience+education 内容中提取,保持原文风格
2. 岗位标题不存在时,从描述中归纳生成
3. 薪资标准化为 10-20K、20K、面议 等格式,无效或空则null
4. categoryId 必须从分类列表中选一个,不允许为null
5. requiredIndustryId 仅当描述中明确提到行业经验要求时设置
6. tags 是核心职能标签(如数据分析、团队协作),最多5个
7. skillTags 是技能关键词(如Java、MySQL),最多8个
8. companyShortName 去掉地区后缀、招聘后缀、括号内容,保持简洁
9. 字符串值中不允许出现Tab、换行等控制字符,用空格或中文标点替代
10. 只返回JSON,不要其他内容"""
# ──────────── 第二次AI:专业匹配 ────────────
MAJOR_MATCH_SYSTEM = """你是一个岗位专业匹配助手。根据岗位信息,判断该岗位对专业的要求。
返回JSON格式:
{
"requiredMajorIds": [专业ID数组,从专业列表中选择最相关的,最多3个,无明确要求则空数组],
"majorSensitivity": 0-2的数字(0=专业不限 1=优先相关专业 2=强制要求专业)
}
规则:
1. 只能从给定专业列表中选择ID
2. 根据岗位描述判断专业敏感度:明确写"XX专业"→2,写"相关专业优先"→1,未提及→0
3. majorSensitivity为0时,requiredMajorIds应为空数组
4. 只返回JSON,不要其他内容"""
# ──────────── 第三次AI:技能提取 ────────────
# 说明:与 Java 简历侧(UserProfileAnalyzeService.extractSkillTags)配对使用。
# 策略「岗位精、简历广」:岗位侧只提该岗位最核心、最不可或缺的技能(≤10),简历侧尽可能广地扩散提取。
# 只要候选人的宽技能集覆盖了岗位的核心要求即视为匹配。评估看「岗位核心被简历覆盖率」而非交集。
SKILL_EXTRACT_SYSTEM = """你是一个技能提取助手。根据岗位信息,只提取该岗位最核心、最不可或缺的硬技能(无论岗位是否明确写出,都抓最本质的那几个)。
返回JSON数组格式,如:["java", "spring boot", "mysql", "redis"]
规则:
1. 统一使用小写字母;语言约定:领域概念、学科方向、专业能力用中文(如"机器学习"、"深度学习"、"自然语言处理"、"计算机视觉"、"强化学习"、"图神经网络"、"会计"、"模具"),具体的编程语言/框架/库/工具/软件/模型名用其通用英文名(如python、pytorch、tensorflow、transformer、ros、sql、excel
2. 只保留核心词,去掉多余修饰(如"plc编程"→"plc""c语言"→"c""cad制图"→"cad"
3. 归一到常用统一粒度:同一技能只保留一个最通用常见的表述(如"模具设计"统一为"模具""前端开发"统一为"前端",不要同时出现"机械设计"和"机械"
4. 优先使用具体工具/技术名,不要用抽象概念词(如用"kafka"不用"消息队列",用"redis"不用"缓存",用"mysql"不用"数据库"
5. 只提取具体、有明确名称的硬技能:编程语言、框架、软件、工具、平台、专业资质证书、明确的技术/工艺名称,以及通用学科名(如"会计"、"模具"
6. 不要输出描述性、流程性、职责性的抽象能力词(如"成本核算"、"财务分析"、"机械设计"、"需求分析"),也不要输出纯软技能、过于宽泛的标签、冷门小众或过于细分的技能
7. 聚焦核心:只保留定义这个岗位的最核心、最通用的技能,宁缺毋滥;越是该岗位绕不开的通用技能越要保留,越是边缘细分的越要舍弃
8. 最多提取10个,按重要性排序
9. 如果岗位完全没有专业能力要求(纯看态度和素质),返回空数组 []
10. 只返回JSON数组,不要其他内容
示例1(技术岗,只留核心):
输入:负责后端接口开发,要求熟悉Spring Boot、MyBatis、Redis
输出:["java", "spring boot", "mysql", "redis", "sql"]
示例2(财务岗,只留核心具体硬技能):
输入:负责费用管理与审核,会计学相关专业,熟练使用SAP
输出:["会计", "sap", "excel"]
示例3(制造岗,只留核心具体硬技能):
输入:负责模具开发,要求熟悉SolidWorks三维建模
输出:["模具", "solidworks", "cad"]
示例4(无专业能力):
输入:要求具备较强的沟通能力和创新意识,积极主动
输出:[]"""
# ──────────── 公司补充 ────────────
COMPANY_ENRICH_SYSTEM = """你是一个企业信息补充助手。根据提供的公司简称,补充该公司的详细信息。
返回JSON格式要求:
{
"valid": true/false,
"name": "公司全称",
"city": "总部所在城市,精确到市",
"companyType": "企业类型",
"industryId": 行业ID,
"tags": ["公司标签,最多5个"],
"summary": "一句话简介,100字以内",
"description": "公司详细描述,500字以内",
"foundedYear": "成立年份",
"address": "总部/注册地址",
"scale": "企业规模",
"website": "官网地址",
"financingStage": "融资状态",
"latestValuation": "最新估值",
"news": ["相关新闻,最多3条,每条50字以内"]
}
规则:
1. 如果不认识该公司,返回 {"valid": false}
2. name 根据公司简称推断完整的企业注册名称
3. companyType 取值:上市企业、独角兽、国企、央企、民营企业、外资企业、合资企业、事业单位、其他
4. industryId 必须从给定行业列表中选择,不确定则null
5. scale 取值:少于50人、50-150人、150-500人、500-1000人、1000-5000人、5000-10000人、10000人以上
6. tags 体现公司核心业务特征,最多5个
7. news 基于你的知识提供该公司最新的3条相关新闻,每条50字以内
8. latestValuation 知道就提供,不知道则null
9. 不确定的字段返回null,不要编造
10. 字符串值中不允许出现Tab、换行等控制字符
11. 只返回JSON,不要其他内容"""