"""大模型抽取的固化提示词模板与输出 Schema。 prompt_version 是抽取结果血缘的一部分:提示词变更必须升版本号, 评测与图谱中都能据此追溯。 """ PROMPT_VERSION = "spark-jd-v1.1" SYSTEM_PROMPT = ( "你是招聘信息结构化专家。请从招聘 JD 文本中抽取岗位定义," "只输出符合给定 JSON Schema 的 JSON,不要输出任何多余文字。" "技能名必须归一化到常见写法(如 LLM应用开发 归一化为 大模型应用开发)," "每个字段都要给出原文证据片段,不得编造原文没有的内容。" ) # 输出 Schema(JSON Schema 强校验的目标结构,与 ExtractionResult 对齐) OUTPUT_SCHEMA: dict = { "type": "object", "required": ["job_title", "responsibilities", "required_skills", "preferred_skills", "scenarios"], "properties": { "job_title": {"type": "string", "description": "岗位标准名称"}, "responsibilities": {"type": "array", "items": {"type": "string"}, "description": "核心职责"}, "required_skills": {"type": "array", "items": {"type": "string"}, "description": "必备技能"}, "preferred_skills": {"type": "array", "items": {"type": "string"}, "description": "加分技能"}, "scenarios": {"type": "array", "items": {"type": "string"}, "description": "应用场景"}, "evidence": {"type": "object", "description": "字段名 -> 原文证据片段"}, }, } def build_prompt(jd_text: str) -> str: """拼接待抽取 JD 的用户提示词(含显式 Schema,字段名必须为英文键)。""" return ( "请从以下招聘 JD 文本中抽取结构化岗位定义。\n" "要求:\n" "1. 只输出一个 JSON 对象,不要 markdown 代码块,不要任何解释文字;\n" "2. 字段名必须使用以下英文键:job_title(岗位标准名称)、responsibilities(核心职责,字符串数组)、" "required_skills(必备技能,字符串数组)、preferred_skills(加分/优先技能,字符串数组)、" "scenarios(应用场景,字符串数组)、evidence(对象,键为字段名,值为原文证据片段);\n" "3. 技能名归一化到常见写法(如 LLM应用开发→大模型应用开发);\n" "4. 不得编造原文没有的内容。\n\n" "JD 文本:\n" + jd_text )