卢天成
← 返回主页

私有产品 · 脱敏案例 · 每日真实运行

职位机会筛选与人工决策 Agent

机器负责筛选与举证,人负责决策——本地优先的职位机会评估系统,真实动作永不自动发生。

角色
独立开发 · 单人
周期
2026.06 – 2026.07
状态
常驻服务 · 每日真实运行
形态
本地优先 · 零云依赖

背景问题

求职场景有个两难的中间地带:纯人工——每天刷几十上百个岗位,靠人眼逐条判断「适不适合我」,重复、主观、漏机会;全自动海投——误投、夸大话术、重复触达,坏的是自己的职业声誉,且触碰平台规则红线。

正确的产品形态是中间态:机器做信息采集、标准化、初筛、举证和缺口解释;人做最终决策。任何对外真实动作(联系、投递)默认关闭,需要显式授权,且留有完整审计。

系统边界


来源适配器 → 标准化 + 内容哈希去重 → 候选人画像 → 规则 + 本地 LLM 混合分析 → 人工审阅工作台 →(十条件安全闸)→ 首次接触队列
组件职责
来源适配器 定时扫描 + 详情补全;空 JD 不分析;风控信号熔断停抓
标准化与去重 job_uid = 来源 + sha256(源|URL|标题|公司)[:16],采集与服务双端同算法
候选人画像 结构化技能 / 经历事实库,分析必须对照真实画像,不允许只看 JD 凭空判断
混合分析器 规则层(硬性要求提取、缺口判定、阈值)+ 本地 LLM(证据、风险、话术);模型失败自动规则兜底
人工审阅工作台 待审队列 / 原始 JD / 证据与决策三栏;删除 = 永久排除,跳过 = 软状态
安全闸 任何真实动作前的十条件串联校验
运维账本 system_events 统一事件流:批次、闸判定、跳过原因可追溯
  • 本地优先:本地 LLM(qwen3-14b 级开源模型)+ SQLite + 本机常驻服务,核心链路零云依赖。

关键决策

  1. 1

    analysis-only 是默认模式,真实动作需多重显式授权

    十条件串联闸门:主开关 → 分析决策白名单 → 分数过阈值(策略 / 要求 / 偏好三者最严)→ 无 unsupported claims → 薪资达标 → 通勤可接受 → 硬性要求缺口为 0 → 无阻断标签(一票否决)→ 未超每日上限 → 双端幂等 → 未在沟通中。任一不满足即跳过,跳过原因全部落审计。

  2. 2

    诚实护栏是配置,不是口头承诺

    forbidden_claims 逐条定义「不能说的话 + 纠正口径」(如不得自称「算法工程师」、不得虚构未做过的项目类型),分析输出存在 unsupported claims 即阻断并提示人工修改。

  3. 3

    隐私不出机

    手机号、邮箱、完整简历、精确住址列入 never_send_to_external_api;默认本地模型使隐私约束在架构层面成立,而非依赖自律。

  4. 4

    硬性要求提取是确定性规则层

    从 JD 文本提取要求小节(识别标题变体、截断「加分项 / 优先考虑」)、按能力组分类(缺口 / 匹配 / 未知三态)、弱证据不判匹配、证据最多留 2 条。规则层可 100% 确定性测试,不随模型版本漂移。

  5. 5

    永久排除与软跳过语义分离

    手动删除 = 永久排除(写入排除表,下次不再入库);跳过 = 软状态(不阻止再分析)。避免「删了又回来」与误删后永远失联两种极端。

  6. 6

    统一运维事件账本

    批次摘要、闸判定、跳过原因、通知尝试全部写 system_events,工作台「运行日志」直接可查——一个人运维的系统,可观测性就是生命线。

  7. 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 模式与全合成数据。