在你的机器上进行 AI 求职:Claude Code 框架

一个本地 Claude Code 工作流,用于评估职位、定制求职材料、验证适用于 ATS 系统的 PDF,并帮助候选人为面试做好准备。

在你的机器上进行 AI 求职:Claude Code 框架

求职通常被视为一个写作问题:找到招聘信息,修改简历,撰写求职信,然后重复这一过程。但实际上,困难在于管理完整的求职流程,同时不丢失上下文,也不会意外发送千篇一律或不准确的材料。

ai-job-search 将这一过程视为一个工程工作流。它把 Claude Code 变成本地求职助手,可以建立结构化的候选人档案,搜索招聘门户,评估匹配度,生成定制化文档,检查 PDF 输出,并准备面试材料。由于工作流运行在你自己的代码仓库中,你的职业数据始终由你控制,也可以根据所在市场进行调整。

这个项目也非常容易评估:项目作者表示,他在 2025 年底失去职位后开始使用这套工作流。该流程生成了 69 份定制化申请,带来了 20 次初轮面试,并最终签署了一份合同。作者于 2026 年 6 月开始担任 AI 工程师。这些数字并不能保证每位候选人都能获得相同结果,但它们提供了一个具体示例,说明该系统被作为实际的求职工具使用,而不只是一个演示。

核心工作流

主要工作流刻意保持简短:

/setup -> /scrape -> /apply <url>
   |        |            |
 profile  search       evaluate fit
 files    portals      draft documents
                       review and revise

/setup 创建基础信息。它可以读取包含简历、LinkedIn 导出文件、文凭、推荐信和过往申请材料的完整 documents/ 目录。它也可以导入直接粘贴到聊天中的单份简历,或通过面谈收集信息。文档目录路径支持幂等操作,因此随着更多源材料可用,可以再次运行该命令。

/scrape 搜索已配置的招聘门户,删除重复职位,并按匹配度排序后展示结果。如果结果集过大,无法手动检查,/rank 会对职位进行批量评分,并返回一份排名后的候选列表。评估会考虑技能、经验、文化、地点和职业发展匹配度,而不仅仅是匹配关键词。

最后,/apply 接受职位 URL 或粘贴的职位描述,并运行完整的申请流程。这种分离很重要:职位发现、优先级排序和文档生成是不同的决策,将它们合并到一个无结构的提示中,会让人更难检查系统的推理过程。

/apply 的不同之处

申请命令采用起草者与审阅者模式:

  1. 解析招聘信息。
  2. 根据已配置的标准评估候选人的匹配度。
  3. 起草定制化简历和求职信。
  4. 启动第二个拥有全新上下文的 Claude 代理,研究公司并批评这些草稿。
  5. 根据审阅结果修改文档。
  6. 编译并检查最终 PDF。
  7. 运行面向 ATS 的文本层检查,并展示验证清单。

第二个代理的设计很重要。单次处理可能生成流畅但泛泛的文字,同时遗漏某项要求,对可迁移技能的描述不够有力,或让公司研究显得流于表面。审阅者会直接接收内嵌的草稿,而不必重新读取它们,从而保持较高的令牌使用效率。验证只在最后运行一次,不过较新的 PDF 检查阶段会将部分节省下来的预算用于渲染和布局迭代。

该工作流还执行一条事实性规则:简历和求职信中的陈述必须得到候选人档案的支持。缺失的技能仍然是差距。系统不会仅仅为了改善表面上的匹配度而添加没有依据的关键词。

PDF 布局也是正确性的一部分

该仓库将生成的文档视为需要测试的构建产物。简历使用 lualatex 编译,而求职信使用 xelatex,因为自定义的 cover.cls 依赖 fontspec。工作流会持续迭代,直到简历恰好为两页,求职信恰好为一页,并且包含可见的签名和一致的字体。

这样可以捕获源文件中看不出的失败:职位条目标题孤零零地停留在页面底部,求职信溢出到第二页,或列表项图标静默回退到正文所用字体。项目使用 \\needspace\\enlargethispage 等有针对性的 LaTeX 修复,同时为列表项使用匹配字体的包装器。

当简历超过两页时,系统不会机械地从最早的职位开始删除内容。候选人经历中的每一行会根据其与目标职位的相关性、在文档中的独特性,以及求职信是否依赖该内容进行评分。因此,较早职位中的相关要点可能会保留下来,而最近职位中无关的要点反而可能被删除。

ATS 检查查看 PDF 中嵌入的文本,而不是其视觉外观。借助 pypdfpdftotext,它会验证联系方式是否为字面文本、字形是否乱码、阅读顺序是否合理,以及招聘信息中已得到支持的关键词是否出现在提取出的文档中。如果两种文本提取工具都不可用,流程会退回到人工视觉关键词检查。

安装与设置

该框架需要:

  • Claude Code CLI,不过也可以通过 AGENTS.md 将门户技能用于其他代理工具。
  • Python 3.10 或更高版本。
  • 用于招聘搜索 CLI 工具的 Bun。
  • 包含 lualatexxelatex 的 LaTeX 发行版,例如 TeX Live、MacTeX、TinyTeX 或 MiKTeX。

对于可选的 ATS 解析器,请安装 pypdf

pip install pypdf

Poppler 的 pdftotext 仍然是备用方案。在 macOS 上可以使用 brew install poppler 安装;在 Debian 或 Ubuntu 上使用 apt install poppler-utils;在 Windows 上使用 choco install poppler。精简版 TeX 发行版可能还需要安装 SETUP.md 中列出的其他软件包。

克隆仓库后,安装招聘门户工具:

gh repo fork MadsLorentzen/ai-job-search --clone
cd ai-job-search

for tool in jobbank-search jobdanmark-search jobindex-search jobnet-search linkedin-search freehire-search; do
  (cd .agents/skills/$tool/cli && bun install)
done

linkedin-searchfreehire-search 工具没有运行时依赖,因此它们的安装步骤是可选的,只会获取 TypeScript 开发类型。

设置说明中有一个重要的隐私细节:公开的 GitHub fork 无法改为私有,而 /setup 会将联系方式、工作经历和薪资预期等个人信息写入受版本控制的文件。对于个人求职,推荐使用私有仓库,并将该项目配置为上游远程仓库。只有在需要贡献修改时,才应公开 fork。

扩展到丹麦以外

随项目提供的 Jobindex、Jobnet、Jobdanmark 和 Akademikernes Jobbank 集成面向丹麦市场。不过,该架构本身具备可移植性。每个招聘门户技能都是 .agents/skills/ 下的独立文件夹,包含通用的搜索和详情 CLI、--format json|table|plain 输出、测试,以及技能定义中的 enabled: 标志。

/add-portal 可以调查本地招聘网站的 URL 模式、结果结构、robots 规则和访问限制,然后搭建并测试新的集成。需要身份验证的门户会被拒绝,限制性条款则会触发个人使用警告。LinkedIn 通过公开的 jobs-guest 端点提供了一个与国家无关的起点,并支持明确的地点标志,例如 -l "Berlin, Germany"-l "Remote"。仓库还包含 freehire-search,它使用 freehire.me 的公开 REST API,并支持地区、国家和远程办公筛选条件。

从其他 fork 复制的门户技能应在使用前阅读并测试。项目特别建议检查网络目标、依赖项、生命周期脚本、文件系统访问、测试、服务条款说明以及 enabled: 设置。由于已安装的工具可能会在预先批准的 Claude Code 权限下运行,这种人工检查是一项有意设置的安全控制措施。

跟踪、面试与职业规划

生成申请材料之后,该框架仍会继续工作。/outcome 会将确切的招聘信息、已提交的简历和求职信归档到 documents/applications/<company>_<role>/ 下,同时在跟踪器中记录面试、录用、拒绝或无回应。/outcome followup 会查找默认 10 天内没有进展的申请,并起草适合相应沟通渠道的跟进消息。它不会发送消息,并将每份申请的跟进次数限制为两次。

/interview 会根据面试官实际看到的文档、上一轮反馈、公司研究和面试官研究来生成准备材料。可能出现的问题会映射到真实的 STAR 示例;对于缺失的经历,则使用诚实的衔接式回答,而不是编造故事。

在报告方面,/html-report 会生成一个自包含的离线仪表盘,其中包含状态、行业、渠道和漏斗图表,以及可筛选的申请表格。/notion-sync 使用官方 MCP 服务器在 Notion 中提供单向只读视图,同时将仓库文件保留为事实来源。/gmail-sync 可以根据 Gmail 提议状态变更,但需要获得批准,并为每项变更引用来源邮件。

项目还支持使用 /expand 从关联的公开来源丰富档案,使用 /upskill 生成按优先级排列的技能差距热图和学习计划,以及一个接受用户从工会统计数据、Glassdoor 导出文件或个人研究中提供的数据的薪资基准脚本。

质量提升的关键在于档案深度

档案中没有的信息,系统无法据此定制材料。“Python”是较弱的输入;“使用 Python 和 scikit-learn 为客户流失预测构建机器学习管道”则为工作流提供了可以复用的具体成果、工具链和上下文。

详细的职位描述、可量化的成果、项目细节、偏好、不可妥协项,以及对哪些事情让你充满动力或感到疲惫的反思,都会影响推荐结果。该框架支持明确的目标定位,也可以通过分析职位名称背后的实际工作来发现相邻的职业路径。语言要求会得到专门处理:未声明的语言能力可能触发直接拒绝,而招聘信息要求的水平高于已声明水平时,则会标记出来供人工判断。

结构化评估、文档生成、PDF 验证、申请跟踪和面试准备的结合,使 ai-job-search 不再只是一个简历提示词。它是一个本地、可检查的求职操作系统,并为招聘门户、文档模板和评估标准提供了清晰的扩展点。该项目采用 MIT 许可证,可在 github.com/MadsLorentzen/ai-job-search 获取。

来源

MadsLorentzen/ai-job-search:运行在你机器上的求职工具。基于 Claude Code 构建的 AI 求职框架:评估招聘信息、定制简历、撰写求职信、准备面试。Fork 它,并由你掌控。