我做了一个自动化求职系统

声明:本文由 GPT 结合实际经历和个人写作风格 Skill 生成。Cover Photo 引自 Unsplash

最开始,我想解决的问题其实很普通:职位从不同网站出现,同一个广告可能被重复发布,申请材料散落在不同文件夹里,投递之后又很难确认当时到底提交了哪个版本……只要申请数量稍微多一点,「我是不是漏了什么」和「这一份究竟改过没有」就会变成一种持续存在、但很难靠记忆彻底消除的摩擦。

所以我后来做的并不是一个更复杂的求职表格,而是一套 human-supervised、file-driven 的自动化求职系统。我把它叫做 JobSeek:它负责发现职位、检查重复、评估匹配度、生成材料、等待人工批准、协助提交,并把真正提交过的版本归档下来;人仍然负责判断一个机会是否值得继续,也保留最后一次点击的决定权。

先冻结事实,再开始工作

这套系统最重要的设计并不是「让 AI 帮我写 Cover Letter」,而是先规定什么可以被相信。候选人事实、基础 CV、不同方向的搜索规则和已经批准的内容库各自有明确位置;开始一个批次时,系统会把本轮所需输入复制到不可变的 snapshot/,同时记录来源、角色和 SHA-256 hash。之后即使工作目录里的资料发生变化,正在运行的批次也不会悄悄换一套事实。

这是生成式工作流里一个很实际的问题:模型很擅长把话写得合理,但「合理」不等于「真实」。因此,职位广告只能成为职位证据,不能反过来发明候选人的经历;写作策略可以调整材料的选择、顺序和措辞,却不能覆盖事实来源。如果多个权威文件互相冲突,正确结果不是猜一个,而是停下来。

系统对职位也做了类似处理。每条 URL 会先被 canonicalize,再和历史记录及当前批次比较;同一广告换个平台出现,不应被计算成一个新机会。已审阅记录保存在长期 history 中,可重建的索引只负责加速查找,不承担事实来源的角色——缓存坏了可以重建,历史本身不能靠缓存定义。

自动化的重点,是知道在哪里停

整个流程大致是:preflight → 创建批次 → 发现与评估 → 生成材料 → 人工审核 → 精确版本批准 → 提交确认 → 最小化归档 → 完成批次。不同环节由不同角色处理,控制器只做机械上能够确定的事,例如快照完整性、结构校验、去重、材料 hash、批准是否仍然匹配,以及一次提交是否已经消耗了批准。

它不会因为某个评分超过阈值,就擅自宣布一个职位「值得投」。评分只是排序信息,明确的硬性条件、尚未确认的事实和人的判断始终优先。提交也不是一个可以无限 retry 的 API call:系统只接受针对单个职位、当前 review 和当前材料字节的批准;任何内容变化都会让批准失效,而结果不明确时不能盲目再点一次。

这里有一个看起来不够「自动」、实际却非常必要的设计:自动化不负责最后提交。因为省掉一次点击带来的收益很小,错误申请、重复提交或上传错误文件的成本却很高。好的自动化不是把人从流程里删掉,而是把人留在真正需要承担判断和风险的位置。

跑完之后,我得到了什么

截至本文写作时,这个工作目录已经完成 13 个批次,完整审阅 539 条职位信息,并确认归档了 30 次实际申请。控制器约 1300 行,另有接近 1000 行测试;现有 79 项测试覆盖了快照被篡改、历史与跨 worker 重复、批准失效、提交状态不明确、归档材料一致性等场景,并全部通过。

这些数字当然不能直接证明求职会成功。它们能证明的是另一件事:搜索过什么、为什么跳过、哪一版材料真正被提交、流程是否触及停止条件,都不再只存在于记忆里。即使最终没有匹配结果,也可以区分究竟是流程遗漏了机会,还是在给定约束和时间窗口里,可用的市场本来就很小。

不过,系统也会反过来塑造它所观察到的世界。关键词决定哪些职位会被发现,hard exclusion 的写法决定哪些机会会提前退出,历史去重在候选人能力发生变化后也可能阻止旧职位被重新评估。换句话说,自动化不是中性的放大器:如果搜索 ontology 或判断规则有偏差,它只会更稳定地重复这种偏差。

因此 JobSeek 保留了人工复核、可解释 reason 和批次级 snapshot,也把规则视为可以更新的版本,而不是永久正确的政策。后来发现某个判断过于保守,可以修改未来批次;但不应该为了让历史看起来一致,回头改写当时实际采用的事实和结论。

我把模版也整理了

完整工作目录包含个人资料、历史记录和申请材料,不适合直接公开;真正可以复用的是它的结构与安全边界。因此我另外维护了开源的 jobseek-template:里面保留目录骨架、控制器、测试、代理分工和从初始化到完成批次的说明,但不会包含我的个人数据或具体申请记录。

它并不是一个「clone 下来就能自动找到工作」的产品。使用者仍然需要维护自己的事实来源、搜索标准和人工判断;如果只是偶尔投两三个职位,一张表格可能更轻便。但如果需要长期处理多个来源、反复定制材料,又希望每一步可验证、可追踪、可以安全停止,那么把这些摩擦外化成系统,才开始有意义。

最后,这套系统没有把求职变成一个确定性问题———市场不会因为工作流更漂亮就多出一个合适的机会。它真正减少的是另一种消耗:在结果不可控时,仍然可以知道哪些部分已经认真做过,哪些判断有证据,以及下一次应该修改流程,还是接受现实边界。