---
name: job-match-priority
description: "Match and prioritize job listings against a candidate profile using KSAO-based dual-layer funnel scoring with Agent reasoning."
metadata:
  {
    "openclaw":
      {
        "emoji": "🎯",
        "requires": { "bins": [] },
      },
  }
---

# JD 匹配优先级判定

基于 KSAO 框架（Knowledge / Skills / Abilities / Other）的双层漏斗匹配。全链路 Agent 推理，零脚本。

---

## 快速开始

当用户要求简历匹配、JD 匹配、岗位筛选时，触发此 skill。

---

## Workflow

### Step 0: 判断使用阶段

**首次使用 → 进入引导流程（Step 0.1 - 0.6）**
**非首次使用 → 检查已存配置，直接进入 Step 1**

判断依据：
- 用户是否已有候选人画像（KSAO）→ [references/candidate-profile.md](references/candidate-profile.md)
- 用户是否已校准过匹配标准
- 用户是否明确说"用之前的配置"

---

### Step 0.1: 收集求职偏好（5 问，逐问逐答）

**交互原则：每问一答，不一次甩 5 个问题。**

| # | 问题 | 目的 | 输出 |
|---|------|------|------|
| 1 | 你期望的岗位方向是什么？（如：总助、HR、产品经理、运营...） | 确定目标岗位类型 | 岗位类型标签 |
| 2 | 期望薪资范围？（月薪，如 15-20K） | 硬过滤阈值 | 薪资区间 |
| 3 | 期望工作城市？（可多选） | 硬过滤阈值 | 城市列表 |
| 4 | 有哪些绝对不考虑的行业/岗位类型？ | 硬过滤排除项 | 排除列表 |
| 5 | 对工作强度/福利的底线要求？（如：双休、不加班、不接受单休...） | 硬过滤福利项 | 福利底线 |

---

### Step 0.2: 提供简历

两种方式（二选一）：
- **方式 A：** 提供简历文件路径（本地文件）
- **方式 B：** 直接粘贴简历文本内容

---

### Step 0.3: 生成双画像

#### 画像 A：候选人画像（KSAO）

从简历中提取，按 KSAO 四维度结构化。详见 [references/candidate-profile.md#一、候选人画像结构（KSAO 四维度）](references/candidate-profile.md)。

输出格式：
```
【候选人画像】
K（知识）：学历 X，院校 XX，行业知识 XX
S（技能）：硬技能 XX，管理技能 XX，工具技能 XX
A（能力）：战略能力 L_X，组织能力 L_X，沟通能力 L_X，执行能力 L_X
O（其他）：动机 XX，价值观 XX
```

#### 画像 B：求职 JD 画像（理想岗位特征）

综合求职偏好 + 候选人能力画像，生成"理想 JD"：

```
【求职 JD 画像】
目标岗位：XX（XX方向）
岗位层级推断：L_X-L_X（基于 X 年经验 + 薪资期望）
核心能力维度：XX、XX、XX
加分维度：XX、XX
排除项：XX、XX
福利底线：XX
```

---

### Step 0.4: 确认漏斗标准 + 自定义能力维度

**重要：能力维度需根据用户画像动态生成，而非使用预设维度。**

将画像转化为可执行的匹配规则，向用户确认：

```
基于你的画像，我拟定了以下匹配标准：

【硬过滤】
- 薪资：XX-K 之外直接标记 low
- 地点：非 XX 且不接受远程 → low
- 行业：XX、XX → low
- 排除：XX、XX

【能力维度权重】（根据你的画像定制，5-8 个维度）
- 核心维度：XX、XX（权重最高）
- 重要维度：XX、XX
- 加分维度：XX、XX

【能力深度要求】
- 目标岗位层级：L_X-L_X
- 深度匹配范围：L_X-L_X 可接受

以上标准是否需要调整？可以增删维度或调整权重。
```

**维度生成原则：**
1. 从候选人简历中提取高频能力关键词，聚类为维度
2. 结合目标岗位的典型能力要求
3. 用户可自定义维度名称和同义词簇
4. 总维度数建议 5-8 个

用户确认 → 进入校准测试

---

### Step 0.5: 校准测试（用户提供 ≥10 份 JD）

**目的：** 用真实数据验证匹配标准，让用户校准判定结果。

**要求用户提供：**
- ≥10 份 JD（飞书表格链接 / 本地 CSV / 直接粘贴）
- 优先选择用户已知"应该匹配"和"不应该匹配"的 JD（用于验证）

**执行：**
1. 对每份 JD 执行完整的 Layer 1-3 匹配（详见 Step 3）
2. 生成匹配结果表格：

| # | 岗位名称 | 公司 | 判定 | 理由 | 命中维度 | 深度匹配 |
|---|---------|------|------|------|---------|---------|
| 1 | XX | XX | high | XX | 维度A+维度B | 匹配 |
| 2 | XX | XX | low | XX | 仅维度C | 不匹配 |
| ... | ... | ... | ... | ... | ... | ... |

---

### Step 0.6: 用户审阅 + 校准

展示结果后，问用户：

```
以上 10 份 JD 的匹配结果，是否有需要调整的？
- 哪些判定偏高了？（实际不匹配但判为 high/medium）
- 哪些判定偏低了？（实际匹配但判为 low）
- 漏斗标准需要修改吗？
```

**用户反馈处理：**

| 反馈类型 | 处理方式 |
|---------|---------|
| "这条应该是 high 不是 medium" | 检查维度命中和深度，调整对应维度权重或阈值 |
| "这条不应该被过滤" | 调整硬过滤规则（放宽薪资/地点/行业限制） |
| "这条应该被过滤掉" | 增加硬过滤规则（添加排除项） |
| "整体没问题" | 确认配置，进入正式匹配 |

**校准循环：**
- 用户有调整 → 修改标准 → 重新跑校准测试 → 再次审阅
- 用户确认无误 → 存储最终配置 → 进入 Step 1

---

### Step 1: 检查数据源与 JD 完整性

#### 1.1 数据源识别

| 输入类型 | 处理方式 |
|---------|---------|
| 飞书多维表格链接 | 通过 bitable API 读写 |
| 本地 CSV 文件 | 新建 `<原名>_判定结果.csv` |
| 本地 Excel 文件 | 新建 `<原名>_判定结果.xlsx` |
| 直接粘贴 JD | 逐条分析 |

#### 1.2 JD 信息完整性检查

对每条 JD 检查以下字段是否齐全：

| 字段 | 必要性 | 缺失影响 |
|------|--------|---------|
| 岗位名称 | **必需** | 无法判断岗位类型和 AI 提升 |
| 公司名称 | 重要 | 无法判断行业 |
| JD 描述 | **必需** | 无法进行能力维度匹配 |
| 薪资范围 | 重要 | 硬过滤可能误判 |
| 工作地点 | 重要 | 硬过滤可能误判 |
| 经验要求 | 参考 | 深度匹配精度下降 |
| 行业信息 | 参考 | 行业过滤可能误判 |

**完整性判定：**
- **完整：** 岗位名称 + JD 描述 + 薪资 + 地点 齐全
- **基本完整：** 岗位名称 + JD 描述 齐全，缺薪资或地点
- **不完整：** 缺岗位名称或 JD 描述

**处理方式：**
- **完整 / 基本完整：** 正常执行匹配，结果可信
- **不完整：** 提醒用户，说明"基于不完整信息分析，结果可能不准确"，仍执行匹配

#### 1.3 数据去重（必须）

- 按 `job_id` 或 `岗位名称+公司名称` 去重，保留首条
- 去重后统计实际总数，汇报去重数量

---

### Step 2: 读取待处理记录

1. 获取表格记录（飞书 bitable / 本地文件）
2. 过滤：排除已有"优先级判断"的记录
3. 获取准确的 `record_id`

---

### Step 3: 批量判定（每批 5 条）

对每条记录执行完整匹配流程：

#### Layer 1：硬过滤

按 [references/priority-rules.md#Layer 1：硬过滤](references/priority-rules.md) 执行：
- 薪资过滤
- 地点过滤
- 行业过滤
- 排除项检查

不通过 → 直接标记 `low`，理由说明硬过滤原因

#### Layer 2：能力维度匹配（语义聚类）

按 [references/priority-rules.md#Layer 2：能力维度匹配（语义聚类）](references/priority-rules.md) 执行：
- 使用 Step 0.4 用户确认的自定义能力维度（5-8 个）
- 每个维度有同义词簇
- 命中任一同义词 → 该维度得分 +1（不重复计分）
- 统计命中维度数

#### Layer 3：能力深度匹配

按 [references/priority-rules.md#Layer 3：能力深度匹配](references/priority-rules.md) 执行：
- 从 JD 推断岗位层级（多维信号）
- 评估候选人能力深度
- 判断深度匹配类型（精准/超配/不足）

#### 综合判定

```
Layer 1 不通过 → low
Layer 1 通过 → 结合 Layer 2 + Layer 3 综合判定
  → high / medium / low
```

判定标准参考 [references/priority-rules.md#综合判定（Layer 1-3 汇总）](references/priority-rules.md)，
**但以 Step 0.4 用户确认的标准为准。**

#### AI 关键词提升

仅检测职位名称（title），不检测职位描述（description）。
title 含 AI 关键词 → 提升 1 级（low→medium, medium→high）。
详见 [references/priority-rules.md#AI 关键词提升规则](references/priority-rules.md)。

#### 理由生成

30 字以内，格式：`[核心原因]，[辅助说明]`

---

### Step 4: 写入结果

**飞书多维表格：** 每批 5 条判定完成后立即 `batch_update`

**本地 CSV / Excel：** 创建新文件 `<原名>_判定结果.<扩展名>`
- 检查是否已有 `优先级判断` 和 `优先级判断理由` 字段，若无则追加
- 原始文件不做任何修改

**字段配置：** 见 [references/field-config.md](references/field-config.md)

失败 → 记录失败 record_id，继续下一批，最后重试

---

### Step 5: 汇报结果

简洁汇报：

```
匹配完成
总计：X 条（去重后）
high：Y 条（Z%）
medium：M 条（N%）
low：L 条（P%）
不完整 JD：N 条（结果可能不准确）
```

---

## 核心提醒

- **数据必须先去重**（按 job_id 或 岗位+公司），否则重复记录导致判定结果膨胀
- **AI 提升仅检测 title**，description 中的 AI 关键词不触发提升
- **能力维度按维度计分**，不按关键词计分，避免同义词重复膨胀
- **全链路 Agent 推理**，不使用脚本，确保语义理解准确性
- **JD 不完整时必须提醒用户**，说明结果可信度下降
- **能力维度需动态生成**，根据用户画像定制，而非使用预设维度

---

## 相关文件

| 文件 | 用途 | 何时加载 |
|------|------|---------|
| [references/candidate-profile.md](references/candidate-profile.md) | 候选人画像标准（KSAO 框架 + 能力深度模型） | Step 0.3 生成画像时 |
| [references/priority-rules.md](references/priority-rules.md) | 优先级判定规则（硬过滤 + 能力维度 + 深度匹配 + AI 规则） | Step 3 批量判定时 |
| [references/field-config.md](references/field-config.md) | 飞书多维表格字段配置 + 易错点 + 错误回滚 | Step 1 检查字段 + Step 4 写入时 |

### Assets（模板与文档）

| 文件 | 用途 |
|------|------|
| [assets/usage-guide.md](assets/usage-guide.md) | 用户使用指南（首次使用流程说明） |
| [assets/edge-cases.md](assets/edge-cases.md) | Edge Cases 与特殊情况处理 |
