Files
offerpai_python_ai/app/ai/resume_extractor/prompts.py
T
2026-07-01 19:00:36 +08:00

153 lines
13 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
第一阶段(概览):5路并行,只提取主表短字段和子表标识名。
第二阶段(详情):N路并行,每条子表记录单独提取短字段 + description/summary
AI 直接输出内容(不再返回行号区间),按原文结构分条/分段还原。
输入文本格式:简历纯文本全文(PyMuPDF/docx/txt 提取,保留原始换行)。
description/summary 输出格式:字符串数组 list[str],每个元素代表原文中的「一条 bullet / 一个段落」,
由前端按元素换行展示。规则:
- 忠实还原原文措辞,按原文的分条/分段拆成数组元素,一条 bullet 一个元素。
- 允许轻度清理:去除水印/页眉页脚/乱码碎片,把被 PDF 折断的同一句话拼回完整。
- 不主动改写、润色、扩写、编造内容;没有内容则返回空数组 []。
各详情 prompt 通用铁律(防跨记录串扰/重复):
- 只选取真正属于当前这条记录({name})本身的内容;即使原文中相邻的内容属于**另一条**记录
(另一家公司、另一个项目、另一段学历、校园/社团/实习/竞赛等),也**绝不纳入**。
- 同一段原文只应属于一条记录:不要为了描述完整而把其它记录已包含的内容再抄一遍,避免多条记录重复。
- 宁可少选,不确定归属的内容一律不选。
花括号用 {{ }} 转义,避免被 ChatPromptTemplate 当作变量。{name} 为运行时替换的记录标识名。
"""
# ==================== 第一阶段:概览提取 ====================
OVERVIEW_PROFILE_PROMPT = """严格根据简历原文提取,不要猜测或编造,没有的填null。
输入为简历纯文本全文。从中仅提取个人基本信息(不含技能、证书、自我评价),输出JSON:
```json
{{ "name": "姓名", "email": "邮箱", "mobileNumber": "手机号", "city": "所在城市", "wechatNumber": "微信号", "portfolioUrl": "作品集链接" }}
```
规则:
- 只提取以上6个字段,不提取skills/certificates/summary/经历。没有的填null。
- name:填完整姓名,原文怎么写就怎么填,不要截断或只取一个字。
- mobileNumber:只填**一个**手机号(通常11位数字),若原文出现多个手机号只取第一个,绝不能把多个号码拼接或用逗号/顿号等连接填入;微信号必须填到wechatNumber,绝不能把微信号当手机号。
- portfolioUrl:只填作品集/个人主页/GitHub 等链接。
只输出JSON。"""
OVERVIEW_EDUCATION_PROMPT = """严格根据简历原文提取,不要猜测或编造。
输入为简历纯文本全文。从中提取所有**学历教育**经历的标识名列表,输出JSON数组:
```json
["北京大学", "剑桥大学-哲学硕士", "剑桥大学-经济学士"]
```
规则:
1. 列出原文中每一个**实际就读或已获得学历**的**就读阶段**,不同阶段(本科/硕士/博士)分别列出,一段都不能漏。
2. 每个标识必须**唯一**:若同一所学校有多个不同就读阶段(如本科、硕士),用「学校+学位」区分(如"剑桥大学-硕士""剑桥大学-本科"),避免重名导致后续混淆。
3. **不要过度拆分**
- 联合培养、交换、访学、海外学期属于对应主学历就读的一部分,**并入该主学历那一条**,不要单列成独立教育记录。
- 同一学校同一就读阶段的双学位/主辅修,算**一条**,不要拆成两条。
4. 仅"录取通知/offer/拟就读但尚未入学"的,**不算**教育经历,不要列入。
5. 培训机构、实习/工作单位、科研机构、社团不算学历教育,不要列入。
6. 没有输出[]。只输出JSON。"""
OVERVIEW_WORK_PROMPT = """严格根据简历原文提取,不要猜测或编造。
输入为简历纯文本全文。从中提取工作经历和实习经历的公司标识名列表,输出JSON:
```json
{{ "work": ["阿里巴巴", "腾讯"], "internship": ["字节跳动"] }}
```
规则:
1. 明确标注"实习/intern"的归 internship,其余正式工作归 work。
2. 每个标识唯一:若同一公司有多段不同岗位/时间的经历,用「公司+岗位或时间」区分(如"腾讯-产品经理""腾讯-2020"),确保后续能分别提取,不要合并成一条。
3. 每一段真实的任职经历都要列出,不要遗漏;但同一段经历不要重复列。
4. 只提取公司名相关标识,不要把公司内部的具体项目当作工作/实习条目。
5. 没有填[]。只输出JSON。"""
OVERVIEW_PROJECT_PROMPT = """严格根据简历原文提取,不要猜测或编造。
输入为简历纯文本全文。从中仅提取项目经历的项目名称列表,输出JSON数组:
```json
["订单系统重构", "支付网关"]
```
规则:
1. 只提取作为**独立项目条目标题**出现的项目名(通常单独成行、常带"项目X:"前缀或【】标题、并配有自己的起止时间/角色/描述)。
2. **绝对不要**把出现在某段职责/产品描述句子内部、被"如/包括/例如/【】"等列举的功能点、模块、子功能当作项目(这些是描述内容,不是项目)。
3. **绝对不要**把社团/学生组织、校园活动、志愿服务、任职/职务、兴趣爱好当作项目——这些不是项目经历。
4. **绝对不要**把竞赛/比赛/大赛条目当作项目(如"XX大赛""挑战杯""创新创业大赛""职业规划大赛"等,以参赛/获奖为核心的条目)——这些归竞赛模块,即使参赛做了作品也不要在这里重复列。
5. 同一个项目只列一次,不要因为它在工作经历里被提到就重复列。
6. 没有输出[]。只输出JSON。"""
OVERVIEW_COMPETITION_PROMPT = """严格根据简历原文提取,不要猜测或编造。
输入为简历纯文本全文。从中仅提取竞赛/获奖经历的竞赛名称列表,输出JSON数组:
```json
["ACM区域赛", "数学建模大赛"]
```
规则:
1. 只提取真正的**竞赛/比赛/获奖**条目名称(以报名参赛、比赛名次/获奖为核心的条目,如"XX大赛""挑战杯""数学建模竞赛")。
2. 同一个竞赛只算一条,即使它拿了多个奖项,也不要按奖项拆成多条。
3. **绝对不要**把社团活动、职务、示例文字、描述里顺带提到的活动当作竞赛。
4. **绝对不要**把工作/实习/研究/开发**项目**当作竞赛——即使该项目获过奖,它仍归项目模块,不要在这里重复列(判断依据:条目本质是"做了一个项目/产品/研究"还是"参加了一场比赛")。
5. 奖学金、荣誉称号、考试成绩不属于竞赛,不要列入。
6. 没有输出[]。只输出JSON。"""
# ==================== 第二阶段:详情提取 ====================
# 通用尾注:description 数组的输出规范 + 清理规范。各详情 prompt 复用。
_DESC_RULE = """description 为字符串数组,每个元素是原文中的一条 bullet 或一个段落:忠实还原原文措辞,按原文分条拆成多个数组元素(一条 bullet 一个元素),不要把多条内容塞进同一个元素;允许轻度清理(去除水印/页眉页脚/乱码碎片、把被折断的同一句话拼回完整),但不要改写、润色、扩写或编造;没有描述则填[]。只选属于"{name}"这条记录的内容,不要串入其它公司/项目/教育/竞赛/社团经历的内容,即使它们在原文中相邻。只输出JSON。"""
DETAIL_EDUCATION_PROMPT = """严格根据简历原文提取,不要猜测或编造。输入为简历纯文本全文。
请提取"{name}"这条教育经历的详细信息,输出JSON:
```json
{{ "school": "学校", "major": "专业", "degree": "学历", "studyType": "全日制/非全日制", "startDate": "2020.09", "endDate": "2024.06", "description": ["描述段落1", "描述段落2"] }}
```
规则:短字段直接填值,时间格式YYYY.MM,没有的填null。
description 只填该校**学业本身**的额外正文(主修课程、绩点/排名、在校获得的学术成就);学校/专业/学历/时间已在上面字段提取,不要纳入。
**严禁纳入以下内容**(它们属于其它模块、会被单独提取,即使在原文中紧跟这条教育经历也不要选):实习、工作、项目、社团/学生组织、校园活动、志愿服务、竞赛获奖、科研/论文经历。宁可少选,不确定是否属于本校学业的内容一律不选。
""" + _DESC_RULE
DETAIL_WORK_PROMPT = """严格根据简历原文提取,不要猜测或编造。输入为简历纯文本全文。
请提取"{name}"这条工作经历的详细信息,输出JSON:
```json
{{ "companyName": "公司", "position": "职位", "startDate": "2024.07", "endDate": "2025.03", "description": ["描述段落1", "描述段落2"] }}
```
规则:短字段直接填值,时间格式YYYY.MM,在职/至今则 endDate 填null,没有的填null。
description 填直接描述该公司/岗位**整体职责或概述**的正文。若某段内容明显是某个**独立项目的明细**(且该项目会作为项目单独提取),不要纳入,避免与项目模块重复;但公司层面的职责概述应当保留,不要整条留空导致内容丢失。
""" + _DESC_RULE
DETAIL_INTERNSHIP_PROMPT = """严格根据简历原文提取,不要猜测或编造。输入为简历纯文本全文。
请提取"{name}"这条实习经历的详细信息,输出JSON:
```json
{{ "companyName": "公司", "position": "职位", "startDate": "2023.06", "endDate": "2023.09", "description": ["描述段落1", "描述段落2"] }}
```
规则:短字段直接填值,时间格式YYYY.MM,至今则 endDate 填null,没有的填null。
description 填直接描述该公司/岗位**整体职责或概述**的正文。若某段内容明显是某个**独立项目的明细**(且该项目会作为项目单独提取),不要纳入,避免与项目模块重复;但岗位层面的职责概述应保留,不要整条留空导致内容丢失。
""" + _DESC_RULE
DETAIL_PROJECT_PROMPT = """严格根据简历原文提取,不要猜测或编造。输入为简历纯文本全文。
请提取"{name}"这条项目经历的详细信息,输出JSON:
```json
{{ "companyName": "所属公司", "projectName": "项目名", "role": "角色名称", "startDate": "2023.03", "endDate": "2023.12", "description": ["描述段落1", "描述段落2"] }}
```
规则:短字段直接填值,时间格式YYYY.MM,没有的填null。
role 只填原文中**明确写出**的简短角色名;若原文没有写明该项目的角色,填null,**不要臆造或默认**(如不要凭空填"Developer""开发工程师""团队成员")。
description 填该项目的描述内容。
""" + _DESC_RULE
DETAIL_COMPETITION_PROMPT = """严格根据简历原文提取,不要猜测或编造。输入为简历纯文本全文。
请提取"{name}"这条竞赛/获奖经历的详细信息,输出JSON:
```json
{{ "competitionName": "竞赛名", "award": "获奖情况", "awardDate": "2023.07", "description": ["描述段落1", "描述段落2"] }}
```
规则:短字段直接填值,时间格式YYYY.MM,没有的填null。award 里可包含该竞赛的多个奖项,不要因为多个奖项而拆成多条。
description 填该竞赛/获奖的额外描述内容。
""" + _DESC_RULE
DETAIL_PROFILE_PROMPT = """严格根据简历原文提取,不要猜测或编造。输入为简历纯文本全文。
从中提取技能标签、证书和自我评价/个人概述,输出JSON:
```json
{{ "skills": ["技能1"], "certificates": ["证书1"], "summary": ["自我评价段落1", "自我评价段落2"] }}
```
规则:
- skills:仅当简历中有明确的"技能"/"专业技能"等**独立模块**时才提取,按原文逐字填,最多5个;如果没有专门的技能模块,填[]。**不要**从工作/项目/自我评价里归纳技能,尤其不要把"团队沟通""抗压能力""责任心"等软素质描述当作技能。**证书/语言等级类(如CET-4/6、雅思、托福、GRE、计算机等级、教师资格证等)一律不计入 skills,它们只归 certificates。**
- certificates:填真正的**证书/证件/标准化考试成绩**,包括语言与等级类(如CET-4/6、雅思、托福、GRE、计算机等级、教师资格证、驾照等)。**不要**把竞赛奖项、荣誉称号、名次、奖学金,或工作描述里顺带提到的"认证"句子当作证书;没有填[]。
- summary:自我评价/个人概述**正文**的字符串数组,按原文分段拆成数组元素。不要包含板块标题(如"个人优势""自我评价"),不要把技能列表、兴趣爱好、经历内容纳入;允许轻度清理(去除乱码/水印碎片),不要改写或编造;没有填[]。
只输出JSON。"""