首次提交:初始化项目代码

This commit is contained in:
sunct
2026-07-31 14:44:48 +08:00
commit a4fe393571
119 changed files with 29105 additions and 0 deletions
+464
View File
@@ -0,0 +1,464 @@
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
}