私有产品 · 脱敏案例 · 每日真实运行
职位机会筛选与人工决策 Agent
机器负责筛选与举证,人负责决策——本地优先的职位机会评估系统,真实动作永不自动发生。
- 角色
- 独立开发 · 单人
- 周期
- 2026.06 – 2026.07
- 状态
- 常驻服务 · 每日真实运行
- 形态
- 本地优先 · 零云依赖
背景问题
求职场景有个两难的中间地带:纯人工——每天刷几十上百个岗位,靠人眼逐条判断「适不适合我」,重复、主观、漏机会;全自动海投——误投、夸大话术、重复触达,坏的是自己的职业声誉,且触碰平台规则红线。
正确的产品形态是中间态:机器做信息采集、标准化、初筛、举证和缺口解释;人做最终决策。任何对外真实动作(联系、投递)默认关闭,需要显式授权,且留有完整审计。
系统边界
来源适配器 → 标准化 + 内容哈希去重 → 候选人画像 → 规则 + 本地 LLM 混合分析 → 人工审阅工作台 →(十条件安全闸)→ 首次接触队列
| 组件 | 职责 |
|---|---|
| 来源适配器 | 定时扫描 + 详情补全;空 JD 不分析;风控信号熔断停抓 |
| 标准化与去重 | job_uid = 来源 + sha256(源|URL|标题|公司)[:16],采集与服务双端同算法 |
| 候选人画像 | 结构化技能 / 经历事实库,分析必须对照真实画像,不允许只看 JD 凭空判断 |
| 混合分析器 | 规则层(硬性要求提取、缺口判定、阈值)+ 本地 LLM(证据、风险、话术);模型失败自动规则兜底 |
| 人工审阅工作台 | 待审队列 / 原始 JD / 证据与决策三栏;删除 = 永久排除,跳过 = 软状态 |
| 安全闸 | 任何真实动作前的十条件串联校验 |
| 运维账本 | system_events 统一事件流:批次、闸判定、跳过原因可追溯 |
- 本地优先:本地 LLM(qwen3-14b 级开源模型)+ SQLite + 本机常驻服务,核心链路零云依赖。
关键决策
- 1
analysis-only 是默认模式,真实动作需多重显式授权
十条件串联闸门:主开关 → 分析决策白名单 → 分数过阈值(策略 / 要求 / 偏好三者最严)→ 无 unsupported claims → 薪资达标 → 通勤可接受 → 硬性要求缺口为 0 → 无阻断标签(一票否决)→ 未超每日上限 → 双端幂等 → 未在沟通中。任一不满足即跳过,跳过原因全部落审计。
- 2
诚实护栏是配置,不是口头承诺
forbidden_claims 逐条定义「不能说的话 + 纠正口径」(如不得自称「算法工程师」、不得虚构未做过的项目类型),分析输出存在 unsupported claims 即阻断并提示人工修改。
- 3
隐私不出机
手机号、邮箱、完整简历、精确住址列入 never_send_to_external_api;默认本地模型使隐私约束在架构层面成立,而非依赖自律。
- 4
硬性要求提取是确定性规则层
从 JD 文本提取要求小节(识别标题变体、截断「加分项 / 优先考虑」)、按能力组分类(缺口 / 匹配 / 未知三态)、弱证据不判匹配、证据最多留 2 条。规则层可 100% 确定性测试,不随模型版本漂移。
- 5
永久排除与软跳过语义分离
手动删除 = 永久排除(写入排除表,下次不再入库);跳过 = 软状态(不阻止再分析)。避免「删了又回来」与误删后永远失联两种极端。
- 6
统一运维事件账本
批次摘要、闸判定、跳过原因、通知尝试全部写 system_events,工作台「运行日志」直接可查——一个人运维的系统,可观测性就是生命线。
- 7
产品边界用「三问」守住
每个新功能先问——是否改善「刷岗位 → 判断 → 确认」主链路?是否让系统更容易说假话 / 误判 / 误投?是主链路还是旁路?答不上第一条就不做。明确不做:海投、代聊跟进、通用求职 SaaS。
查看脱敏架构图(Mermaid 源码) ›
架构图使用通用角色标注,无平台名称、接口细节与真实数据。
%% 职位机会筛选与人工决策 Agent · 脱敏架构图(公开版)
%% 不含平台名、接口细节、登录态机制、真实数据
flowchart TB
User([本人 · 决策者])
subgraph Local["本地环境(本地优先 · 零云依赖)"]
subgraph Adapter["来源适配器层"]
Scan["定时扫描器<br/>列表 + 详情补全<br/>空 JD 不分析 · 风控信号熔断"]
end
subgraph Core["核心服务 · FastAPI + SQLite"]
Norm["标准化 + 去重<br/>job_uid 内容哈希<br/>双端同算法"]
Profile["候选人画像库<br/>结构化事实 · 一等公民"]
Rules["规则层(确定性)<br/>硬性要求提取 · 三态判定<br/>弱证据不判匹配"]
LLM["本地 LLM 分析<br/>证据 / 风险 / 缺口 / 话术<br/>失败自动规则兜底"]
Guard["诚实与隐私护栏<br/>forbidden_claims 纠正口径<br/>隐私字段不出机"]
Gate["十条件安全闸<br/>阈值 · 诚实 · 硬性缺口 · 阻断标签<br/>日上限 · 双端幂等 · 已沟通"]
Events["system_events 统一账本<br/>批次 / 闸判定 / 跳过原因可追溯"]
end
subgraph UI["人工审阅工作台"]
Queue["待审队列 / 原始 JD / 证据与决策<br/>删除=永久排除 · 跳过=软状态"]
Logs["运行日志 / 排除列表 / 配置"]
end
end
Source["职位来源<br/>(当前实例:某主流招聘平台)"]
Model["本机 LLM 运行时<br/>开源模型 · 隐私不出机"]
Action["首次接触队列<br/>默认 analysis-only<br/>真实动作需显式授权"]
Source --> Adapter
Scan --> Norm
Norm --> Rules
Profile --> Rules
Profile --> LLM
Rules --> LLM
LLM --> Guard
Guard --> Queue
User --> Queue
Queue -->|"人工决策:入库 / 跳过 / 准备联系"| Gate
Gate -->|全部通过| Action
Gate -->|任一不满足:跳过并记录原因| Events
Scan --> Events
Model --> LLM
Events --> Logs
验证方式
- 安全闸单元测试 28 项全部通过:闸门十条件逐项单独阻断 + 全通过入队 + 主开关短路;硬性要求提取的分类 / 截断 / 弱证据测试;诚实护栏配置完整性测试(配置缺失即测试失败——防线失守必须显式可见);
- 合成评估集 20 条 100% 通过:全合成岗位样本,只测确定性规则层、不依赖 LLM,任何环境可复现;
- 每日真实运行:常驻服务 + 定时扫描 + 工作台审阅是日常在用的真实系统,非演示品;
- doctor / e2e 自检脚本覆盖服务健康与关键链路。
可公开结果
- 安全闸测试套件(28 用例)与合成评估集(20 条)随仓库维护,运行方式见项目 verification.md
脱敏边界
以下内容不公开,本案例全文与配图均已规避:
- 平台名称、平台私有接口与请求参数细节;
- 登录态维持机制、Cookie 处理、反风控与绕过限制的方法;
- 真实公司、真实岗位、真实联系人;
- 真实简历与候选人隐私数据;
- 任何批量联系脚本;演示仅使用 analysis-only 模式与全合成数据。