金三银四 0 offer?可能不是你不优秀,而是简历没替你说话。
这篇文章会手把手带你实现一个基于 Agent 架构的简历优化助手——粘贴 JD 链接,对话式生成匹配岗位的简历,还能记住你的每一次偏好。
🧭 思维导图速览
mindmap
root((ResumeHarness))
为什么要做
ATS 6秒筛选
一份简历走天下失效
岗位关闭快
逐岗位定制太慢
核心功能
JD链接自动抓取
关键词精准匹配
对话式生成
多模板输出
专属记忆系统
多渠道接入
简历渲染下载
技术架构
接入层 Web/飞书/微信
Agent服务 FastAPI
共享单例层
每会话隔离层
存储 文件→SQLite
从OpenHarness重构
学习架构思想
裁剪43+本地工具
重构核心模块
新增领域能力
路线图
P0 Agent核心
P1 Web服务
P2 多用户
P3 IM渠道
P4 增强版
一、为什么要做这个项目?
你可能也经历过这些“简历之痛”
- 能力明明匹配,投出去的简历却石沉大海 —— ATS 系统扫 6 秒就决定命运,关键词没命中直接淘汰。
- 一篇简历走天下?投前端要突出 React,投后端要强调架构,投管理岗要写带团队。同一份简历投所有岗位 = 海投。
- 等你花两小时改完简历,那个心仪岗位已经收到 500 份投递关闭了。好岗位稍纵即逝,求职是快鱼吃慢鱼。
💡 如果有一个人,能读懂你的经历,还能针对每个 JD 精准优化简历呢?
这就是 ResumeHarness 的起点 —— 一个基于 Agent 架构的简历智能体。你只需要粘贴 JD 链接,剩下的交给它。
二、我要做什么
核心定位
ResumeHarness 基于 OpenHarness v0.1.6 裁剪重构,而非直接使用。核心理念:
“The model is the agent. The code is the harness.”
—— 模型提供智能,Harness 提供手、眼、记忆和安全边界。
OpenHarness 是一个通用的 Agent 基础设施框架,拥有 43+ 内置工具、12 种消息渠道、54 条命令……能力很强,但对简历场景来说太重了。我的做法是:
- 学习其架构思想:Agent Loop、记忆系统、技能系统、Hook 机制、渠道适配
- 裁剪不需要的部分:Bash/File/LSP/Sandbox 等 43+ 本地工具、Swarm 多 Agent、Voice、Vim……简历场景用不到
- 重构核心模块:将需要的引擎、客户端、记忆、技能等模块按简历场景重新实现
- 新增领域能力:简历渲染、JD 抓取、记忆自动提取、微信适配等
🚀 不重复造轮子,也不照搬照抄,而是站在巨人的肩膀上做垂直场景的重构。
技术约束(MVP 务实版)
| 约束 | 选型 | 原因 |
|---|---|---|
| 部署环境 | 轻量云服务器 2C4G | 成本可控,个人也能跑 |
| 大模型 | DeepSeek API(多 Key 轮询) | 性价比高,64K 上下文 |
| 目标并发 | 10 用户同时在线 | MVP 先跑通 |
| 前端 | React SPA | 现代化交互体验 |
三、能实现什么功能
1. 智能简历优化 —— 对话即生成
不再是填表式模板,而是自然语言对话驱动:
你:帮我优化简历,投递这个前端岗位 https://job.example.com/position/123
Agent:我来帮你分析 JD 并优化简历... [自动抓取 JD]
根据岗位需求,我调整了以下内容:
1. 将 React 项目经验提到最前
2. 补充了 TypeScript 和 Webpack 关键词
3. 用 STAR 法则重写了项目成果描述
关键能力:
- JD 链接自动抓取:粘贴招聘链接,
web_fetch工具自动解析岗位需求 - 关键词精准匹配:基于
resume-skill.md领域知识(ATS 友好、STAR 法则、行业关键词) - 多模板输出:商务风 / 学术风 / 创意风,一键切换
2. 越用越好用 —— 专属记忆系统
这是 ResumeHarness 最亮眼的设计。每个用户拥有独立的记忆空间:
| 记忆文件 | 内容 | 更新方式 |
|---|---|---|
| 简历原文.md | 原始简历 | 上传 API |
| 职业偏好.md | 写作风格/偏好 | LLM 自动写入 / 手动编辑 |
| 技能标签.md | 技能和经验年限 | LLM 自动写入 / 手动编辑 |
| 优化历史.md | 历次优化要点 | LLM 自动追加 |
记忆自动提取:LLM 在对话中主动调用 memory_write 工具,将你表达的偏好、技能标签持久化,下次对话自动注入提示词。
💡 第 1 次使用 → 上传简历原文 → 存入记忆
第 2 次使用 → Agent 记住你的偏好:“不要用 STAR 法则” → 自动调整
第 3 次使用 → 无需重复说明,直接按你的风格生成
3. 多渠道接入 —— 不只是 Web
- Web 端:React SPA,流式对话 + 简历预览/下载
- 飞书:在工作群里 @机器人,直接生成简历
- 微信/企微:消息即服务,超长简历自动分段 + Web 下载链接
4. 简历渲染与下载
- Markdown → PDF / HTML / Markdown 多格式导出
- 渲染队列防 OOM(单线程渲染,60s 超时保护)
- 简历快照持久化,会话淘汰后仍可下载
- 每用户最多保留 20 份历史版本
四、项目架构
架构总览(Mermaid 版)
┌─────────────────────────────────────────────────────────────┐
│ 接入层 │
│ Web UI (SPA) │ 飞书频道 │ 微信/企微 │ 其他 IM 渠道 │
└────────┬────────────┬─────────────┬────────────────────────┘
│ SSE / JSON │ MessageBus │ ChannelAdapter
┌────────▼────────────▼─────────────▼────────────────────────┐
│ Resume Agent Service │
│ (FastAPI + uvicorn) │
│ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ 共享单例层 (进程级) │ │
│ │ API Client Pool(多Key) │ McpClientMgr │ ToolRegistry │ │
│ │ HookExecutor │ SkillLoader │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ 每会话独立层 (用户级) │ │
│ │ QueryEngine │ Messages │ User Memory │ Settings │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Web API 层 │ │
│ │ POST /api/chat 流式对话 (SSE) │ │
│ │ /api/resume/* 简历生成与下载 │ │
│ │ /api/memory/* 用户记忆管理 │ │
│ │ /api/settings/* 用户配置 │ │
│ └──────────────────────────────────────────────────────┘ │
└────────────────────────┬────────────────────────────────────┘
│
┌────▼────┐
│ DeepSeek│
│ API │
│ (多Key) │
└─────────┘
从 OpenHarness 重构了什么?
| 模块 | 重构方式 | 说明 |
|---|---|---|
| Agent Loop | 重构实现 | QueryEngine + query.py + stream_events |
| API 客户端 | 重构实现 | DeepSeek 走 OpenAI 兼容协议 |
| 记忆系统 | 改造重构 | 按 user_id 隔离,新增 memory_write 工具 |
| 技能系统 | 重构实现 | 新增 resume-skill.md 领域知识 |
| 钩子系统 | 精简重构 | 简历生成后格式校验等 |
| 上下文压缩 | 重构实现 | 长会话自动压缩 |
| 消息渠道 | 重构实现 | 飞书适配器 + 新增微信适配器 |
| ohmo/gateway | 部分重构 | MessageBus + GatewayBridge 基类 |
不引入:43+ 本地工具、Sandbox、Swarm 多 Agent、Voice、Vim 等 —— 简历场景不需要。
新增模块(简历领域专属)
| 模块 | 职责 |
|---|---|
resume_renderer.py | Markdown → PDF/HTML 转换(渲染队列) |
session_pool.py | 多租户会话池(LRU 淘汰) |
api_key_pool.py | DeepSeek 多 API Key 令牌桶轮询 |
web_fetch.py | JD 链接自动抓取工具 |
memory_write.py | LLM 主动记忆写入工具 |
wechat_adapter.py | 微信/企微渠道适配器 |
技术栈速览
| 层次 | 技术 |
|---|---|
| Agent 框架 | OpenHarness 架构思想(裁剪重构) |
| LLM | DeepSeek API(多 Key 轮询,64K 上下文) |
| Web 后端 | FastAPI + uvicorn |
| Web 前端 | React SPA |
| PDF 生成 | fpdf2(纯 Python,中文友好) |
| IM 渠道 | lark-oapi / httpx |
| MCP | mcp SDK(HTTP only) |
| 数据存储 | 文件存储 → SQLite(P2 迁移) |
| 部署 | systemd / Docker(单机 2C4G) |
五、实现路线图(从零到一,5 个阶段)
我会持续更新进度,欢迎关注仓库。
P0:Agent 核心可用版
心脏跳动——Agent Loop 跑通,DeepSeek 对接成功,记忆写入生效
- 精简版 RuntimeBundle 构建
- DeepSeek API 接入(多 Key 令牌桶轮询)
- Agent Loop 完整实现(LLM → 工具 → 反馈 → 继续)
- 简历领域 Skill(ATS 友好 / STAR 法则 / 关键词)
- 用户记忆系统(memory_write 工具自动提取偏好)
- SSE 流式对话端点 + 极简验证页面
P1:Web 服务可用版
从能用变好用——简历可以下载,JD 可以抓取,记忆越用越懂你
- 简历渲染与下载(PDF/HTML/Markdown,多模板)
- 记忆管理 API(CRUD + 简历上传)
- 用户级配置(模板偏好 / 语言风格)
web_fetch工具(JD 链接自动抓取)- 工具与系统查询 API
P2:多用户版
从个人工具变产品——10 人并发,认证隔离,React 前端上线
- JWT 认证体系
- 多租户数据隔离
- SQLite 数据存储迁移
- React SPA 正式前端(登录/对话/简历预览/记忆管理)
P3:IM 渠道版
简历助手无处不在——飞书/微信也能用
- 飞书渠道接入
- 微信/企微渠道接入
- 渠道统一消息路由
P4:增强版
更强更稳更专业——MCP 工具扩展 + 高质量 PDF + 领域 Skill 精调
- MCP 工具接入(邮件发送、PDF 转换等)
- 多套简历 CSS 模板 + 中文 PDF 优化
- 行业细分 Skill(Tech / Finance / Creative)
- API 速率限制 + 监控
六、为什么值得关注?
1. 实战 Agent 架构的最佳学习材料
不是 Demo,不是 Hello World,是一个完整可运行的 Agent 产品。从 RuntimeBundle、Agent Loop、工具调用、记忆系统到多渠道接入,每一步都有代码。
2. OpenHarness 架构重构的实战案例
OpenHarness 有 43+ 内置工具、12 种消息渠道、54 条命令……对垂直场景太重。ResumeHarness 展示了如何学习架构、裁剪冗余、重构实现——这是从通用框架到垂直产品的完整实践。
3. 从零到一的完整迭代记录
P0 → P1 → P2 → P3 → P4,每个阶段的代码变更、设计决策、踩坑记录都会完整公开。
4. 可复用的 Agent 架构模式
- 共享单例 + 每会话隔离:API Client 进程级复用,QueryEngine 每会话独立
- LRU 会话池:2C4G 服务器支撑 10 并发的秘密
- 记忆自动提取:LLM 主动调用
memory_write,实现“越用越好用” - 多 Key 令牌桶轮询:DeepSeek API 429 的优雅应对
七、后续愿景
| 方向 | 内容 |
|---|---|
| 简历评分 | 对生成简历与 JD 的匹配度自动评分 |
| 简历对比视图 | 原文 vs 优化版并排展示差异 |
| 多轮优化 | 支持对话中逐步修改简历细节 |
| 批量投递 | 一次生成多份不同岗位的简历 |
| 多语言简历 | 中英双语简历一键生成 |
| 招聘网站 MCP | 自动抓取招聘网站 JD 描述 |
📌 写在最后
金三银四不裸奔,简历先行找工作。如果你也遇到过简历的坑,或者对 Agent 架构感兴趣,欢迎一起交流!
相关链接
⭐ Star 一下,陪我一起从零到一!
交流讨论
扫码加入 Resume Harness 技术交流群,一起聊聊 Agent 架构和简历优化那些事。
🤔 互动问题:你在求职过程中遇到过“简历没问题,但就是没面试”的情况吗?你觉得 AI 能在多大程度上解决这个问题?欢迎在评论区聊聊你的经历和看法!