简历筛选评分系统 · Resume Screening & Scoring System
Overview
把"描述岗位 + 批量简历 → 多维匹配评分 → 交互式评分报告 → 外链交付"做成可复用能力。不限行业/职能、不限岗位数量:今天评"销售 + 客户支持",明天可以评"算法工程师 + 产品经理 + 法务"。用户只做两件事:① 用大白话描述要招的岗位(可多个);② 把简历批量丢进来(文件夹或 zip)。其余由本系统完成。
设计原则:所有评分维度动态化——评分维度数 = 岗位数,报告区块/筛选器按岗位数自动生成,没有写死的"销售/客服"字样。
决策树(收到请求后)
用户输入包含什么?
├── 自然语言岗位描述(无正式JD) + 一批简历
│ → 主流程:角色解析 → 批量分析 → 报告 → 外链
├── 仅岗位描述(还没简历)
│ → 先按 references/role_parse.md 把角色结构化,等简历到位再分析
├── 仅简历(无岗位描述)
│ → 反问要招什么岗,或先按通用"胜任力"做一轮初筛
└── 已出报告,用户要调权重/加岗/换人
→ 改 role spec 或数据后重跑(报告数据驱动,重生成即可)
通用数据模型(本技能的核心)
角色 spec(从用户描述解析,1~N 个)
window.ROLES = [
{ key:"R1", name:"销售岗", tag:"销售", role:"销售岗 · 1名",
tasks:["面向企业客户推介产品,完成线索→演示→签约→回款"],
priorityBg:["有 SaaS/云服务销售经验","熟悉腾讯/阿里/字节生态"],
expRange:"1-3年", keyCaps:["客户沟通","需求挖掘","抗压回款"] },
{ key:"R2", name:"客户支持岗", tag:"客服", role:"客户支持 · 1名", ... }
];
候选人对象(维度数 = 岗位数)
window.CANDIDATES = [
{ id:"01", name:"张伟", title:"Java开发", age:24, yrs:"1.5年",
edu:"大专 · 成都职业技术学院", now:"成都极客邦 · Java开发",
scores:{ R1:12, R2:15 }, // 每个岗位一个分
verdicts:{ R1:"none", R2:"none" }, // 每个岗位一个结论
bestFit:"R2", // 最佳匹配岗 key
pros:["..."], cons:["..."], watch:"需要关注的点..." }
];
verdict 取值:top(首选) / break(破格候选) / backup(备选) / consider(可考虑) / extra(编外提示) / none(不匹配)。
bestFit:取分数最高且 verdict≠none 的岗位 key;若全部 none 则填 "none"。
主流程(6 步)
- 解析岗位 → 按
references/role_parse.md把用户口述拆成ROLES(含 key/name/tag/tasks/priorityBg/expRange/keyCaps/weights)。 - 接收简历 → 文件夹或 zip(zip 自动解压);多格式转文本(见
scripts/extract.py:PDF→pypdf,DOCX→python-docx,MD/TXT 直读,图片→OCR 接入点)。 - 逐份分析 → 每份简历按所有 role 打
scores+verdicts+bestFit+pros/cons/watch。权重按references/scoring_model.md从 role spec 自动推导(用户可改)。 - 生成报告 → 用
assets/templates/(数据驱动的 index.html/style.css/app.js)渲染:JD 卡片(按岗) → 每岗"首选/备选"大卡 → 全局"破格"区 → 每岗排行表 → 全员可折叠列表(带按岗/已入围/不匹配筛选)。大数据量务必把候选人拆成data-a.js/data-b.js/data-c.js多个小文件(见 Ops 第 3 条)。 - 部署前自检(强制,不通过不部署) →
node <skill>/scripts/validate.js <报告目录>,退出码 0 才继续。校验字段齐全性、verdict 合法性、bestFit 一致性、ID 唯一、pros/cons/watch 分级密度、每岗 top 不超名额。 - 部署交付 →
workbuddy_cloudstudio_deploy(directory 指向含 index.html 的目录,entry=index.html),再用 WebFetch 验证外链可达后交付。默认不出 PDF(用户 memory 硬规则:只给外链)。
references 索引
references/role_parse.md— 自然语言岗位描述 → 结构化 role spec 的解析规范与多行业示例。references/scoring_model.md— 多维评分、权重自动推导、verdict 判定规则、bestFit 逻辑、破格/编外说明。references/report_design.md— 数据驱动 HTML 报告的结构设计(动态区块、筛选器、排行表、移动端适配)。
assets/templates 索引
index.html— 报告骨架,仅留 DOM 容器,数据/渲染全由 JS 驱动。style.css— 商务简洁响应式样式(深色 header + 卡片 + 表格 + 筛选 + 折叠列表)。app.js— 通用渲染逻辑:读 ROLES + CANDIDATES → 动态生成 JD 卡/大卡/破格区/排行表/列表/筛选器。data-example.js— 示例数据(2 岗 + 6 人),演示通用 schema,可直接改造成真实批次的 data 文件。
scripts 索引
extract.py— 多格式 + zip 批量提取:PDF(pypdf)/DOCX(python-docx)/MD/TXT 直读,图片留 OCR 接入点;输出resumes/*.txt+ 清单。validate.js— 部署前自检(用法node validate.js <报告目录>):字段/verdict/bestFit/ID唯一/分级密度/top名额六类校验,退出码非 0 即不得部署。
Ops 实操经验(落地避坑,必读)
- PDF 解析:用受管 Python(
C:\Users\13541\.workbuddy\binaries\python\versions\3.13.12\python.exe)建 venv +pip install pypdf python-docx,PdfReader抽文本最稳。 - 多格式:DOCX 用
python-docx读 paragraph;图片 OCR 接tencentcloud-ocr连接器或textin-xparse,在extract.py留了接入点。 - Write 大文件避坑:候选人数据较多(如 40 人 × 多字段)时,把数据拆成
data-a.js/data-b.js/data-c.js(各挂window.CANDIDATES分段数组,或统一window.CANDIDATES由多个文件 push)。绝不要把全部数据塞进单个 HTML——Write 工具写超大内容会报content expected string but received undefined。index.html 只写骨架。 - CloudStudio 稳定性:链接可能约 1 小时回收、偶发账号级 400 报错;交付前用 WebFetch 自测可达性。需长托管 → 改用 EdgeOne Pages(需用户授权)。CloudStudio 链接无
_fid参数,不要套用腾讯文档的?_wework_browser=1旧写法。 - 数据自检:部署前用 Node
global.window={}; require('./data-*.js');校验每个候选对象的scores/verdicts/bestFit/pros/cons/watch字段齐全、verdict 取值合法。
重要规则
- 交付规则(硬):默认只交付 CloudStudio 外链,不生成 PDF / 本地文件;仅当用户明确点名要某格式时才生成(用户 liuzh 偏好:"以后所有产出物都以外链的形式发我,不要生成其他的")。
- 隐私与安全:对外分享默认脱敏(姓+职位,如"张先生/后端开发");用户明确要求时才显示全名。本技能内部评估可用全名。
- 数据完整性:简历未提及的信息标注"未提供"/"未注明",绝不编造;verdict 与分数须有简历依据。
- 人工覆盖优先于分数阈值:分数区间只是基线。若简历有「直接相关手感」但总分被年限/职级拉低(如应届生有真实签单或真实客服记录),可人工上调为
consider/backup,但必须在数据文件注释里写明覆盖理由。反之亦可下调。 - watch 禁止零信息:不得只写"不匹配"。不匹配者也要写清核心原因 + 是否有后续回捞价值(换岗位时能不能再用上)——这是用户最关心的信息之一。
- 字段密度分级:入围/储备/不匹配三级对 pros/cons 条数要求不同(见
scoring_model.md第六节)。对明显不匹配者强行凑满 3 条优点会诱发编造,严禁。 - 评分一致性:同一批次用同一套权重(来自 role spec),多岗之间分数尺度一致,便于横向对比。
- 学历仅参考:学历作参考项、不直接决策时,权重明显调低或标注「参考」;经验区间超出的候选放入
break并写明破格理由,不直接淘汰。 - 格式支持:PDF/DOCX/MD/TXT 直接处理;图片走 OCR 接入点;zip 自动解压。