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