粘贴简历 + JD,4 个 AI Agent 自动协作,生成定制简历、Cover Letter 和评分报告。
AI 求职助手是一个基于多 Agent 协作框架(CrewAI)构建的求职辅助工具。你只需要把原始简历和目标职位的 JD(职位描述)粘贴进去,系统会依次启动 4 个专职 AI Agent,完成从 JD 解析、简历改写、Cover Letter 撰写到整体评分的完整流程,最终输出一套针对该岗位高度定制的求职材料。
用户输入
├── 原始简历(Markdown / 纯文本)
└── 目标 JD
│
▼
┌─────────────────────────────────────────────────────┐
│ CrewAI Sequential Pipeline │
│ │
│ Step 1 Step 2 │
│ ┌─────────────────┐ ┌─────────────────────┐ │
│ │ Research Agent │───>│ Rewrite Agent │ │
│ │ (Haiku) │ │ (Sonnet) │ │
│ │ │ │ │ │
│ │ · 解析 JD │ │ · 改写简历 │ │
│ │ · 提取关键词 │ │ · 镜像 JD 语言 │ │
│ │ · 识别 ATS 词 │ │ · 强化量化成就 │ │
│ └─────────────────┘ └─────────────────────┘ │
│ │ │
│ Step 3 Step 4 │ │
│ ┌─────────────────┐ ┌────────▼────────────┐ │
│ │ Cover Letter │ │ Review Agent │ │
│ │ Agent (Sonnet) │───>│ (Haiku) │ │
│ │ │ │ │ │
│ │ · 写求职信 │ │ · ATS 关键词核查 │ │
│ │ · 3-4 段结构 │ │ · 经历匹配度评估 │ │
│ │ · 人性化语气 │ │ · 0-100 综合评分 │ │
│ └─────────────────┘ └─────────────────────┘ │
│ │
└─────────────────────────────────────────────────────┘
│
▼
Streamlit UI(4 个 Tab 展示 + 下载按钮)
│
▼
output/ 目录(4 个 .md 文件持久化)
| 组件 | 版本 / 说明 |
|---|---|
| CrewAI | 1.14.4 — 多 Agent 编排框架,顺序流水线 |
| Claude Haiku | claude-haiku-4-5-20251001 — 用于 Research Agent 和 Review Agent(速度快、成本低) |
| Claude Sonnet | claude-sonnet-4-5 — 用于 Rewrite Agent 和 Cover Letter Agent(写作质量更高) |
| Streamlit | UI 框架,双栏输入 + 4 Tab 结果展示 |
| python-dotenv | 从 .env 文件加载 API Key |
| LiteLLM | CrewAI 内部调用 Anthropic API 的适配层(anthropic/ 前缀格式) |
git clone https://github.com/xyma2003/job-assistant.git
cd job-assistantpython -m venv .venv
source .venv/bin/activate # macOS / Linux
# .venv\Scripts\activate # Windowspip install -r requirements.txtcp .env.example .env
# Edit .env — fill in ONE backend (see .env.example comments)支持两种 LLM backend:SiliconFlow/OpenAI-compatible(国内默认)和 Anthropic(海外)。
Option A — SiliconFlow(国内推荐):
# .env
OPENAI_API_KEY=sk-...
OPENAI_API_BASE=https://api.siliconflow.cn/v1
OPENAI_MODEL=Qwen/Qwen3-32B获取 key:https://cloud.siliconflow.cn/(有免费额度)
CrewAI 底层用 litellm,
openai/前缀路由到 OpenAI-compatible 端点。当OPENAI_API_KEY设了,config.py自动把 SONNET/HAIKU 都设成openai/${OPENAI_MODEL}。
Option B — Anthropic(海外):
# .env
ANTHROPIC_API_KEY=sk-ant-xxxxxxxxxxxxxxxxxxxxxxxx
.env文件已在.gitignore中排除,不会被提交到 Git。
streamlit run app.py浏览器会自动打开 http://localhost:8501。
首次运行提示:4 个 Agent 顺序执行,通常需要 60–120 秒,请耐心等待。
第一步:粘贴简历
在左侧文本框粘贴你的完整简历。支持纯文本或 Markdown 格式。建议保留原始结构(教育、工作经历、技能等分节),Agent 会依据此结构进行改写。
第二步:粘贴目标 JD
在右侧文本框粘贴目标职位的完整 JD,包括岗位描述、任职要求、加分项等全部内容。内容越完整,分析越准确。
第三步:点击「开始分析」
点击蓝色「🚀 开始分析」按钮。页面会显示旋转进度条,提示「4 个 Agent 正在协作分析中,预计需要 1–2 分钟」。
实际耗时取决于简历/JD 长度以及 API 响应速度,通常在 60–120 秒之间。
第四步:查看 4 个 Tab 的结果
分析完成后,结果以 4 个 Tab 展示:
| Tab | 内容 |
|---|---|
| 📋 JD 分析 | 必备技能、加分技能、核心职责、企业文化信号、ATS 关键词、潜在红旗 |
| 📄 定制简历 | 针对该 JD 改写后的完整简历(Markdown 格式,可直接复制) |
| ✉️ Cover Letter | 3–4 段个性化求职信,连接你的具体经历与 JD 要求 |
| ⭐ 评分报告 | 关键词匹配度、经历相关度、求职信质量、Top 3 改进建议、综合匹配分(0–100) |
第五步:下载文件
每个 Tab 底部均有「下载」按钮,可将对应内容保存为 .md 文件,同时文件也会自动保存到项目 output/ 目录。
| 属性 | 值 |
|---|---|
| Role | Job Description Analyst |
| 模型 | Claude Haiku(速度优先,成本低) |
| max_tokens | 2048 |
| 输入 | 用户粘贴的 JD 原文 |
| 输出 | output/jd_analysis.md |
职责: 扮演拥有 10 年经验的高级招聘官,精准拆解 JD。提取:
- 必备技能与经验(硬性要求)
- 加分项(Nice-to-have)
- 核心职责
- 企业文化信号(团队协作风格、工作节奏等)
- ATS 关键词(简历必须包含才能通过系统筛选的词汇)
- 红旗警示(不寻常的要求或潜在问题)
| 属性 | 值 |
|---|---|
| Role | Resume Tailoring Specialist |
| 模型 | Claude Sonnet(写作质量优先) |
| max_tokens | 4096 |
| 输入 | 原始简历 + Research Agent 的分析结果(上下文传递) |
| 输出 | output/tailored_resume.md |
职责: 扮演帮助 500+ 候选人拿到 Top 科技公司面试的简历撰写专家,遵循严格规则:
- 镜像 JD 语言,嵌入 ATS 关键词
- 按相关度重新排序经历条目
- 强化量化成就表述(STAR 结构)
- 绝不虚构任何经历、技能或数据,仅重新表述已有内容
| 属性 | 值 |
|---|---|
| Role | Cover Letter Writer |
| 模型 | Claude Sonnet(写作质量优先) |
| max_tokens | 2048 |
| 输入 | JD 分析 + 定制简历(上下文传递) |
| 输出 | output/cover_letter.md |
职责: 扮演专注于求职材料的专业写作者,输出结构如下:
- 开头段:用真诚的方式展示对该职位的兴趣,而非千篇一律的「I am writing to apply」
- 正文(2 段):将 2–3 段具体经历与 JD 要求直接挂钩,有故事、有数据
- 结尾段:清晰的行动号召(Call to Action)
语气要求:专业但有人情味,避免模板化套话。
| 属性 | 值 |
|---|---|
| Role | Application Quality Reviewer |
| 模型 | Claude Haiku(速度优先,成本低) |
| max_tokens | 1024 |
| 输入 | 全部三个前序 Task 的输出(通过 context 参数传入) |
| 输出 | output/review.md |
职责: 扮演每天审阅数百份申请的招聘经理,给出不留情面的诚实反馈:
- 简历-JD 关键词匹配度(ATS 关键词是否全部命中)
- 经历相关度(经历是否真正匹配岗位需求)
- 求职信质量(是否有说服力、具体、有人情味)
- 整体短板(缺什么、哪里弱)
- 提交前 Top 3 改进建议
- 综合匹配评分(0–100)
所有输出保存在项目根目录的 output/ 文件夹下:
output/
├── jd_analysis.md # JD 结构化分析(Research Agent 输出)
├── tailored_resume.md # 定制化简历(Rewrite Agent 输出)
├── cover_letter.md # 求职信(Cover Letter Agent 输出)
└── review.md # 评分报告(Review Agent 输出)
| 文件 | 内容结构 |
|---|---|
jd_analysis.md |
Required Skills / Nice-to-Have / Responsibilities / Culture / ATS Keywords / Red Flags |
tailored_resume.md |
完整 Markdown 格式简历,经历条目已按 JD 相关度重排并改写 |
cover_letter.md |
3–4 段求职信,可直接复制使用 |
review.md |
各维度评估 + Top 3 改进建议 + 最终 0–100 分 |
每次运行会覆盖同名文件。如需保留多个版本,请在运行前手动备份
output/目录。
job-assistant/
├── app.py # Streamlit 前端入口,UI 布局与结果展示
├── crew.py # CrewAI Pipeline 核心逻辑,定义 Tasks 和 Crew
├── config.py # 全局配置(API Key、模型名、输出目录)
├── requirements.txt # Python 依赖
├── .env.example # API Key 模板(复制为 .env 使用)
├── .env # API Key(需自行创建,不提交 Git)
├── .gitignore
├── LICENSE
│
├── agents/
│ ├── __init__.py # 统一导出 4 个 make_*_agent 工厂函数
│ ├── research_agent.py # Research Agent 定义(Haiku)
│ ├── rewrite_agent.py # Rewrite Agent 定义(Sonnet)
│ ├── cover_letter_agent.py # Cover Letter Agent 定义(Sonnet)
│ └── review_agent.py # Review Agent 定义(Haiku)
│
└── output/ # 自动生成,存放 4 个输出 .md 文件
Q: 运行时报错 ANTHROPIC_API_KEY 未设置或无效
确认项目根目录有 .env 文件,且内容格式正确:
ANTHROPIC_API_KEY=sk-ant-xxxxxxxxxxxxxxxxxxxxxxxx注意 Key 前后不要有引号或多余空格。重新启动 streamlit run app.py 使配置生效。
Q: 点击「开始分析」后长时间无响应或超时
- 4 个 Agent 顺序运行,每个 Agent 都需要等待 API 响应,总耗时通常为 60–120 秒。
- 如果超过 3 分钟仍未完成,检查网络连接,或确认 Anthropic API 服务状态(status.anthropic.com)。
- Streamlit 界面的 Spinner 消失即表示完成。
Q: 报错 crewai 版本不兼容
本项目锁定使用 crewai==1.14.4,模型名使用 LiteLLM 的 anthropic/ 前缀格式(如 anthropic/claude-sonnet-4-5),这是 CrewAI v1.x 的要求。如果你安装了其他版本,请严格按照 requirements.txt 安装:
pip install -r requirements.txtQ: 定制简历内容有遗漏或改动过大
Rewrite Agent 的 Prompt 中明确要求「不虚构任何经历、技能或数据」,仅对已有内容进行重新表述和排序。如果发现明显问题,建议:
- 检查原始简历是否粘贴完整
- 检查 JD 是否包含足够详细的岗位要求
- 将
tailored_resume.md作为参考,手动微调关键细节后再使用
Q: 如何更换 Agent 使用的模型
在 config.py 中修改模型常量,使用 LiteLLM 支持的 Anthropic 模型 ID:
# config.py
SONNET = "anthropic/claude-sonnet-4-5" # 改为其他 Sonnet 模型
HAIKU = "anthropic/claude-haiku-4-5-20251001" # 改为其他 Haiku 模型Q: 如何扩展自定义工具(如联网搜索公司信息)
参照 CrewAI Tools 文档 创建自定义 Tool,然后在对应 Agent 的 make_*_agent() 函数中通过 tools=[your_tool] 参数注入即可。