AI+人力资源应用教程:从零搭建智能招聘筛选流程

想把AI用到人力资源工作里,最直接、最容易验证效果的场景就是简历初筛。
这篇教程会带你从零搭建一个本地运行的智能筛选原型,不依赖商业平台,全部用开源工具和Python脚本完成。
适合有基础Linux操作能力、想先跑通流程再考虑规模化的人力资源从业者或运维人员。

先理清你要解决的具体问题

开始之前,先确认你的目标不是“用上AI”,而是“用AI减少重复筛选”。
典型需求是:收到一批PDF或Word简历,需要按岗位关键词、工作年限、技能栈快速排序,人工只看前20%。

这个原型适合简历量在每天50份以内、格式相对统一的情况。
如果简历来源杂乱、扫描件多,需要额外做OCR,本文不展开。

准备一台能联网的Linux服务器或本地虚拟机,配置不低于2核4G,系统用Ubuntu 22.04或Debian 12均可。
以下操作以Ubuntu 22.04为例。

环境准备与依赖安装

先更新系统包并安装Python虚拟环境工具:

sudo apt update
sudo apt install -y python3 python3-venv python3-pip

创建项目目录和虚拟环境:

mkdir -p ~/ai-hr-demo && cd ~/ai-hr-demo
python3 -m venv venv
source venv/bin/activate

安装简历解析和文本处理库。
这里用pdfplumber读PDF,python-docx读Word,scikit-learn做关键词相似度计算:

pip install pdfplumber python-docx scikit-learn

验证安装是否成功:

python3 -c "import pdfplumber, docx, sklearn; print('ok')"

终端输出ok即表示依赖正常。
如果提示缺少系统库,按报错信息补装libpoppler-cpp-dev等包。

编写简历筛选脚本

在项目目录下新建screen.py,核心逻辑分三步:读取简历文本、提取岗位关键词、计算匹配分数并排序。

import os
import pdfplumber
from docx import Document
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

JOB_DESC = """
招聘Python后端工程师,要求熟悉Django或Flask框架,
有MySQL数据库优化经验,了解Redis缓存,
3年以上工作经验,本科及以上学历。
"""

def read_resume(path):
    if path.endswith('.pdf'):
        with pdfplumber.open(path) as pdf:
            return "\n".join(page.extract_text() or "" for page in pdf.pages)
    elif path.endswith('.docx'):
        doc = Document(path)
        return "\n".join(p.text for p in doc.paragraphs)
    return ""

resumes = []
for f in os.listdir('resumes'):
    text = read_resume(os.path.join('resumes', f))
    if text.strip():
        resumes.append((f, text))

if not resumes:
    print("resumes目录下没有可解析的简历文件")
    exit(1)

corpus = [JOB_DESC] + [r[1] for r in resumes]
vectorizer = TfidfVectorizer(stop_words='english')
matrix = vectorizer.fit_transform(corpus)
scores = cosine_similarity(matrix[0:1], matrix[1:]).flatten()

for (name, _), score in sorted(zip(resumes, scores), key=lambda x: -x[1]):
    print(f"{score:.3f}\t{name}")

把待筛选简历放进resumes目录,执行:

mkdir resumes
python3 screen.py

终端会输出按匹配度从高到低排序的文件名和分数。
分数范围0到1,越接近1表示与岗位描述文本越相似。

避坑指南:新手最容易踩的三个坑

第一,简历格式不统一导致读取失败。 pdfplumber对扫描版PDF提取不到文字,脚本会跳过该文件。
解决办法是先用pdftotext检查能否提取文本,扫描件需先转成可搜索PDF。

第二,中英文混合时stop_words='english'只过滤英文停用词。 中文简历里“的、了、和”等词会影响相似度。
可以在调用TfidfVectorizer时加入token_pattern=r'(?
u)\b\w+\b'
,或先用jieba分词再传入。

第三,岗位描述写得太短。 如果JOB_DESC只有一句话,TF-IDF向量维度太少,排序结果参考价值低。
建议把岗位职责、硬性要求、加分项都写进去,至少200字。

另外,resumes目录不要放超过200个文件,内存占用会明显上升;
如果简历量大,按批次拆分目录处理。

验证效果与后续调整

跑完脚本后,人工抽查前5名和末5名的简历,判断排序是否符合预期。
如果前几名明显不相关,优先检查岗位描述关键词是否覆盖了简历中的实际用词。

可以临时修改JOB_DESC,加入“机器学习”“数据分析”等词,再执行一次,观察排序变化。
这能帮你快速理解TF-IDF对关键词的敏感程度。

这个原型只做文本相似度,不涉及语义理解。
要提升准确度,后续可以替换为句向量模型,但需要额外下载模型文件并占用更多内存。
建议先用当前版本跑通流程,确认业务侧认可排序逻辑后,再考虑升级。

常见疑问

脚本能直接读图片简历吗? 不能。pdfplumber只提取文本层,图片简历需要先做OCR,常见做法是用tesseract转文字后再传入脚本。

排序分数多高才算合格? 没有统一标准。
建议先人工标注20份简历的“是否进入面试”,再对比脚本排序,看前50%是否覆盖了大部分合格简历。

能否批量处理多个岗位? 可以。
把JOB_DESC改成从文件读取,用循环依次处理每个岗位的简历目录即可,注意每次重新初始化向量器。

如果你正在推进AI+人力资源应用落地,建议先按本文步骤在测试环境跑通原型,再根据实际简历样本调整关键词和阈值。
遇到解析失败时,优先检查文件格式和编码,而不是反复改脚本逻辑。

分享到:
上一篇
AI招聘文案生成怎么落地?从提示词到批量出稿的实操教程
下一篇
AI绩效管理配置:从参数设置到结果验证的实操步骤
1
系统公告

泽御云中秋国庆双节活动上线:新购8折,拼团3.99元起

尊敬的用户:
泽御云“月满中秋·礼贺国庆”双节活动现已开启,活动时间为2026年9月23日至10月10日。 活动期间可享以下福利:
1. 常规云服务器新购使用优惠码“泽御中秋国庆同乐”,符合条件的订单享8折优惠。
2. 香港精品云服务器5人拼团低至3.99元,部分4核4G套餐3人拼团年付388元,续费同价。
3. 新用户购买年付云服务器,符合活动规则可赠送2个月使用时长。
4. 老用户续费季度赠15天,续费年度赠2个月;活动期间升级配置免收配置迁移手续费。
5. 推荐好友成功下单,符合条件的推荐人可获赠7天服务器使用时长。
6. 活动期间享宕机补偿标准翻倍、简单网站迁移协助及技术工单优先处理权益。
温馨提示:优惠码不适用于拼团套餐、活动轻量产品、年付订单及续费订单;拼团套餐为独立特价活动,不与赠时类福利叠加。赠送时长不可折现、退款或跨账户转移,具体规则以活动页面说明为准。
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意