ai-job-search
儿童的心灵是敏感的,它是为着接受一切好的东西而敞开的。如果教师诱导儿童学习好榜样,鼓励仿效一切好的行为,那末,儿童身上的所有缺点就会没有痛苦和创伤地不觉得难受地逐渐消失。——苏霍姆林斯基
https://github.com/MadsLorentzen/ai-job-search
当求职这件事,终于不再像一场孤军奋战
有些项目一看名字,就知道它不是来“展示技术肌肉”的,它是来替人分担焦虑的。
ai-job-search 就是这样一个仓库。
它像一位不知疲倦、逻辑清晰、又很懂分寸的求职搭子,站在你电脑旁边,对你说:
把你的经历交给我,把岗位链接交给我,剩下的我来帮你一起拆。
它不是简单地帮你“生成一份简历”那么浅,也不是把招聘广告喂给 AI 再吐出一封套话味十足的求职信。它更像是把求职这件事,拆成了一整套可以协作、可以验证、可以迭代的工作流:先认识你,再理解岗位,再判断匹配度,再去定制简历和求职信,最后连 PDF 呈现效果和 ATS 可读性都不放过。
如果说很多 AI 工具只是递给你一支笔,那 ai-job-search 更像是直接搭起了一间求职作战室。
它到底是什么
ai-job-search 的仓库描述写得很直接:
一个基于 Claude Code 构建的 AI 驱动求职申请框架。你只需要 fork 它、填写自己的资料,然后让 Claude 去评估职位、定制 CV、撰写求职信,并帮你准备面试。
README 进一步把它说得更完整一些:这是一套结构化工作流,可以把 Claude Code 变成一个全栈求职助手。
这句话很有意思。
所谓“全栈”,不是因为它用了多少技术名词,而是因为它几乎覆盖了求职过程中的整条链路:
- 建立个人画像
- 搜索职位
- 评估岗位匹配度
- 生成定制化 CV
- 撰写求职信
- 用第二个代理做审稿和批判
- 修订输出
- 编译并检查 PDF
- 验证 ATS 读取效果
- 记录申请结果
- 追踪能力缺口并生成学习计划
它不是一锤子买卖,而是一套持续运转的求职系统。
你可以把它理解成:把“投简历”这件通常很混乱、很耗神、很容易反复自我怀疑的事情,变成一个尽可能有秩序、有依据、有反馈回路的流程。
这个项目最迷人的地方,是它不装聪明
很多 AI 求职工具给人的感觉像是一个太过热情的销售,张口闭口都在说“我可以帮你秒生成最强简历”。但真正找过工作的人都知道,求职最怕的不是慢,而是假。
假经历,假技能,假热情,假匹配,假到最后连自己都不敢相信自己投出去的那份材料。
ai-job-search 在 README 里有一句很重要的话:
它不会编造技能和经历。CV 和求职信里的所有表述,都要基于你的真实资料进行验证。
这一点,让整个项目一下子从“炫技工具”变成了“可信工具”。
它并不试图替你发明一个更厉害的你,而是努力把真实的你组织得更有说服力,让你的经验更准确地对接岗位需求,让你的优势被更好地看见。
这很克制,也很珍贵。
因为真正成熟的求职辅助,不是替你撒谎,而是替你表达。
它像一个认真做功课的求职助手
README 里给了一张很清晰的流程图,大意可以理解成这样:
- 先用
/setup建立你的个人档案 - 再用
/scrape去搜索招聘网站 - 然后用
/apply <url>对某个岗位发起完整申请流程
这三个命令几乎构成了它的主心骨。
你会发现,这个项目很像一个做事特别有章法的人。
它不会一上来就催你“快给我一个岗位链接”。它会先把椅子拉开,让你坐下,说,先别急着投,我们先认真认识一下你是谁。
于是 /setup 出场了。
它会引导你建立自己的档案,而且不是只认一种输入方式。README 里提到它支持三条路径:
- 读取你
documents/文件夹中的材料 - 直接在对话里粘贴一份 CV
- 通过一次引导式访谈来逐步了解你
这很像一个真正懂人的助手。因为它知道,不是每个人都已经把资料整理得漂漂亮亮,也不是每个人都习惯用同一种方式讲述自己。
有人简历丰富、文档齐全,那就读文件。
有人手上只有一份旧 CV,那也能先接住。
还有人经历很多,但从没系统梳理过,那就通过提问,一点点把他的故事拎出来。
它不是要求你完美准备好再来,而是愿意陪你从混乱中开始。
它懂得先理解你,再理解工作
很多人对 AI 求职工具最大的担忧是:它会不会把我写得千篇一律?
这个仓库给出的答案是:不会,前提是你愿意给它足够真实、足够丰富的自己。
README 里反复强调了一件事:资料的深度,直接决定输出质量。
你的资料越薄,它写出来的内容越像模板。
你的经历越具体,它生成的申请材料越有灵魂。
它很鼓励你不要只写职位名称,而是去描述:
- 你具体做过什么项目
- 用过什么工具
- 承担过什么责任
- 取得了什么可量化成果
- 哪些工作让你有成就感
- 哪些工作让你感到消耗
- 你未来想往哪里走
这意味着这个项目眼中的你,不是一串关键词,也不是一份技能清单。
你是一个有工作轨迹、有偏好、有动力结构、有成长路径的人。
于是它做岗位评估的时候,也不是只看“命中几个关键词”。README 中写得很明确,它会从多个维度判断匹配度,包括:
- 技能匹配
- 经验匹配
- 文化契合
- 地点因素
- 职业发展方向的一致性
这很像一个真正会替你思考长期价值的职业顾问,而不是一个只会把“Python”匹配给“Python”的自动机。
/scrape 像一只勤奋的小猎犬,替你四处嗅岗位
当你的画像建立好之后,/scrape 就开始上场干活了。
它会搜索多个招聘门户,找出和你画像相匹配的职位,然后去重、排序,并按匹配度展示结果。
这种感觉很妙。
你不是站在无数招聘网站之间来回切换的人了,你像是坐在指挥室里,而这个项目则像一只跑得飞快、鼻子很灵的小猎犬,在不同的岗位池里替你搜寻线索,然后把猎物叼回来,整齐地放到你面前。
仓库里已经内置了多个职位搜索工具,README 展示了几个主要集成:
- Jobbank
- Jobdanmark
- Jobindex
- Jobnet
- LinkedIn public job listings
其中前四个更偏丹麦市场,LinkedIn 那个则是更通用、更偏全球化的入口。README 还提到,LinkedIn 这一套是基于公开、无需认证的 jobs-guest 接口实现的。
这说明项目不是停留在“理论上能搜职位”,而是真的把搜索这件事做成了可执行的工具链。
更妙的是,如果你所在的市场不在它预设的范围内,它还准备了 /add-portal。
也就是说,这个项目并没有把自己关在一个固定的小世界里。它像个很会适应环境的人,对你说:
你常用的招聘网站不在这里没关系,带我去看看,我可以学。
/apply 才是整部戏真正的主角
如果说 /setup 是认识你,/scrape 是替你找机会,那么 /apply 就是这套系统最锋利、也最动人的部分。
你可以这样用它:
1 | /apply https://jobindex.dk/job/1234567 |
如果某些招聘网站屏蔽自动抓取,也可以直接粘贴完整职位描述:
1 | /apply <paste the full job description here> |
然后,它就开始一整套严谨得近乎执拗的工作流。
README 对 /apply 的流程写得非常清楚,大致包括:
- 解析岗位信息
- 根据你的画像评估匹配度
- 生成定制化 LaTeX CV 和求职信
- 启动第二个 reviewer agent 去研究公司并批评草稿
- 根据反馈修订内容
- 编译并检查两个 PDF
- 做 ATS 可读性检查
- 展示最终输出和验证清单
这一连串动作看下来,你会意识到,这不是“AI 写一封信”。
这是“AI 在替你走一遍真正高质量申请材料的生产流程”。
它把一个原本很容易草率处理的动作,变成了一次有审稿、有质检、有复盘的完整协作。
最妙的一笔,是它安排了一个“挑刺的人”
这个仓库最有戏剧感的一点,是它不是只安排一个 agent 来写,而是安排了一个 reviewer agent 来批。
这特别像你身边那个最靠谱的朋友。
你写完一版材料,自己看总觉得还行。
而那个朋友会皱着眉头说:
这个地方太空了。
这句太泛。
你说你适合这家公司,但你其实还没说明白为什么。
这段经历写得像流水账,没有把价值抬出来。
README 里强调,这个 reviewer 会以一个新的上下文去研究公司,并对草稿提出批评意见,然后再由 drafter 去修订。
这个“写的人”和“挑刺的人”分离开的设计,非常聪明。
因为很多时候,AI 最容易犯的错不是不会写,而是写得太顺,顺到它不质疑自己。
而 reviewer 的存在,就是专门给那种“看起来挺像那么回事”的内容踩一脚刹车。
于是整套工作流就不再像自说自话,而像一次真正有内部校对机制的协作过程。
它连 PDF 最终长什么样都要亲自盯
如果你做过 LaTeX 简历,应该知道一件很现实的事:
源码看着没问题,不代表导出的 PDF 没问题。
有时候某个职位标题会孤零零掉到下一页;
有时候求职信不知不觉溢到了第二页;
有时候版式很漂亮,但 ATS 一读全成乱码;
还有时候图标字体看着高级,提取文本时却面目全非。
README 专门把这一块写成了项目差异化能力之一,而且说得很直白:
很多简历模板的问题,不在 .tex 文件里,而在生成出来的 PDF 里。
所以 ai-job-search 做了一件非常“较真”的事:
它不只负责生成内容,它还会编译 PDF、读取渲染结果,并持续调整,直到 CV 恰好控制在 2 页内,同时避免孤行、断裂和排版问题。
对于 CV,它使用 lualatex;
对于求职信,它使用 xelatex。
这不是形式主义,这是把“最后交出去的东西”当回事。
它不像有些工具,只把任务停在“我帮你生成文本了,剩下你自己看着办”。
它更像一个把文件交付视作尊严的编辑,对每一页都亲自过目。
它还知道,ATS 读的不是你眼睛看到的那层世界
这部分尤其让我觉得这个项目很懂现实。
README 里提到,ATS 检查读取的是 PDF 的文本层,不是你肉眼看到的版面层。换句话说,人看起来没问题,不代表机器能正确解析。
于是它会用 pdftotext 去检查导出的 CV,在机器视角里确认这些关键内容是否还在:
- 联系方式是否以文字形式存在
- 是否出现乱码字符
- 章节结构是否还能正确提取
- 项目符号和文本流是否还合理
这个细节真的很加分。
因为它不是活在理想世界里,它知道简历要面对的不只是招聘经理,还有前置筛选系统。
你辛辛苦苦写得再漂亮,如果 ATS 读不懂,那些努力可能在第一道门口就被拦住了。
而这个项目像一个有经验的前辈,拍拍你的肩说:
别只顾着让人类喜欢,也得先让机器别误会你。
它不是盲目地删内容,而是聪明地帮你“裁剪”
简历篇幅控制一直是件很痛苦的事。
要保留什么?
删掉什么?
是不是旧经历都该砍?
是不是不相关的就完全不能提?
很多工具在这件事上特别粗暴,一超页就机械删除。
但 ai-job-search 的 README 提到,它使用的是 relevance-weighted CV cutting,也就是按“相关性加权”的方式来裁剪内容。
这意味着它不是照着时间线胡乱砍,而是会综合判断:
- 某条经历和当前岗位的相关度
- 这段内容在你职业故事中的重要性
- 是否有助于支撑目标职位的价值表达
这很像一个会讲故事的编辑。
它知道简历不是流水账,也不是墓志铭,不是要把你所有做过的事都刻进去,而是要保留那些最能说明“你为什么值得被面试”的证据。
它替你做的,不是删除,而是取舍。
它还有很多像配角一样低调,却很能打的命令
这类项目最怕主流程强,边角能力弱。
但这个仓库在“求职生命周期管理”上,想得比很多同类工具更远。
README 里提到,除了 /setup、/scrape 和 /apply 三大核心命令外,还有六个延展命令。
/outcome
这个命令会记录每次申请最后发生了什么:
- 进了哪几轮面试
- 有没有拿到 offer
- 是被拒绝了还是石沉大海
- 当时投递的 CV、求职信、岗位描述都会被归档
这就像一个很细心的档案管理员。
它不让你的每次尝试像落进水里的石子一样没了回音,而是把结果收集起来,逐渐变成你自己的求职数据库。
/rank
它负责在 /scrape 和 /apply 之间搭桥。
当你一次抓回来很多岗位时,它会批量打分,按适配度排出 shortlist。这样你就不需要面对一堆岗位时凭直觉乱选,而是能先看一眼哪些机会更值得优先下注。
/expand
这个命令很像一个不满足于表面信息的研究员。
它会沿着你在资料里已经提到的公开来源继续往下挖,比如:
- GitHub 仓库
- 个人作品集网站
- Kaggle
- Google Scholar
- 课程大纲与证书信息
也就是说,它愿意替你把那些已经散落在外部世界里的能力线索,重新拉回到求职画像中来。
/upskill
这是一个很有成长意味的命令。
它会分析你的画像和岗位之间的差距,给出优先级排序后的能力缺口热力图和学习计划。
这让整个项目不只是服务于“这次申请”,它还开始关心“你的下一次竞争力”。
它像一个不会只陪你冲刺一次的人,而是想陪你把路越走越宽。
/add-template
如果你不想使用项目自带的 LaTeX 模板,可以注册自己的模板,告诉系统编译方式、字体、页数限制和风格规则。
它不是要求你接受它的审美,而是愿意学习你的偏好。
/add-portal
前面提过,这是让项目适应你本地招聘网站生态的重要入口。
你给它一个招聘网站,它会去研究搜索 URL 模式、结果结构、访问规则,并生成对应的 CLI skill。
这像一个跨国工作的顾问,到了新市场也不怵,说一句:
给我一点时间,我先熟悉一下这边的街道。
它连文件结构都整理得像一间井井有条的办公室
一个项目的目录结构,常常暴露作者到底是认真搭系统,还是只是拼一个 demo。
ai-job-search 的文件结构很完整,而且非常具有“工作流感”。
比如你会看到:
CLAUDE.md作为主候选人画像与工作流规则.claude/commands/放各种命令定义.claude/skills/job-application-assistant/放候选人画像、行为画像、写作风格、岗位评估、CV 模板、求职信模板、面试准备等内容.agents/skills/放各类职位门户的 CLI 工具cv/和cover_letters/放默认 LaTeX 模板templates/放用户自定义模板documents/放你的真实资料job_scraper/存职位抓取状态upskill/存能力提升报告job_search_tracker.csv用来跟踪申请过程
这就像一间办公室,每个抽屉都贴好了标签。
简历在哪,求职信在哪,投递记录在哪,能力提升报告在哪,搜索器在哪,规则手册在哪,全都有明确的位置。
你不会觉得自己是在用一个神秘的黑盒。
你会觉得自己是在和一套透明、有秩序的系统协作。
documents/ 这一层设计,特别像在认真收集你的职业证据
README 和 documents/README.md 都把 documents/ 讲得很细。
这里面可以放:
cv/:你的主 CV,支持 PDF 或 LaTeXlinkedin/:LinkedIn 导出的 PDFdiplomas/:学历证书与成绩单references/:推荐信applications/:过往申请记录
这个设计的高明之处在于,它不是把“简历”当作你唯一的职业身份来源。
它知道一个人真正的职业画像,往往散落在不同文档里:
你的主 CV 里有主体故事,
LinkedIn 里有补充信息和公共叙述,
学历材料里有官方名称和时间校验,
推荐信里有别人对你能力的措辞,
过往申请记录里有你曾经瞄准过哪些方向,以及那些尝试换回了什么结果。
于是这个项目像个认真做案头工作的研究员,把这些材料一份份摊开,不急着下判断,而是慢慢拼出一个更完整的你。
它不只帮你找工作,也帮你认识自己的职业路径
README 中有一段我很喜欢,它提到这个框架支持两种求职模式:
- 明确目标型
- 潜在机会发现型
前者很好理解:你知道自己想找什么岗位,系统帮你 refine 和排序。
后者就很有意思了:它会基于你完整的经历,而不只是职位头衔,帮助你发现你可能没想过的新方向。
这很像一个真正有职业洞察的伙伴。
它不会只说“你过去是数据分析师,所以你下一份也该找数据分析师”。
它会去看你做过的项目、使用过的工具、你在哪些任务上表现出强项、你对哪些工作内容更有能量,然后尝试告诉你:
也许你还能往这里走。
也许你那些看似分散的经历,拼起来其实指向另一条路。
也许你不只是过去那个职位名称。
这一点,让项目有了一种超出“自动化求职”的温度。
它不只关心你怎么投,也关心你往哪里去。
快速启动也很直接,几乎没有废话
如果你想上手,README 给出的 Quick start 很清楚。
1. Fork 并克隆仓库
1 | gh repo fork MadsLorentzen/ai-job-search --clone |
2. 安装职位搜索工具
1 | cd .agents/skills/jobbank-search/cli && bun install && cd ../../../.. |
README 还特别说明了,linkedin-search 其实运行时没有依赖,直接用 bun 就能跑,bun install 更多是为了拉 TypeScript 的开发类型。
3. 设置个人资料
1 | claude |
4. 搜索职位
1 | /scrape |
5. 对目标岗位发起申请流程
1 | /apply https://jobindex.dk/job/1234567 |
如果目标网站抓不到内容,就直接贴岗位描述:
1 | /apply <paste the full job description here> |
从命令本身也能看出这个项目的气质:简洁、明确、不绕弯子。
它不是堆一大堆参数和复杂配置把你挡在门外,而是尽量把真正复杂的部分收进内部流程里,把入口留给人。
它对环境依赖也交代得很实在
在使用前,你大概需要准备这些:
- Claude Code CLI
- Python 3.10+
- Bun
- 带有
lualatex和xelatex的 LaTeX 发行版 - 可选的
pdftotext
这些依赖看起来不少,但和它要完成的事情相比,其实都很合理。
尤其是 LaTeX 这一块,恰恰说明它不是只想生成“差不多就行”的文本,而是要产出能真正用于投递的正式材料。
项目甚至还明确写了:
CV 用 lualatex 编译,
封面信用 xelatex 编译,
某些环境下 pdflatex 可能并不可靠。
这种细节非常像一个踩过坑之后认真写下提醒的人。
不是教科书式地罗列依赖,而是带着一点“这地方我替你摔过一次了”的经验感。
它甚至替“重来一次”准备好了体面的退出方式
有时候最好的设计,不体现在“开始”,而体现在“重来”。
这个仓库提供了 /reset:
1 | /reset profile |
而且它不会默默执行,它会明确告诉你将删除什么,并要求你输入 RESET 才会确认。
这就是一个成熟系统该有的样子。
它知道人的资料、职业材料、投递记录都不是玩具。
所以即使是重置,也要谨慎、透明、有确认机制。
这像一个做事有边界感的人。
他愿意帮你动手,但不会替你鲁莽。
为什么这个项目会让人觉得有希望
我觉得 ai-job-search 最打动人的地方,不是它用了 Claude Code,不是它会写 LaTeX,也不是它会多门户抓取。
而是它非常认真地对待了“求职”这件本来就很消耗人的事。
它知道求职不是只有生成文本那么简单。
求职是一种反复回答“我是谁、我适合什么、我为什么值得被看见”的过程。
它也是一种很容易被挫败、被忽视、被低回应率磨掉自信的过程。
而这个项目像一个沉稳的助手,把这团混乱拆开:
- 先把你的材料收好
- 再把你的经验说清
- 再把岗位看明白
- 再决定值不值得投
- 再认真定制材料
- 再找另一个视角来挑刺
- 再把 PDF 盯到能交
- 再确认 ATS 不会误伤你
- 再把结果记录下来
- 再从一次次结果里提炼下一步成长方向
它不承诺魔法。
它提供的是秩序。
而对很多正在找工作的人来说,秩序本身就是一种安慰,也是一种力量。
它适合什么样的人
如果你只是想一键糊一份“差不多”的简历,这个项目可能比你想象中认真得多。
但如果你是下面这些人,它会非常适合你:
- 想把求职流程系统化的人
- 不想每次投递都从零开始的人
- 希望 CV 和求职信真正贴合岗位的人
- 在意 PDF 版式和 ATS 可读性的人
- 愿意沉淀长期职业资料的人
- 想一边找工作,一边反向发现能力缺口的人
- 希望 AI 帮忙,但不希望 AI 乱编经历的人
它不是“最轻”的工具,但很可能是“最像真实求职协作”的工具之一。
最后
ai-job-search 像一个不爱说大话、但真的会把活做细的伙伴。
它把自己放在一个很正确的位置上:
不是替你变成另一个人,
而是帮你把真正的你,讲得更准确、更有针对性、更能穿过人和机器的双重筛选。
它会帮你搜索岗位,帮你梳理画像,帮你定制材料,帮你检查版式,帮你记录结果,帮你找出差距,帮你准备下一次出发。
如果说求职像一段又长又磨人的路,那这个项目就像一位会背包、会查地图、会提醒你整理鞋带、还会在你怀疑自己的时候递上一杯热咖啡的同行者。
它不替你走路。
但它会让你走得更稳,也更像你自己。
