AI+招聘应用落地教程:从模型接入到简历筛选上线
AI+招聘应用的核心,是把招聘流程里重复度最高的简历筛选和岗位匹配交给程序处理,人只负责复核结果。
本文按零基础也能照做的顺序,讲清楚环境准备、接口配置、核心功能实现、常见报错和上线验证,适合想自建招聘筛选工具的中小团队或运维人员。
先明确你要做的功能边界
动手前先定范围,避免一上来就做成大而全的系统。
建议第一版只做三件事:
- 上传简历文件(PDF 或 DOCX),提取纯文本。
- 调用大模型接口,让模型输出结构化的候选人字段,例如姓名、年限、技能、匹配分。
- 按岗位要求打分并写入数据库,前端只做列表和详情查看。
适用条件:服务器能访问外网或已配置好内网模型网关;
简历文件不超过单次接口的上下文长度限制。
如果简历量很大,先做批量异步处理,不要同步等待。
环境准备与依赖安装
以 Ubuntu 22.04 为例,Python 用 3.10 以上版本。
先确认基础环境:
python3 --version
pip3 --version
安装虚拟环境和依赖,目录统一放在 /opt/ai-recruit:
mkdir -p /opt/ai-recruit && cd /opt/ai-recruit
python3 -m venv venv
source venv/bin/activate
pip install fastapi uvicorn pdfplumber python-docx requests
数据库用 SQLite 起步即可,后续再换 MySQL。
关键配置写入 .env 文件,不要硬编码在代码里:
MODEL_API_BASE=https://你的模型网关地址/v1
MODEL_API_KEY=你的密钥
MODEL_NAME=你的模型名称
注意:模型名称和接口地址以你实际使用的服务商文档为准,不要照抄示例。
密钥只放在服务器环境变量中,不要提交到代码仓库。
简历解析与模型调用的关键步骤
第一步做文本提取。
PDF 用 pdfplumber,DOCX 用 python-docx,提取后统一清洗空白字符。
文本过长时按段落截断,保留前 6000 字左右,避免超出上下文限制。
第二步构造提示词。
要求模型只返回 JSON,字段固定,例如:
{"name":"","years":0,"skills":[],"match_score":0,"reason":""}
在请求中设置 temperature 为 0 到 0.2,减少输出波动。
拿到返回后先做 JSON 解析校验,解析失败就记录原文并跳过该条,不要让整批任务中断。
第三步落库。
表结构至少包含简历 ID、原始文件名、解析文本、模型返回 JSON、创建时间。
匹配分建议由程序按岗位关键词权重计算,模型只负责抽取字段,避免分数完全不可解释。
常见报错与避坑
- 接口返回 401 或 403:检查密钥是否过期、请求头是否为
Authorization: Bearer 密钥,以及网关是否限制了来源 IP。 - 返回内容不是合法 JSON:在提示词中明确“只输出 JSON,不要解释”,并在代码里做容错解析,失败时重试一次。
- 处理大文件超时:把同步接口改成后台任务,前端轮询状态,不要在前端请求里直接等模型返回。
- 简历文本乱码:扫描版 PDF 没有文字层,需要 OCR,不能直接当文本处理。
- 密钥泄露风险:不要把密钥写进前端代码或日志,日志中只记录请求 ID。
上线前的验证清单
部署时用 uvicorn 启动服务,前面加 Nginx 反向代理并配置 HTTPS:
uvicorn main:app --host 127.0.0.1 --port 8000
Nginx 中把 /api/ 转发到 127.0.0.1:8000,并设置 client_max_body_size 10m,否则上传简历会报 413。
验证时按这几点检查:上传一份已知内容的简历,确认提取文本正确;
调用一次模型,确认返回字段齐全;
用两份不同岗位的简历测试匹配分是否有区分度;
查看日志中是否有解析失败记录。
全部通过后再开放给招聘人员使用。
关于效果与合规的提醒
AI 筛选结果只能作为辅助参考,最终录用决策仍应由人复核。
简历属于个人信息,存储和传输要控制访问权限,保留处理日志,避免把真实简历用于公开测试。
模型输出存在波动,建议对关键字段做人工抽检,并定期用样本回归验证。
如果后续要接入企业微信或招聘网站,优先把简历入库和打分逻辑独立成服务,再对接不同来源,这样扩展时不用重写核心流程。