这次更新把我原来的简历优化平台整理成了一个求职 Agent 应用:围绕简历版本、目标 JD、公司资料和投递记录,建立连续的操作流程。
项目名是 Resume Fit AI,使用 Java 21、Spring Boot 3、Spring AI 和 DeepSeek。本文记录目前已经实现的功能、工具注册方式,以及多轮调用中处理异常时的一些取舍。
1. 业务流程
页面按以下顺序组织:
text
简历与版本
↓
简历分析
↓
找岗位与对比
↓
了解公司
↓
投递跟进
用户保存简历后,可以选择版本分析表达和完整性,再粘贴完整岗位 JD 做对比。修改后的内容可以另存版本、查看文本差异并导出纯文字 PDF。公司资料保留来源,投递进度由用户手动维护。
这样的流程让一次分析结果能接上后续操作,而不只是留在一段聊天回复中。
2. 代码按职责拆开
当前分成三部分:
| 层次 | 主要职责 |
|---|---|
| AI 层 | 模型适配、消息、工具定义与模型返回值 |
| Agent 层 | 多轮循环、工具目录与执行、预算和停止条件 |
| 求职应用层 | 简历版本、岗位、公司资料、投递业务和报告校验 |
通用 AgentLoop 不读取业务数据库,不判断某个简历报告应该有哪些字段。应用层负责准备任务上下文,并提供本次任务允许调用的工具。
3. 工具目录和执行器分工
ToolCatalog 使用工具名到 ToolSpec 的映射。注册时拒绝同名工具,运行前冻结目录;模型可见的是登记好的工具定义,实际执行由 ToolExecutor 处理。
它是进程内的工具目录,不需要额外部署一个注册服务。
一次调用需要经过这些步骤:
text
模型返回工具名、参数、调用 ID
↓
确认工具在白名单中
↓
校验参数
↓
执行对应处理逻辑
↓
校验并限制工具输出
↓
以原调用 ID 回传结果
工具名只是选择能力的入口,不能因为模型给出一个字符串,就允许它调用后端任意方法。工具目录也不能替代业务权限校验,例如选定的简历版本仍需验证归属。
4. Agent 多轮运行
整体过程是"请求模型 → 执行工具 → 回传结果 → 再请求模型",直到输出最终结果或触发停止条件。
项目为循环设置了轮数、工具调用次数、总超时、单次调用超时和 Token 预算。模型不再请求工具时,最终内容还要经过应用层的结果校验;格式或内容不符合约定,不能直接标记成功。
原始调用 ID 会保留,用来把工具结果对应回模型的那次请求,不能只回传一个工具名。
5. 重试与取消的边界
重试需要知道失败发生在哪一步。
当前只对符合策略、且尚未执行工具的临时模型错误进行一次有限重试;重试仍消耗本次任务的预算。参数错误、未知工具或最终输出无效,都不能简单靠无限重试解决。
如果任务已经执行了有副作用的操作,盲目重放还可能重复写入。因此"失败就把整段流程再跑一遍"不能作为通用策略。
前端和服务端也处理了取消、超时以及迟到结果,避免切换简历版本后,上一次任务的结果覆盖当前内容。
6. 招聘平台搜索的实际状态
目前线上提供 BOSS 直聘、智联招聘和 51job 搜索入口。用户确认条件后去平台查找,再把核实过的完整 JD 粘贴回应用,继续收藏和分析。
Tavily / SearXNG 的搜索适配已预留,但服务器还没有配置搜索来源,因此自动搜索并返回真实职位列表尚未启用。
搜索摘要与完整 JD 是两种输入,不能直接混用。关键词覆盖可以提供核对线索,不能宣传成综合匹配度或录用概率。当前也没有公司信誉评分、自动投递或自动联系招聘方的功能。
7. 验证与后续
本轮后端检查共 82 项:79 项通过,3 项真实模型测试按设计跳过。同时进行了本地浏览器流程和边界检查。真实模型并发、外部职位搜索效果仍需单独验证,不能用离线通过结果代替。
接下来会继续完善搜索来源接入和结果核实流程,并结合实际反馈调整页面操作。
线上体验:
https://jianli.wanbinxy.icu/job-assistant.html
欢迎反馈功能问题,也欢迎交流工具注册、多轮调用和异常处理方面的实现思路。