从 "海投" 到 "精准匹配" 的范式转移
过去半年,AI 求职工具经历了从 "批量生成" 到 "精准筛选" 的明显转向。早期尝试者常陷入一个误区:让 AI 自动投递数百份申请,结果却是零回复。这种模式的问题不在于自动化本身,而在于缺乏质量门槛和人工审核机制。
开源项目 Career-Ops 提供了一个更具工程思维的解决方案。该系统基于 Claude Code 构建,采用 14 种独立技能模式(skill modes)处理求职流程中的不同环节。开发者 santifer 使用这套系统评估了 740 余个职位,生成 100 余份定制简历,最终成功获得 Head of Applied AI 职位。值得注意的是,系统的核心价值不在于生成那 100 份简历,而在于过滤掉 640 个不匹配的机会。
14 技能架构:模块化设计优于单一大提示词
Career-Ops 的核心架构决策是将求职流程拆解为 14 个独立的技能文件,每个文件位于.claude/skills/career-ops/目录下,采用 YAML frontmatter 定义技能元数据,正文部分存放具体指令。
这种设计的优势在于解决单一大提示词的上下文漂移问题。当所有功能挤在一个提示词中时,模型容易遗忘早期规则,输出逐渐趋于泛化。而模块化架构让每个技能专注于单一任务:
- scan.md:使用 Playwright 无头浏览器扫描 45 + 公司门户(Ashby、Greenhouse、Lever)
- score.md:基于 5 分制评分标准评估职位与简历的匹配度
- tailor.md:针对单个职位定制简历,进行关键词注入
- pdf.md:通过 Puppeteer 将 HTML 渲染为 ATS 友好的 PDF
- intel.md:研究目标公司,映射职级与薪资带宽
- interview.md:基于职位描述生成 STAR 格式的面试准备材料
- negotiate.md:评估 offer 并生成谈判脚本
每个技能文件通过 slash 命令调用,如/career-ops:scan触发扫描,/career-ops:score执行评分。这种设计还带来可编辑性优势 —— 你可以直接告诉 Claude"将评分阈值从 4.0 调整为 4.2",它会自动修改对应的 skill 文件。
核心工作流:从扫描到投递的完整链路
系统的标准工作流遵循 "扫描→评分→定制→生成→人工审核" 的五步闭环:
第一步:门户扫描。Playwright 处理 JavaScript 渲染的职位列表,将 Ashby、Greenhouse、Lever 等 ATS 系统的职位信息标准化为统一 JSON 格式(包含职位标题、地点、职级、描述、URL、发布日期)。扫描结果写入data/raw_listings.json。
第二步:智能评分。评分技能读取原始职位列表和用户的 source-of-truth 简历,按 5 分制标准输出匹配分数、2-3 句评分理由,以及明确的 "申请 / 跳过" 建议。评分低于 4.0 的职位会被直接过滤,避免在后续环节浪费 token 和注意力。
第三步:简历定制。针对通过评分的职位,系统提取职位描述中的 12-15 个核心关键词(标题和必需技能部分权重更高),将这些关键词映射到简历中的现有 bullet point。如果某个关键词没有对应经历,系统会从 source-of-truth 文件中提取相关事实生成新 bullet,但严格禁止虚构经历。
第四步:PDF 生成。使用 Puppeteer 将定制后的 HTML 简历渲染为 PDF。字体选择有讲究:标题使用 Space Grotesk,正文使用 DM Sans,这两种字体在 ATS 解析时 Unicode 兼容性更好,避免因花哨排版导致的静默拒收。
第五步:人工审核。系统准备申请材料、导航到申请页面、预填表单,但最终的提交按钮必须由人工点击。这是设计上的 feature 而非 limitation—— 自动提交容易导致向同一家公司重复投递 12 次的尴尬局面。
关键工程实践
ATS 优化的技术细节
ATS(Applicant Tracking System)优化是简历能否进入人工审核环节的关键。Career-Ops 的优化策略包括:
- 关键词密度控制:从 JD 提取的关键词按重要性加权,确保高权重词在简历前 1/3 处出现
- bullet point 动态重写:只重写与目标职位最相关的 4-6 个 bullet,而非整份简历,保持成本可控
- 格式保守主义:避免表格、多栏布局、页眉页脚中的关键信息,确保纯文本提取时不丢失内容
成本控制策略
对于为期一个月的严肃求职,API 成本可控制在 30-60 美元,或完全免费:
- Claude:用于评分和定制环节,这些步骤需要高质量推理
- Gemini 免费层(15 RPM,1M tokens / 天):用于批量扫描和公司情报收集
- 本地 Puppeteer:PDF 渲染零成本
- JD 缓存:将职位描述缓存到
jds/目录,避免重复抓取和 token 化
数据安全与防漂移
系统采用本地优先架构,用户的简历、职业故事、偏好设置存储在data/目录,职位描述缓存于jds/。关键安全措施包括:
- 将
.claude/、data/、writing-samples/加入.gitignore - source-of-truth 文件机制防止 AI 生成虚构经历
- 拒绝条款:任何无法追溯到 source-of-truth 的 bullet 必须标记为人工审核
可落地参数与实施建议
如果你计划基于 Career-Ops 构建自己的求职系统,以下参数可作为起点:
评分阈值:初始设置为 4.0/5.0,根据第一周的实际匹配度微调。评分过严会导致机会流失,过松则浪费定制成本。
公司列表规模:从 5 家真正想去的公司开始,而非导入 200 家。Career-Ops 预置了 45 + 公司的配置模板,但建议逐步扩展。
冷启动期:将第一周视为 "招聘人员入职期",系统需要学习你的 CV、职业故事和偏好后才能输出与你判断一致的评分。
技能启用顺序:建议按 scan→score→tailor→pdf 的顺序逐步启用,每个技能稳定后再添加下一个。interview 和 negotiate 技能可在获得面试邀请后启用。
多职业路径切换:通过 modes.md 技能支持工程师 / 产品经理 / 管理岗等职业原型切换,每种原型对应不同的 CV 模板和评分权重。
结语
Career-Ops 展示了一种更务实的 AI 自动化思路:不是让 AI 代替人类做决策,而是让 AI 承担筛选和准备的重体力劳动,将人类的注意力集中在真正值得投入的机会上。740 个职位中只生成 100 份定制简历的比例,恰恰说明了一个健康的求职流程应该是什么样的 —— 质量优先于数量,精准匹配优于广撒网。
对于开发者而言,这套系统的更大价值在于其架构模式:14 个独立技能文件组成的模块化系统,可以作为其他复杂自动化场景的参考模板。当 Claude Code 能够读取和编辑自己的 skill 文件时,系统就具备了自我演进的能力。
参考来源
- santifer/career-ops - 开源 AI 求职系统
- Build a 14-Skill AI Job Search Agent With Claude Code - 详细架构解析与实施指南
内容声明:本文无广告投放、无付费植入。
如有事实性问题,欢迎发送勘误至 i@hotdrydog.com。