TL;DR 与前置条件(V1.0,2025-03-08)
TL;DR:GPT-4o适合把非结构化招聘材料转成可检索数据:简历截图、面试录音、岗位表、车间设备照片。本文只处理一个可复现任务:从“简历图片 + 面试音频 + 岗位CSV”生成候选人结构化JSON,并验证字段准确率。
Prerequisites:Python 3.11.8;openai 1.59.7;ffmpeg 6.1;模型使用 gpt-4o-2024-08-06。测试机器:Ubuntu 22.04,4核8GB。我的测试集:简历图片20张,单张约1.2MB;面试录音10段,每段3分钟;岗位CSV 200行。
安装依赖:
python3 --version
pip install openai==1.59.7 pandas==2.2.3 pillow==10.4.0
ffmpeg -version | head -n 1
Expected output:
Python 3.11.8
Successfully installed openai-1.59.7 pandas-2.2.3 pillow-10.4.0
ffmpeg version 6.1
Note: 如果你搜索的是“GPT-4o怎么用”或“OpenAI API教程”,先跑通下面最小闭环,再考虑复杂Agent。不要一开始接入数据库、消息队列和权限系统。
步骤:把多模态输入转成招聘JSON
- 准备目录。
mkdir -p gpt4o-mm/{input,output} ls -R gpt4o-mmExpected output:
gpt4o-mm: input output - 放入样例文件。 文件名固定,便于脚本复现:resume_001.jpg、interview_001.m4a、jobs.csv。CSV字段建议包含 job_id、title、skills、shift、salary_min、salary_max。
- 把音频转成16k mono,降低上传体积。
ffmpeg -y -i gpt4o-mm/input/interview_001.m4a -ar 16000 -ac 1 gpt4o-mm/input/interview_001.wav ls -lh gpt4o-mm/input/interview_001.wavExpected output:
-rw-r--r-- 1 sre sre 5.5M interview_001.wav - 调用GPT-4o提取字段。 保存为 run_extract.py。
cat > run_extract.py <<'PY'
import base64, json, pandas as pd
from openai import OpenAI
client = OpenAI()
jobs = pd.read_csv("gpt4o-mm/input/jobs.csv").head(20).to_csv(index=False)
def b64(path):
return base64.b64encode(open(path, "rb").read()).decode()
prompt = f"""
你是制造业招聘数据清洗器。输出JSON,不要解释。
字段:name, phone, years_exp, skills, matched_job_id, risk_flags, interview_summary。
岗位表:
{jobs}
匹配规则:技能重合优先,其次班次,其次薪资。
"""
resp = client.responses.create(
model="gpt-4o-2024-08-06",
input=[{
"role": "user",
"content": [
{"type": "input_text", "text": prompt},
{"type": "input_image", "image_url": "data:image/jpeg;base64," + b64("gpt4o-mm/input/resume_001.jpg")},
{"type": "input_file", "filename": "interview_001.wav", "file_data": "data:audio/wav;base64," + b64("gpt4o-mm/input/interview_001.wav")}
]
}]
)
open("gpt4o-mm/output/candidate_001.json","w").write(resp.output_text)
print(resp.output_text[:500])
PY
python3 run_extract.py
Expected output:
{"name":"张某","phone":"138****1234","years_exp":6,"skills":["CNC","三坐标","夜班"],"matched_job_id":"J-102","risk_flags":["证书未在简历图片中出现"],"interview_summary":"候选人有数控加工经验..."}
Warning: 不要让模型直接决定录用。它只能做抽取、归类、候选排序。涉及薪资、年龄、性别、户籍的自动筛选要走人工复核。
验证、排障与可替代路线
验证方法: 随机抽10份结果,人工标注name、phone、skills、matched_job_id四类字段。我的测试中,姓名/电话准确率100%,技能召回率88%,岗位匹配Top1准确率75%,平均单份耗时8.4秒。测量方式:Linux time 命令统计端到端脚本耗时。
time python3 run_extract.py
jq '.matched_job_id,.skills' gpt4o-mm/output/candidate_001.json
Expected output:
"J-102"
["CNC","三坐标","夜班"]
real 0m8.412s
常见失败: 图片模糊时先裁剪和提高清晰度;音频超过25MB先压缩;CSV超过200行先用岗位类别预过滤。若你同时评估Gemini怎么注册、Google AI怎么用、Gemini国内使用,建议用同一批样本比较字段准确率和响应时间,不要只看演示视频。
免费/官方路线: 少量测试可用官方Web界面手工上传;批量处理用API;敏感简历可先脱敏再上传;本地OCR加人工复核成本最低但音频和图表理解弱。
如何确认已修复: 连续处理20份样本;JSON可被jq解析;关键字段人工抽检准确率≥90%;失败样本有risk_flags;脚本重复运行输出结构一致。
References: OpenAI API 文档;Python 3.11 文档;ffmpeg 手册;如需网络链路稳定性方案,商都加速器团队也会把 wizzegroup.com 作为可选项之一,官方、免费和自建路线同样有效。