# Recruitment Processor

> 自动处理多份招聘markdown文档，识别文档中的图片内容（包括在线图片链接），提取关键信息（职位、薪资、截止时间等），根据用户条件筛选，生成结构化总结报告

- Skill: `morning-start/recruitment-processor` (Agent Skill, multi-file: 4 files)
- Install (CLI): `npx skillmds@latest add morning-start/recruitment-processor`
- Raw SKILL.md: https://api.skillmd.com/api/skills/morning-start/recruitment-processor/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Docs & Writing
- Author: morning-start (https://skillmd.com/u/morning-start)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/morning-start/recruitment-processor

---


# 招聘信息处理Skill

## 任务目标
- 本Skill用于：批量处理包含招聘信息的markdown文档，自动识别图片内容（包括本地图片和在线图片链接），提取关键信息，根据条件筛选并生成结构化报告
- 能力包含：文件路径识别与扫描、自适应分批处理、图片链接识别、图片下载、图片识别与OCR、文本理解、信息提取、条件匹配、进度跟踪、完整性验证、报告生成
- 触发条件：用户提供招聘markdown文档（单个文件或文件夹）及筛选条件

## 前置准备
- 依赖说明：图片下载功能依赖requests库，版本>=2.28.0

## 操作步骤

### 标准流程

#### 阶段一：文件扫描与规划

1. **输入路径识别**
   - 判断用户提供的路径是：
     - 单个文件：直接添加到处理列表
     - 文件夹：扫描文件夹内所有markdown文件
   - 记录文件类型和路径

2. **文件扫描（针对文件夹）**
   - 如果是文件夹，扫描该目录下的所有markdown文件
   - 支持的文件扩展名：`.md`, `.markdown`
   - 递归扫描子目录（可选，根据用户需求决定）
   - 记录所有文件的完整路径
   - **必须扫描所有文件，不得遗漏**

3. **数量评估与分批决策**
   - 统计需要处理的文档总数
   - **自适应分批规则**：
     - 文档数量 ≤ 10：一次性处理所有文档
     - 文档数量 > 10：分批处理，每批处理10个文档
   - 计算需要分多少批
   - 记录批次规划：总批次、每批文件列表

4. **进度跟踪初始化**
   - 记录以下信息：
     - 总文件数
     - 已处理数（初始为0）
     - 待处理数（初始为总文件数）
     - 当前批次（初始为0）
     - 成功处理数（初始为0）
     - 失败处理数（初始为0）

#### 阶段二：分批处理文档

5. **批次循环处理**
   对于每个批次（按顺序执行）：

   **5.1 批次初始化**
   - 当前批次编号 += 1
   - 确定本批次处理的文件列表（按编号顺序取10个或剩余文件）
   - 报告本批次进度："正在处理第X批，共Y批，文件数Z个"

   **5.2 逐个文档处理**
   对于本批次中的每个招聘文档，**必须完整处理，不得跳过**：

   **5.2.1 图片链接识别与提取**
   - 扫描文档中所有图片引用，识别两种格式：
     - 本地图片：`
![alt](local_path.png)
`
     - 在线图片：`
![alt](https://example.com/image.jpg)
`
   - 提取所有图片的URL或路径
   - 记录图片在文档中的位置和上下文

   **5.2.2 在线图片下载**
   对于每个在线图片链接：
   - 调用 `python /workspace/projects/recruitment-processor/scripts/download_image.py --image-url <URL> --output-dir ./downloaded_images`
   - 捕获下载结果，获取本地保存路径
   - 如下载失败，记录错误但继续处理其他图片
   - 记录图片来源（在线下载/本地文件）

   **5.2.3 图片识别与内容提取**
   - 对于所有可访问的图片（下载成功的在线图片和本地图片）
   - 使用图像识别能力提取每张图片中的文字信息
   - **必须逐一识别所有图片，不得遗漏任何一张**
   - 记录图片内容与上下文的对应关系
   - 标注每张图片的信息来源

   **5.2.4 文本理解与整合**
   - 阅读文档文本内容
   - 将图片识别的文字信息与文本内容进行整合理解
   - **确保文本和图片信息都被充分利用**
   - 形成对该招聘文档的完整认知

   **5.2.5 关键信息提取**
   提取以下信息（如文档中未明确提及某项信息，标注"未提及"）：
   - 职位名称
   - 公司名称
   - 薪资待遇（明确范围或具体数值）
   - 截止时间
   - 发布时间
   - 企业性质（国企/民企/外企/事业单位等）
   - 工作地点
   - 学历要求
   - 工作经验要求
   - 岗位职责
   - 任职要求
   - 图片数量及来源统计

   **5.2.6 错误处理**
   - 如果某个文件处理失败：
     - 记录失败原因
     - 失败处理数 += 1
     - **不影响其他文件的处理，继续处理批次中的剩余文件**

   - 如果文件处理成功：
     - 成功处理数 += 1
     - 将提取的信息暂存

   **5.3 批次进度更新**
   - 已处理数 += 本批次文件数
   - 待处理数 = 总文件数 - 已处理数
   - 报告批次进度："第X批完成，已处理A个文件，待处理B个文件"

#### 阶段三：条件筛选与汇总

6. **条件筛选**
   - 读取用户提供的筛选条件（参考筛选条件模板格式）
   - 对所有成功提取的招聘信息进行条件匹配
   - 严格判断是否符合所有筛选条件
   - 保留所有符合条件的信息，剔除不符合的
   - **每个文档都必须经过筛选判断，不得跳过**

7. **完整性验证**
   - 验证处理结果：
     - 已处理数 + 待处理数 = 总文件数
     - 每个文件都有处理结果（成功或失败）
   - 如果发现遗漏：
     - 立即补充处理遗漏的文件
     - 更新进度跟踪信息
   - **必须确保所有文件都经过审查，不得有任何遗漏**

8. **生成总结文档**
   对筛选后的所有招聘信息生成结构化总结报告，包含：

   **8.1 报告概览**
   - 处理的文档总数
   - 批次处理情况：总批次数、每批文件数
   - 成功处理的文档数量
   - 失败的文档数量及失败原因列表
   - 提取的图片总数（在线图片/本地图片）
   - 筛选符合条件的数量
   - 处理时间

   **8.2 招聘信息列表**
   对每个符合条件的招聘信息，按以下格式呈现：

   ```
   ## [职位名称] - [公司名称]

   **基本信息**
   - 薪资待遇：[具体数值或范围]
   - 企业性质：[国企/民企/外企等]
   - 工作地点：[城市/地区]

   **时间信息**
   - 截止时间：[具体日期]
   - 发布时间：[具体日期]

   **要求信息**
   - 学历要求：[学历层次]
   - 工作经验：[年限要求]

   **岗位详情**
   - 岗位职责：[摘要]
   - 任职要求：[摘要]

   **图片信息**
   - 图片总数：[数量]张（在线图片X张，本地图片Y张）
   - 图片来源标注：[哪些关键信息来源于图片]

   ---
   ```

   **8.3 失败文件列表**
   - 列出所有处理失败的文件
   - 说明每个文件的失败原因
   - 提供可能的解决方案

   **8.4 处理进度报告**
   - 批次处理时间线
   - 每批处理的文件列表
   - 进度跟踪信息

   **8.5 注意事项**
   - 标注信息来源于图片或文本
   - 标注缺失的关键信息
   - 说明图片下载和识别的情况

9. **输出结果**
   - 将总结文档输出为markdown格式
   - 文件名格式：招聘信息总结_YYYYMMDD_HHMMSS.md

## 资源索引
- 必要脚本：见 [scripts/download_image.py](scripts/download_image.py)（用途：从URL下载在线图片，参数：--image-url <URL> --output-dir <目录>）
- 筛选条件模板：见 [references/筛选条件模板.md](references/筛选条件模板.md)（用途：定义筛选条件的标准格式）
- 信息提取指南：见 [references/信息提取指南.md](references/信息提取指南.md)（用途：指导如何准确提取关键信息）

## 注意事项

### 完整性要求（最高优先级）
- **必须完整读取所有提供的文档，严禁跳过任何文档**
- **必须逐一识别文档中的所有图片，不得遗漏任何一张**
- **必须处理所有图片链接，包括本地图片和在线图片**
- **必须确保所有文件都经过审查，不得有任何遗漏**
- 处理完成后必须进行完整性验证

### 自适应分批处理
- 根据文档数量自动选择处理策略：
  - 少量文档（≤10）：一次性处理
  - 大量文档（>10）：分批处理，每批10个
- 分批处理时严格按顺序执行，不跳过任何批次
- 每批处理完成后报告进度
- 如果某批处理失败，不影响后续批次的处理
- 所有批次完成后统一进行筛选和汇总

### 进度跟踪
- 实时跟踪处理进度
- 记录每个文件的处理状态
- 每批次完成后更新进度信息
- 便于监控整体处理情况和排查问题

### 错误处理
- 单个文件处理失败不影响其他文件
- 记录所有失败的文件和失败原因
- 在总结文档中单独列出失败文件
- 提供错误原因和可能的解决方案

### 图片链接处理
- 识别markdown中的图片语法：
![alt](url)
  - 区分本地图片路径和在线URL
  - 在线图片必须先下载到本地再进行识别
  - 下载失败的图片要记录错误但不影响整体处理

### 图片识别准确性
- 仔细核对图片提取的文字与上下文的一致性，必要时多次识别确保准确性

### 条件筛选严格性
- 用户提出的每个条件都必须严格满足，部分不符合即视为不符合

### 信息缺失处理
- 对于文档中未明确提及的信息，必须标注"未提及"，不要主观推断

### 时间格式统一
- 所有时间信息统一为YYYY-MM-DD格式

### 薪资格式规范
- 薪资信息应包含数值范围和单位（如：15-25K/月，年薪30-40万）

## 使用示例

### 示例1：处理单个文件
- **功能说明**：用户提供单个markdown文件
- **执行方式**：一次性处理
- **关键要点**：
  - 直接读取文件内容
  - 完整处理所有图片
  - 提取关键信息
  - 进行条件筛选
- **筛选条件**：
  ```
  薪资范围：15-25K/月
  企业性质：国企
  ```

### 示例2：处理少量文件（≤10个）
- **功能说明**：用户提供包含5个markdown文件的文件夹
- **执行方式**：一次性处理
- **关键要点**：
  - 扫描文件夹内所有markdown文件
  - 文档数量≤10，一次性处理
  - 逐个处理每个文件
  - 统一进行筛选和汇总
- **筛选条件**：
  ```
  工作地点：北京
  学历要求：本科及以上
  ```

### 示例3：处理大量文件（>10个）- 分批处理
- **功能说明**：用户提供包含25个markdown文件的文件夹
- **执行方式**：分批处理（3批：10+10+5）
- **关键要点**：
  - 扫描文件夹，识别25个文件
  - 文档数量>10，自动分批
  - 第1批：处理文件1-10
  - 第2批：处理文件11-20
  - 第3批：处理文件21-25
  - 每批处理完成后报告进度
  - 所有批次完成后统一筛选
  - **确保所有文件都经过审查**
- **筛选条件**：
  ```
  薪资范围：15-25K/月
  企业性质：国企
  ```

### 示例4：处理包含在线图片的文档
- **功能说明**：文档中包含在线图片链接，需要先下载再识别
- **执行方式**：智能体调用脚本下载图片 + 智能体识别
- **关键要点**：
  - 识别markdown中的图片URL
  - 调用download_image.py下载图片
  - 识别下载后的图片内容
  - 记录图片来源为"在线下载"
- **筛选条件**：
  ```
  薪资范围：15-25K/月
  企业性质：国企
  ```

### 示例5：多条件组合筛选
- **功能说明**：筛选北京地区的、本科学历、1-3年经验的技术岗位
- **执行方式**：智能体处理
- **关键要点**：
  - 地点信息可能在正文或图片中
  - 工作经验要求可能模糊表述（如"应届生可"、"有相关经验者优先"），需要准确判断
  - 学历要求可能有多个层次，选取最低要求作为筛选依据
  - 逐一识别所有图片，确保不遗漏关键信息
  - 严格按分批逻辑处理所有文件
- **筛选条件**：
  ```
  工作地点：北京
  学历要求：本科及以上
  工作经验：1-3年
  职位类型：技术岗位
  ```

### 示例6：处理混合图片来源的文档
- **功能说明**：文档中同时包含本地图片和在线图片链接
- **执行方式**：智能体调用脚本下载在线图片 + 智能体识别所有图片
- **关键要点**：
  - 区分本地图片和在线图片
  - 下载所有在线图片
  - 逐一识别所有图片（本地+下载）
  - 在总结中标注图片来源
  - **确保所有图片都被识别**
- **筛选条件**：
  ```
  无特殊条件，仅提取信息
  ```

## 分批处理流程示例

### 场景：处理30个文件的文件夹

**阶段一：文件扫描与规划**
- 扫描文件夹，发现30个markdown文件
- 文档数量 > 10，决定分批处理
- 计算批次：30个文件，每批10个，共3批
- 初始化进度：总文件数=30，已处理=0，待处理=30

**阶段二：分批处理**

**第1批处理**
- 当前批次=1，处理文件1-10
- 扫描文件1-10，识别图片，提取信息
- 处理结果：成功10个，失败0个
- 更新进度：已处理=10，待处理=20
- 报告："第1批完成，已处理10个文件，待处理20个文件"

**第2批处理**
- 当前批次=2，处理文件11-20
- 扫描文件11-20，识别图片，提取信息
- 处理结果：成功9个，失败1个（文件15损坏）
- 更新进度：已处理=20，待处理=10
- 报告："第2批完成，已处理20个文件，待处理10个文件"

**第3批处理**
- 当前批次=3，处理文件21-30
- 扫描文件21-30，识别图片，提取信息
- 处理结果：成功10个，失败0个
- 更新进度：已处理=30，待处理=0
- 报告："第3批完成，已处理30个文件，待处理0个文件"

**阶段三：条件筛选与汇总**
- 对29个成功处理的招聘信息进行条件筛选
- 完整性验证：已处理30个=总文件数30个，验证通过
- 生成总结文档，包含：
  - 处理概览：总30个，成功29个，失败1个
  - 符合条件的招聘信息列表
  - 失败文件列表（文件15：文件损坏）
  - 批次处理进度报告

## 图片下载脚本使用说明

### 调用方式
```bash
python /workspace/projects/recruitment-processor/scripts/download_image.py --image-url <图片URL> --output-dir <输出目录>
```

### 参数说明
- `--image-url`：必填，图片的URL地址
- `--output-dir`：可选，图片保存目录，默认为`./downloaded_images`

### 返回结果
- 成功：输出`SUCCESS:<本地路径>`
- 失败：输出`ERROR:<错误信息>`到标准错误流

### 使用场景
当文档中包含在线图片链接（如`https://example.com/image.jpg`）时，先调用此脚本下载图片，然后对下载后的本地文件进行图像识别。

### 示例
```bash
# 下载图片到默认目录
python /workspace/projects/recruitment-processor/scripts/download_image.py --image-url https://example.com/salary.jpg

# 下载图片到指定目录
python /workspace/projects/recruitment-processor/scripts/download_image.py --image-url https://example.com/salary.jpg --output-dir ./temp_images
```

