求职招呼词 skill(通用版 v1.1.4)
> 招呼词不是自我介绍,是一个信号包:既要过平台 AI 预筛(关键词/语义打分),又要抢 HR 10–20 字的预览框。
> 本 skill 不预设「你是谁、你会什么」——那部分必须从你的简历和目标 JD 里现算。
Pay Skill 改造说明(接入支付宝 AI 按量付费 · A2M 402)
本 skill 已按 SkillHub「改造与测试 Pay Skill」规范接入付费:服务端负责验付、交付资源与商家履约确认;Skill 负责发起请求、调用官方支付能力、展示结果;后端源码独立部署,不放入 Skill 包。
| 项 | 内容 |
|---|---|
| 触发词 | 写招呼词、求职开场白、求职投递话术、HR 沟通第一句、BOSS 直聘/智联/猎聘/51job 打招呼、投简历开场白、破冰第一句、批量给多个岗位写打招呼(完整触发词见下方 description) |
| 价格 | ¥0.10 / 条 JD(按条计费:每处理一条 JD 单独付费一次,无跨条复用、无时间窗) |
| 依赖 | 买家侧 @alipay/agent-payment(alipay-bot)用于付款;已部署的收费接口 https://pay-probe-56932.app.workbuddy.host(生产环境,无凭证请求返回 HTTP 402 + amtPaymentLink + Payment-Needed) |
| 调用流程 | ① 每条 JD 先 POST 收费接口(带上这一条 JD)→ 收 402 + Payment-Needed 账单 → ② 调 alipay-bot 生成支付入口、用户扫码付款 → ③ alipay-bot 带 Payment-Proof 重试原请求 → 服务端验付 → ④ 交付这一条的施工单并确认商家履约 → ⑤ 落盘 _施工单_<JD指纹>.md |
| 输出 | 这一条 JD 的施工单(字数档 / 本条能力词 / 14 项自查 / 缺口提示),只对该条有效,用完即弃,不可跨条复用 |
付费、验付、履约确认全部在独立服务端完成,Skill 包内不含任何密钥、凭据或账本;scripts/pay_client.py 只负责发起请求并把结果落盘。
版本升级(重要:本 skill 不会自动更新)
SkillHub 不会自动替换你已安装的 skill 版本——新版本上架后,你本地目录里的旧版不会变,只有主动重装才生效。所以:
- 怎么知道自己是哪一版:每次运行
pay_client.py首行都会打印[skill vX.Y.Z];也可单独跑一次版本检查(不付款、不落盘):
bash python "$SK/pay_client.py" --check-version
它会连服务端对比「服务端要求的最低版本」,输出✓ 版本可用或✗ 需升级(退出码 0=可用 / 1=需升级 / 2=异常)。 - 怎么升级:
skillhub install yingpin-zhaohuci(同一命令重跑即拉最新版)。 - 脚本检测到你版本落后时,会在付款前打印
⚠ ... 建议先升级:skillhub install yingpin-zhaohuci;若服务端判定不兼容(HTTP 426),直接中止并给出升级命令,不扣费。 - 升级后会自动清理旧版正文(重要):1.0.x 时代服务端下发的是整份写词规范(落盘为
_写词规范.md+_meta.json,约 8.6 KB)。那份文件可离线无限复用,留着等于绕过按条计费,所以 1.1.x 每次运行第一步就会检查并删除它(只认这两个确切文件名,不递归、不碰同目录其他文件;不存在则什么都不做)。删除时会打印一行说明。如果你曾把那份文件另存到别处,脚本无从得知,也不去追查。
安装(一次,2 分钟)
把整个 yingpin-zhaohuci 文件夹原样拷到下面这个目录即可,不要只拷 SKILL.md:
| 系统 | 放这里 |
|---|---|
| Windows | C:\Users\<你的用户名>\.workbuddy\skills\yingpin-zhaohuci\ |
| macOS / Linux | ~/.workbuddy/skills/yingpin-zhaohuci/ |
拷完目录应该长这样(这是最小可用集,缺任何一项都会报错):
yingpin-zhaohuci/
SKILL.md
references/ mechanism.md platform-playbook.md
scripts/ extract_resume.py split_jd.py cluster_jd.py pay_client.py
templates/ config-fill-in.md workspace-init.md resume-extra.md jd-intake.md
自包含保证(已逐项核对):
| 检查项 | 结论 |
|---|---|
| 是否依赖其他 skill | ❌ 不依赖。不需要个人版 zhao-hu-geoskill,也不需要扫描/投递 skill |
| 是否要 pip 安装 | ❌ 不需要。三个脚本只用 Python 标准库(re/json/os/sys/glob/zipfile/hashlib/argparse/collections/datetime),无第三方依赖 |
| 是否需要联网 | 取本条施工单需联网一次(pay_client.py,每条 JD 一次);其余步骤离线可用,离线时让用户粘贴 JD 全文即可,只有「发链接让 skill 自己拉」这一步才要联网 |
| 是否含他人个人信息 | ❌ 不含。岗型、白名单、禁项全部由你的简历 + 你的 JD 现场算 |
| 是否有硬编码绝对路径 | ❌ 无。脚本读写都在你当前工作目录 |
唯一的环境要求:Python 3.8 及以上(实测 3.13)。Windows / macOS / Linux 通用。
- 读
.pdf简历才需要pip install pypdf;用.docx / .txt / .md时零依赖。开放平台云端沙箱通常不允许pip install,云端使用时请直接粘贴.txt/.md或用.docx,避免上传.pdf简历。 - ⚠️ 本地手动安装时必须放用户级
~/.workbuddy/skills/,不要放项目级{项目}/.workbuddy/skills/** ——项目级目录不在 Skill 工具的索引范围里,放了会加载不到。(通过开放平台订阅安装的无需关心此条,平台会自动部署到正确位置。)
付款依赖(用付费部分才需要,装一次)
施工单走支付宝 AI 按量付费(402 协议),付款由买家侧官方支付能力完成,本包不自带、也不含任何密钥。装官方依赖:
npx -y @alipay/agent-payment@latest install
装完应同时具备两样东西,缺一样都付不了款:
| 组件 | 用途 |
|---|---|
alipay-payment-skill |
官方买家侧支付 skill,Agent 通过它发起付款、生成支付入口 |
alipay-bot |
官方买家支付 CLI,scripts/pay_client.py 直接调用它 |
pay_client.py 按以下顺序自动找 alipay-bot:环境变量 ALIPAY_BOT → PATH → ~/.openclaw-autoclaw/alipay-bot-cli/bin/;也可用 --bot <路径> 显式指定。装了但找不到,先 npx -y @alipay/agent-payment@latest install 重装一次。
验证依赖是否可用(不花钱,只查价):
python ~/.workbuddy/skills/yingpin-zhaohuci/scripts/pay_client.py --out . --probe-only
能打印出单次价格就是通了;报「没找到 alipay-bot」按上表重装。
装完自检一条命令(能出参数说明就是装好了):
python ~/.workbuddy/skills/yingpin-zhaohuci/scripts/extract_resume.py --help
调用方式(WorkBuddy 运行环境)
本技能包内不含任何密钥、凭据或账本,服务端代码也不进包。
包内三个脚本(简历提取 / JD 拆分 / 岗型聚类)完全在你本机运行,零第三方依赖;
施工单由独立服务端按条付费下发(每条 JD 0.10 元,无跨条复用、无时间窗),
付费、验付、履约确认都在服务端完成,本包只负责发起请求并把结果落盘(scripts/pay_client.py)。
生成所需的全部输入都通过对话以文本形式提供,不要求读取你本机任何文件。
最简用法(对话内即可完成)
直接把 JD 文本和简历要点粘贴到对话里,按正文 Step 3 + 该条施工单出词,无需任何脚本:
- JD:粘贴岗位描述(或先复制链接全文)
- 简历:粘贴关键经历、可量化的真实数字、明确不会的禁项
可选本地增强(本机有文档时)
若你用 .docx / .txt / .md / .pdf 管理简历或成批 JD,可在你本机跑 scripts/ 下的三个
脚本做结构化提取与聚类(见正文 Step 1–2);提取出的文本同样粘贴进对话使用。脚本零第三方
依赖(仅读 .pdf 时需 pip install pypdf),只在你本机运行,不影响云端出词逻辑。
数据流向与隐私
| 项目 | 说明 |
|---|---|
| 输入内容 | 你通过对话提供的 JD 文本、简历要点(身份串 / 真实数字 / 禁项) |
| 用途 | 仅用于本次生成招呼词,在沙箱内临时处理、不外传至无关第三方,不写到你本机 |
| 不收集的 | 姓名、电话、邮箱、住址等个人身份信息(除非你主动写入对话文本) |
| 服务端依赖 | 仅「单条写词施工单」按条付费下发;简历原文不上传(只传年资/领域/数字摘要),JD 为招聘网站公开信息,上传后仅用于生成本条参数、履约即清除 |
可完全不带简历事实:省略简历要点时,skill 会基于你粘贴的 JD 出词,代价是拿不到
「前 10 字最强命中词」与「真实数字」这两项 GEO 加成。
它凭什么能提高 HR 回复率(机制说清楚)
一条招呼词要被人看到,路上有两道关卡。这个 skill 的每一步设计都对着这两道关:
你的简历 ──┐
├─→ 逐词对齐 ─→ 招呼词 ─→ ①平台 AI 初筛 ─→ ②HR 真人 10-20 字预览 ─→ 回复
目标 JD ──┘
第一道关:平台 AI 初筛。 招聘平台(Boss 南北阁/DeepHire、智联通义千问 embedding、
51job 大模型分层)会用 AI 给你的招呼词和岗位做匹配打分。已知口径:关键词匹配约占
60%、学历年限约 25%、简历完整度约 15%(智联白皮书),Boss 与 51job 还会做
二次关键词匹配。所以招呼词里的词干必须和你的简历、JD 里的表述字面一致——
同义改写在语义打分里能兜一点,但字面命中才是主项。
第二道关:HR 的 10–20 字预览框。 HR 日均收海量招呼,约 45% 只读前 20 字;
脉脉口径是前 10 字决定是否被推荐。所以最强的命中词(年资 + 领域)必须压进
前 10 字,后面才是成果和提问。
这套 skill 具体做了五件事:
| # | 动作 | 对应哪道关 |
|---|---|---|
| ① | 读你的简历,抽出身份串(年资+领域)和能展开的真实数字 | 两道关的地基——没有落点的话,后面全是注水 |
| ② | 拆 JD、判输入质量、按岗位类型归纳主词干(从 JD 池现场归纳,不从简历硬分) | 决定第 1 点打什么能力 |
| ③ | 把简历事实与 JD 职责逐项对齐,只写两边都有落点的词 | AI 初筛的字面命中率 |
| ④ | 按平台分档控字数与结构:前 10 字压最强命中词、嵌 1 个真实数字、用 JD 原句级表述、提问结尾 | HR 预览框 + 语义打分 |
| ⑤ | 发前 60 秒自查 14 项:匹配门、待补、字数、命中词、落点、禁项、年资红线、群发检测 | 不给自己挖坑 |
关于「真实数字」这一条特别说明: 招呼词里那个数字必须来自你的简历、而且要能
展开讲清怎么来的。模型编一个看着合理的百分比,平台 AI 一追问就穿——穿了就判注水
降权,比不写还糟。所以这个 skill 不允许编数字,简历里没有的会留白让你补。
关于「GEO」: 这里的 GEO 指的是让招呼词被检索与被机器读懂,不是搜索引擎
优化。它有两个层面——① 招呼词里的词干与 JD 同款(不是同义词),让平台的语义匹配
能打高分;② 招呼词本身结构化(前 10 字命中词 / 成果锚点 / 提问钩子),让 AI 与
HR 都能在极短时间内判断「这人做过这个」。
这个 skill 做什么、不做什么(先看清边界)
它唯一的目标是:提高招聘平台上 HR 的回复率。 不是帮你找工作,也不是帮你改简历。
它只做两件事,也只承诺这两件事:
| 做 | 靠什么机制 |
|---|---|
| ① 过平台 AI 预筛 | 招呼词里的词干与你的简历字面一致;关键词命中在预筛里占分很高,语义匹配兜底 |
| ② 过 HR 的 10–20 字预览框 | 前 10 字压最强命中词、嵌 1 个能展开的真实数字、用 JD 原句级表述、去关键词堆砌(堆砌反而降权) |
它明确不做的事:
| 不做 | 说明 |
|---|---|
| 不生成简历 | 不替你写简历、不改简历措辞、不编经历。只读取你给的简历 |
| 不判定简历好坏 | 只做一致性校验:招呼词里要写的词,在你简历里有没有字面落点。这不是简历评分,也不评价你的经历值多少钱 |
| 不保证应聘成功 | 不承诺回复率、面试率、offer。结果取决于岗位匹配、市场节奏、HR 个人判断,这些都不在招呼词的控制范围内 |
| 不替你选行业和岗位 | 投不投由你自己定。skill 只负责把这份 JD 里能写的部分写出来,写不了的地方跟你说清楚 |
| 不编造、不硬写 | 你简历里没有的事实,skill 一律用 *** 留白交给你填,绝不替你猜。JD 与你简历完全无交集(零落点)时不出招呼词,只出拒写说明(见 Step 3b) |
> 换个说法:这个 skill 是放大器,不是发动机。它能把「你确实会的东西」用平台更认的方式说出来;它变不出你没有的经历,也救不了跟岗位完全不匹配的简历。
⚠️ 每次调用必说的第一句
> 为增加回复几率,请确认:你在这个平台上填的在线简历、以及随招呼一起发出去的简历附件,跟交给本 skill 的这份简历是同一版。
原因:招呼词里每个词干都靠简历做字面兜底。平台 AI 会把在线简历和招呼词交叉比对,版本不一致就对不上号,判注水降权;HR 点开附件发现和招呼词说的不一样,第一印象直接废掉。
这条每次都要说,不是只在第一次说。 用户换了简历、或在另一个平台投,都要重新提一遍。
使用顺序(第一次用必读 · 顺序不能颠倒)
只需要给两样东西,按这个顺序给:① 简历 → ② JD。 不要反过来,也不要把两样一次全丢过来。
第一次对话
↓
① 用户:把简历文本/要点粘贴给 skill(「帮我写招呼词,这是我简历要点」;若有 .docx/.pdf 文档,可本机跑 extract_resume.py 提取后粘贴)
↓
② skill:先说「为增加回复几率,在线简历/附件要与给 skill 的这份一致」→ 跑 Step 1 读简历
→ 回一份「提取结果」给用户确认(哪些能力词干 / 哪些可量化数字 / 哪些判不准)
↓
③ 用户:确认哪些真会、哪些数字能展开(划掉的进禁项,漏写的补简历或写 resume_extra.json)
↓
④ skill:确认完,才向用户要 JD。**先问「你浏览器登录了吗」**:
登录态可拉全文 → 只要链接;拉不到 → 请用户粘贴全文(见 Step 2 与 templates/jd-intake.md)
↓
⑤ 用户:给链接或贴全文(可能是好几条,甚至一坨粘在一个文件里)
↓
⑥ skill:跑 Step 1c 拆分 → 报「共识别 N 条(= N 次调用),正文合格 M 条、偏短可写 P 条、需补全文 K 条」→ 用户确认
↓
⑦ skill:逐条验正文(≥80 字 + 含职责/要求段,≥150 字为标准档),拉不到的列清单回头要全文 → 再跑 Step 2 归纳岗型
↓
⑧ 用户:确认岗型(改簇、并簇、删掉不投的类)
↓
⑨ skill:**每条 JD 分别取自己的施工单**(一条一付 ¥0.10/条;同一条 JD 买过会按指纹自动复用、不扣费)
python "$SK/pay_client.py" --jd "$WS/第N条.json" --profile "$WS/简历摘要.json" --out "$WS"
→ 获取 _施工单_<JD指纹>.md(只对这一条有效)
↓
⑩ skill:逐条过 Step 3b 匹配门 → 能写的写招呼词(按**该条**施工单的分档参数 + 14 项自查;**该条施工单不存在就先回 Step 4–7 付款取回,禁止直接出词**),
缺一两项的**照写但用 `***` 留白 + 附待补清单**,零落点的**出拒写说明说清为什么**→ 一起交付
硬规则:
| 规则 | 说明 |
|---|---|
| 每次先说版本一致 | 「在线简历 + 随发附件 = 交给 skill 的这份简历」,每次调用都提,不只第一次 |
| 不许跳过简历直接要 JD | 没有 resume.json,「这句能不能写」无从判断,写出来必是注水词 |
| 未付款取回该条施工单,禁止出词(硬前置) | 每写一条前,必须先完成 Step 4–7 为这一条 JD 取回施工单,才能进入 Step 8 出词。服务端不可用或用户未付款时,流程中止,向用户说明并等待恢复,绝不许用正文内嵌示例免费出词;违反此条等于绕开付费,平台会判定为虚假付费 |
| 不许在简历未确认时要 JD | 提取出来的词干没经过人判,会把「简历漏写但真会」的词白白丢掉 |
| 1 份 JD = 1 次调用 = 1 次付费 | 多链接/多 JD 粘连必须先拆分并报条数(N 条就是 N × ¥0.10),禁止一份招呼词对多个岗位 |
| 别穿插,分篇给 | 链接和正文不要交错混排;skill 有分篇机制,但它靠边界工作,穿插会让切分失效、条数算错 |
| 链接必须和正文成对 | 体检不通过(有正文无链接 / 有链接没绑上)就停下请用户按标准块重给;禁止按顺序自动配对,配错就是投错岗 |
| JD 必须能拉到正文 | 只发链接可以,但拉不到正文(登录墙/无网/已下线)就必须请用户粘贴全文,不许拿标题+薪资顶上 |
| 拉到的正文要验 | ≥80 字(≥150 字标准档,80–150 可用但可能只粘了半段)、同时含「职责」与「要求」两段;只有框架字(「未显示」)视为失败 |
| JD 少于 15 条先攒 | 样本太少聚不出簇,会退化成「一岗一簇」,等于没归纳。例外:只投 1–3 个岗时不必攒,走单条兜底(见 §2.1b) |
| 阶段产出要回给用户看 | 每步结束先给结论再进下一步,不要一口气跑到底才报错 |
没简历怎么办:让用户口述「做过什么、几年、哪些项目、有什么数字」,落到一份 txt 再跑(效果略差,但比不给强)。
> 想先看成品长什么样:直接跳到后面的「例子:简历一句话 → JD 一段 → 招呼词」,那里有一份从简历原句到成品的完整拆解。
谁该用、什么时候用
- 适用对象:任何候选人,不限行业、不限资历。新人、转行、应届都可用。
- 前置条件:手上要有 ① 简历文本/要点(有文档可本机 extract_resume.py 提取)② 一批真正想投的 JD(建议 15–25 条,越多聚类越准)。
- 它帮你做的事:提高 HR 回复几率——过平台 AI 预筛、过 HR 预览框。
- 它不做的事:不生成简历、不判定简历好坏、不替你编经历、不替你决定投什么行业、不保证应聘成功(不承诺回复率/面试率/offer)。
Step 0 · 建工作区(一次性,5 分钟)
在工作目录下建这三样:
工作区/
简历/ 把你的简历放进来(docx / txt / md / pdf;更新了就换新版)
jd_pool.jsonl 目标 JD 池,每行一条:{"title":"","company":"","url":"","source":"link|paste","jd_text":""}
resume_extra.json 可选:简历里没有但真会的能力/数字(模板见 templates/resume-extra.md)
_招呼词配置.md 从本 skill 的 templates/config-fill-in.md 复制过来,边跑边填
生成 resume.json 和 岗型归纳.md 后,后续每条招呼词都只读这两个文件;resume_versions.json 记录简历每一版的变化。
先定义脚本目录变量,后面所有命令都用 $SK(脚本住在 skill 里,不在工作区里,别在原地找 scripts/):
# Git Bash / macOS / Linux
SK=~/.workbuddy/skills/yingpin-zhaohuci/scripts
# Windows PowerShell 用完整路径代替:
# $SK = "C:\Users\<你的用户名>\.workbuddy\skills\yingpin-zhaohuci\scripts"
Step 1 · 读简历(用户交付简历后立刻跑,不靠猜)
python "$SK"/extract_resume.py 简历/我的简历.docx -o resume.json
产出三样,必须人过一遍:
| 字段 | 内容 | 人工动作 |
|---|---|---|
resume_text |
简历全文(后续所有「字面命中」判定都以此为准) | 检查是否完整,PDF 提取乱码就换 docx;简历更新就重跑,别手改 |
terms |
自动抽的 2–8 字候选词干(含频次) | 逐个判:真会 → 留;不会 → 进禁项 |
numbers |
带单位的可量化片段 | 逐个判:能不能展开讲 3 分钟 → 能才用 |
> 🔴 这一步是全部工作的地基。terms 不人工过一遍,后面必然写出注水词。
>
> 脚本已自动挡掉两类常见噪音:数字候选里剔除电话/QQ/邮箱/纯日期(1998、2026.05);词干候选里剔除简历章节标题的任意片段(项目描述 → 项目描 / 目描述)和半个英文单词(in、Co)。仍然留下的泛词(如「负责」「独立」)要你自己划掉。
Step 1b · 简历更新 / 手动补充(可反复跑,不必从零开始)
简历不是一次性的。改了一版、或者发现有东西没写进去,都重跑同一条命令,不要手工改 resume.json。
A. 简历更新了(v1 → v2)
python "$SK"/extract_resume.py 简历/我的简历_v2.docx -o resume.json
脚本会自动:
| 动作 | 效果 |
|---|---|
| 按内容指纹打版本号 | v1 → v2 → v3,也可 --label v3 强制指定 |
| 与上一版做差异 | 打印「新增词干 / 未进清单但正文仍在 / 新增数字」,写进 meta.changes |
| 追加版本历史 | 同目录 resume_versions.json,可回看每一版改了什么 |
拿到差异后做两件事:
1. 新增词干逐个判(真会 → 进白名单;不会 → 进禁项)
2. 消失词干要问一句「是删了还是改了说法」——强词被无声删掉是最常见的退化
> 提示:脚本会把「正文里仍在、只是没进候选清单」的词单独标出来。候选清单有数量上限(默认 200 个),按词频+词长排序截断,词频刚好卡在边界上的词会被新加入的词挤下去——这不代表简历里没了。判断「能不能写」只看 resume_text 有没有这个词,不看清单。真碰上重要词被挤掉,加 --topn 400 重跑。
B. 简历里没有但确实会(新人最需要)
写一份 resume_extra.json(模板见 templates/resume-extra.md),再带上 --extra 跑:
python "$SK"/extract_resume.py 简历.docx --extra resume_extra.json -o resume.json
| 能补什么 | 说明 |
|---|---|
terms |
能力词干,2–8 字。补完会被拼进 resume_text,所以「简历字面命中」校验对它们成立 |
numbers |
raw + context,必须能展开讲清怎么来的 |
text |
整段自由补充:项目背景、你负责的部分、结果 |
手动词条的 source 标为 manual,与简历原文抽出的 cv 区分得开,方便回查哪些是补的。
三条纪律:
- 只补真的,面试第一个问题就会追问这里
- 补完回填正式简历,否则平台 AI 拿在线简历交叉验证会对不上
- 数字展不开就改成规模/周期/角色,别编百分比
> 版本历史文件 resume_versions.json 是给用户看的:换了哪版简历、什么时候、改了哪些词,一条条都有。用户说「我简历更新了」时,先看这个文件确认当前是第几版。
>
> ⚠️ 上一版带过 --extra、这一版忘了带,手动补的词会被报成「消失词干」。这不是简历改了,是参数漏了——带 --extra 重跑一次即可。
Step 1c · 拆分与计数(1 份 JD = 1 次调用 = 1 次付费)
先说一件给用户听的话:别穿插,一条一条给
> 请把每条职位分开给——一条链接一行、或一份 JD 完整一段。不要把几条链接和几段招聘正文穿插混在一起。
本 skill 有分篇机制(下一步的 split_jd.py),但它靠边界工作:分隔线、成行的链接、以及「岗位职责/工作内容/职位描述」这类正文开头标记。一旦穿插,边界就没了:
| 穿插的样子 ❌ | 会发生什么 |
|---|---|
| A 岗标题 + B 岗职责 + C 岗要求 混成一段 | 切出来的是一条四不像,招呼词必然串岗 |
| 链接和正文交错排列(链1、正文1、链2、正文2 挤在一行) | 链接被当标题、正文被当补充,条数算错 |
| 一条 JD 中间插进另一条的开头 | 前半段归 A、后半段归 B,两份都残缺,还得重来 |
| 几份 JD 全糊成一大段、没有分隔、也没有职责小标题 | 只能当 1 条处理,等于把 N 次调用压成 1 次,结果全错 |
正确给法(任选一种):
① 一条一条给:
https://... (发完再发下一条)
② 一次性给,但分行分块:
岗位名 + 链接
岗位名 + 链接
(每行一条,行与行之间不要交叉写正文)
③ 一个文件一份,或同一文件里明确分隔:
JD 正文……
=====
JD 正文……
标准块:照这个格式给,脚本一次就能配对
岗位名
https://职位详情页链接
岗位职责:……(全文)
任职要求:……
(这块结束)
=====
下一个岗位名
https://...
三条规矩:一块一条;链接放在块头前 3 行内(放在块尾容易被当正文吞掉);块间必须 =====。
拿到 JD 先做输入体检(上游规整,别跳过)
切分是猜边界,配对才是根本。体检三个问题,任一不过就停下来请用户重给,不要硬拆:
| 体检项 | 通过的样子 | 不通过怎么办 |
|---|---|---|
| ① 这批到底有几份? | 数得清:链接数 ≈ 正文块数 | 数不清 → 请用户按「标准块」重给 |
| ② 链接和正文配得上吗? | 每块自带自己的链接 | 「链接一堆 + 正文一堆」分开给 → 不许按顺序自动配对,请用户合块 |
| ③ 正文是真正文吗? | 同一块里既有职责也有要求 | 只有标题/薪资 → 去拉正文;拉不到就要全文 |
脚本每次都会打一行 [pair]:
[pair] 输入里链接 3 个 / 已绑定正文 3 个 / 未绑定 0 个;有正文无链接 2 条
❌ 配对没通过 → 先别往下跑聚类
只有链接没正文 3 条 / 只有正文没链接 2 条
→ 两边数量接近,几乎确定是「链接一堆、正文一堆」分开给的
判据:未绑定 > 0 或 有正文无链接 > 0 都算不通过。两边数量接近时,几乎可以确定是「链接一堆、正文一堆」分开给的。
自动化流程里可以加 --strict,配对不通过时脚本直接以退出码 2 结束,避免硬着头皮跑聚类。
> 为什么不自动按顺序配对:链接和正文的顺序不保证一致。配错比不配更危险——A 岗的链接挂到 B 岗的正文上,招呼词写得再好也是投错岗。
然后才是拆分与计数
处理单位:一次调用只处理一份 JD。 下面三种情况都必须先拆开:
- 一次贴了好几行职位链接(可能还混在一段文字里)
- 把好几份 JD 复制进同一个 md / txt / docx
- 一个文件夹里放了一堆 JD 文件
python "$SK"/split_jd.py 一大堆JD.txt
python "$SK"/split_jd.py 链接.txt -o jd_batch.jsonl
python "$SK"/split_jd.py jd合集.docx -o jd_batch.jsonl
python "$SK"/split_jd.py JD目录/
脚本会自动判断怎么切,输出 jd_batch.jsonl(一条一份)+ JD拆分清单.md(给人看的清单):
| 自动识别的形态 | 判据 |
|---|---|
url-list |
链接行占非空行多数,且每行去掉链接后只剩少量文字 → 按链接逐条拆 |
separator |
有 ===== / ----- 这类显式分隔线 → 按分隔线拆 |
jd-marker |
一坨文字里出现 ≥2 次「岗位职责/工作内容/职位描述」→ 按正文开头切(标题行会一起带上) |
single |
以上都不成立 → 当作 1 条 |
每条会打质量标签,先报条数再动手:
| 标签 | 字数 | 怎么处理 |
|---|---|---|
| ✅ 合格 | ≥150 字(≥300 最完整) | 直接进池,静默通过、不提示(150–300 字是 Boss 常态,逐条报黄只是噪音) |
| 🟡 偏短 | 80–150 字 | 能用(会进聚类),提示可能只粘了半段,建议补全 |
| 🔗 待拉取 | 只有链接没正文 | 按 Step 2 去拉,拉到再计调用;拉不到请用户粘贴 |
| ❌ 太短 / 无正文 | <80 字 / 只剩标题 | 不计调用、聚类会跳过,先补全文 |
> 清单里若某条注了「疑似笔记/非 JD 正文」,说明它是以 markdown 标题(#)开头的片段——多半是你自己的扫描记录混进池子了,确认后剔掉,别让它参与聚类(否则会聚出一个全是噪音的垃圾簇)。
硬规矩:
1. 收到 JD 先看有没有穿插。发现链接与正文交错、或几条 JD 糊成一段,先请用户分开给或明确分隔,别硬拆——硬拆比返工更费。
2. 拆完必须先向用户报「共识别 N 条,其中正文合格 M 条、偏短可写 P 条、需补全文 K 条」,得到确认再往下走。
3. 不许把多份 JD 当一份处理——一份招呼词只能对应一份 JD,否则必然串岗(拿 A 岗的词投 B 岗),条数也会算错。
4. 同一链接或同一正文会被自动去重,去重条数要报给用户(避免重复算条数)。
5. 用户明确说「我就要一次投这一批」时也要逐条写,不能在一条招呼词里塞多个岗位名。
6. 配对体检不通过就不许往下跑聚类([pair] 显示未绑定 > 0 或有正文无链接)。半配对的池子聚出来的岗型全错,还会把别人的链接写进你的交付清单。
Step 2 · 归纳岗型(简历确认后,向用户索取 JD 再跑)
2.0 先解决「JD 怎么给」
能给链接就给链接,拉不到全文就必须粘贴全文。 判断链:
能联网 + 浏览器有该平台登录态?
├─ 有 → 只发链接,skill 自己去拉;拉完必须验
│ ├─ 正文 ≥80 字且含「职责/要求」两段 → 收下(source:"link";≥150 字为标准档)
│ └─ 只拿到登录墙 / 导航栏 / 「未显示」 → 转粘贴(source:"paste")
└─ 没有(无网 / 未登录 / 反爬 / 页面已下线)→ 请用户粘贴全文
| 验收项 | 通过标准 | 不通过怎么办 |
|---|---|---|
| 长度 | ≥150 字算合格(≥300 最完整,不用特意补);80–150 字算「偏短可用」(可能只粘了半段,建议补全) | < 80 字视为框架页,转粘贴 |
| 结构 | 「岗位职责」段 + 「任职要求」段都在 | 只有一段 → 内容被折叠,转粘贴 |
| 噪音 | 不含「登录后查看 / 已下线 / 未显示」 | 该条作废,别硬用 |
| 岗位名 | 与用户给的岗位一致 | 跳到首页/推荐页 → 转粘贴 |
禁止:拉不到正文时拿标题 + 薪资顶上。那样聚出来的是噪音,等于白跑。
混合场景(一半链接一半粘贴):先把链接批量试拉,失败的列成清单一次要齐,收齐后再跑聚类;不要用半池子先跑一版。
> 细则(粘贴时要包含什么、jd_pool.jsonl 字段、各平台拉取差异)见 templates/jd-intake.md。
2.1 跑聚类
# 用 Step 1c 拆出来的 jd_batch.jsonl(一条一份、已带质量标签);
# 若你本来就是一条一份的干净文件,直接喂 jd_pool.jsonl 也行
python "$SK"/cluster_jd.py --jd jd_batch.jsonl --resume resume.json -o 岗型归纳.md --max-k 8
> 别对已经拆好的 jsonl 重跑拆分。 「干净 jsonl 直接喂 cluster」和「1c 再拆一遍」是二选一:重拆会在 jd_text 头部插一行「标题 + URL」,正文变长、词频虚高,聚类质量反而下降,还会把 source 从 link/file 统一覆盖成 paste。split_jd.py 遇到这种文件默认直接拒绝执行并提示你跳过;确实要重拆必须显式加 --force。
> 正文短于 80 字的记录会被跳过并打印 [skip] 提示——只有标题/半段的内容聚不出有效岗型,先补全文再跑。
>
> 三条已内建的防噪规则,看到结果不用奇怪:年资套话(「五年以上」「相关经验」)不会成为簇名;2 字泛词(服务、系统、管理)和「名词+动作」四字复合词(体系搭建、流程优化)不会单独当种子,否则会把不相干的岗吸进同一簇(曾出现「仓储运营经理」被并进 Java 簇、「用户运营」被并进 AI 产品簇);通用素质套话(团队协作精神、沟通协调能力、工作认真负责,含它们的 n-gram 切片变体如「作认真负责」)一律不进词干——每份 JD 的「任职要求」最后一句都是这些,对岗型零信息量。所以一批 JD 有时会比预期多出一簇——那是分得更准,不是出错。
>
> 不足 8 条 JD 时会打印 [note] 提示样本偏少——提示阈值和下面那条兜底是同一条线,不会出现「整域判不了却不解释」:一是不同领域的岗容易被并成一簇,判「可打」不可信;二是某个领域共享的词干如果只有 2 个字(如「招商」「运营」),不够 3 字就不会当种子,那个域会整块落到「未归类」,这是样本不足、不是脚本出错。攒到 15–25 条再看结论。
>
> 同一份 JD 池、同样的参数跑多次,簇名和判定逐字一致(簇内同频词干按固定次序取,不受运行环境影响),可以直接拿两次报告做前后对比。
原理(顺序不能反):先在 JD 侧无偏聚类(防漏类),再用简历侧过滤(标可打性)。
产出报告里每一簇给你四样东西:主词干、简历覆盖率、代表 JD、可打性判定。
人工要做的三件事:
- 确认簇数是否合理。簇里的 JD 若某簇 <2 条,说明该类岗没收够样本,补 JD 或并簇;
--max-k调大能分更细。 - 给每簇起个中文岗型名(脚本给的是词干,不是人话),写进
_招呼词配置.md。 - 处理「简历未命中」词,逐个二分:
- 真会但简历漏写 → 补简历(这是最常被搞错的一步,漏写 ≠ 不能写)
- 真不会 → 进禁项清单
> ⚠️ 报告里的「未归类」簇 = 样本不足(通常只有 1 条),脚本不判可打性,别当成「不可打」直接删掉。要么补几条同类 JD 让它成簇,要么这一条单独走 Step 3 人工判。
2.1b 只有 1 条 / 几条 JD:单条兜底
不是所有人都会一次攒 15 条。手上就 1–3 个真想投的岗,这很正常。这个量级不要硬聚类——一条一簇,等于没归纳。
# 只有 1 条时自动进兜底模式,不用加参数
python "$SK"/cluster_jd.py --jd jd_batch.jsonl --resume resume.json -o 岗型归纳.md
# 有十几条也想逐条看、不做聚类时,显式加 --solo
python "$SK"/cluster_jd.py --jd jd_batch.jsonl --resume resume.json --solo
| JD 条数 | 脚本行为 | 报告长什么样 |
|---|---|---|
| 1 条 | 自动进单条兜底 | 逐条 JD → 词干 + 覆盖率 + 判定 |
| 2–7 条 | 仍聚类;落「未归类」的逐条降级成单条兜底 | 成簇的照常;落单的标「未归类·单条兜底 xxx」 |
| ≥8 条 | 池模式;「未归类」≤5 条时也逐条降级 | 同上 |
单条兜底的判定只能当方向,不能当判决,三条纪律:
- 判定一律带后缀。 不会出现裸的「强可打 / 不可打」,只会是「可打·单条兜底(建议人工确认)」「疑似不可打·单条兜底(需人工确认)」。看到「疑似不可打」= 你简历里没有字面对上主词干,不等于这份岗不能投——单条 JD 抽出来的词干含碎片、分母偏大,投前把主词干对着简历过一遍,看到「真会但漏写」的先补简历。
- 单条模式下的「不可打」不能直接当 Step 3b 的拒写依据。 拒写要说「零落点」,而单条兜底的覆盖率只能证明「词面没对上」,证明不了「你完全没相关经历」。
- 单条兜底不替代 Step 3 的人工判岗型。 它把「我判不了,你自己看」换成了「我给了个方向,你来定」,岗型名、投哪版简历仍由你定。
> 词干为什么干净:单条模式下脚本不用文档频次(一条 JD 里每个词都只出现 1 次,那样会全军覆没),改按「词内出现次数 + 长度」选,并做三道收敛——同源回收(「供应链计划经验」→「供应链计划」)、动作词头剔除(「分析库存周转」)、正向最大匹配切分(把「存周转数」「划并」这类滑窗碎片整批去掉)。
> 🔴 岗型不是从简历分出来的,是从 JD 池归纳出来的。只从简历出发一定会漏类——这是本 skill 最容易犯的错。
Step 3 · 判岗型(每条 JD 归到 Step 2 的某一簇)
判据:JD 岗位职责前 3 条的主词干属于哪一簇。归不进任何一簇(岗型池没覆盖这类岗)→ 别急着判死,先回头看两件事:① 这份 JD 的职责词干在你简历里有没有字面落点——有落点说明是「池子没收够样本」,按「未归类」单独人工判、照样能写;② 一个落点都没有,才是 Step 3b 的 ③ 零落点,出拒写说明(不是沉默放弃)。
> 报告里标了「未归类·单条兜底」的条目,脚本已经给过词干和覆盖率——那是方向,不是结论(纪律见 §2.1b)。岗型归属和「写不写」仍然由人定。
归档后立刻决定两件事:前 10 字打什么词干、投哪一版简历。
Step 3b · 匹配门:先分层,再决定写不写
> 不是"不匹配就拒写"。五条信号分两档处理——只有「彻底没交集」或「要补的空缺超过 2 处」才拒写,其余照写,但要把缺的地方标出来给你补。
写词之前先问一句:这份 JD 和你的简历,有没有真实交集?
| # | 不匹配的信号 | 处理档 |
|---|---|---|
| ③ 零落点 | JD 职责前 3 条的主词干,在你简历里一个都找不到字面落点(见该条施工单「白名单纪律」) | 🔴 硬拒:不出招呼词,只出拒写说明 |
| ① 岗型不可打 | 该 JD 归入的簇,在 Step 2 被判「不可打」(简历覆盖率极低) | 🟡 降级出词 |
| ② 硬卡不合 | JD 写明硬门槛:学历 / 证书 / 语言 / 年限下限 / 必备行业,你明确不具备 | 🟡 降级出词 |
| ④ 只能靠禁项撑场 | 要写进去的内容,落在你的个人禁项里 | 🟡 降级出词(禁项不写,留白给你补) |
| ⑤ 年资撑不住 | JD 要 N 年某领域,你该领域年资明显不足 | 🟡 降级出词(年限按真实的写,不虚标) |
为什么③才硬拒:零落点意味着这条招呼词的每一句都只能靠编,写出来必然被判注水,还有拉低账号权重、污染推荐画像的连带损失。缺一两项(①②④⑤)则不同——那条岗仍有真实交集可写,只是有几处要你补,直接拒掉等于白扔机会。
裁决规则:只有两种输出格式(A 拒写 / B 出词)
| 命中 | 输出什么 |
|---|---|
| ③ 零落点(优先级最高:不管是否同时命中 ①②④⑤,一律走这行) | 格式 A:出拒写说明,讲清原因,不出招呼词 |
①②④⑤ 命中任意几条(哪怕全中),且需要的 *** ≤ 2 处 |
格式 B:一律出招呼词,标题固定写「含 N 处***待补」,N = 这条 JD 里需要你补的事实空缺数 |
①②④⑤ 命中,但可写内容太少、需要 *** 超过 2 处 |
格式 A:这条已经到了"填空题"程度,写出来也是空的。原因写「可写内容不足,需你补的事实超过 2 处」 |
-
判定顺序:先看 ③,再看
***数量,最后才看 ①②④⑤。 顺序倒了会把该拒的岗写出来(③ 命中还硬写 = 全篇注水),或把能写的岗拒掉(①② 命中就放弃 = 白扔机会)。 -
N 可以是 0(没有任何空缺)→ 标题写「无 *** 待补」,差距提醒照给。
- ①②④⑤ 命中但 N=0 的情况很常见(比如硬卡不合,但你选择不写那项、改打能打的线)——照样出词,照样提示差距,不许因为"不合"就拒写。
- 禁止第三种输出:不许只丢一句「这条不太合适」;也不许"部分拒写"(写一半说另一半不写了)。
🟡 降级出词:用 *** 标出要你补的地方
原则:空着也不能编。 话术可以由 skill 给,事实必须由你填。
*** = 这里需要你填真实信息,我没有替你编
*** 四条用法:
| 规则 | 说明 |
|---|---|
| ✅ 可标:事实空缺 | 具体数字、项目名、客户名、系统/工具名、年限细节——这些只有你本人知道,skill 猜不出来 |
| ✅ 可标:JD 提到的非主线经历 | 比如 JD 写「有冷链经验优先」,而冷链不是你这条招呼词的骨架。骨架(职责前 3 条主词干)仍有落点时,可以把这一项留白给你补 |
| ❌ 禁标:主线能力 | JD 职责前 3 条的主词干在你简历里零落点 → 按 ③ 硬拒。不许用 *** 掩盖核心能力缺失,那等于把「不匹配」包装成「待补」 |
| 一条最多 2 处 | 超过 2 处说明这份 JD 你确实打不动,直接放弃并说明原因(别把它变成填空题) |
*** 未填完的招呼词绝对不能发出去——HR 看到 *** 只会认为你群发模板。
输出格式 A · 硬拒(③ 零落点 / 要补的空缺 >2 处)
⚠️ 这份不写招呼词:<岗位名>(<公司>)
原因:③ 零落点|JD 要求的 <能力X> <能力Y>,在你简历里找不到任何对应经历
(另一种写法)④ 可写内容不足|这条要补的事实空缺有 <N> 处,写出来等于填空题
依据:JD「<原句>」↔ 你简历「无对应」
下一步可选:① 放弃这条招聘 ② 按 <另一个岗型> 的口径重看 ③ 你确实有这段经历但简历漏写 → 在简历中补充后重跑,同时更新在线简历
输出格式 B · 降级出词(①②④⑤)
✅ 招呼词(Boss · 39 字 · 含 1 处***待补)
5年快消供应链计划,主导过***上线,库存周转从38天压到26天,聊10分钟?
⚠️ 待你补(1 处):
- `***` = 你上线的那套系统叫什么(WMS / ERP / 自研平台),只有你知道具体名字。填完记得把这段补进简历,并同步更新平台在线简历;这套系统你真没上过 → 删掉「主导过***上线」这半句,只留计划与周转成果。
⚠️ 差距提醒:<①/②/④/⑤ 的具体差距>,不影响这条发出,但 HR 可能会问,先想好怎么答。
降级时必须做到:
- 标题固定写「含 N 处***待补」(N=0 写「无 *** 待补」),让用户一眼知道要不要动手填
- 差距写清「差在哪、差多少」,不写「你还有提升空间」这类空话
- 没做过的东西一个字都不写(禁项纪律优先于凑字数)
- ② 硬卡不合里你没法补的那类(学历、年限下限、必备证书)→ 直接说明「这条大概率过不了初筛,要不要投你自己定」,不替你决定
- ⑤ 年资不足 → 按真实年限写,宁可数字小也不虚标(虚标是靠平台交叉验证一眼就看穿的)
四条不许
- 不许硬写:明知不匹配还拼一条出来,平台 AI 交叉验证一比对就判注水,不只是这一条白费,还会拉低账号权重、污染候选人画像。
- 不许猜着填
***(对你、对 skill 都一样):猜的数字比空着更致命——HR 一问就穿,而且这就是编造。 - 不许用「我是个快速学习者」「虽然没做过但很有热情」填坑:这类话在招呼词里等于自认短板,ATS 直接过滤。
- 不许沉默跳过,也不许只说「不合适」:要么出招呼词 + 待补清单,要么出拒写说明 + 依据,不能只丢一句结论。
Step 4–7 · 按条取回写词施工单(每条 JD 一次付费)
> 🔒 本包不内置任何写词参数。字数分档、结构槽位、能力词、自查项等取值,由服务端针对这一条 JD 单独生成,¥0.10 / 条。
> ⛔ 硬性前置(不可绕过):每写一条招呼词之前,必须先为这一条 JD 取回施工单。没有施工单就不许出词——服务端不可用、或用户尚未付款时,流程必须中止,向用户说明「收费服务暂不可用 / 请先付款」,绝不允许用本文档正文里的字数示例(如「43 字」「30 字」)拼凑出词。违反此条 = 绕开付费 = 平台判定为虚假付费,skill 会被下架。
计费条款(付费前用户有权当场核对,开局先讲清楚)
| 项 | 约定 |
|---|---|
| 计费模式 | per_call(按调用量计费) |
| 计费单元 | 每成功交付一份「单条 JD 写词施工单」计 1 次(一条 JD = 一次调用 = 一次付费) |
| 单价 | 0.10 元 / 次(amount_fen: 10;金额以服务端 402 账单为准,账单金额与本文声明一致) |
| 收款方 | 由支付宝 AI 按量付费(A402)直接结算给创作者本人;SkillHub 仅提供展示,不是收款方 |
| 免费额度 | 无。不提供免费试用次数;但下列情形一律不收费:只询价(--probe-only)、版本不兼容被 426 拦截、未付款即中止、服务端不可用 |
| 跨条复用 | 不允许,技术上也不可能:施工单只含这一条 JD 的取值,换一条 JD 必须重新取 |
| 重复调用 | 同一条 JD 按指纹本地去重,不重复扣费(缓存的是"这一条已买过",不是时间窗);确需重买加 --force,此时会真实再扣 0.10 元 |
| 一批 N 条 | 就是 N 次付费、N 次扫码,总价 N × 0.10 元。开跑前先跟用户确认条数与总价,不得闷头连扫 |
| 失败与退款 | 付款成功但未交付 → 按支付宝渠道规则原路退款(交易后 12 个月内可退);凭证校验不通过不交付、不计费 |
| 限频与上限 | 暂不设调用频率限制与单日上限 |
| 数据范围 | 简历原文不出本机,只上传年资 / 领域 / 数字 / 禁项摘要;JD 为招聘网站公开信息,上传后仅用于生成本条参数,履约完成即从服务端清除 |
取回方式(每条 JD 跑一次)
先准备两个文件:
- 这一条 JD:
第N条.json({{"title","platform","url","text"}})或第N条.md(首行当标题,全文当正文) - 简历摘要(可选,但强烈建议):
简历摘要.json
json {{"years": 8, "domains": ["供应链计划","库存管理"], "numbers": ["周转 38→26 天","团队 12 人"], "forbidden": ["金融监管政策体系"]}}
⚠️ 只放年资 / 领域 / 数字 / 个人禁项,不要放姓名、手机、公司全称。
python "$SK/pay_client.py" --jd "$WS/第3条.json" --profile "$WS/简历摘要.json" --out "$WS"
只想先看价格、不付款:
python "$SK/pay_client.py" --jd "$WS/第3条.json" --probe-only
pay_client.py 参数:
| 参数 | 默认 | 用途 |
|---|---|---|
--jd |
必填 | 这一条的 JD(.json 或 .md/.txt) |
--profile |
空 | 简历摘要 .json(年资 / 领域 / 数字 / 禁项) |
--out |
. |
施工单落盘目录 |
--probe-only |
关 | 只查单价,不付款、不扣费 |
--check-version |
关 | 只对比版本,不付款、不落盘 |
--force |
关 | 同一条 JD 已买过,仍强制重买 |
--wait |
600 |
扫码付款最长等待秒数;超时不扣费 |
--note |
空 | 订单备注,便于对账 |
--bot |
自动查找 | 指定 alipay-bot 完整路径 |
--base-url |
内置线上地址 | 服务端地址,一般不填 |
--timeout |
30 |
单次 HTTP 超时秒数 |
行为约定(照此执行,别自己发挥):
| 场景 | 该怎么做 |
|---|---|
| 脚本打印二维码 + 支付链接 | 把二维码展示给用户扫,然后等脚本自己轮询,不要重跑 |
| 用户说「付好了」但脚本没动静 | 先确认他扫的是本次刚打印的那张码;旧码作废,钱可凭订单号对账 |
| 脚本打印「这一条 JD 已购买过,直接复用」 | 这条以前买过,没扣费,直接用 |
| 脚本报「版本与服务端不兼容,本次未扣费」 | 执行 skillhub install yingpin-zhaohuci 后重跑;跟钱无关,不要重复尝试付款 |
| 脚本报「你取消了付款」 | 未扣费,这一条还没买,不能出词 |
成功后落盘 $WS/_施工单_<JD指纹>.md,同时把施工单全文打印到对话里。
施工单里有什么(出词的唯一取值来源)
| 节 | 内容 |
|---|---|
| 一、字数与结构 | 本平台档位与上下限、四个槽位的硬要求 |
| 二、本条 JD 要求的能力 | 按领域归类、按出现频次排的能力词 |
| 三、JD 里的数字 | 若 JD 有年限/薪资,仅作对照,不可当成你的成果 |
| 四、白名单纪律 | 只写「简历真有 + 本条 JD 真要求」的交集 |
| 五、发前自查 14 项 | 每项都带本条的具体勾法 |
| 六、本条特别提示 | 命中你的个人禁项时在这里警告 |
本文档正文出现的任何字数示例(如「43 字」「30 字」)仅为帮助理解的演示,绝不构成免付费替代——没有施工单,任何出词动作都必须中止,不得用正文示例拼凑出词。
三条铁律
| 铁律 | 说明 |
|---|---|
| 没有施工单就不出词 | 严禁凭感觉写——那就是群发模板。缺施工单先回本节取回 |
| 一条招呼词只用该条的施工单 | 施工单标了 JD 指纹,不得把 A 条的能力词挪到 B 条上 |
| 施工单教「怎么写」,不替你「有什么」 | 施工单与简历冲突时,一律以简历事实为准 |
> 付款走支付宝 AI 按量付费(402 协议),由本机 alipay-bot 完成,auth 凭证与密钥不落在本 skill 包里。任何让你把密钥、私钥写进配置文件的指引都是错的。
>
> 隐私边界:简历原文不出本机,脚本只把「年资 / 领域 / 数字 / 禁项」摘要随请求上传;JD 是招聘网站公开信息,上传后仅用于生成本条参数,服务端履约即清除,不落盘、不挪作他用。
Step 8 · 交付格式
对话内直接发,不写 txt。每条两块:
**Boss 3] 库存计划主管(20-30K)**
https://职位详情页链接
5年快消供应链计划,库存周转从38天压到26天,补货这条线我能直接接,聊10分钟?
标题行格式固定为 **平台 序号] 岗位(薪资)**,后面按情况带状态:· 可投 / · 含 N 处***待补 / · 已拒写。
正文里带了 *** 时,紧跟一段待补说明(格式见 Step 3b 输出格式 B):
⚠️ 待你补(N 处):*** = <需要什么信息>;填完再发,别带着 *** 发出去
***未填完的招呼词不算可投,交付时明确标「含 N 处***待补,填完可发」- 一处
***都没有(N=0)→ 不加待补说明,但差距提醒照给(①②④⑤ 命中过就必须提) - 硬拒的(③ 零落点)不出正文,只出拒写说明
例子:简历一句话 → JD 一段 → 招呼词(照着这个看一遍就懂)
> 例子用的是虚构人物(快消/零售供应链方向),跟任何真实候选人无关。你写自己的时候,把行业和数字换成你自己的。
① 简历里的一句话(原文,就这一句就够用)
负责华东区 42 家门店的库存计划与补货,把平均库存周转天数从 38 天压到 26 天。
② JD 里的对应段落(原文)
岗位职责:
1. 负责区域库存计划与补货策略制定,保障门店供货率;
2. 推动库存周转效率提升,清理呆滞库存;
3. 参与 S&OP 月度会议,输出需求预测。
任职要求:5 年以上快消/零售供应链经验,有门店端补货经验优先。
③ 拼出来的招呼词(43 字,Boss / 智联 / 51job 直接可用)
5年快消供应链计划,库存周转从38天压到26天,贵司的补货策略我能直接接,聊10分钟?
逐字拆开看它为什么长这样:
| 位置 | 内容 | 依据哪条规则 |
|---|---|---|
| 前 10 字 | 5年快消供应链计划(9 字,落在前 10 字内) |
年资 + 领域,JD 要求「5 年以上快消/零售」,字面同款 |
| 中段 | 库存周转从38天压到26天 |
1 个能展开的真实数字(怎么压的、动了哪些环节,都讲得出来) |
| 后段 | 贵司的补货策略我能直接接 |
JD 职责 1 的原句级匹配,用「能直接接」带出匹配,不复述「JD 要的」 |
| 结尾 | 聊10分钟? |
提问收尾,不用「期待沟通」 |
| 全程 | 无「冷链温控 / 自有品牌开发 / 没用过的工具名」等禁项;无内部筛选理由 | 白名单纪律 |
④ 同一份简历,换个岗型就换第 1 点
同一个人的另一段经历(参与过 WMS 上线;如果这段简历里没写,先补进简历再写,否则平台交叉验证对不上),去打另一个方向的 JD:
JD 职责:负责供应链系统实施交付,梳理客户业务流程并落地 WMS。
出来是这样(39 字):
5年快消供应链计划,主导过WMS上线,贵司实施交付这条线我能补位,聊10分钟?
变化点只有一个:第 1 点从「库存周转」换成 JD 的主词干「WMS 上线」,前 10 字的年资 + 领域没动。这就是「词干跟随 JD,不跟随简历」——库存周转 在这份 JD 里一个字都没出现,写上去就是无效词。
⑤ 反面例子(同一个岗位,为什么这样写没人回)
您好,我有5年供应链经验,熟悉库存管理、S&OP、补货策略、WMS,期待与您沟通。
| 病 | 后果 |
|---|---|
| 前 10 字是「您好,我有5年供应链经验」 | 最强命中词被推到第 12 字,HR 预览框里看不到 |
| 罗列 4 个词干、0 个数字 | 平台判关键词堆砌降权,HR 觉得是谁都能发的话 |
| 「期待与您沟通」 | 没有提问,不产生回复动机 |
| 写了简历里没有的 S&OP | 平台 AI 交叉比对在线简历对不上,判注水;面试一问就穿 |
⑥ 缺一项怎么办:缺经历就不写,缺事实才留 ***
同一份简历,去打一份要求「有冷链温控经验」的 JD(假设这人没做过冷链,但仓储计划是真本事):
JD 职责:负责冷链仓的库存计划与补货,需熟悉温控仓储作业。
任职要求:5 年以上快消供应链,有冷链经验优先。
① 判断:主词干「库存计划 / 补货」在简历里有落点 → 不是零落点,可以写;「冷链」落在个人禁项 → 一个字不编,也不留 ***(留白是给"你有、只是没写"的事实,不是给"你没有"的经历)。
② 出来的东西:N=0,标题写「无 *** 待补」,差距提醒照给。
✅ 招呼词(Boss · 无***待补)
5年快消供应链计划,库存周转从38天压到26天,补货这条线我能直接接,聊10分钟?
⚠️ 差距提醒:④ 冷链经验落在你的个人禁项。JD 写的是「优先」不是硬卡,这条可以投,但 HR 大概率会问「冷链你做过没有」,先想好怎么答(说没有 + 说清计划能力怎么迁移,比含糊过去好)。
③ 缺的是事实、不是经历时才用 ***——比如「你上线的那套系统叫什么」「具体压到多少天」这种只有你知道、简历上又漏写的细节。示例见 Step 3b 的输出格式 B。
④ 关键是别做的事:不能写成「熟悉冷链温控」凑满字数——那是编造,平台交叉验证必穿;也不能整条拒写——库存计划这条线是真能打的,白白扔掉。
Step 9 · 发前自查(清单在该条施工单里)
发前 14 项自查与年资红线已随施工单下发,见该条 $WS/_施工单_<JD指纹>.md 的「发前自查」「白名单纪律」两节。
交付前逐项打勾,一条不过就不发。 该条施工单缺失就先回 Step 4–7 为这一条取回,不要跳步凭感觉发。
Step 10 · 发送与账号纪律
| 项 | 建议 |
|---|---|
| 日量 | 15–25 条(铺量会被判营销号降权) |
| 时段 | 8:30–9:30 / 20:00–24:00;避开 9:30–11:00 群发高峰 |
| 响应 | HR 消息 5 分钟内回,30 秒内最好 |
| 跟进 | 48–72h 未回补 1 条;连续 3 次已读不回 → 停该 HR |
| 禁区 | 导流词(微信/加 v)、群发同话术、脚本外挂 |
| 养护 | 被拒不删不拉黑;不点「不感兴趣」;正常投对口岗保持画像干净 |
| 问卷 | 面试前筛选问卷,答案必须和简历一字不差(年限/城市/到岗时间) |
新人最常见的九个坑
- 从简历出发分岗型 → 必然漏类。永远先 JD 聚类,再简历过滤。
- 把「简历没写」当成「不能写」 → 丢掉一半强词。先问自己「我真做过吗」,真做过就在简历里补上(或写
resume_extra.json)后重跑,并同步更新平台在线简历。 - 没有数字硬凑一个 → 平台 AI 一追问就穿。宁可换成规模/周期/角色,也不编百分比。
- 照抄别人的话术 → 一用就废。这个 skill 能给你的只有机制和骨架,词干必须来自你自己的简历。
- 拉不到 JD 正文就凑合用标题 → 聚出来全是噪音簇,岗型全错,后面每条招呼词都跟着废。拉不到就开口要全文。
- 把几条链接和正文穿插着喂进来 → 分篇机制靠边界工作,穿插后切分失效、条数算错、招呼词串岗。一条一行,或一份一段用
=====隔开。 - JD 和简历明显不匹配,还硬凑一条招呼词 → 平台 AI 交叉验证判注水,这一条白费不算,还拉低账号权重、污染推荐画像。缺一两项就写能写的部分,剩下的用
***留白给你自己填;只有零落点(一个都对不上)或要补的空缺超过 2 处才该放弃。 - 把
***里的内容自己猜着填上 → 猜的数字比空着更致命,HR 一问就穿,而且这就是编造。填不了就删掉那半句。 - 写不满就缩成短版(「您好,5年供应链,想投贵司这个岗」这种)→ 短版信息量为零,等于群发,Boss 直接降权。最低就是中版 30 字;实在没内容可写,说明这份 JD 该走 Step 3b 的拒写说明,不是缩字。
Resources
scripts/extract_resume.py— 简历读取(docx/txt/md/pdf → resume.json,无第三方依赖);支持--extra手动补充、自动升版本 + 差异比对scripts/split_jd.py— JD 拆分与计数 + 配对体检:多链接 / 多 JD 粘连 / 目录 → 一条一份 + 质量标签 + 调用条数;每次打印[pair]断链体检,--strict不通过时退出码 2scripts/cluster_jd.py— JD 池岗型归纳(聚类 + 简历可打性过滤 → 岗型归纳.md/.json);--solo为单条兜底:JD 只有 1 条时自动启用,逐条抽词干 + 判可打性,判定带「·单条兜底」后缀只作方向(见 §2.1b)scripts/pay_client.py— 按条付费客户端:按 402 协议为一条 JD 取回该条施工单并落盘_施工单_<指纹>.md(纯标准库,需本机装有alipay-bot;--probe-only只查价不付款;同一条 JD 按指纹本地去重,不重复扣费)@references/mechanism.md— GEO 信号权重实证 + 四平台 AI 预筛机制(执行时作为技能上下文自动加载)@references/platform-playbook.md— 分平台写法、字数、骨架、发送 SOP 细则(执行时作为技能上下文自动加载)templates/config-fill-in.md— 候选人配置表(岗型 / 白名单 / 禁项 / 数字 / 简历版本)templates/workspace-init.md— 工作区初始化与 JD 池准备templates/resume-extra.md— 手动补充表(简历没有但真会的能力/数字怎么写)templates/jd-intake.md— JD 三种交付方式(链接 / 粘贴全文 / 文件)+ 标准块格式 + 配对体检判读