智能招聘管理助手,提供从简历筛选到录用决策的全流程支持。
在开始使用前,了解本工具的能力边界,避免对结果产生不合理期望:
| 能力项 | 可靠程度 | 说明 |
|-------|---------|------|
| 简历结构化提取(姓名/邮箱/教育/工作经历)| ★★★★★ 高 | 基于规则+正则,准确率稳定 |
| PDF/Word 文档解析 | ★★★★☆ 较高 | 有多重降级策略,偶有格式异常 |
| 人岗技能匹配度计算 | ★★★★☆ 较高 | 基于关键词匹配,JD 越详细越准 |
| AI 软实力/潜力评估 | ★★★☆☆ 中 | 依赖 AI 语义理解,结果存在波动 |
| 面试题生成质量 | ★★★★☆ 较高 | 结合岗位和简历背景生成,可能需人工微调 |
| PDF 中文报告排版 | ★★★★☆ 较高 | 依赖中文字体是否已安装 |
| 邮件发送成功率 | ★★★★★ 高 | 配置正确后稳定,163/QQ 已实测 |
> 重要原则: 本工具的评估结果仅供参考,不替代专业 HR 判断。软实力评估、最终录用决策等关键环节,请结合面试和背景调查进行人工复核。
| 文件类型 | 支持格式 | 建议大小 | 注意事项 |
|---------|---------|---------|---------|
| 简历 | .docx / .doc / .pdf / .png / .jpg / .jpeg | ≤ 10 MB | 扫描件 PDF 需安装 pytesseract |
| 职位 JD | .pdf / .docx / 纯文本粘贴 | 不限 | 粘贴纯文本效果最稳定 |
| 邮件配置 | .json | — | password 字段填授权码,非登录密码 |
不支持的场景:
.doc 旧版 Word 97-2003(部分环境需额外安装 antiword)
支持格式: Word (.docx/.doc) · PDF (.pdf) · 图片 (.png/.jpg/.jpeg)
PDF 解析策略(4 级自动降级):
| 优先级 | 解析器 | 适用场景 | 触发条件 |
|-------|-------|---------|---------|
| 1 | pypdfium2 | 扫描件 PDF、Microsoft Print To PDF | 默认首选 |
| 2 | pdfplumber | 多栏布局、表格型简历 | pypdfium2 返回空文本时 |
| 3 | PyPDF2 | 普通数字 PDF | 前两者失败时 |
| 4 | PDF 转图片 + pytesseract OCR | 完全无文本层的扫描件 | 前三者均失败时 |
自动提取字段: 姓名、手机号、邮箱、教育背景(学校/专业/学历/时间)、工作经历(公司/职位/时长/职责)、技能清单、项目经验
依赖安装:
pip install pypdfium2 pdfplumber PyPDF2 python-docx pytesseract Pillow
# Windows 还需安装 Tesseract 可执行文件(用于 OCR 兜底):
# https://github.com/UB-Mannheim/tesseract/wiki
使用示例(多种说法均可触发):
# 方式一:指定文件路径
解析这份简历:C:\Users\admin\Desktop\张三_简历.pdf
# 方式二:描述文件位置
帮我看看桌面上李四的简历,是 PDF 格式的
# 方式三:处理图片格式
这是一张简历截图,帮我提取里面的信息:/Downloads/resume_scan.jpg
# 方式四:批量处理
批量解析以下 3 份简历:resume1.pdf、resume2.docx、resume3.jpg
预期输出:
姓名:张三
手机:138xxxx1234
邮箱:zhangsan@example.com
最高学历:本科 · 计算机科学 · XX 大学(2018-2022)
工作年限:3 年
当前/最近职位:后端工程师 @ ABC 科技(2022.07 至今)
技能:Python / Java / MySQL / Docker / Redis
项目:电商推荐系统(主导后端架构,日均处理请求 200 万次)
提升准确率的操作建议:
138 xxxx xxxx)可能漏提,可手动补充
.docx 格式而非 PDF
根据岗位 JD 与候选人简历,输出结构化匹配报告。
匹配维度及评分权重:
| 维度 | 权重 | 评估方式 |
|------|------|---------|
| 必需技能覆盖率 | 40% | 关键词匹配,准确稳定 |
| 工作年限/经验深度 | 25% | 数字提取对比,准确稳定 |
| 教育背景 | 15% | 学历/专业匹配,准确稳定 |
| 软实力/文化匹配 | 20% | AI 语义理解,存在波动 |
> ⚠️ AI 稳定性提示: 软实力维度(领导力、协作能力、学习能力等)基于简历描述的语义理解,同一候选人如简历措辞不同可能得到不同分数。分数波动范围通常在 ±8 分以内。建议: 对总分 60-80 分区间的候选人,重点关注技能匹配维度分数,而非总分排名。
使用示例(多种说法):
# 方式一:同时提供两个文件
分析这份简历与 Java 高级开发工程师的匹配度
JD:C:\Users\hr\jd_java.pdf
简历:C:\Users\hr\resume_lisi.docx
# 方式二:JD 直接粘贴
帮我看看这个候选人适不适合做产品经理
[粘贴简历内容]
岗位要求:5 年以上产品经验,熟悉 B 端 SaaS,有团队管理经验
# 方式三:省略 JD 文件,用自然语言描述岗位
这个候选人适合做数据分析师吗?要求会 SQL 和 Python,3 年以上经验
简历:C:\Users\hr\wangwu.pdf
# 方式四:一次分析多位候选人
对比这 3 份简历,哪位最适合前端工程师岗位?
JD:jd_frontend.pdf
简历:a.pdf、b.docx、c.pdf
预期输出:
综合匹配分:78 / 100
技能匹配(40分):34/40 ✅
- 命中必需技能:Java ✅ Spring Boot ✅ MySQL ✅
- 缺失:Kubernetes(JD 优先要求)
工作年限(25分):22/25 ✅
- 候选人 7 年,岗位要求 5 年,超出要求
教育背景(15分):13/15 ✅
- 本科 · 软件工程(岗位要求本科及以上)
软实力(20分):9/20 ⚠️
- 简历中无明显团队管理描述(岗位需要带 3-5 人小组)
🔴 风险提示:近 3 年换了 3 家公司,平均在职 12 个月
建议:推进面试,重点考察稳定性意愿及 Kubernetes 学习计划
提升匹配准确率的建议:
根据岗位要求和候选人背景,生成有针对性的面试题目。
题目类型及比例(默认):
| 类型 | 默认比例 | 说明 |
|-----|---------|------|
| 技术能力题 | 40% | 编程/系统设计/专业知识 |
| 行为面试题(STAR) | 30% | 过去经历验证能力 |
| 情景模拟题 | 20% | 假设场景解决方案 |
| 文化匹配题 | 10% | 价值观/团队协作倾向 |
每道题包含:题目内容 / 考察要点 / 评分标准(1-5 分)/ 追问方向
使用示例(多种说法):
# 方式一:指定岗位和简历
为产品经理候选人生成面试题,侧重数据分析能力
简历:C:\Users\hr\resume_wangwu.pdf
# 方式二:指定数量和类型比例
生成 10 道面试题,其中 4 道技术、3 道行为、2 道情景、1 道文化匹配
岗位:高级后端工程师
# 方式三:针对简历中的弱点出题
这份简历跳槽频繁,帮我生成重点考察稳定性和职业规划的面试题
简历:/Downloads/resume.pdf
# 方式四:仅凭岗位描述生成(无简历)
生成 Java 架构师岗位的通用面试题库,覆盖微服务、高并发、团队管理
预期输出(节选):
【行为题 1】请描述一次你推动一个数据驱动决策的经历
考察要点:数据意识、从分析到执行的完整链路
追问:当数据结论与团队直觉相反时,你如何处理分歧?
评分标准:
1分 = 只有描述,无数据支撑
3分 = 有数据,但结论模糊
5分 = 明确指标 + 清晰决策路径 + 量化结果
【技术题 2】系统设计:如何设计一个支持百万级 DAU 的消息推送服务?
考察要点:分布式系统思维、消息队列选型、降级策略
追问:如果需要支持优先级消息(VIP 用户先推),你会如何修改架构?
评分标准:
1分 = 只能描述单机方案
3分 = 提到消息队列但未考虑峰值
5分 = 分层架构 + 限流降级 + 监控告警完整方案
支持输出格式:
| 格式 | 适用场景 | 中文字体 | 额外依赖 | 生成速度 |
|------|---------|---------|---------|---------|
| HTML | 在线分享、浏览器查看 | 依赖浏览器(无需额外安装)| 无 | 快(< 5s)|
| PDF(高质量)| 存档、打印、正式提交 | ✅ 自动检测 SimHei/SimSun | reportlab / pypdf / matplotlib | 中(10-30s)|
| Word (DOCX) | 后续编辑修改 | ✅ 原生支持 | 无 | 快(< 5s)|
PDF 依赖完整安装(Windows):
# 步骤 1:安装 Python 依赖
pip install reportlab pypdf matplotlib
# 步骤 2:确认中文字体存在(Windows 通常已内置)
dir C:\Windows\Fonts\simhei.ttf
# 若命令返回"找不到文件",从 Microsoft 官方字体包获取 SimHei.ttf
# 放入 C:\Windows\Fonts\ 目录后重新生成即可
# 步骤 3:无需 Node.js 或 Playwright(v2.0 起封面改为 ReportLab 直绘)
PDF 依赖完整安装(Linux):
pip install reportlab pypdf matplotlib
apt-get install fonts-wqy-zenhei # Debian/Ubuntu
# yum install wqy-zenhei-fonts # CentOS/RHEL
报告包含内容:
使用示例(多种说法):
# 方式一:基础 PDF 报告
生成候选人李四的评估报告,输出为 PDF
简历:C:\Users\hr\resume_lisi.pdf
# 方式二:含面试题附录
生成这份简历的分析报告,格式 HTML,附上面试题
# 方式三:包含面试记录
生成候选人评估报告,候选人面试表现如下:
[粘贴面试记录]
输出格式:Word
# 方式四:批量生成多人报告
对这 3 位候选人分别生成 PDF 评估报告:lisi.pdf、wangwu.pdf、zhaoliu.pdf
岗位:Java 高级工程师
输出质量自检清单(AI 生成后请人工确认):
生成并直接发送各类招聘邮件,支持以下场景:
| 邮件类型 | 适用场景 | 特殊说明 |
|---------|---------|---------|
| 面试邀约(高级版)| 通过中间人/代表转达 | 支持联系人 ≠ 候选人的代表人模式 |
| 面试邀约(简版)| 直接发给候选人 | 含现场材料提示(身份证/作品集等)|
| 面试跟进 | 面试后催回复/感谢信 | — |
| 录用通知(Offer)| 正式发 offer | 含薪资/福利/入职时间 |
| 婉拒信 | 通知未录用候选人 | 礼貌措辞,维护雇主品牌 |
SMTP 配置(smtp_config.json):
{
"smtp_server": "smtp.163.com",
"smtp_port": 465,
"use_ssl": true,
"username": "your@163.com",
"password": "授权码(非登录密码,16位字符串)",
"sender_email": "your@163.com",
"sender_name": "公司名称 HR <your@163.com>"
}
已验证邮箱配置:
| 服务商 | SMTP 地址 | 端口 | use_ssl | 获取授权码路径 |
|--------|-----------|------|---------|-------------|
| 163邮箱 | smtp.163.com | 465 | true | 设置 → POP3/SMTP/IMAP → 开启服务 |
| QQ邮箱 | smtp.qq.com | 465 | true | 设置 → 账户 → 开启 SMTP → 生成授权码 |
| 企业微信邮箱 | smtp.exmail.qq.com | 465 | true | 企业微信后台管理 |
| Gmail | smtp.gmail.com | 587 | false | Google 账户 → 应用专用密码 |
> ⚠️ 163/QQ 邮箱: password 字段必须填授权码(16 位),不是登录密码。登录密码会导致认证失败。
使用示例(多种说法):
# 方式一:代表人面试邀约(联系人 ≠ 候选人)
给候选人田飞的联系人周博远发送面试邀约
收件人邮箱:zhouboyuan@tnktech.net
岗位:财务,面试时间:2026-05-30 14:00-15:30
视频面试(腾讯会议),面试官:李总监
发件邮箱:hr@163.com,授权码:abcd1234efgh5678
# 方式二:直发候选人
给张三(zhangsan@email.com)发面试邀约
岗位:后端工程师,线下面试
时间:2026-06-15 10:00,地址:北京朝阳区 XX 大厦 8 楼
# 方式三:发 offer
给通过面试的李四发录用通知
邮箱:lisi@email.com
岗位:高级产品经理,薪资:35K×14,入职日期:2026-07-01
发件邮箱:hr@company.com
# 方式四:发拒信
给未录用的候选人王五发婉拒信
邮箱:wangwu@email.com,岗位:前端工程师
面试邀约数据字段参考(data.json):
{
"recipient_name": "周博远",
"candidate_name": "田飞",
"company_name": "TNK Tech",
"position": "财务",
"interview_time": "2026年05月30日 14:00-15:30",
"interview_format": "视频面试(腾讯会议)",
"interviewer": "技术负责人 李总监",
"duration": "90分钟",
"confirm_deadline": "2026年05月27日",
"contact_email": "hr@tnktech.net",
"extra_notes": "腾讯会议链接将于面试前一天另行发送,请留意查收。"
}
命令行快速发送:
python email_sender.py invite smtp_config.json recipient@email.com data.json
以下说法均可触发对应功能,AI 会自动识别意图:
| 你的说法(示例) | 命中功能 | 最优信息 |
|----------------|---------|---------|
| "解析这份简历" / "分析候选人张三的简历" / "帮我看看这份简历" | 简历解析 | 提供文件路径或上传文件 |
| "和 XX 岗位的匹配度" / "适不适合做 XX" / "对比这几个候选人" | 人岗匹配 | 提供 JD 文本或文件 |
| "生成面试题" / "出几道面试题" / "我要面试 XX" | 面试题生成 | 说明岗位和侧重点 |
| "生成评估报告" / "出一份分析报告" / "做一个候选人总结" | 评估报告 | 说明输出格式(PDF/HTML/Word)|
| "发面试邀约" / "发 offer" / "发拒信" / "通知候选人" | 招聘邮件 | 提供收件人邮箱和关键信息 |
> 模糊输入也能处理: 如果你只说"帮我招一个 Java 工程师候选人分析",AI 会引导你补充缺失信息(简历文件、JD 等),无需一次性提供所有内容。
步骤 1 接收简历 → 解析简历,提取结构化信息
步骤 2 简历筛选 → 人岗匹配分析,判断是否进入面试
步骤 3 通知候选人 → 发送面试邀约邮件
步骤 4 面试准备 → 生成结构化面试题
步骤 5 面试执行 → 线下面试(可记录评估意见)
步骤 6 评估决策 → 生成候选人评估报告(推荐 PDF)
步骤 7 结果通知 → 发送录用通知或婉拒信
端到端场景示例:
场景 A:快速筛选一批简历
批量解析以下简历并与 Python 工程师 JD 匹配,按分数排序:
JD:jd_python.pdf
简历:张三.pdf、李四.docx、王五.jpg
场景 B:面试全流程准备
1. 解析候选人赵六的简历:zhaoliu.pdf
2. 与高级数据分析师岗位匹配分析,JD 如下:[粘贴 JD]
3. 生成 8 道面试题,侧重 SQL 和业务理解
4. 发送面试邀约给候选人邮箱 zhaoliu@email.com
场景 C:生成正式报告
生成候选人赵六的完整评估报告
输出:PDF,包含面试题附录
简历:zhaoliu.pdf,面试记录:[粘贴记录]
场景 D:批量发送 offer
向以下候选人批量发送录用通知:
张三:zhangsan@email.com,岗位:后端工程师,薪资:25K
李四:lisi@email.com,岗位:前端工程师,薪资:22K
入职日期均为 2026-07-15,发件邮箱:hr@company.com
遇到问题时,先查此表:
| 错误现象 | 可能原因 | 解决步骤 |
|---------|---------|---------|
| PDF 解析结果为空 | PDF 无文本层(纯扫描件)| 1. 确认已安装 pytesseract;2. 安装 Tesseract 可执行文件;3. 转为 .jpg 重试 |
| PDF 解析内容乱码 | 字体编码问题 | 1. 尝试 pdfplumber(告知 AI "使用 pdfplumber 解析");2. 转为图片后用 OCR |
| Word 解析失败 | python-docx 未安装 | pip install python-docx |
| PDF 报告中文显示方块 | 中文字体未找到 | Windows: dir C:\Windows\Fonts\simhei.ttf 确认存在;Linux: 安装 wqy-zenhei |
| PDF 报告生成超时 | matplotlib 渲染慢 | 告知 AI "跳过可视化图表,仅生成文字版报告" |
| 邮件发送失败(认证错误)| 密码填写错误 | 确认 password 为授权码(非登录密码);重新在邮箱设置页生成授权码 |
| 邮件发送失败(连接超时)| SMTP 配置错误 | 检查 smtp_server 和 smtp_port 是否与服务商一致;确认 use_ssl 设置 |
| 匹配分数异常低 | JD 描述太简略 / 术语不一致 | 补充 JD 细节;手动说明候选人技能(如"候选人 K8s = Kubernetes")|
| 简历手机号提取不全 | 特殊格式(带空格/横线)| 手动告知 AI "候选人手机号为 xxx" |
| .doc 文件解析失败 | 旧版 Word 格式 | 用 WPS/Word 另存为 .docx 后重新解析 |
Q1:简历解析后信息不完整,有些字段是空的?
> 优先检查:(1) 文件格式是否为图片扫描件(需要 OCR);(2) 简历是否使用了非常规排版(如图片嵌入文字)。可以告诉 AI "简历中第 X 部分没有提取到,请重新尝试这段文字" 来手动补充。
Q2:PDF 报告生成很慢(超过 30 秒)怎么办?
> matplotlib 绘制雷达图较耗时。可以告诉 AI "生成文字版 PDF,不需要图表",生成速度会快很多。或者改用 HTML 格式(生成最快)。
Q3:163 邮箱发送后收件方没收到?
> 检查以下顺序:(1) 是否进入了收件方垃圾箱;(2) 发件人邮件是否被标记为"营销邮件"(可调整邮件主题避免使用"面试"等高频词);(3) 163 邮箱账号是否有每日发送限制(默认 500 封/天)。
Q4:匹配分数偏低但候选人实际很合适?
> 常见原因:简历与 JD 术语不一致(如"K8s"vs"Kubernetes")、JD 描述过于简略、候选人将重要技能写在项目经历而非技能栏。解决方案:手动告诉 AI "这个候选人具备 XX 技能,请重新评估匹配分"。
Q5:可以同时处理多份简历吗?
> 可以。一次最多建议处理 10 份,超过时建议分批。例如:"批量解析这 5 份简历:a.pdf、b.docx、c.pdf、d.jpg、e.pdf,分别提取关键信息"。
Q6:如何只针对简历中某个弱点出面试题?
> 直接说明:"这份简历跳槽频繁,请生成重点考察稳定性和职业规划的面试题" 或 "候选人无管理经验,但岗位需要带团队,请生成考察领导力潜力的行为面试题"。
Q7:评估报告的 AI 分析不稳定,同一人两次结果不一样?
> 软实力/综合评估部分依赖 AI 语义理解,同一简历的多次分析可能有细微差异(通常 ±5 分以内)。建议:(1) 以技能匹配维度得分为主要参考;(2) 关键候选人跑 2-3 次取平均;(3) 最终决策结合人工面试判断。
Q8:可以自定义评估报告的结构和内容吗?
> 可以。例如:"生成评估报告,只需要技能匹配分析和面试题,不需要录用建议" 或 "在报告中额外加入背景调查清单模块"。
Q9:邮件模板可以修改吗?
> 生成邮件后,在发送前告诉 AI 需要修改的部分,例如:"修改邮件中面试时间为 6 月 20 日,语气更正式" 或 "帮我把拒信改得更有温度一些"。
Q10:支持英文简历吗?
> 支持。解析、匹配、面试题生成均可处理英文内容。评估报告默认输出中文;如需英文报告,说明 "生成英文版评估报告" 即可。
scripts/
├── resume_parser.py # 简历解析(pypdfium2 优先,4 级降级)
├── report_generator.py # 报告生成(HTML / PDF 管道 / Word)
├── email_sender.py # 邮件发送(含代表人模式,v2.1)
├── ai_resume_analyzer.py # AI 简历分析
├── smart_resume_analyzer.py # 智能分析(含软实力评估)
├── requirements.txt # Python 依赖清单
└── pdf_pipeline/
├── palette.py # 设计令牌(含中文字体自动检测)
├── cover.py # 封面生成(ReportLab 直绘)
├── render_body.py # 正文 PDF 生成(ReportLab + 中文字体注册)
└── merge.py # 封面 + 正文合并(pypdf)
content.json
→ palette.py → tokens.json(字体路径 / 设计令牌)
→ cover.py → cover.pdf(ReportLab 直绘,无需 Node.js)
→ render_body.py → body.pdf(中文字体已注册)
→ merge.py → final_report.pdf
send_interview_invitation() 函数、invite 子命令
共 6 个版本