基于 SBERT 与 LLM 的智能简历匹配系统,完整流程为:
PDF/文本预处理 -> 语义匹配(SBERT) -> 技能匹配 -> 综合评分 -> 建议生成(规则/LLM)
系统目标:
- 输入:简历 PDF + 岗位描述(文本或 PDF)
- 输出:语义分、技能分、综合分(0-100)+ 技能命中 + 可解释建议
- 形态:Gradio 可交互网页 Demo
| 模块 | 方案内容 | 当前实现 |
|---|---|---|
| 模块1:文本预处理 | PyPDF2/pdfplumber + jieba |
已实现 PyPDF2 + jieba(pdfplumber 未启用) |
| 模块2:语义匹配 | SBERT 余弦相似度 |
已实现,模型 paraphrase-multilingual-MiniLM-L12-v2 |
| 模块3:融合打分 | 0.6*semantic + 0.4*skill |
已实现(技能侧使用加权重叠) |
| 模块4:建议生成 | 关键点提取 + LLM + 结构化输出 | 已实现(规则默认,支持可选 LLM) |
| 模块5:Demo 展示 | Gradio/Streamlit + 图表 | 已实现 Gradio + matplotlib 图表 |
pip install -r requirements.txt
python app.py启动后访问终端中的地址(通常是 http://127.0.0.1:7860)。
建议首次提前运行一次,SBERT 会下载模型文件,避免演示时等待。
- 在页面顶部选择语言:
中文 / English - 上传简历 PDF
- 输入岗位描述(或上传岗位 PDF / 选择示例 JD)
- 点击
计算匹配度(英文界面为Run Match) - 查看:
- 综合分、语义分、技能分(0-100)
- 技能命中列表
- 分数柱状图
- 建议生成(规则或 LLM)
说明:语言切换会同步影响页面标签、提示信息、图表标题,以及建议输出(含 LLM 提示词与回退规则建议)。
- 语义相似度:SBERT 向量余弦相似度,范围
[0,1] - 技能匹配度:基于词典与别名映射的技能重叠(含段落加权)
- 综合评分:
[ Score = 0.6 \times Sim_{semantic} + 0.4 \times Sim_{skill} ]
网页展示按百分制(0-100)。
- 自动抽取优势与短板(语义分、技能分、命中/缺失技能)
- 默认:规则建议(无需联网)
- 可选:OpenAI 兼容接口(Qwen/ChatGLM/本地网关)
- 以 Markdown 结构化展示:优势、短板、建议、生成状态
支持两种方式:
- 页面直接输入(推荐演示)
- 环境变量预设(推荐长期使用)
页面语言(中文 / English)启用 LLM 生成建议模型名称API KeyBase URL超时时间(秒)
$env:MATCHMAKER_LLM_MODEL="qwen3.6-plus"
$env:MATCHMAKER_LLM_API_KEY="your_api_key"
$env:MATCHMAKER_LLM_BASE_URL="https://dashscope.aliyuncs.com/compatible-mode/v1"
$env:MATCHMAKER_LLM_TIMEOUT_S="80"模型名称:页面输入 >MATCHMAKER_LLM_MODELAPI Key:页面输入 >MATCHMAKER_LLM_API_KEYBase URL:页面输入 >MATCHMAKER_LLM_BASE_URL超时秒数:页面输入 >MATCHMAKER_LLM_TIMEOUT_S>100
若 LLM 配置不完整或调用失败,系统会自动回退规则建议,不影响主流程打分。
- JD 来源说明:
data/jd/SOURCES.md - JD 数据文件(未随仓库提交,需本地生成):
data/jd/job_descriptions_en_500.csv - Kaggle 简历 CSV(本地准备,不提交到仓库):
data/resume/Resume.csv - 技能词典(500+):
data/skills/skills_en_canonical.txt - 技能别名映射:
data/skills/skills_en_aliases.csv
为减小仓库体积,
*.zip与大体积csv默认通过.gitignore排除,不再上传到 GitHub。
python scripts/csv_resume_to_pdf.py --csv data/resume/Resume.csv --id 16852973 --out-dir data/resume/pdf_export输出:data/resume/pdf_export/resume_<ID>.pdf
python scripts/kaggle_resume_batch.py --csv data/resume/Resume.csv --job-text "your JD text" --limit 50 --output data/resume/scores.tsv说明:
semantic/skill/final为 0-1(乘 100 为百分制)- Excel/WPS 打开
.tsv时分隔符选择Tab
| 路径 | 说明 |
|---|---|
app.py |
Gradio 界面与交互流程 |
matchmaker/pdf_parse.py |
PDF 解析、清洗、分词 |
matchmaker/skills.py |
技能词典加载、技能抽取与加权 |
matchmaker/scoring.py |
SBERT 语义匹配与融合评分 |
matchmaker/recommendation.py |
关键点提取、LLM 调用、结构化输出 |
scripts/ |
数据导出、批量评估、CSV 转 PDF |
- 扫描版 PDF(图片)默认无法抽取文本,需要 OCR
- 技能词典当前以英文技能为主,纯中文技能描述命中可能偏低
- LLM 调用依赖外部服务可用性(网络、权限、额度、超时)