Resume Scorer - 简历评分与优化建议
Overview
对用户简历进行综合评分(满分 100)并给出聚焦优化建议。评分模型整合自 Harvard 职业中心、Harvard 公共卫生学院 Resume Guide 及国内多个高校就业指导中心的公开最佳实践。
核心设计:混合评分架构以降低 token 消耗
- 6 个简历模块(个人信息/教育背景/工作经历/项目经历/专业技能/获得荣誉)× 3 个质量维度(清晰度/完整度/重点突出度)= 18 评分点
- 脚本评 73 分(各模块完整度 + 清晰度格式 + 重点突出度的量化/动词/分级/级别)→ 由 scripts/score_resume.py 确定性评分,零 LLM token
- LLM 评 27 分(表述逻辑/成果相关性/技术深度/含金量/岗位匹配)→ 仅基于脚本输出的 JSON 聚焦评分,单次调用完成
触发条件
当用户出现以下意图时激活本 skill:
- "帮我评分/评估/看看 简历"
- "我的简历怎么样"
- "优化/改进 我的简历"
- "resume review / score my resume"
- 用户直接提供简历文件并要求评价
评分模型
总分 100,采用模块 × 质量三要素矩阵评分:6 个简历模块 × 3 个质量维度(清晰度/完整度/重点突出度)= 18 个评分点。详细规则见 references/scoring_rubric.md。
| 模块 | 清晰度 | 完整度 | 重点突出度 | 小计 |
|---|---|---|---|---|
| ① 个人信息 | 3 | 4 | 2 | 9 |
| ② 教育背景 | 4 | 5 | 3 | 12 |
| ③ 工作经历 | 8 | 8 | 10 | 26 |
| ④ 项目经历 | 7 | 7 | 9 | 23 |
| ⑤ 专业技能 | 5 | 6 | 5 | 16 |
| ⑥ 获得荣誉 | 4 | 4 | 6 | 14 |
| 合计 | 31 | 34 | 35 | 100 |
权重设计:工作经历 + 项目经历合计 49%(近半),符合简历核心。
评分分工(token 优化):
- 脚本评 73 分:各模块的完整度(字段齐全检测)+ 清晰度格式部分(日期/符号/时间线)+ 重点突出度的量化/动词/GPA/技能分级/荣誉级别
- LLM 评 27 分:清晰度表述逻辑 + 重点突出度的成果相关性/技术深度/含金量/岗位匹配
等级:A(90+) 优秀 / B(75+) 良好 / C(60+) 合格 / D(40+) 待改进 / E(<40) 不合格
工作流(token 优化执行顺序)
第 1 步:收集输入(0 token)
确认用户的简历输入形式:
- 文件路径(PDF / Word / TXT / MD)
- 直接粘贴的文本
- 图片(需先 OCR,提示用户或用系统 OCR 工具转换)
若用户希望针对特定岗位评分,询问或要求提供目标岗位 JD(可选;有 JD 则维度④按关键词匹配评分更精准,无 JD 则按通用职业素养折算)。不要强制要求 JD,避免增加用户负担。
第 2 步:运行脚本评分(零 LLM token)
执行评分脚本,生成 JSON 结果与 HTML 报告:
# 基础用法(输出 JSON 到 stdout)
python3 <skill_dir>/scripts/score_resume.py <简历文件>
# 生成 HTML 报告 + JSON 文件
python3 <skill_dir>/scripts/score_resume.py <简历文件> --html <报告输出路径> -o <JSON输出路径>
# 附带目标岗位 JD
python3 <skill_dir>/scripts/score_resume.py <简历文件> --jd <JD文件> --html <报告路径> -o <JSON路径>
# 直接传文本(用户粘贴的简历)
python3 <skill_dir>/scripts/score_resume.py -t "简历全文..." --html <报告路径>
# 从 stdin 读取
echo "简历文本" | python3 <skill_dir>/scripts/score_resume.py --stdin
依赖说明(脚本会自动降级):
- PDF 解析需 pdfplumber:pip install pdfplumber
- Word 解析需 python-docx:pip install python-docx
- 纯文本/TXT/MD 无需额外依赖
脚本输出 JSON 包含:
- matrix:6 模块 × 3 质量维度的评分矩阵(每个评分点含 score/max/method/details)
- script_total / script_max:脚本已评部分总分(满分 73)
- llm_items:需 LLM 评估的评分点列表(共 27 分,含 module/dim/max/note/script_score)
- issues:脚本检测到的问题列表(低分项 + 禁忌词命中)
- sections_text:各模块识别出的文本(供 LLM 按模块聚焦读取)
- text_preview:简历文本前 1500 字符
- needs_full_llm_review:脚本评分可信度标志(true=需 LLM 全量补评)
- script_ratio:脚本得分率(< 30% 触发全量补评)
- instructions_for_llm:给 LLM 的评分指令(根据可信度自动切换)
- suggestion_schema:优化建议的输出格式模板
第 3 步:LLM 评分与建议(根据脚本可信度走两条分支)
读取脚本 JSON 后,先检查 needs_full_llm_review 字段,走对应分支:
分支 A:脚本可信(needs_full_llm_review = false,常见于单栏 PDF/Word/TXT)
仅对 llm_items 中的 7 个评分点打分(共 27 分),并针对 issues 生成优化建议。
LLM 待评的 7 个评分点:
- 个人信息-重点突出度(2分):求职意向与经历方向一致性
- 教育背景-重点突出度(1分):核心课程与岗位相关性
- 工作经历-重点突出度 STAR 部分(3分):经历段落是否含 S/T/A/R
- 项目经历-完整度要素部分(5分):背景/职责/技术/成果齐全度
- 项目经历-重点突出度技术深度+个人贡献(5分)
- 专业技能-重点突出度(5分):岗位匹配+核心专长
- 获得荣誉-重点突出度(6分):含金量+相关性
分支 B:全量评估(needs_full_llm_review = true,常见于双栏 PDF)
当 script_ratio < 30% 或工作经历模块未识别到时,LLM 基于完整文本全量评估 18 个评分点(6 模块 × 3 维度),不只评 llm_items。
- 读取
text_preview(完整简历文本)和sections_text(已识别的模块文本) - 对 matrix 中每个评分点给出 score + 一句话理由
- 将 LLM 评分写回 JSON 的
matrix各评分点的score字段 - 设置
final_total= 18 项评分总和 - 此分支 token 消耗略高(~3500 token),但确保评分准确
输入控制(token 优化):
- 分支 A:LLM 输入仅需脚本 JSON(< 500 token)+ 模块文本(< 1500 token)+ JD(可选)
- 分支 B:LLM 输入需脚本 JSON + text_preview(< 1500 token)+ JD(可选)
- 不要把 best_practices.md、scoring_rubric.md 全文塞给 LLM
- LLM 凭内置知识 + JSON 中的 note / instructions_for_llm 即可评各评分点
优化建议生成规则(两分支共用)
- 仅针对得分 < 该项 max × 60% 的评分点给出建议
- 按分值损失排序,最多 5 条,避免信息过载
- 每条建议格式(写入 JSON 的
llm_suggestions数组):
json { "module": "experience", "dim": "highlight", "issue": "经历描述偏职责罗列,缺乏量化成果", "example_before": "高合汽车车联网云平台架构设计,云端微服务框架开发", "example_after": "主导高合车联网云平台架构设计,搭建日均处理200万+车辆数据的IOT系统,系统可用性99.99%" } - 改写示例须包含:强动词 + 量化数据 + 具体成果
- 禁忌词命中:直接给出改写示例
第 4 步:合并 LLM 评分并生成最终报告
将 LLM 评分合并到脚本 JSON:
- 分支 A:把 llm_items 各项得分累加到 script_total,得到 final_total
- 分支 B:用 LLM 全量评分覆盖 matrix 各评分点的 score 字段,同时将 method 统一改为 "script"(表示已有最终分数),final_total = 18 项总和。注意:必须更新 score 字段,不能只更新 script_score,否则报告矩阵和问题列表会显示原始 0 分
重新生成 HTML 报告(含 LLM 评分 + 优化建议改写示例):
# 用合并后的 JSON 重新生成 HTML(LLM 评分填入后)
python3 -c "
import json
from pathlib import Path
data = json.load(open('<JSON路径>'))
tpl = open('<skill_dir>/assets/report_template.html').read()
html = tpl.replace('__DATA__', json.dumps(data, ensure_ascii=False, indent=2))
html = html.replace('__GENERATED_AT__', data['meta']['timestamp'])
Path('<报告输出路径>').write_text(html, encoding='utf-8')
"
第 5 步:呈现结果
向用户呈现:
1. 总分与等级(final_total)
2. 模块矩阵评分明细(6 模块 × 3 维度,低分项标红)
3. 优化建议(llm_suggestions 中的最多 5 条改写示例,原句→改写对照)
4. HTML 报告文件路径(用 present_files 工具交付)
5. 若进行了全量评估,简要说明采用了完整文本评估方式
将 HTML 报告保存到工作目录并通过 present_files 交付。
资源说明
scripts/
score_resume.py(核心):简历文本抽取 + 模块矩阵确定性评分 + JSON/HTML 输出。多格式输入(PDF/Word/TXT/MD/纯文本/stdin)。评 73 分(各模块完整度+清晰度格式+重点突出度量化和动词)。refresh_samples.py(维护):从配置的公开简历指南来源(Harvard 等)重新抓取最佳实践,更新基线库。日常评分不需要运行,仅在用户要求"更新评分库"时运行。keywords.json:评分关键词库 v2(强动词 200+ / 弱动词 / 禁忌词 / 量化模式 / 板块标识词 / 各模块字段标识 module_fields),由 score_resume.py 加载。
references/
best_practices.md:简历撰写最佳实践基线库(评分模型的依据来源)。整合自 Harvard FAS Mignone Center、Harvard T.H. Chan SPH Resume Guide、国内高校就业指导指南。仅在需要向用户解释"为什么这样评"时查阅,评分时无需加载到上下文。scoring_rubric.md:评分规则详解(模块矩阵权重、各评分点判定方法、等级映射)。LLM 评分时凭内置知识 + JSON 中的llm_items说明即可,无需加载全文。
assets/
report_template.html:评分报告 HTML 模板。score_resume.py 通过__DATA__占位符注入 JSON,生成可视化报告(总分仪表盘 + 模块×质量三要素矩阵表 + 问题列表 + LLM 待评区 + 文本预览)。
Token 消耗对照
| 环节 | 传统做法 | 本 skill |
|---|---|---|
| 各模块完整度评分 | LLM 读全文逐项判断 | 脚本字段检测,0 token |
| 清晰度格式评分 | LLM 逐行分析 | 脚本正则匹配,0 token |
| 重点突出度量化/动词 | LLM 逐行分析 | 脚本正则匹配,0 token |
| 表述逻辑/相关性/含金量 | LLM 读全文 + 规则文档 | LLM 仅读 JSON + 模块文本,<2500 token |
| 建议生成 | LLM 自由发挥易冗长 | 聚焦 issues 最多 5 条,<800 token |
| 脚本评分占比 | 0% | 73%(73/100 分) |
| 单次评分总 LLM 消耗 | ~8000+ token | ~2500 token 以内 |
维护与更新
- 用户要求"更新评分库 / 抓取最新简历指南"时:运行
python3 scripts/refresh_samples.py,结果写入references/fetched_samples.md,由 LLM 整合到best_practices.md。 - 评分规则调整:直接编辑
references/scoring_rubric.md和scripts/keywords.json(如新增行业动词)。 - 报告样式调整:编辑
assets/report_template.html。
限制说明
- 图片简历需先 OCR 转文本(脚本不内置 OCR,避免重依赖);提示用户用系统 OCR 或先转为文本。
- 字体一致性、双栏布局、照片合规等视觉要素在文本抽取后难以精确判定,脚本采用启发式或默认满分,相关细节请 LLM 在建议中补充提示。
- 评分模型偏向通用岗位;高度专业化领域(如学术 CV、设计作品集简历)建议 LLM 结合领域知识调整权重。