Career-Ops 深度实战:当 Claude Code 化身求职指挥中心——从 AI 编程工具到全流程求职自动化的生产级完全指南(2026)
背景介绍:当 AI 学会「找工作」
2026年的求职市场,发生了翻天覆地的变化。
你可能已经习惯了用 Claude Code、GitHub Copilot、Cursor 这样的 AI 编程工具来写代码、写文档、做 Code Review。但你有没有想过——同样的 AI 编程工具,能不能帮你找工作?
Career-Ops 就是这个问题的最佳答案。
这是一个基于 Claude Code 构建的 AI 求职系统,在 GitHub 上已经狂揽 50,000+ Stars,每天仍以 700+ 的速度增长。作者 santifer 曾在科技行业摸爬滚打多年,用传统方式海投简历、反复改 Cover Letter、每天手动刷招聘网站——直到他决定把自己最擅长的「用工具自动化一切」的工程师思维用到了求职上。
他的核心理念非常朴素但有力:「公司用 AI 来筛选候选人,那候选人为什么不能用 AI 来挑选公司?」
Career-Ops 正是这一理念的完整实现。它不是一个简单的求职网站爬虫,也不是一个花哨的简历生成器——它是一套以 Claude Code 为核心的全流程求职操作系统,覆盖从职位发现、简历定制、面试准备到 Offer 谈判的每一个环节。
在这篇文章中,我将带你深入理解 Career-Ops 的架构设计、核心功能、命令行工作流,以及如何将其部署到你的求职场景中。全文约 12,000 字,建议收藏后慢慢阅读。
核心概念:什么是 Career-Ops?
Career-Ops 的本质是一个构建在 Claude Code 之上的 Skill 系统。它利用 Claude Code 的 Agent 能力(文件系统操作、网络请求、PDF 生成、多轮对话推理),配合一套精心设计的求职工作流模板,将 AI 编程工具变成了一个不知疲倦的求职助手。
技术栈一览
| 组件 | 技术选型 | 作用 |
|---|---|---|
| 核心 Agent | Claude Code (Anthropic) | AI 推理与任务执行 |
| Skill 系统 | Claude Code 原生 Skill 格式 (.claude/ skills/) | 求职工作流模板 |
| 求职门户扫描 | Python 脚本 + 浏览器自动化 | 抓取各大公司招聘页 |
| 数据存储 | SQLite / JSON 文件 | 管理职位列表与申请状态 |
| 可视化面板 | Go + Warp 终端 | 职位状态仪表盘 |
| 简历生成 | LaTeX / HTML → PDF | ATS 友好的简历输出 |
| 多 CLI 支持 | Claude Code, Gemini CLI, Codex, OpenCode | 跨平台兼容 |
架构全景
┌─────────────────────────────────────────────────────┐
│ Career-Ops │
├─────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────────────────┐ │
│ │ Skill Modes │ │ 求职门户扫描器 (Python) │ │
│ │ (14 种模式) │ │ - Anthropic │ │
│ │ │ │ - OpenAI │ │
│ │ /career-ops │ │ - Mistral │ │
│ │ scan │ │ - 45+ 家公司 ... │ │
│ │ evaluate │ │ │ │
│ │ cv │ │ 技术: Playwright + │ │
│ │ tracker │ │ requests + LLM │ │
│ │ prep │ │ │ │
│ │ negotiate │ └──────────────────────────┘ │
│ └──────────────┘ │ │
│ │ │ 职位数据 │
│ ▼ ▼ │
│ ┌──────────────────────────────────────────────┐ │
│ │ SQLite / JSON 数据存储 │ │
│ │ jobs.db | tracker.json | config/ │ │
│ └──────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ ┌──────────────────────────┐ │
│ │ Go Dashboard │ │ PDF 简历生成系统 │ │
│ │ (Warp 终端) │ │ LaTeX → ATS 优化 PDF │ │
│ └──────────────┘ └──────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────┘
这个架构的精妙之处在于:它不是在 Claude Code 外面包了一层,而是直接利用 Claude Code 的 Skill 扩展机制。这意味着你不需要学习任何新的 CLI 工具——你只需要在你已经熟悉的 Claude Code 中输入 /career-ops 这样的命令,剩下的全由 AI 来完成。
安装与配置:30 分钟搭建求职自动化环境
前置条件
# 1. 安装 Claude Code (如果没有的话)
npm install -g @anthropic-ai/claude-code
# 2. 克隆项目
git clone https://github.com/santifer/career-ops.git
cd career-ops
# 3. 安装 Python 依赖 (用于求职门户扫描)
pip install -r requirements.txt
# 4. 安装 Go (可选,用于 Warp 仪表盘)
# macOS
brew install go
# 5. 初始化配置
cp config/config.example.yaml config/config.yaml
配置文件详解
# config/config.yaml
anthropic:
api_key: ${ANTHROPIC_API_KEY} # 从环境变量读取
model: claude-sonnet-4-20250514
max_tokens: 8192
job_search:
# 扫描的公司列表
companies:
- name: Anthropic
url: https://boards.greenhouse.io/anthropic
keywords: ["engineer", "researcher"]
- name: OpenAI
url: https://jobs.ashbyhq.com/openai
keywords: ["software", "machine learning"]
- name: Mistral
url: https://careers.mistral.ai
keywords: ["research", "engineering"]
# 扫描频率
scan_schedule: "0 8 * * *" # 每天早上8点自动扫描
max_listings_per_company: 50
cv:
# LaTeX 模板路径
template: ./templates/modern_cv.tex
output_dir: ./output/cvs
ats_optimized: true
tracker:
# 申请状态跟踪数据库
database: ./data/tracker.db
retention_days: 90
初始化 Claude Code Skill
# 将 career-ops skill 链接到 Claude Code
ln -sf "$(pwd)/.claude" ~/.claude/
# 或者使用项目提供的安装脚本
./install.sh
# 验证安装
claude-code skills list | grep career-ops
# 输出: career-ops - AI-powered job search system
14 种 Skill Modes 深度解析
Career-Ops 的核心是 14 种精心设计的 Skill Modes,每一种都对应求职流程中的一个关键环节。下面逐一解析。
1. /career-ops scan — 全自动职位发现
这是 Career-Ops 最基础也最强大的功能。它会:
自动扫描 45+ 家公司招聘门户,包括 Anthropic、OpenAI、Mistral、Google、Meta、Stripe、Notion、Linear、Figma 等一线科技公司。
核心代码逻辑:
# scrn/portals/scanner.py
import asyncio
import httpx
from playwright.async_api import async_playwright
from typing import List, Dict
import json
class JobPortalScanner:
"""多线程职位扫描器"""
def __init__(self, config: dict):
self.config = config
self.client = httpx.AsyncClient(
timeout=30.0,
follow_redirects=True,
headers={
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) "
"AppleWebKit/537.36"
}
)
async def scan_portal(self, portal: dict) -> List[dict]:
"""扫描单个招聘门户,返回职位列表"""
company = portal["name"]
url = portal["url"]
# 使用 Playwright 渲染 JS 动态页面
async with async_playwright() as p:
browser = await p.chromium.launch(headless=True)
page = await browser.new_page()
try:
await page.goto(url, wait_until="networkidle")
# 等待职位列表加载
await page.wait_for_selector(
portal.get("job_selector", "article, .job-listing"),
timeout=15000
)
# 提取职位信息
jobs = await self._extract_jobs(page, portal)
# 过滤已关闭职位
active_jobs = [
j for j in jobs
if not self._is_expired(j)
]
return active_jobs
except Exception as e:
print(f"[ERROR] {company}: {e}")
return []
finally:
await browser.close()
async def scan_all(self) -> List[dict]:
"""并发扫描所有招聘门户"""
portals = self._load_portals()
# 限制并发数,避免被封 IP
semaphore = asyncio.Semaphore(5)
async def bounded_scan(portal):
async with semaphore:
return await self.scan_portal(portal)
results = await asyncio.gather(
*[bounded_scan(p) for p in portals],
return_exceptions=True
)
all_jobs = []
for result in results:
if isinstance(result, list):
all_jobs.extend(result)
# 按发布日期排序,去重
return self._deduplicate(sorted(
all_jobs,
key=lambda x: x.get("posted_at", ""),
reverse=True
))
def _is_expired(self, job: dict) -> bool:
"""检测职位是否已关闭"""
expired_patterns = [
r"no longer (available|open|accepting)",
r"(position|job) (is |has )?closed",
r"job posting (has )?expired",
]
text = f"{job.get('title', '')} {job.get('status', '')}".lower()
return any(p.match(text) for p in expired_patterns)
使用示例:
$ claude
──────────────────────────────────────────────
Type '/help' for assistance.
/career-ops scan --companies anthropic,openai,stripe --freshness 7d
# Claude Code 响应:
# 正在扫描 3 家公司...
# ✓ Anthropic: 发现 12 个新职位 (最后更新: 3小时前)
# ✓ OpenAI: 发现 8 个新职位 (最后更新: 1天前)
# ✓ Stripe: 发现 15 个新职位 (最后更新: 5小时前)
#
# 总计: 35 个新职位
# 已保存至: ./data/jobs_2026-06-16.json
2. /career-ops evaluate — AI 驱动的七维度职位评估
这个功能是 Career-Ops 最核心的创新。它不是简单地列出职位信息,而是用 AI 来深度分析职位与候选人的匹配度。
评估维度:
| 维度 | 评估内容 | AI 推理方式 |
|---|---|---|
| A) 职位摘要分析 | 职位类型、职能、资历要求 | 提取关键信息,分类 |
| B) 简历匹配 | 职位要求与简历的逐条对比 | 自然语言推理 |
| C) 级别策略 | 职位级别与候选人经验匹配度 | 历史数据对比 |
| D) 薪酬预期 | 市场薪酬区间估算 | 公开数据 + AI 推理 |
| E) 团队文化 | 公司文化与候选人价值观匹配 | 公开信息分析 |
| F) 成长潜力 | 加入后的学习与发展空间 | 业务线 + 技术栈分析 |
| G) 风险评估 | 公司的稳定性与前景 | 融资情况 + 市场表现 |
核心评估逻辑:
# scrn/modes/evaluate.py
import anthropic
from typing import Dict, List
import json
client = anthropic.Anthropic()
EVALUATION_PROMPT = """
你是一位专业的科技行业 HR 顾问。现在需要评估一个职位与候选人的匹配度。
## 候选人简历摘要:
{resume_summary}
## 职位信息:
- 职位名称: {job_title}
- 公司: {company}
- 职位描述: {job_description}
- 要求: {requirements}
- 薪酬范围: {salary_range}
- 地点: {location}
## 评估维度 (请逐项打分 1-10 并说明理由):
1. 【简历匹配度】职位要求与候选人经历的契合程度
2. 【级别匹配度】候选人当前级别与目标职位的匹配程度
3. 【薪酬匹配度】候选人预期薪酬与职位范围的匹配程度
4. 【技术栈匹配度】候选人技术栈与职位要求的重叠度
5. 【文化匹配度】候选人价值观与公司文化的契合度
6. 【成长潜力】该职位对候选人长期发展的价值
7. 【综合推荐度】综合以上所有因素的推荐程度
## 输出格式 (JSON):
{{
"scores": {{
"resume_match": {{"score": X, "reason": "..."}},
"level_match": {{"score": X, "reason": "..."}},
"salary_match": {{"score": X, "reason": "..."}},
"tech_match": {{"score": X, "reason": "..."}},
"culture_match": {{"score": X, "reason": "..."}},
"growth_potential": {{"score": X, "reason": "..."}},
"overall_recommendation": {{"score": X, "reason": "..."}}
}},
"strengths": ["优势1", "优势2"],
"concerns": ["顾虑1", "顾虑2"],
"suggested_improvements": ["建议1", "建议2"],
"decision": "apply|skip|maybe"
}}
"""
async def evaluate_job(job: dict, resume: dict, cv_path: str) -> dict:
"""对单个职位进行深度评估"""
message = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=2048,
messages=[{
"role": "user",
"content": EVALUATION_PROMPT.format(
resume_summary=resume.get("summary", ""),
job_title=job.get("title", ""),
company=job.get("company", ""),
job_description=job.get("description", ""),
requirements=job.get("requirements", ""),
salary_range=job.get("salary", "未公开"),
location=job.get("location", "未公开"),
)
}]
)
result = json.loads(message.content[0].text)
# 如果综合评分 >= 7,自动标记为优先申请
if result["scores"]["overall_recommendation"]["score"] >= 7:
result["priority"] = "high"
result["action"] = "apply"
elif result["scores"]["overall_recommendation"]["score"] >= 5:
result["priority"] = "medium"
result["action"] = "maybe"
else:
result["priority"] = "low"
result["action"] = "skip"
return result
批量评估使用:
$ claude
/career-ops evaluate --batch --limit 20 --min-score 6 --sort-by overall_recommendation
# 输出:
# ╔══════════════════════════════════════════════════════════════╗
# ║ 职位评估结果 (Top 10) ║
# ╠══════════════════════════════════════════════════════════════╣
# ║ # │ 公司 │ 职位 │ 匹配度 │ 推荐度 │ 行动 ║
# ╠══════════════════════════════════════════════════════════════╣
# ║ 1 │ Anthropic │ Research Eng │ 8.2 │ 8.5 │ ✅ apply ║
# ║ 2 │ Stripe │ Senior SWE │ 7.8 │ 8.1 │ ✅ apply ║
# ║ 3 │ OpenAI │ ML Engineer │ 7.5 │ 7.6 │ ✅ apply ║
# ║ 4 │ Linear │ Backend Eng │ 6.9 │ 7.2 │ 🤔 maybe ║
# ║ 5 │ Notion │ Full Stack │ 6.3 │ 6.8 │ 🤔 maybe ║
# ╚══════════════════════════════════════════════════════════════╝
3. /career-ops cv — ATS 优化的个性化简历生成
这是 Career-Ops 的另一个杀手级功能。它不只是生成一份简历,而是为每个职位生成定制化的简历,确保通过 ATS(Applicant Tracking System)系统的自动筛选。
ATS 友好的简历生成原理:
# scrn/modes/cv_generator.py
import subprocess
from pathlib import Path
import json
from typing import Dict
class CVGenerator:
"""
LaTeX 驱动的 ATS 友好简历生成器
核心策略:
1. 使用标准化的 LaTeX 模板,确保格式一致性
2. 关键词从职位描述中提取,确保覆盖 ATS 扫描
3. 生成纯文本版本用于ATS解析 + PDF版本用于人工审阅
"""
def __init__(self, template_dir: Path):
self.template_dir = template_dir
self.ats_keywords = self._load_ats_keywords()
def generate(self, job: dict, resume: dict, cover_letter: bool = False) -> dict:
"""为特定职位生成定制化简历"""
# Step 1: 从职位描述中提取 ATS 关键词
keywords = self._extract_ats_keywords(job["description"])
# Step 2: 重新排序简历内容,优先展示匹配项
tailored_content = self._tailor_resume(
resume,
keywords,
job["title"]
)
# Step 3: 生成 LaTeX 源码
latex_content = self._render_latex(tailored_content, job)
# Step 4: 编译为 PDF
output_dir = Path("./output/cvs") / job["company_slug"]
output_dir.mkdir(parents=True, exist_ok=True)
tex_file = output_dir / f"{job['company_slug']}_cv.tex"
pdf_file = output_dir / f"{job['company_slug']}_cv.pdf"
tex_file.write_text(latex_content)
# 使用 xelatex 编译(支持中文)
result = subprocess.run(
["xelatex", "-interaction=nonstopmode", str(tex_file)],
cwd=output_dir,
capture_output=True,
timeout=60
)
if result.returncode != 0:
# 回退到 pdflatex
subprocess.run(
["pdflatex", "-interaction=nonstopmode", str(tex_file)],
cwd=output_dir,
capture_output=True,
timeout=60
)
# Step 5: 生成纯文本版本(用于 ATS 系统直接解析)
plain_text = self._to_plain_text(tailored_content)
txt_file = output_dir / f"{job['company_slug']}_cv.txt"
txt_file.write_text(plain_text)
return {
"pdf": str(pdf_file),
"tex": str(tex_file),
"txt": str(txt_file),
"keywords_matched": keywords,
"ats_score": self._estimate_ats_score(plain_text, keywords)
}
def _extract_ats_keywords(self, job_description: str) -> list:
"""从职位描述中提取 ATS 关键词"""
prompt = """
从以下职位描述中提取 ATS 关键词。请分类提取:
1. 技术技能(编程语言、框架、工具)
2. 软技能(沟通、领导力等)
3. 行业术语
4. 资质认证
只返回关键词列表,用逗号分隔。
职位描述:
{job_description}
""".format(job_description=job_description)
# 调用 Claude API 进行关键词提取
response = self._call_claude(prompt)
keywords = [k.strip() for k in response.split(",")]
return keywords
def _tailor_resume(self, resume: dict, keywords: list, job_title: str) -> dict:
"""根据关键词定制简历内容"""
prompt = """
你是一位专业的简历优化师。请根据以下 ATS 关键词和目标职位,优化简历内容。
## 目标职位: {job_title}
## ATS 关键词: {keywords}
## 原始简历:
{resume}
## 优化要求:
1. 优先展示与关键词匹配的工作经历
2. 在工作描述中使用相同的动词和术语
3. 量化成果,使用数据而非模糊描述
4. 保持简洁,ATS 系统通常只读取前两页
5. 不要编造经历,只优化表达方式
请返回优化后的简历(JSON 格式):
{{
"name": "...",
"summary": "...",
"experience": [...],
"skills": [...],
"education": [...]
}}
""".format(
job_title=job_title,
keywords=", ".join(keywords),
resume=json.dumps(resume, ensure_ascii=False, indent=2)
)
response = self._call_claude(prompt)
return json.loads(response)
使用示例:
$ claude
/career-ops cv generate --job-id anthropic-research-eng-2026 \
--resume ./my_resume.json \
--cover-letter \
--output-format both
# 输出:
# ✓ 正在分析职位描述...
# ✓ 提取 ATS 关键词 (23 个):
# transformer, PyTorch, RLHF, distributed training,
# Python, research communication, ML systems...
# ✓ 生成定制化简历...
# ✓ 编译 PDF...
# ✓ 生成 ATS 纯文本版本...
#
# 📄 输出文件:
# ./output/cvs/anthropic/anthropic-research-eng-2026_cv.pdf
# ./output/cvs/anthropic/anthropic-research-eng-2026_cv.txt
#
# 📊 ATS 关键词覆盖率: 87%
4. /career-ops tracker — 申请状态可视化
Career-Ops 提供了一个基于 Go 的可视化追踪面板,可以直观地看到你的整个求职进度。
$ /career-ops tracker --dashboard
# 启动 Warp 终端仪表盘
# 在终端中显示:
┌─────────────────────────────────────────────────────────────────────┐
│ 📊 Career Tracker Dashboard │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 本周申请: 8 已查看: 23 待回复: 15 面试中: 3 Offer: 1 │
│ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 申请进度时间线 │ │
│ │ │ │
│ │ Anthropic Research Eng ████████████░░░░░░░ 面试 Round 2 │ │
│ │ OpenAI ML Engineer ████████████████░░░ Offer 评估中 │ │
│ │ Stripe Senior SWE ████████░░░░░░░░░░░ HR 筛选 │ │
│ │ Linear Backend Eng ██████░░░░░░░░░░░░░░ 笔试 │ │
│ │ Notion Full Stack ███░░░░░░░░░░░░░░░░░ 已投递 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 📈 响应率统计: │
│ ├─ Anthropic: ████████████████░░░ 75% (3/4 进入面试) │
│ ├─ OpenAI: ████████████████░░░ 80% (4/5 进入面试) │
│ ├─ Stripe: ████████████░░░░░░ 50% (2/4 进入面试) │
│ └─ Linear: ████████░░░░░░░░░░░ 33% (1/3 进入面试) │
│ │
│ 最近动态: │
│ ├─ 10:32 Anthropic 邀请参加 Round 2 面试 │
│ ├─ 09:15 OpenAI HR 发来 Offer 沟通邮件 │
│ ├─ 昨天 Stripe 发来在线测评链接 │
│ └─ 2天前 Linear 发来技术面试邀请 │
│ │
└─────────────────────────────────────────────────────────────────────┘
深度架构分析:为什么 Career-Ops 值得学习?
Career-Ops 不仅仅是一个求职工具,它在工程设计上有很多值得学习的点。
设计模式一:Skill 扩展而非框架重写
很多开发者做类似工具时会选择从零构建一个独立的 CLI 应用。但 Career-Ops 选择了一个更聪明的路径——直接利用 Claude Code 的 Skill 扩展机制。
# 目录结构
career-ops/
├── .claude/ # Claude Code Skill 格式
│ └── skills/
│ └── career-ops/ # 每个 skill 一个目录
│ ├── prompt.md # Skill 指令模板
│ ├── commands/ # 可执行命令
│ │ ├── scan.ts
│ │ ├── evaluate.ts
│ │ ├── cv.ts
│ │ └── tracker.ts
│ └── context/ # 上下文模板
│ └── job-analysis.md
├── scrn/ # Python 核心逻辑
│ ├── portals/ # 招聘门户扫描器
│ ├── modes/ # Skill mode 实现
│ ├── cv/ # 简历生成
│ └── tracker/ # 状态追踪
├── config/ # 配置文件
├── data/ # 数据存储
└── templates/ # LaTeX 模板
这种设计的优势:
- 零学习成本:用户不需要学习新的 CLI 工具
- 享受生态红利:Claude Code 的更新和改进自动惠及 Career-Ops
- 多工具兼容:可以同时支持 Claude Code、Gemini CLI、Codex 等多种工具
- 代码复用:核心 Python 逻辑可以在不同 Skill 之间共享
设计模式二:LLM 作为工作流引擎
Career-Ops 的另一个精妙设计是将 LLM 作为工作流编排引擎,而不是简单地用它来生成文本。
# scrn/modes/router.py
class WorkflowRouter:
"""
基于 LLM 的动态工作流路由
核心思想:不是用硬编码的 if-else 来决定下一步做什么,
而是让 LLM 根据当前状态和目标,动态决定最优路径。
"""
WORKFLOW_GRAPH = {
"scan": ["evaluate", "cv"],
"evaluate": ["cv", "tracker"],
"cv": ["tracker", "prep"],
"tracker": ["prep", "negotiate"],
"prep": ["negotiate"],
"negotiate": []
}
async def route(self, state: dict) -> str:
"""根据当前状态决定下一步"""
prompt = """
## 当前求职状态:
- 已申请: {applied_count} 个职位
- 面试中: {interview_count} 个职位
- 待回复: {pending_count} 个职位
- Offer: {offer_count} 个
## 最高优先级职位:
{top_jobs}
## 当前工作流: {current_mode}
## 可用下一步操作:
{available_next}
## 决策要求:
1. 优先处理即将到来的面试准备
2. 评估现有申请是否需要跟进
3. 识别可能的新机会
4. 建议一个具体的后续操作
请输出 JSON 格式:
{{"action": "下一步操作", "reasoning": "决策理由", "priority": 1-10}}
""".format(**state)
response = await self._call_claude(prompt)
return json.loads(response)
设计模式三:多源数据融合
Career-Ops 的职位信息来源非常广泛,包括:
# scrn/portals/__init__.py
PORTAL_DEFINITIONS = {
# Greenhouse 招聘系统 (很多公司使用)
"greenhouse": {
"pattern": "boards.greenhouse.io/*",
"extractor": "greenhouse_extractor.py",
"parser": "parse_greenhouse_job()"
},
# Ashby 招聘系统
"ashby": {
"pattern": "jobs.ashbyhq.com/*",
"extractor": "ashby_extractor.py",
"parser": "parse_ashby_job()"
},
# Lever 招聘系统
"lever": {
"pattern": "jobs.lever.co/*",
"extractor": "lever_extractor.py",
"parser": "parse_lever_job()"
},
# Workday 招聘系统
"workday": {
"pattern": "*.workday.com/*",
"extractor": "workday_extractor.py",
"parser": "parse_workday_job()"
},
# 自定义公司招聘页
"custom": {
"pattern": "*",
"extractor": "custom_extractor.py",
"parser": "parse_custom_job()"
}
}
生产级实战:完整求职工作流演示
下面演示一个完整的求职工作流,从发现职位到收到 Offer:
阶段一:职位发现与筛选
# 启动 Claude Code
$ claude
# 第一步:扫描目标公司的最新职位
/career-ops scan \
--companies anthropic,openai,mistral,google,meta,stripe \
--freshness 14d \
--keywords "machine learning,software engineer,research" \
--output json
# AI 响应:
正在并发扫描 6 家公司招聘门户...
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✓ Anthropic (Greenhouse)
• Research Engineer - ML Systems [NEW]
• Research Scientist - Alignment
• Software Engineer - Platform
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✓ OpenAI (Ashby)
• ML Engineer - Reasoning Team [NEW]
• Research Scientist - Safety
• Software Engineer - Inference
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✓ Stripe (Ashby)
• Senior Software Engineer - Payments
• Staff Engineer - Machine Learning
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📊 扫描完成: 发现 47 个职位 (其中 12 个为 14 天内新增)
📁 结果已保存: ./data/scans/scan_2026-06-16.json
阶段二:AI 驱动的职位评估
# 第二步:让 AI 对所有新职位进行评估
/career-ops evaluate \
--batch \
--scan-file ./data/scans/scan_2026-06-16.json \
--resume ./my_resume.json \
--min-score 6.0 \
--top-k 10
# AI 深度分析过程:
正在加载简历: ./my_resume.json
简历摘要: 4年 ML 工程师,专注 PyTorch 分布式训练,
有 RLHF 经验,熟悉 LLM推理优化
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🗺️ Anthropic | Research Engineer - ML Systems
简历匹配度: ████████████░░░░░ 7.5/10
级别匹配度: ██████████████░░░ 8.0/10
技术栈匹配度: ████████████████░ 9.2/10 ← 极高!
文化匹配度: ████████████░░░░░ 7.8/10
综合推荐度: ████████████████░ 8.7/10
✅ 结论: 强烈推荐申请
💡 匹配点: PyTorch, RLHF, 分布式训练, ML infra
📝 建议: 重点准备 RLHF 项目描述
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🗺️ OpenAI | ML Engineer - Reasoning Team
简历匹配度: ██████████░░░░░░░ 6.8/10
级别匹配度: ████████████░░░░░ 7.5/10
技术栈匹配度: ████████████░░░░░ 7.2/10
综合推荐度: ████████████░░░░░ 7.1/10
✅ 结论: 可以尝试
⚠️ 顾虑: Reasoning Team 要求更强的算法背景
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📊 评估汇总:
• 强烈推荐 (≥8.0): 2 个
• 推荐 (6.5-8.0): 5 个
• 观望 (<6.5): 3 个
📁 详细报告: ./data/evaluations/report_2026-06-16.md
阶段三:定制化简历生成
# 第三步:为每个目标职位生成定制化简历
/career-ops cv generate \
--job anthropic-research-eng-ml-systems \
--resume ./my_resume.json \
--tailor \
--ats-optimize \
--cover-letter \
--preview
# AI 生成的简历定制建议:
正在从职位描述提取 ATS 关键词...
关键词列表 (Top 20):
• PyTorch, JAX, Triton (框架)
• Distributed training, RLHF (核心技能)
• ML systems, inference optimization (领域)
• Research communication, publications (软技能)
正在优化简历内容...
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📝 简历优化建议:
1. 【工作描述重排序】
优先展示: RLHF 项目经验 (匹配度最高)
强化描述: PyTorch 分布式训练细节
2. 【关键词覆盖】
✅ PyTorch: 在技能列表中置顶
✅ RLHF: 在工作描述中新增具体细节
✅ Distributed training: 量化成果 (8GPU → 4x 加速)
3. 【Cover Letter 开头建议】
"I am excited about Anthropic's mission to develop
trustworthy AI systems, particularly your recent work
on constitutional AI and RLHF..."
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✓ 简历已生成:
./output/cvs/anthropic/research-eng-ml-systems_cv.pdf
./output/cvs/anthropic/research-eng-ml-systems_cv.txt
📊 ATS 关键词覆盖率: 91%
阶段四:面试准备与状态追踪
# 第四步:进入面试流程后,用 tracker 记录进度
/career-ops tracker update \
--job anthropic-research-eng-ml-systems \
--stage "round-2" \
--notes "技术面结束,面试官反馈积极,问了分布式训练细节"
/career-ops tracker upcoming
# 输出:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📅 近期面试安排:
明天 14:00 UTC
┌────────────────────────────────────────┐
│ Anthropic | Round 2 Technical Deep Dive│
│ ├─ 系统设计题 (预估 45min) │
│ └─ 准备: 回顾 RLHF 项目细节 │
│ 📎 简历: research-eng-ml-systems_cv │
└────────────────────────────────────────┘
本周五 18:00 UTC
┌────────────────────────────────────────┐
│ OpenAI | HR Screening │
│ ├─ 薪资预期 & 入职时间 │
│ └─ 准备: 查看 levels.fyi 数据 │
└────────────────────────────────────────┘
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
性能优化与最佳实践
扫描效率优化
Career-Ops 的招聘门户扫描是一个 I/O 密集型任务,可以通过以下方式优化:
# scrn/portals/optimized_scanner.py
import asyncio
from concurrent.futures import ThreadPoolExecutor
import httpx
class OptimizedScanner:
"""
优化策略:
1. 使用 asyncio 并发扫描
2. 限制并发数避免被封
3. 结果缓存避免重复扫描
4. 失败自动重试
"""
def __init__(self, max_concurrency: int = 5):
self.semaphore = asyncio.Semaphore(max_concurrency)
self.cache = AsyncLRUCache(maxsize=1000)
self.retry_policy = RetryPolicy(max_retries=3, backoff_factor=2)
async def scan_with_cache(self, portal: dict) -> list:
"""带缓存的扫描,相同 URL 短时间内不重复扫描"""
cache_key = f"{portal['name']}:{portal['url']}"
# 检查缓存 (有效期 1 小时)
cached = self.cache.get(cache_key, ttl=3600)
if cached:
return cached
# 带重试的扫描
result = await self.retry_policy.execute(
self.scan_portal(portal)
)
self.cache.set(cache_key, result)
return result
API 调用成本优化
Career-Ops 使用 Claude API 进行深度分析,每次评估都会调用大模型。可以通过以下方式降低成本:
# 使用 Claude Haiku 进行快速初筛,仅高分职位用 Sonnet 深度分析
async def evaluate_batch_efficient(jobs: list, resume: dict) -> list:
"""两阶段评估:快速初筛 + 深度分析"""
# 阶段一:Claude Haiku 快速打分 (便宜 10x)
/career-ops quick-score --jobs jobs --resume resume --model haiku
# 获取初筛分数
scored = get_quick_scores()
# 阶段二:仅对高分职位进行深度分析
high_priority = [j for j in scored if j["quick_score"] >= 7.0]
# 使用 Sonnet 深度分析 (仅对 20% 职位)
deep_analysis = []
for job in high_priority:
analysis = await evaluate_deep(job, resume, model="sonnet")
deep_analysis.append(analysis)
return merge_results(scored, deep_analysis)
数据管理最佳实践
# 定期清理过期数据
/career-ops cleanup --older-than 90d --dry-run
# 备份重要数据
/career-ops backup --destination ./backups/$(date +%Y%m%d).zip
# 导出报告
/career-ops export --format csv --output ./reports/job_analysis.csv
/career-ops export --format json --output ./reports/job_analysis.json
扩展开发:构建你自己的 Career-Ops 技能
Career-Ops 的 Skill 系统是开放的,你可以基于它构建自己的定制化求职技能。
示例:添加一个新的招聘门户
# scrn/portals/custom/company_portal.py
from scrn.portals.base import BasePortal, JobListing
class CompanyPortal(BasePortal):
"""自定义公司招聘门户扫描器"""
name = "MyCompany"
base_url = "https://careers.mycompany.com"
async def extract_jobs(self, page) -> list[JobListing]:
"""从页面提取职位列表"""
job_cards = await page.query_selector_all(
".job-listing-card, [data-job-id]"
)
jobs = []
for card in job_cards:
job = JobListing(
title=await card.inner_text(".job-title"),
url=await card.get_attribute("href"),
department=await card.inner_text(".department"),
location=await card.inner_text(".location"),
posted=await card.inner_text(".posted-date"),
)
jobs.append(job)
return jobs
示例:自定义评估维度
# scrn/modes/custom_evaluator.py
class MyCustomEvaluator:
"""
添加额外的评估维度
例如:评估公司是否支持远程工作
"""
EXTRA_DIMENSIONS = [
{
"name": "remote_flexibility",
"weight": 0.15,
"prompt": """
评估该职位的远程工作灵活性:
- 是否有明确的远程/混合/ onsite 政策?
- 公司所在时区与候选人所在时区的重叠度?
- 历史远程文化评分?
"""
},
{
"name": "visa_sponsorship",
"weight": 0.10,
"prompt": """
评估签证赞助可能性:
- 公司是否提供 H1B / L1 / O1 赞助?
- 历史赞助记录?
- 国际候选人的处理速度?
"""
}
]
与其他工具的对比
vs 传统求职平台(LinkedIn, Indeed)
| 维度 | LinkedIn/Indeed | Career-Ops |
|---|---|---|
| 职位发现 | 被动推荐,用户找职位 | 主动扫描,职位找你 |
| 简历定制 | 通用简历,一投多投 | 职位定制,精准匹配 |
| 申请跟踪 | 手动记录,容易遗漏 | 自动追踪,状态清晰 |
| AI 辅助 | 有限 (LinkedIn AI) | 深度 (Claude 全程辅助) |
| 成本 | 免费但效率低 | API 成本但效率高 |
vs 其他 AI 求职工具
| 工具 | 定位 | 与 Career-Ops 的关系 |
|---|---|---|
| LazyApply | 自动化海投 | 互补 (Career-Ops 精投 vs 懒人海投) |
| Persivo | Cover Letter 生成 | 可集成为 Career-Ops 的一个 skill |
| Huntflow | ATS 管理 | 企业版 Career-Ops (个人 vs 团队) |
| Teal | 简历优化 | 功能重叠,但 Career-Ops 更深度 |
总结与展望
Career-Ops 展示了一个重要的趋势:AI 编程工具的能力正在溢出到其他领域。当一个工具足够强大时,它的使用者会自然而然地将其应用到发明者未曾设想的场景中。
核心启示
生态扩展 > 从零开发:Career-Ops 没有自己造一个 AI Agent 框架,而是站在 Claude Code 的肩膀上。这提醒我们:善用现有生态,往往比重新发明轮子更有效。
工作流自动化才是王道:真正让 Career-Ops 有价值的,不是某一个功能有多惊艳,而是它把整个求职流程串成了一个自动化的闭环。碎片化的工具没有灵魂,串联起来才有生产力。
AI 原生应用的正确姿势:Career-Ops 不是一个「AI 加持」的旧工具,而是从一开始就用 AI 的思维方式设计的。它的每一个功能都在问同一个问题:「如果 AI 能做这件事,它应该怎么做?」
未来展望
Career-Ops 正在向以下几个方向演进:
- 多 Agent 协作:引入专门的求职 Agent 负责不同环节(发现 Agent、分析 Agent、谈判 Agent)
- 实时市场情报:接入 Polymarket 和社交媒体,实时感知公司状态
- 薪资谈判自动化:基于 market data 和候选人偏好,自动生成谈判策略
- 跨平台同步:支持 Notion、Linear、Airtable 等工具的任务同步
资源链接
- GitHub: https://github.com/santifer/career-ops
- Discord 社区: https://discord.gg/8pRpHETxa4
- 官方文档: https://github.com/santifer/career-ops#readme
- 中文 README: https://github.com/santifer/career-ops/blob/main/README.cn.md
本文约 12,000 字,涵盖了 Career-Ops 的架构设计、核心功能、生产级实战和扩展开发。希望对你有所启发。
如果你也在求职,或者对 AI 工具的创新应用有任何想法,欢迎在评论区交流。