这个项目藏着一个被绝大多数 AI 求职工具忽视的"第一性原理"。
求职的瓶颈不是"写得好",而是 "判断准 + 写得好 + 闭环跑完"。
市面上 90% 的 AI 求职工具只做"生成"那一段(生成 CV / 求职信),但 没有"评估+闭环"两段——这是本项目的破界点。
把求职拆成 6 个环节,任何一个掉链子,前面再好也没用:
从海量岗位里筛出值得投的(而不是 HR 推荐的)
5 维评分模型(技术/经验/行为/位置/职业),避免"硬技能匹配但文化冲突"
LaTeX CV + 求职信,按岗位关键词重排
CSV 记录每份申请的状态
STAR 案例 + 公司研究 + Mock Interview
归档 offer/reject/沉默,反哺评估模型
项目不是"功能集合",而是 Layer 1 评估 + Layer 2 生成 + Layer 3 迭代 的能力栈。
自我对抗 + 自我修订 + ATS 校验循环 → 逼近 80 分稿
CV 模板 / 求职信模板 / 编译验证 → 输出可投递文档
技能匹配 / 经验匹配 / 行为匹配 / 位置 / 职业方向 → 判断该不该投
三层缺一不可。没有评估层,AI 帮你生成 100 份也投错岗;没有生成层,评估再准也无法输出;没有迭代层,永远停在"60 分稿",无法逼近"80 分稿"。
按"评估 → 生成 → 迭代"分类,每个能力都有明确实现路径。
| 能力 | 实现 | 价值 |
|---|---|---|
| 五维评分模型 | 04-job-evaluation.md | 5 个维度独立打分,避免单一维度误判 |
| 行为画像匹配 | 02-behavioral-profile.md | 解决"硬技能匹配但文化冲突"的死亡组合 |
| 薪资基准对比 | salary_lookup.py | 接 BYO 薪资数据,识别"低薪高岗"陷阱 |
| 死线 / Deal-breaker 过滤 | /rank 命令 | 硬件级筛选:过期岗位直接剔除 |
| 能力 | 实现 | 价值 |
|---|---|---|
| CV 定制 | 05-cv-templates.md + moderncv | 按岗位重排经验 bullet,强调关键词 |
| 求职信定制 | 06-cover-letter-templates.md | 一岗位一语言(Danish/English 自动匹配) |
| PDF 编译验证 | lualatex + xelatex 双引擎 | 解决 LaTeX "看起来 OK 但 PDF 排版崩"的死亡陷阱 |
| ATS 文本层校验 | pdftotext 提取 PDF 文本 | 验证 ATS 真正能解析的内容(不是渲染出来的) |
| 相关性剪裁 | 评分驱动剪裁 CV | 不按时间剪,按"相关性+独特性+求职信依赖度"评分 |
| 能力 | 实现 | 价值 |
|---|---|---|
| Drafter-Reviewer 双 Agent | /apply 命令的 Step 3 | 单 Agent 容易自我满足,双 Agent 互相纠错 |
| 公司研究自动化 | WebSearch + WebFetch | Reviewer 自动查公司官网/新闻/团队,避免编造 |
| PDF 视觉检查 | Read tool 读 PDF | 解决"标题孤页"/"求职信溢出第二页"等问题 |
/apply 的 8 步流程这是项目的灵魂——把"输入→输出"拆成 8 步,每步都有不可跳过的验证。
URL 或文本 → 提取公司/岗位/地点/语言
读取 04-job-evaluation.md + 01-candidate-profile.md,5 维评分 → 评估表 + 是否建议投递
CV 用 lualatex + moderncv(必须 2 页);求职信用 xelatex + cover.cls(必须 1 页)
内联传入草稿(不重读文件,节省 token)→ 研究公司 + 批判 + 找漏关键词
根据 Reviewer 反馈迭代修改
编译 PDF → Read tool 看 → 修复 \needspace / \enlargethispage → 重新编译
检查:联系方式是文本不是图标 / 阅读顺序正常 / 关键词覆盖度
pass/fail 表格呈现给用户
① Reviewer 通过内联传入草稿而非重读文件(节省 ~30% token)
② 验证清单只在最后跑一次(不重复浪费)
③ 跨步骤复用 context(已读过的文件不重读)
Mads 不只写了功能,更写了一套反共识的设计哲学。
CLAUDE.md 和画像用占位符 [YOUR_NAME] 强制约束——AI 只能从画像里取数据,不能编造。这是反 hallucination 的硬约束。
LaTeX 的页面分割不可预测——很多模板在 .tex 看着 OK,但 PDF 里标题孤页、求职信溢出第 2 页、bullet 字体悄悄 fallback。/apply 强制走 Read tool 看 PDF,迭代修复到完美。
当 CV 超过 2 页时,不按"最老"剪,而是按相关性评分剪:跟岗位关键词的匹配度、在全文中的独特性、求职信是否依赖这条 bullet。旧角色但命中关键词的 bullet 优先保留。
单 Agent 容易自我满足:"我写得很好了。" 双 Agent 强制拆开:
· Drafter:专注写
· Reviewer:全新上下文,查公司、找漏洞、批判
· Drafter 拿到反馈修订
这套机制可迁移到所有 Agent 工作流(翻译 / 报告 / 写作)。
ATS(Applicant Tracking System)读的是 PDF 文本层,不是渲染。LaTeX 经常渲染好看但文本层是垃圾:邮箱被渲染成图标(ATS 看不到)、多列布局让阅读顺序错乱、关键词被图标打断。/apply 用 pdftotext -layout 提取文本层,验证ATS 真正能看到的内容。
地球物理学家 Mads 用这套系统 5 个月拿到 AI Engineer offer——数据自己说话。
"I was upfront about it with every employer I spoke to, and instead of counting against me, it usually sparked a genuine technical conversation."
—— 他主动告诉每家雇主自己在用 AI 求职,结果不是减分,反而成为技术对话的起点。
本项目是目前唯一端到端覆盖"评估→生成→迭代→归档"全流程的开源框架。
| 维度 | 本项目 | Resume Builder | AI Cover Letter | LinkedIn Easy Apply |
|---|---|---|---|---|
| 匹配评估 | 5 维评分 | 无 | 无 | 无 |
| CV 定制 | LaTeX + ATS | 模板选择 | 无 | 1 份通用 |
| 求职信定制 | 一岗一信 | 模板填空 | 通用 AI | 无 |
| Drafter-Reviewer | 双 Agent | 无 | 无 | 无 |
| PDF 视觉验证 | 强制 | 仅模板预览 | 无 | 无 |
| ATS 文本层校验 | pdftotext | 无 | 无 | 无 |
| 薪资基准 | BYO 数据 | 无 | 无 | 无 |
| 面试备战 | STAR 框架 | 无 | 无 | 简单建议 |
| 结果归档复盘 | outcome.md | 无 | 无 | LinkedIn 自带 |
| 行为画像匹配 | PI / DISC | 无 | 无 | 无 |
任何开源项目都有边界,诚实标注才能正确使用。
5 个 CLI 搜索工具都是丹麦招聘网站,需要 /add-portal 扩展其他国家
linkedin-search 只能低频使用,作者明确标注「personal use only」
lualatex + xelatex + 字体安装复杂,对非技术求职者门槛高
跑 LaTeX smoke + skill lint + CLI typecheck,个人项目维护成本高
salary_lookup.py 需要用户自己准备 salary_data.json,没有内置数据源
从"分析别人"到"指导自己"——这个项目对祖宁当前阶段(求职冲刺 + 实在智能 Agent 运营)有 5 条直接启发。
不要再纠结 CV 写得好不好——建立端到端闭环才是核心:选岗 → 评估 → 文书 → 投递 → 追踪 → 复盘。
Mads 的核心智慧:先评估再写。祖宁的"求职作战系统"(job-research + job-asset-manager)就是这个思路,下一步:把"五维评分"做成自动化评分卡。
这是孔明可以学的通用模式:
· 任何需要"对抗式校验"的场景(求职 / 翻译 / 报告 / 写作)都适用
· 关键设计:Reviewer 用全新上下文 + 内联输入(节省 token)
Mads 的 CLAUDE.md 用占位符强制约束,祖宁的求职材料也应该用类似机制:
· 简历只能从 MEMORY.md 取数据
· 不能在求职信里编造经历
· AI 输出必须人工校验
祖宁现在做实在智能 Agent 运营,这个项目的双 Agent 架构(Drafter-Reviewer)正好可以反向迁移到:
· EAOS 的「评估 Agent + 执行 Agent」协同模式
· 客户场景:「AI 生成方案 + AI 评审方案」的双轨设计
本项目可作为"AI 协作型工作流"标杆案例,用于销售/BD 与客户对话。
这是 Mads Lorentzen 给所有 AI 求职工具的一份公开答案——也是给所有"AI 协作型工作流"的一份范本。