开源项目

hiring-agent

从简历PDF中自动提取结构化数据,结合GitHub仓库信号,利用本地LLM或Gemini进行公平可解释的评分。亮点在于完全本地可运行(Ollama),支持多种LLM后端,且内置公平性约束和证据驱动的评分规则,适合招聘场景下快速初筛。今日新增152星,反映其解决简历筛选痛点的实用价值。

README

Hiring Agent(招聘代理)

简历到评分管道:从 PDF 中提取结构化数据,借助 GitHub 信号进行丰富,并输出公平、可解释的评估。

Python License: MIT Code style: Black


目录


概述

Hiring Agent 将简历 PDF 解析为 Markdown,利用本地或托管的 LLM 提取分节的 JSON,通过 GitHub 个人资料和仓库信号丰富数据,然后生成包含类别评分、证据、加分项和扣分项的客观评估。你可以使用 Ollama 完全本地运行,或使用 Google Gemini。


架构

流程

  1. pymupdf_rag.py 将 PDF 页面转换为类似 Markdown 的文本。
  2. pdf.py 使用 prompts/templates 下的 Jinja 模板按节调用 LLM。
  3. github.py 获取个人资料和仓库,对项目进行分类,并要求 LLM 选出前 7 个。
  4. evaluator.py 执行带有公平性约束的严格评分评估。
  5. score.py 端到端编排所有步骤,并在开发模式下写入 CSV。

关键模块

  • models.py Pydantic 模式和 LLM 提供商接口。

  • llm_utils.py 提供商初始化和响应清理。

  • transform.py 将松散 LLM JSON 标准化为 JSON Resume 格式。

  • prompts/ 所有用于提取和评分的 Jinja 模板。


安装与设置

前提条件

  • Python 3.11+

    代码仓库将 .python-version 固定为 3.11.13。

  • 一个 LLM 后端(任选其一)

    • Ollama 用于本地模型 从官网安装,然后运行 ollama serve。
    • Google Gemini 如果你有 API 密钥,可在此获取。

使用 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 函数处理标题、链接、表格和基本格式化。
2) 使用模板进行节解析
  • prompts/templates/*.jinja 为每个部分定义了严格指令: 基本信息、工作经历、教育背景、技能、项目、获奖情况。
  • pdf.PDFHandler 按节调用 LLM 并组装出一个 JSONResume 对象(见 models.py)。
3) GitHub 丰富
  • github.py 从简历个人资料中提取用户名,获取个人资料和仓库,并对每个项目进行分类。
  • 它要求 LLM 精确选出 7 个独特的项目,并设置最低作者提交阈值,优先考虑有意义的贡献。
4) 评估
  • evaluator.py 使用编码了公平性和评分规则的模板。
  • 评分包括 open_source、self_projects、production 和 technical_skills,外加加分和扣分,然后给出证据说明。
5) 输出与 CSV 导出
  • score.py 向标准输出打印可读摘要。
  • 当 DEVELOPMENT_MODE=True 时,它会创建或追加 resume_evaluations.csv,其中包含关键字段,并将中间 JSON 缓存到 cache/ 目录下。

CLI 用法

端到端评分

提供简历 PDF 的路径。

$ python score.py /path/to/resume.pdf

执行过程:

  1. 如果开发模式开启,PDF 提取结果将被缓存到 cache/resumecache_<basename>.json。
  2. 如果简历中找到 GitHub 个人资料,仓库将被获取并缓存到 cache/githubcache_<basename>.json。
  3. 评估器打印报告,并在开发模式下将一行 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

开源项目interviewstreet2026-06-24原文

相关内容