diff --git a/app/ai/resume_extractor/prompts.py b/app/ai/resume_extractor/prompts.py index d57e58c..b5d51e1 100644 --- a/app/ai/resume_extractor/prompts.py +++ b/app/ai/resume_extractor/prompts.py @@ -18,6 +18,22 @@ description/summary 输出格式:字符串数组 list[str],每个元素代 - 同一段原文只应属于一条记录:不要为了描述完整而把其它记录已包含的内容再抄一遍,避免多条记录重复。 - 宁可少选,不确定归属的内容一律不选。 +模块归属总原则(防同一内容被多个模块重复收录): + - 原文中的**每一段经历只能归属一个模块**。一条内容要么是工作、要么是实习、要么是项目、要么是竞赛,不能同时出现在两个模块。 + - 工作/实习经历条目内部所描述的职责、成果、子项目,属于该**工作/实习**记录本身的描述,**不要**再把它们抽成独立的"项目"记录。 + - 只有出现在**独立"项目/项目经历"板块**下、有自己标题的条目,才算项目记录。 + - "做了作品/项目 + 参加比赛获奖"这类既像项目又像竞赛的条目(如机器人竞赛、创新创业大赛作品),**只归竞赛**,不要在项目里重复。 + +description/summary 输出的**分条铁律**(必须遵守): + - description 是**字符串数组**,原文中的**每一条 bullet / 每一个段落**各自作为**一个独立数组元素**。 + - **严禁**把多条 bullet 合并进同一个元素;**严禁**用 " / "、";"、"、"、换行符等把多条内容拼接成一个长字符串。 + - 正例:["负责A模块开发", "主导B方案落地"];反例(禁止):["负责A模块开发 / 主导B方案落地"]。 + +短字段准确性铁律: + - 时间:起止时间按原文如实填写,**开始时间不得晚于结束时间**,不要把起止写反;无法确定的填 null,不要臆造精确年月。 + - 手机号:完整照抄,不要漏位、截断或改写(通常 11 位);微信号只填到 wechatNumber,绝不当手机号。 + - 角色/职位等:只填原文明确写出的,原文没有就填 null,**不要臆造或按常见值默认补全**。 + 花括号用 {{ }} 转义,避免被 ChatPromptTemplate 当作变量。{name} 为运行时替换的记录标识名。 """ @@ -43,9 +59,10 @@ OVERVIEW_EDUCATION_PROMPT = """严格根据简历原文提取,不要猜测或 规则: 1. 列出原文中每一个**实际就读或已获得学历**的**就读阶段**,不同阶段(本科/硕士/博士)分别列出,一段都不能漏。 2. 每个标识必须**唯一**:若同一所学校有多个不同就读阶段(如本科、硕士),用「学校+学位」区分(如"剑桥大学-硕士""剑桥大学-本科"),避免重名导致后续混淆。 -3. **不要过度拆分**: - - 联合培养、交换、访学、海外学期属于对应主学历就读的一部分,**并入该主学历那一条**,不要单列成独立教育记录。 - - 同一学校同一就读阶段的双学位/主辅修,算**一条**,不要拆成两条。 +3. **不要过度拆分**(这是最常见的错误,务必克制): + - 联合培养、交换、访学、海外学期、双学位/主辅修,都属于对应主学历就读的一部分,**并入该主学历那一条**,不要单列成独立教育记录。 + - 同一所学校**同一就读阶段**只能有一条,不要因为专业不同、学院不同、或原文重复出现就拆成/重复成多条。 + - 一个人的教育条目数 = 其真实就读的学历阶段数(通常本科1条、硕士1条…),不要多。 4. 仅"录取通知/offer/拟就读但尚未入学"的,**不算**教育经历,不要列入。 5. 培训机构、实习/工作单位、科研机构、社团不算学历教育,不要列入。 6. 没有输出[]。只输出JSON。""" @@ -68,12 +85,13 @@ OVERVIEW_PROJECT_PROMPT = """严格根据简历原文提取,不要猜测或编 ["订单系统重构", "支付网关"] ``` 规则: -1. 只提取作为**独立项目条目标题**出现的项目名(通常单独成行、常带"项目X:"前缀或【】标题、并配有自己的起止时间/角色/描述)。 -2. **绝对不要**把出现在某段职责/产品描述句子内部、被"如/包括/例如/【】"等列举的功能点、模块、子功能当作项目(这些是描述内容,不是项目)。 -3. **绝对不要**把社团/学生组织、校园活动、志愿服务、任职/职务、兴趣爱好当作项目——这些不是项目经历。 -4. **绝对不要**把竞赛/比赛/大赛条目当作项目(如"XX大赛""挑战杯""创新创业大赛""职业规划大赛"等,以参赛/获奖为核心的条目)——这些归竞赛模块,即使参赛做了作品也不要在这里重复列。 -5. 同一个项目只列一次,不要因为它在工作经历里被提到就重复列。 -6. 没有输出[]。只输出JSON。""" +1. 只提取出现在**独立"项目/项目经历"板块**下、有自己标题的项目条目(通常单独成行、常带"项目X:"前缀或【】标题、并配有自己的起止时间/角色/描述)。 +2. **绝对不要**把"工作经历/实习经历"条目内部描述的职责、成果、子项目当作独立项目——它们属于对应的工作/实习记录,不要在项目模块重复收录。 +3. **绝对不要**把出现在某段职责/产品描述句子内部、被"如/包括/例如/【】"等列举的功能点、模块、子功能当作项目(这些是描述内容,不是项目)。 +4. **绝对不要**把社团/学生组织、校园活动、志愿服务、任职/职务、兴趣爱好当作项目——这些不是项目经历。 +5. **绝对不要**把竞赛/比赛/大赛条目当作项目(如"XX大赛""挑战杯""创新创业大赛""职业规划大赛"等,以参赛/获奖为核心的条目,即使参赛做了作品)——这些归竞赛模块。 +6. 同一个项目只列一次。 +7. 没有输出[]。只输出JSON。""" OVERVIEW_COMPETITION_PROMPT = """严格根据简历原文提取,不要猜测或编造。 输入为简历纯文本全文。从中仅提取竞赛/获奖经历的竞赛名称列表,输出JSON数组: @@ -91,7 +109,7 @@ OVERVIEW_COMPETITION_PROMPT = """严格根据简历原文提取,不要猜测 # ==================== 第二阶段:详情提取 ==================== # 通用尾注:description 数组的输出规范 + 清理规范。各详情 prompt 复用。 -_DESC_RULE = """description 为字符串数组,每个元素是原文中的一条 bullet 或一个段落:忠实还原原文措辞,按原文分条拆成多个数组元素(一条 bullet 一个元素),不要把多条内容塞进同一个元素;允许轻度清理(去除水印/页眉页脚/乱码碎片、把被折断的同一句话拼回完整),但不要改写、润色、扩写或编造;没有描述则填[]。只选属于"{name}"这条记录的内容,不要串入其它公司/项目/教育/竞赛/社团经历的内容,即使它们在原文中相邻。只输出JSON。""" +_DESC_RULE = """description 为字符串数组,**每个元素只装原文中的一条 bullet 或一个段落**:忠实还原原文措辞;**严禁把多条 bullet 合并进一个元素,严禁用 " / "、";"、换行等符号把多条内容拼成一个长字符串**(正例 ["做了A","做了B"];反例 ["做了A / 做了B"])。允许轻度清理(去除水印/页眉页脚/乱码碎片、把被折断的同一句话拼回完整),但不要改写、润色、扩写或编造;没有描述则填[]。只选属于"{name}"这条记录的内容,不要串入其它公司/项目/教育/竞赛/社团经历的内容,即使它们在原文中相邻。只输出JSON。""" DETAIL_EDUCATION_PROMPT = """严格根据简历原文提取,不要猜测或编造。输入为简历纯文本全文。 请提取"{name}"这条教育经历的详细信息,输出JSON: