返回项目分享

Job-Agent:一条能跑完的求职链路,而不只是一个聊天框

Spring Boot 多模块 + Vue3 双前端的求职 Agent 系统,覆盖简历解析、岗位匹配、投递跟进、AI 模拟面试与复盘;重点是 Agent 的分层工程化:Planner、工具 Schema、Guardrails、记忆、Trace 和 Eval。

维护中

想解决的问题

上一个项目(Gym-Agent)里我踩到的最大坑是:Agent 的行为只能靠手点去试,改一版提示词完全不知道是变好还是变坏。 所以 Job-Agent 我从一开始就不是「做一个会聊天的求职助手」,而是想把 简历准备 → 岗位发现 → 匹配分析 → 投递跟进 → HR 沟通 → 模拟面试 → 复盘提升 → 行动确认 这条完整链路跑通,并且让每一层都可观测、可评测。

用户端:一条真实的求职流程

  • 简历上传后走解析与评分:文件用 Apache Tika / POI / PDFBox 抽取,MinIO 存原文件,预览和「设为默认简历」都有;
  • 岗位列表、详情、收藏、推荐、搜索,简历与岗位做匹配分析,输出匹配分、优势、风险点和优化建议;
  • 投递记录带状态流转和跟进提醒,HR 沟通记录支持回复识别与跟进动作;
  • Agent Inbox 把跟进、面试、日报、提醒这些模块产生的待处理事项汇到一个地方;
  • 行动确认中心:AI 生成的可执行建议先进这里,由用户点确认才执行。 这条规则和上一个项目一样——模型可以提议,但不可以替用户做决定。

AI 模拟面试:链路最长的一条

选岗位和简历创建面试 → 从题库/RAG 知识库抽题(去重、难度配比、知识点关联、用户错题优先)→ 用户开摄像头和麦克风用语音作答 → 接火山引擎/豆包 ASR 转文本 → 大模型拿参考答案 + RAG 知识 + 用户回答做相似度判断与评分 → 生成总体评分、逐题复盘、 薄弱知识点、优化建议和学习计划 → 错题自动沉入错题本,并反过来影响下一轮抽题策略。

这条链路上最难的不是模型调用,是失败怎么收场:ASR 挂了、复盘 JSON 解析不出来、 总结生成超时,每一种都有标准错误码和兜底路径,不会让面试卡在中间状态。

Agent 的分层工程化

这是我认为这个项目里最值得写的部分:

层做什么
Planner把用户目标拆成计划、步骤、工具选择和完成条件
Executor按计划执行工具调用,记录步骤状态与输入输出
Tool Schema统一工具的名称、入参、出参、错误码、权限、副作用、是否需要用户确认
GuardrailsPrompt 注入、工具越权、敏感操作拦截、PII 脱敏、JSON 输出校验
Long-term Memory沉淀偏好、简历摘要、面试反馈、历史决策;带冲突检测与版本历史
Model Gateway模型配置、API Key、路由、超时、重试、熔断、成本统计统一收口
Prompt 管理模板、版本、场景编码、灰度,业务方在页面上就能改
Trace主链路 + 工具链路 + 模型调用,耗时、token、费用、失败原因
Eval评测用例与批量回归,看工具选择准确率、参数准确率、RAG 命中率、JSON 与回答质量

RAG 侧做了文档与 chunk 两级入库、增量索引、删除同步、权限过滤、引用展示, 以及混合检索 + 重排序的第一版;召回质量本身也可以评测—— 知识库最容易出现的问题不是「没实现」,而是「看着能用,其实什么都没命中」。

工作流与连接器

不适合在请求线程里同步做的事交给异步工作流:任务创建、状态机流转、失败重试与恢复、进度记录、定时调度, 比如面试准备任务创建后给用户发提醒邮件;Admin 端能看到任务列表、失败原因和处理状态。 外部连接器(招聘平台、邮箱、日历、通知渠道、简历导出)单独放在 Job-Agent-Mcp-Tools 里, 目前是预留接口,还没有真实对接。

哪里还不够

  • 连接器的真实对接没做完,「自动同步岗位」还只是设计;
  • Eval 用例覆盖的是核心链路,长尾场景没有;
  • 项目进入现在这个阶段,我更该做的是少加功能、多提质量,把回归跑稳。

技术栈

后端 Java 17 / Spring Boot 3.5.x / MyBatis-Plus / MySQL / Redis / Sa-Token / MinIO / LangChain4j / SpringDoc,前端 Vue 3 + TypeScript + Vite + Pinia + Element Plus(地图用高德 JS API), 模型侧统一走 OpenAI 兼容接口,语音用火山引擎 ASR。

对这个项目有问题或建议?讨论留在仓库里更容易被看到,欢迎 到仓库提 Issue