hiring-agent
从简历PDF中自动提取结构化数据,结合GitHub仓库信号,利用本地LLM或Gemini进行公平可解释的评分。亮点在于完全本地可运行(Ollama),支持多种LLM后端,且内置公平性约束和证据驱动的评分规则,适合招聘场景下快速初筛。今日新增152星,反映其解决简历筛选痛点的实用价值。
README
Hiring Agent(招聘代理)
简历到评分管道:从 PDF 中提取结构化数据,借助 GitHub 信号进行丰富,并输出公平、可解释的评估。
目录
概述
Hiring Agent 将简历 PDF 解析为 Markdown,利用本地或托管的 LLM 提取分节的 JSON,通过 GitHub 个人资料和仓库信号丰富数据,然后生成包含类别评分、证据、加分项和扣分项的客观评估。你可以使用 Ollama 完全本地运行,或使用 Google Gemini。
架构
流程
|
关键模块
|
安装与设置
前提条件
Python 3.11+
代码仓库将
.python-version固定为 3.11.13。一个 LLM 后端(任选其一)
使用 pip 快速设置
$ git clone https://github.com/interviewstreet/hiring-agent
$ cd hiring-agent
$ python -m venv .venv
# Linux 或 macOS
$ source .venv/bin/activate
# Windows
# .venv\Scripts\activate
$ pip install -r requirements.txt
Ollama 模型
拉取你想使用的模型。例如:
$ ollama pull gemma3:4b
如果你想要不同结果,可以拉取其他模型,例如:
# 适用于较高系统配置
$ ollama pull gemma3:12b
# 适用于较低系统配置
$ ollama pull gemma3:1b
配置
复制模板并设置你的环境变量。
$ cp .env.example .env
环境变量
| 变量 | 值 | 描述 |
|---|---|---|
LLM_PROVIDER |
ollama 或 gemini |
选择提供商,默认为 Ollama。 |
DEFAULT_MODEL |
例如 gemma3:4b 或 gemini-2.5-pro |
传递给提供商的模型名称。 |
GEMINI_API_KEY |
字符串 | 当 LLM_PROVIDER=gemini 时必须设置。 |
GITHUB_TOKEN |
可选 | 继承自 shell 环境,可提升 GitHub API 速率限制。 |
提供商映射位于 prompt.py 和 models.py 中。config.py 文件含有一个标志:
# config.py
DEVELOPMENT_MODE = True # 启用缓存和 CSV 导出
你可以在迭代期间保持开启。详见下一节。
工作原理
1) PDF 提取pymupdf_rag.py和pdf.py使用 PyMuPDF 读取 PDF 并将页面转换为类似 Markdown 的文本。to_markdown函数处理标题、链接、表格和基本格式化。
prompts/templates/*.jinja为每个部分定义了严格指令: 基本信息、工作经历、教育背景、技能、项目、获奖情况。pdf.PDFHandler按节调用 LLM 并组装出一个JSONResume对象(见models.py)。
github.py从简历个人资料中提取用户名,获取个人资料和仓库,并对每个项目进行分类。- 它要求 LLM 精确选出 7 个独特的项目,并设置最低作者提交阈值,优先考虑有意义的贡献。
evaluator.py使用编码了公平性和评分规则的模板。- 评分包括
open_source、self_projects、production和technical_skills,外加加分和扣分,然后给出证据说明。
score.py向标准输出打印可读摘要。- 当
DEVELOPMENT_MODE=True时,它会创建或追加resume_evaluations.csv,其中包含关键字段,并将中间 JSON 缓存到cache/目录下。
CLI 用法
端到端评分
提供简历 PDF 的路径。
$ python score.py /path/to/resume.pdf
执行过程:
- 如果开发模式开启,PDF 提取结果将被缓存到
cache/resumecache_<basename>.json。 - 如果简历中找到 GitHub 个人资料,仓库将被获取并缓存到
cache/githubcache_<basename>.json。 - 评估器打印报告,并在开发模式下将一行 CSV 追加到
resume_evaluations.csv。
目录结构
.
├── .env.example
├── .python-version
├── config.py
├── evaluator.py
├── github.py
├── llm_utils.py
├── models.py
├── pdf.py
├── prompt.py
├── prompts/
│ ├── template_manager.py
│ └── templates/
│ ├── awards.jinja
│ ├── basics.jinja
│ ├── education.jinja
│ ├── github_project_selection.jinja
│ ├── projects.jinja
│ ├── resume_evaluation_criteria.jinja
│ ├── resume_evaluation_system_message.jinja
│ ├── skills.jinja
│ ├── system_message.jinja
│ └── work.jinja
├── pymupdf_rag.py
├── requirements.txt
├── score.py
└── transform.py
提供商详情
Ollama
- 设置
LLM_PROVIDER=ollama - 将
DEFAULT_MODEL设为任意已拉取的模型,例如gemma3:4b models.OllamaProvider中的提供商封装器调用ollama.chat
Gemini
- 设置
LLM_PROVIDER=gemini - 将
DEFAULT_MODEL设为一个受支持的 Gemini 模型,例如gemini-2.0-flash - 提供
GEMINI_API_KEY models.GeminiProvider中的封装器将响应适配为统一格式
贡献
请阅读 CONTRIBUTING.md 获取有关提报问题、提议变更和提交拉取请求的详细指南。关键原则包括:
- 保持提示词声明式且与提供商无关。
- 使用不同提供商下的几份真实简历验证更改。
- 添加或调整无单元烟雾测试,以最小输入调用每个阶段。
许可证
MIT © HackerRank