人永远是要学习的。死的时候,才是毕业的时候。——萧楚女

https://github.com/interviewstreet/hiring-agent

Hiring Agent:一位会看简历、懂 GitHub、还能讲道理的 AI 招聘搭档

招聘这件事,表面上看像是在筛简历,实际上更像是在一堆纸页与链接里,努力寻找一个人的真实能力轮廓。很多简历写得漂亮,却未必落地;很多候选人代码写得扎实,却不一定擅长包装自己。于是,招聘团队常常像在雾里看人,既想快一点,又怕看走眼。

Hiring Agent 就像这样一位被请进招聘现场的智能搭档。它不是那种只会扫关键词的冷面机器,也不是那种一上来就拍脑袋打分的武断裁判。它做的事情更像一位认真、克制、讲证据的评估者:先把 PDF 简历读懂,再从中抽取结构化信息,接着顺藤摸瓜去看候选人的 GitHub 足迹,最后给出一份尽量公平、可解释的评价结果。

这个项目的仓库 description 很直接:

AI agent to evaluate and score resumes.

短短一句话,已经把它的性格交代清楚了:它的使命,就是评估简历,并给出分数。但真正吸引人的地方,不是“会打分”,而是它为什么打这个分,它看了什么,它如何尽量减少主观偏差。这正是 Hiring Agent 最有意思的地方。


它不是在读简历,它是在和简历“对话”

很多工具处理简历的方式都很粗暴:把 PDF 丢进去,抽点文字,找几个学历、年限、技能关键词,然后给个模糊结果。Hiring Agent 显然不满足于这种浅尝辄止的做法。

它更像一个很有耐心的面试官,会先把候选人的简历从 PDF 转换成接近 Markdown 的文本形式,把版式、标题、表格、链接这些信息尽可能有条理地还原出来。这样一来,原本可能藏在 PDF 版式里的结构,就被整理成了更适合后续理解和分析的样子。

接着,它不会把整份简历一股脑丢给模型乱猜,而是分章节处理。基础信息、工作经历、教育背景、技能、项目、奖项,各有各的模板,各有各的问题。这个过程像极了一位认真做笔记的人,把候选人的经历一点点拆开、整理、归纳,最后拼成一份更标准、更清晰的画像。

换句话说,Hiring Agent 不只是“读到了字”,而是努力“理解这些字在讲什么”。


它最动人的地方,是会顺着 GitHub 去看候选人的“第二张脸”

一份简历讲的是“我做过什么”,而 GitHub 往往讲的是“我到底是怎么做的”。

Hiring Agent 很聪明地意识到了这一点。它不会只停留在纸面描述,而是会尝试从简历中提取 GitHub 相关信息,再去获取候选人的 GitHub profile 和仓库数据,并进一步分析项目特征。

这一步特别像一位经验丰富的招聘官,在看完简历后轻轻推开另一扇门,说一句:

“纸上写得不错,那我再去看看你留下来的代码痕迹。”

它会对项目进行分类,并让 LLM 从候选人的仓库中挑选出 恰好 7 个独特项目 作为重点观察对象,而且还会结合作者提交阈值等约束,尽量偏向那些真正体现有效贡献的项目,而不是只看“fork 了多少”“star 多不多”这种表面热闹。

这很重要,因为真正好的招聘判断,不是被喧嚣吸引,而是去看那些能证明能力的细节。Hiring Agent 在这里展现出的,不只是自动化能力,还有一种克制的判断气质。


它不是随便给分,而是在努力做一个“讲证据的裁判”

很多“智能评分”工具最让人不安的地方,在于它们给了一个分数,却没告诉你这个分数到底是怎么来的。

Hiring Agent 试图避免这种黑箱感。

它的评估环节会基于明确的评分维度来进行,包括:

  • open_source
  • self_projects
  • production
  • technical_skills

除此之外,还有 bonus 和 deductions,以及与评分对应的解释说明。也就是说,它不是“心情好给 8 分,心情不好给 5 分”,而是尽量按照规则、有证据地说话。

这种设计很像一位成熟的评委:不抢戏,不煽情,但每一句判断后面都有依据。它关心的不只是结果,还关心这个结果能不能被人类理解、复核和讨论。

在招聘这种本来就很容易受偏见影响的场景里,这样的设计尤其珍贵。因为“公平”不是喊出来的,而是体现在每一次评分约束、每一个解释字段、每一条规则模板里。


整个流程像一条安静但高效的流水线

Hiring Agent 的架构非常清晰,几乎像一支分工默契的小团队:

  1. pymupdf_rag.py 负责把 PDF 页面转成 Markdown 风格文本
  2. pdf.py 按章节调用 LLM,并结合 prompts/templates 下的 Jinja 模板提取结构化内容
  3. github.py 负责获取 GitHub profile、仓库信息、项目分类,并让模型筛出最有代表性的 7 个项目
  4. evaluator.py 根据严格的评分规则进行评估,并加入公平性约束
  5. score.py 负责把整条链路串起来,执行端到端评分,在开发模式下还会输出 CSV

这套流程看起来很工程化,但读起来其实很有画面感。

如果把它拟人化一点,可以这样理解:

  • pymupdf_rag.py 是那个先把候选人“请进门”的前台,负责把复杂的 PDF 内容整理成大家都看得懂的样子
  • pdf.py 像一位做记录的面试助手,把不同维度的信息分别归档
  • github.py 像背景调查专员,安静地去翻看候选人的开源履历
  • evaluator.py 则像评审委员会,按照规则给出综合判断
  • score.py 就像总导演,把所有角色调度起来,让整场评估有条不紊地完成

这也正是一个好项目最迷人的地方:它不只是“功能堆起来了”,而是每个模块都知道自己该在什么时候出现、该说什么话。


快速启动很友好,像是在说“来,先跑起来再聊”

如果你想上手这个项目,它并不故作高冷。README 给出的快速启动路径很直接,几步就能把环境拉起来。

1
2
3
4
5
6
git clone https://github.com/interviewstreet/hiring-agent
cd hiring-agent

python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

如果你在 Windows 上,则激活虚拟环境可以使用:

1
.venv\Scripts\activate

项目要求 Python 3.11+,仓库里的 .python-version 固定到了 3.11.13。这说明它对运行环境是有明确预期的,不希望你在版本细节上踩坑。

接下来,它会邀请你选择一个 LLM 后端。这个项目目前支持两种路线:

  • Ollama
  • Google Gemini

如果你喜欢本地跑模型,README 推荐使用 Ollama。你可以先启动服务,再拉取模型,例如:

1
2
ollama serve
ollama pull gemma3:4b

如果机器配置更高一点,可以尝试:

1
ollama pull gemma3:12b

如果设备资源比较紧张,也可以用更轻量的版本:

1
ollama pull gemma3:1b

看到这里你会发现,Hiring Agent 并没有强迫你必须走云端 API,也没有摆出一种“只有高配机器和昂贵额度才能玩”的架势。它在姿态上是开放的,既欢迎本地实验,也支持托管模型接入。


配置过程很干净,不拐弯抹角

项目的配置也很清晰。先复制环境变量模板:

1
cp .env.example .env

然后根据你的使用方式填写变量。README 里列出的几个关键项非常实用:

  • LLM_PROVIDERollamagemini
  • DEFAULT_MODEL:例如 gemma3:4bgemini-2.5-pro
  • GEMINI_API_KEY:当使用 Gemini 时需要提供
  • GITHUB_TOKEN:可选,但能提升 GitHub API 的速率限制表现

其中还有一个非常值得注意的小开关,位于 config.py

1
DEVELOPMENT_MODE = True  # enables caching and CSV export

这个 DEVELOPMENT_MODE 很像项目留给开发者的一盏小夜灯。你把它打开,它就会在执行过程中缓存中间结果,还会把评估结果写到 CSV 里。对于调试、验证、迭代 prompt、观察模型行为来说,这个设计非常贴心。

它像是在悄悄对你说:

“别急着一次性跑完,我们可以边看边改,慢慢把流程打磨顺。”


真正跑起来时,它的工作方式很有仪式感

项目最核心的 CLI 用法其实非常简单,只需要给它一份 PDF 简历路径:

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

就这一条命令,背后却会触发一整套评估旅程。

根据 README 描述,执行后会发生这些事情:

  1. 如果开发模式开启,PDF 提取结果会缓存到 cache/resumecache_<basename>.json
  2. 如果在简历里找到了 GitHub profile,仓库数据会被抓取并缓存到 cache/githubcache_<basename>.json
  3. 评估器会输出一份可读性较强的报告
  4. 在开发模式下,还会把关键字段追加写入 resume_evaluations.csv

这就像你把一份简历交到它手里,它先认真拆封、阅读、查验,再把判断结果整齐地放回桌面。过程中不仅有结论,还有痕迹;不仅有输出,还有留档。

对于招聘团队、实验研究者、做 AI 工作流搭建的人来说,这种可观察、可复现的行为非常重要。因为一套真正能进入业务流程的系统,不能只会“出结果”,还得能被验证、被排查、被改进。


它的目录结构,像一间收拾得很利落的工作室

从目录布局也能看出,这个项目是有节制感的。核心文件并不杂乱,职责边界比较明确:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
.
├── .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

其中最值得多看一眼的是 prompts/templates/。这个目录像项目的大脑语言区,里面的模板决定了它如何提问、如何抽取、如何评估。也就是说,Hiring Agent 的判断风格,并不只存在于 Python 逻辑里,也深深写在 prompt 模板中。

这类项目最容易被忽略的一点,就是 prompt 本身其实也是“业务规则”的一部分。这里把模板集中管理,既利于迭代,也说明作者把 LLM 行为当作正式系统组件来对待,而不是随手拼几句提示词就算了。

这种态度,挺专业,也挺迷人。


它的“公平感”,不是装饰词,而是设计的一部分

README 在开头就强调了一个关键词:fair, explainable evaluation

这句话很重要,因为招聘评估从来不只是技术问题,它还带着明显的价值判断问题。

一个简历评分系统,如果只追求速度,可能会把人当成一串关键词;如果只追求自动化,可能会放大偏见;如果只追求漂亮输出,可能会牺牲解释性。Hiring Agent 试图在这些拉扯之间找到一个更稳的平衡点。

它采用结构化解析,不让信息混成一团。
它结合 GitHub 信号,不让纸面表达独占舞台。
它设定明确维度,不让结论漂浮不定。
它要求解释说明,不让分数成为黑箱。
它引入公平性约束,不让评估轻易滑向随意和偏见。

当然,任何 AI 评估系统都不可能天然完美,Hiring Agent 也一样。它不是最终真理,更不是替代人类判断的绝对裁决者。但它至少在架构和流程上表现出一种认真:不是用 AI 来制造新的不透明,而是试图用 AI 去搭建一个更可讨论、更可审视的评估过程。

这份认真,本身就很值得尊重。


对谁来说,这个项目尤其有吸引力

如果你是以下几类人,Hiring Agent 大概率会让你眼前一亮:

1. 招聘产品或 HR Tech 方向的开发者

你会看到一个非常具体的 AI 应用场景,不是泛泛地说“AI 赋能招聘”,而是真的把简历解析、GitHub 增强、评分输出串成了一条可运行流程。

2. 正在做 LLM 工作流编排的人

这个项目很适合作为一个案例去看:如何把文档解析、结构化提取、外部数据增强、规则化评估组合成一个端到端系统。

3. 对 Prompt Engineering 和结构化输出感兴趣的人

Hiring Agent 的模板组织方式很有参考价值。它不是把模型当魔法盒,而是用章节模板、统一 schema、结果清洗和转换逻辑,把“模型输出”尽量约束成“系统输入”。

4. 想研究 AI 在高风险决策场景中如何落地的人

招聘不是一个可以随便试错的场景。它天然要求公平、解释性和可审计性。所以这个项目所呈现的思路,远不止“怎么调 API”,而是“怎么让 AI 在严肃业务场景中说话更负责任”。


它像一位年轻但认真的招聘官

如果一定要给 Hiring Agent 一个拟人化形象,我会觉得它像一位刚走进招聘现场不久、却已经很有原则感的年轻招聘官。

它不油滑,不装腔,也不急着给人下定义。
它会先低头看材料,再抬头看代码。
它愿意听简历怎么讲,也愿意去 GitHub 看你真正做了什么。
它记得评分,却更记得解释。
它想提高效率,但又不想为了效率牺牲公正。

在一个充满“快一点、再快一点”的时代里,这种带着克制感的自动化反而格外动人。

因为真正好的工具,从来不是代替人草率判断,而是帮助人更认真地判断。


写在最后

Hiring Agent 并不是一个喧闹的项目。它没有把自己包装成“颠覆招聘行业的终极革命”,也没有把 AI 神化成无所不能的裁判。它做的事情其实很朴素:把简历读清楚,把 GitHub 看明白,把评估说具体。

但正是这种朴素,让它显得可靠。

它像一位坐在招聘桌旁的安静助手,不抢风头,却把脏活累活做得有条有理;不高喊公平,却把公平尽量写进流程;不假装全知,却努力让每一份评分更有根据。

如果你想找一个既能体现 LLM 工程实践、又足够贴近真实业务问题的开源项目,Hiring Agent 很值得一看。它让人看到,AI 不是只能做炫目的演示,也可以认真地参与那些需要判断、责任与分寸感的工作。

而招聘,也许正是最需要这种分寸感的地方之一。