"""简历两阶段提取 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。"""