package prompt import "fmt" var ( ResumeExtractor = `你是一位专业的中文简历信息提取专家。请仔细分析以下简历内容,全面提取所有信息并按指定格式输出。 【简历内容】 %s 【提取要求】 请全面分析文档内容,识别以下所有区块,并尽可能从已有信息中推断和补充缺失的字段: 1. 基本信息: - name: 姓名(通常在文档最开头,可能是最大的字体) - title: 当前职位/头衔(如"后端开发工程师"、"高级Java工程师") - email: 邮箱地址(包含@符号,可能在文档开头或结尾) - phone: 手机号码(11位数字,可能在文档开头或结尾) - location: 所在城市(如"北京"、"上海",可能在基本信息区域) - website: 个人网站或博客地址(包含http://或https://) - summary: 个人简介或自我评价(通常以"个人简介"、"自我评价"、"职业概述"等开头) - experience_years: 工作年限(从工作经历计算,填数字,如3、5、8) - job_target: 求职目标或意向岗位(如果没有明确说明,可从当前职位推断) - industry: 所属行业(如互联网、教育、金融、电商,从公司名称或描述推断) - core_advantages: 核心优势或个人亮点(从工作经历和项目经验中提炼) 2. 工作经历: - company: 公司名称 - position: 职位名称 - start_date: 开始时间(格式YYYY-MM) - end_date: 结束时间(格式YYYY-MM,"至今"或"当前"填"present") - description: 工作职责描述(详细描述日常工作内容) - highlights: 工作亮点或主要成就(用列表表示,从描述中提炼关键成果) - platforms: 负责的线上平台或产品名称(如有) 3. 教育背景: - school: 学校名称 - degree: 学位(本科/硕士/博士/大专/高中等) - major: 专业名称 - start_date: 入学时间(格式YYYY-MM) - end_date: 毕业时间(格式YYYY-MM) - gpa: GPA成绩(如有) 4. 专业技能: - name: 技能名称(如Java、Python、MySQL、Redis、Vue.js、Docker) - level: 熟练程度(入门/初级/中级/高级/精通,根据描述推断) - category: 技能分类(后端/前端/数据库/运维/移动端/人工智能/工具/其他) 5. 项目经验: - name: 项目名称 - description: 项目描述(项目的目的、规模、主要功能) - tech_stack: 技术栈列表(从项目描述和工作经历中提取使用的技术) - url: 项目链接(如有) - highlights: 项目亮点(主要负责的工作、解决的问题) - achievements: 项目成果(量化的成果、获得的奖励等) - start_date: 开始时间(格式YYYY-MM) - end_date: 结束时间(格式YYYY-MM) 【数据补充规则】 1. 如果工作年限没有明确说明,根据工作经历的时间跨度计算得出 2. 如果求职目标没有明确说明,可从当前职位或工作经历推断 3. 如果行业没有明确说明,从公司名称或工作描述推断 4. 如果技能的熟练程度没有明确说明,根据使用频率和描述推断(如"精通"、"熟练"、"熟悉"、"了解") 5. 如果技能分类不确定,根据技能性质归类(如Java属于后端,Vue.js属于前端,MySQL属于数据库) 6. 如果项目的技术栈没有明确说明,从项目描述中提取使用的技术 7. 如果项目亮点和成果没有明确说明,从项目描述中提炼关键贡献 8. 如果核心优势没有明确说明,从工作经历和项目经验中提炼3-5个关键点 【关键词识别】 - 基本信息区域关键词:姓名、电话、手机、邮箱、邮箱地址、地址、所在地、籍贯、个人简介、自我评价、职业概述、求职意向、工作年限 - 工作经历区域关键词:工作经历、工作经验、职业经历、工作背景、公司、任职时间、工作职责、负责内容 - 教育背景区域关键词:教育背景、学历、教育经历、毕业院校、学校、学位、专业 - 技能区域关键词:专业技能、技能特长、技术能力、掌握技能、熟练掌握、了解、精通 - 项目经验区域关键词:项目经验、项目经历、项目背景、项目名称、负责项目、参与项目 【重要提示】 1. 请按照文档中的实际内容提取,不要遗漏任何信息 2. 如果某个字段在简历中确实找不到,请填空字符串""或空数组[] 3. 时间格式统一为YYYY-MM,"至今"或"当前"填"present" 4. 工作年限只填数字,不要填"年"字 5. 请确保提取的信息与文档内容完全一致 6. 如果发现冲突信息,请以文档中最新的信息为准 【输出格式】 请直接输出JSON,不要包含markdown代码块标记,格式如下: { "basic_info": { "name": "", "title": "", "email": "", "phone": "", "location": "", "website": "", "summary": "", "experience_years": "", "job_target": "", "industry": "", "core_advantages": [] }, "experience": [ { "company": "", "position": "", "start_date": "", "end_date": "", "description": "", "highlights": [], "platforms": [] } ], "education": [ { "school": "", "degree": "", "major": "", "start_date": "", "end_date": "", "gpa": "" } ], "skills": [ { "name": "", "level": "", "category": "" } ], "projects": [ { "name": "", "description": "", "tech_stack": [], "url": "", "highlights": [], "achievements": [], "start_date": "", "end_date": "" } ] }` RAGAnswer = `你是一位专业的简历分析助手。请根据以下上下文信息回答用户的问题。 【上下文信息】 %s 【用户问题】 %s 【回答要求】 1. 优先使用上下文信息回答问题 2. 如果上下文没有相关信息,可以使用你的内部知识 3. 回答要准确、简洁,符合中文表达习惯 4. 如果无法回答,请明确说明` PolishSummary = `你是一位专业的简历优化专家。请优化以下个人简介,使其更加专业、简洁、有吸引力: 原文: %s 优化要求: 1. 突出核心竞争力和独特价值 2. 使用行动动词和量化成果 3. 保持专业但不过于生硬 4. 控制在150字以内 5. 保持原意,不要编造信息 请直接输出优化后的内容,不要包含其他解释。` PolishExperience = `你是一位专业的简历优化专家。请优化以下工作经历描述,使其更加专业、量化、有说服力: 公司:%s 职位:%s 原描述: %s 优化要求: 1. 使用STAR法则(情境-任务-行动-结果) 2. 突出量化成果和数据指标 3. 使用专业术语和行业关键词 4. 突出个人贡献而非团队成果 5. 保持原意,不要编造信息 请直接输出优化后的内容,不要包含其他解释。` PolishProject = `你是一位专业的简历优化专家。请优化以下项目描述,使其更加专业、突出技术能力和成果: 项目名称:%s 原描述: %s 优化要求: 1. 清晰描述技术架构和技术栈 2. 突出个人技术贡献和解决的难题 3. 量化项目成果和影响 4. 使用专业技术术语 5. 保持原意,不要编造信息 请直接输出优化后的内容,不要包含其他解释。` PolishDescription = `你是一位专业的简历优化专家。请优化以下%s内容: 原文: %s 优化要求: 1. 语言更加专业、精炼 2. 突出重点和亮点 3. 使用适当的行业术语 4. 保持原意,不要编造信息 5. 格式清晰易读 请直接输出优化后的内容,不要包含其他解释。` DocumentAnalysis = `你是一位专业的文档分析助手。请根据以下文档内容回答用户问题。 文档内容: %s 用户问题:%s 回答要求: 1. 仅基于提供的文档内容回答,不要编造信息 2. 如果文档内容不足以回答问题,请明确说明 3. 回答要简洁准确,避免冗长` QuestionGeneration = `你是一位专业的技术面试官和出题专家。请根据以下简历内容和技术关键词,生成高质量的面试题目。 简历内容: %s 技术关键词:%s 题目类型:%s 生成规则(必须严格遵守,否则任务失败): 1. 每种题目类型必须生成4道题目,不得少于4道,不得多于5道 2. 如果包含4种题型(选择题、填空题、简答题、算法设计题),必须生成16道题目(4×4) 3. 如果包含3种题型,必须生成12道题目(4×3) 4. 如果包含2种题型,必须生成8道题目(4×2) 5. 选择题必须有4个选项,正确答案必须是选项之一 6. 填空题必须有明确的填空位置,用___表示 7. 每道题必须有详细的解析,不少于50字 8. 答案必须完整准确,代码题要有可运行的代码示例 9. 题目难度在初级、入门、中级、进阶之间均匀分布 10. 每道题至少包含2个技术关键词 11. 输出格式必须为纯JSON数组,不要包含任何markdown标记、代码块标记或额外文字 12. JSON字符串中所有双引号必须使用反斜杠转义 JSON格式要求(必须严格遵守,每种类型4题): [ { "type": "mcq", "text": "选择题题目内容", "options": ["选项A", "选项B", "选项C", "选项D"], "answer": "正确答案(如A、B、C、D)", "analysis": "题目解析,直接给出解析内容", "score": 10, "keywords": ["关键词1", "关键词2"], "difficulty": "初级", "category": "分类名称" }, { "type": "fill", "text": "填空题题目内容(用___表示填空位置)", "answer": "正确答案", "analysis": "题目解析", "score": 5, "keywords": ["关键词1"], "difficulty": "入门", "category": "分类名称" }, { "type": "sa", "text": "简答题题目内容", "answer": "参考答案", "analysis": "详细解析", "score": 15, "keywords": ["关键词1", "关键词2"], "difficulty": "中级", "category": "分类名称" }, { "type": "algo", "text": "算法题题目内容", "answer": "代码答案", "analysis": "详细解析", "score": 20, "keywords": ["关键词1"], "difficulty": "进阶", "category": "算法" } ] 请立即开始生成题目,严格按照上述规则输出JSON数组。如果题目数量不够或格式不正确,将被视为任务失败。` QuestionGenerationForType = `你是一位专业的技术面试官和出题专家。题目和答案必须严谨专业,符合面试需求,不得出现错误或漏洞。 请根据以下简历内容和技术关键词,生成高质量的%s。 简历内容: %s 技术关键词:%s 生成规则(必须严格遵守,否则任务失败): 1. 必须生成5道%s,不得少于5道 2. 选择题必须有4个选项,答案字段必须只包含选项字母A、B、C或D,不能包含选项内容文字 3. 选择题的选项必须清晰明确,互不重叠,只有一个正确答案 4. 填空题必须有明确的填空位置,用___表示 5. 每道题必须有详细的解析,不少于50字 6. 答案必须完整准确,代码题要有可运行的代码示例 7. 题目难度在初级、入门、中级、进阶之间均匀分布 8. 每道题至少包含2个技术关键词 9. 输出格式必须为纯JSON数组,不要包含任何markdown标记、代码块标记或额外文字 10. JSON字符串中所有双引号必须使用反斜杠转义 11. 确保题目和答案正确无误,避免出现逻辑漏洞或事实错误 JSON格式要求(必须严格遵守,生成5道%s): [ %s ] 请立即开始生成题目,严格按照上述规则输出JSON数组。` ) func BuildResumeExtractorPrompt(content string) string { return fmt.Sprintf(ResumeExtractor, content) } func BuildRAGAnswerPrompt(context, query string) string { return fmt.Sprintf(RAGAnswer, context, query) } func BuildPolishSummaryPrompt(original string) string { return fmt.Sprintf(PolishSummary, original) } func BuildPolishExperiencePrompt(original, company, position string) string { return fmt.Sprintf(PolishExperience, company, position, original) } func BuildPolishProjectPrompt(original, projectName string) string { return fmt.Sprintf(PolishProject, projectName, original) } func BuildPolishDescriptionPrompt(original, fieldType string) string { var fieldName string switch fieldType { case "summary": fieldName = "个人简介" case "experience": fieldName = "工作经历" case "project": fieldName = "项目描述" case "education": fieldName = "教育背景" case "skill": fieldName = "技能描述" default: fieldName = "文本内容" } return fmt.Sprintf(PolishDescription, fieldName, original) } func BuildDocumentAnalysisPrompt(context, question string) string { return fmt.Sprintf(DocumentAnalysis, context, question) } func BuildQuestionGenerationPrompt(resumeText string, keywords []string, types []string) string { typeNames := map[string]string{ "mcq": "选择题", "fill": "填空题", "sa": "简答题", "algo": "算法设计题", } var typeDesc string for i, t := range types { if i > 0 { typeDesc += "、" } typeDesc += typeNames[t] } return fmt.Sprintf(QuestionGeneration, resumeText, joinKeywords(keywords), typeDesc) } func BuildQuestionGenerationPromptForType(resumeText string, keywords []string, qType string) string { typeNames := map[string]string{ "mcq": "选择题", "fill": "填空题", "sa": "简答题", "algo": "算法设计题", } typeName := typeNames[qType] if typeName == "" { typeName = qType } var formatExample string switch qType { case "mcq": formatExample = `{ "type": "mcq", "text": "题目内容", "options": ["选项A内容", "选项B内容", "选项C内容", "选项D内容"], "answer": "A", "analysis": "详细解析,不少于50字,说明每个选项为什么对或错", "score": 10, "keywords": ["关键词1", "关键词2"], "difficulty": "初级", "category": "分类名称" }` case "fill": formatExample = `{ "type": "fill", "text": "题目内容(用___表示填空位置)", "answer": "正确答案", "analysis": "详细解析,不少于50字,解释答案的由来", "score": 5, "keywords": ["关键词1", "关键词2"], "difficulty": "入门", "category": "分类名称" }` case "sa": formatExample = `{ "type": "sa", "text": "题目内容", "answer": "参考答案,完整准确", "analysis": "详细解析,不少于100字,深入解释原理", "score": 15, "keywords": ["关键词1", "关键词2"], "difficulty": "中级", "category": "分类名称" }` case "algo": formatExample = `{ "type": "algo", "text": "题目内容", "answer": "完整可运行的代码示例", "analysis": "详细解析,不少于100字,解释算法思路和复杂度", "score": 20, "keywords": ["关键词1", "关键词2"], "difficulty": "进阶", "category": "算法" }` } return fmt.Sprintf(QuestionGenerationForType, typeName, resumeText, joinKeywords(keywords), typeName, typeName, formatExample) } func joinKeywords(keywords []string) string { var result string for i, kw := range keywords { if i > 0 { result += ", " } result += kw } return result }