跳转到内容

岗位拆解

把一条 JD 拆成结构化的“这个岗位要什么”:工作内容、技术栈(按类别)、经验要求、项目 / 成果、软技能、语言、其他。每一项标明“必须”还是“加分”,并附 JD 原文引用,点“原文”就能跳到 JD 里核对。画像里有技能时,再给一个“你已具备 / 待补强”的对照,方便查看匹配和自我补强。

拆解每次要调用一次 AI(花订阅额度和 1–3 分钟),所以:

  • data/config/breakdown.yaml 里 enabled: false、mode: manual。
  • 打开后默认只在你点按钮时分析(手动)。自动模式要你自己切换,而且只处理高分岗位、每轮有上限。
  • 成本看 /sources 的“AI 用量”卡片里“拆解”一行:每次拆解 = 1 次调用。

设置页 → “拆解”标签:

项 对应键 说明
启用岗位拆解 enabled 关闭时详情页没有拆解按钮、也不自动拆解;已有结果仍显示(只读)
方式 mode manual:只在详情页点按钮;auto:每轮处理的最后,给高分岗位自动拆解
最低排序值 / 每轮最多几条 auto.min_rank / auto.per_cycle_limit 只在 auto 时生效;按排序值从高到低,没拆完的下一轮继续
发给 AI 的 JD 最长字符数 jd_max_chars 更长的只保留开头和结尾
一次拆解最多等多久 timeout_seconds 超时换下一个服务商

jd_head_share(截断时开头占的比例)不在表单里,直接改 YAML。保存后约 5 秒 runner / ai-worker 热加载;网页每次打开详情页时重读这个文件。

沿用 ai.yaml 的任务覆盖:任务名 breakdown。不写就按全局顺序(默认 codex-cli 优先)。设置页“AI”标签的“任务覆盖”里多一行“拆解”,codex 的“推理强度:拆解”也在那里。拆解的输出比较长(约 2–4k token),API 服务商的 max_output_tokens: 4096 对超长 JD 可能不够(输出被截断就换下一个服务商),所以建议把订阅 CLI 排在前面;需要时加 tasks.breakdown: {order: [codex-cli, claude-cli, api]}。

升级顺序:ai.yaml 里的 tasks.breakdown 和 reasoning_effort_by_task.breakdown 只能在部署了支持岗位拆解的代码之后再写(旧版本的 schema 是 strict 的)。breakdown.yaml 是新文件,旧版本不读,提前放上是安全的。

位置:详情页主栏,“匹配理由 / 差距”和“JD”之间。状态:

状态 什么时候 怎么办
未开启 enabled: false 且这个岗位没有结果 点“去设置打开”
配置读不了 breakdown.yaml 不合法 运行 pnpm config:check
没有 JD 正文 来源没给描述 无法拆解
可以拆解 开启、有 JD、还没结果 点“拆解这个岗位”
排队中 / 拆解中 请求在队列里 / ai-worker 在处理 等;超过 10 分钟没响应会提示去来源页看 ai-worker 是否在线
失败 见下表 看原因,点“重试”
已拆解 有当前版本的结果 点标签 / “原文”跳到 JD 原文
已过期 JD 在拆解后改过,或用旧版提示词拆解 结果照常显示,顶部有徽标;点“重新拆解”
旧版本 存的格式认不出来 点“重新拆解”
AI 没找到内容 拆解成功但所有类别为空 可重新拆解

关闭开关后,已有结果的岗位仍显示结果,只是没有“重新拆解”按钮。

失败原因:no_verified_quotes(AI 给的引用都对不上 JD 原文,没保存,重试即可);aborted(ai-worker 重启了);auth / timeout / rate_limited / invalid_output / provider_error / network / budget / unavailable / failed(AI 失败的原因,同翻译);disabled(排队后又关掉了)。

一直“排队中”几乎都是 ai-worker 没在运行:看 /sources 的 ai-worker 卡片,启动后请求会被领走。

提示词要求每一项都从 JD 里原样摘一句话(quote)。代码把每条引用拿到完整 JD 里找(容忍换行变空格):找到就保存 JD 自己的文字和位置;找不到就丢掉这一项并计数(元信息行显示“丢弃 N 项”)。经验年限的引用对不上时,年限也一起清空。技术栈按规范名去重(“LLMs” 和 “LLM” 算同一个),必须项优先。JD 里没写的不会被推测,空的类别不显示。

引用在 JD 原文里用虚点下划线标出;和信号引用是同一段文字时按信号的颜色显示,拆解项会跳到那个信号标记。

只在本地算,不把画像发给 AI:用 data/profile/me.yaml 的 skills,按技能名归一后对照,pipeline.yaml: skills[].aliases 里的别名也认(画像写 k8s,JD 写 Kubernetes 算已具备)。显示:每个技术标签是“已具备 / 缺”;必须项和加分项各自的命中数;“待补强”清单(必须项在前);JD 写了最低年限时和 me.yaml: years_experience 对比。画像没有技能时,这一块提示去“我的画像”填写。

每一行带 prompt_version(现在是 breakdown-v1)。以后提示词或输出结构改了就升版本:旧结果仍能显示(旧版本保留自己的 schema)并标“用旧版提示词拆解”,也可以手动重新拆解;格式认不出来的显示为“旧版本”。自动模式只补“没有结果 / JD 改过”的岗位,不会因为版本升级而全部重跑(省 token)。

  • 结果只存在 job_breakdowns(每个岗位一行,重新拆解直接覆盖),不回写 jobs 的任何字段,不参与打分、排序、推送、筛选。
  • 请求 breakdown_job 只由宿主机 ai-worker 领取;网页只写请求、轮询结果。
  • 刷新页面、重新打开或在第二个标签页打开同一岗位时,卡片从服务器上该岗位最新的 breakdown_job 请求恢复状态:排队中 / 拆解中继续轮询;最近一次失败(且晚于已存结果)显示原因和重试。翻译标签对未完成的 translate_job 请求同样处理。
  • 结果里的模型名是真实模型名:codex 没指定模型时写模型目录(models.yaml)里的 cli_default 模型,卡片上标“CLI 默认”;旧记录里的 codex-default 显示时同样解析。
  • 失败详情只含服务商名和错误类型,不含 JD 文本和密钥。

本页同步自产品库 Joevonlong/job-radar@2947f47 的 docs/。Job Radar 与任何招聘网站均无关联。代码采用 AGPL-3.0-only 许可。