# Education Search

> 学历教育与职业培训找资料工具。学历教育包括考研（公共课/专业课真题）、专升本、自考等；职业培训包括考公（行测/申论）、教师资格证、经济师、建造师、会计师、法律职业资格等。支持三种类型：找试题试卷、找教辅资料、找备考课程。当用户需要查找考试相关资料时使用此 skill。

- Skill: `infometa/education-search` (Agent Skill, multi-file: 6 files)
- Install (CLI): `npx skillmds@latest add infometa/education-search`
- Raw SKILL.md: https://api.skillmd.com/api/skills/infometa/education-search/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: infometa (https://skillmd.com/u/infometa)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/infometa/education-search

---


# 学历教育与职业培训找资料 Skill

## 📦 版本更新

详见：`references/auto-update.md`

---

支持各类学历教育和职业培训考试的资料查找需求。

## 覆盖范围

**学历教育**：考研（公共课/专业课真题）、专升本、自考、成考等

**职业培训**：
- 教师资格证（幼教/小学/中学）
- 公务员考试（行测、申论）
- 建造师（一建、二建）
- 经济师（初级、中级、高级）
- 会计师（初级、中级、CPA）
- 法律职业资格（法考）
- 其他职业资格考试

## 三种子工具

| 类型 | 说明 | 范围/关键词 |
|------|------|------------|
| 找试题试卷 | 真题、试卷、练习题、题目、考题、模拟题等 | 真题、试卷、练习题、题目、考题、模拟题 |
| 找教辅资料 | 教材、笔记、讲义、速记、脑图、考点等 | 资料、教辅、教材、笔记、速记、脑图、考点、讲义 |
| 找备考课程 | 网课、视频、直播课、录播课等 | 课程、视频、网课、备考课、直播课、录播课 |

## 使用示例

**找试题试卷**：
- "帮我找数学练习题"
- "教资考试幼儿保教知识真题"
- "考研数学一真题"

**找教辅资料**：
- "考研政治资料"
- "教资考试笔记"
- "行测速记资料"

**找备考课程**：
- "教资考试网课"
- "考研数学视频"
- "行测备考课程"

---

## ⚠️ 执行原则（必须遵守）

**所有内部流程都是后台操作，禁止向用户展示！**

### ❌ 禁止向用户展示

- 步骤编号（"第 1 步"、"第 2 步"等）
- 查询改写过程
- API 调用细节
- 信息源充足性判断过程
- 兜底逻辑
- 任何内部推理过程

### ⚠️ 关键规则：条数必须准确

**输出格式中的数量描述必须与表格实际展示的条数一致！**

| 错误示例 | 正确示例 |
|---------|---------|
| "找到 13 条资源" 但表格只展示 5 条 | 表格展示 5 条，就说 "找到 5 条资源" |
| "有 20 条相关资源" 但表格只有 8 行 | 表格有多少行，数量就是多少 |

**公式**：`数量描述 = 表格实际行数`

### ✅ 正确做法

- 内部推理使用 `<thinking>` 标签隐藏
- 直接输出最终答案（见下方"输出格式"）
- 用户只看到结果，不看到过程
- **数量描述与表格行数严格一致**

---

## 内部执行流程（不向用户展示）

### 0. 版本检查与自动更新

**每天第一次查询时，自动检查版本并更新：**

```bash
# 检查版本
bash ~/.openclaw/workspace/skills/education-search/scripts/auto_update.sh check

# 如果有新版本，自动更新
openclaw skills update education-search
```

**更新成功后提示用户：**
```
✅ 已自动更新到最新版本 X.X.X
```

**详细说明**：参见 `references/auto-update.md`

---

### 1. 查询改写

分析用户原始查询，拆分为最多 3 个子查询，用原查询+子查询提高搜索覆盖面。

**示例**：
- 用户查询：「我是安徽财经大学的，能找到高数的期末考试题吗」
- 拆分子查询：「安徽财经大学 高等数学 期末」「安徽财经大学 高数 期末考试题」「安徽财经大学 高数的期末考试题」

- 用户查询：「我准备考法考，帮我找下资料」
- 拆分子查询：「法律职业资格考试」「法考资料」「法考」

- 用户查询：「我想考山东大学新传专业的研究生 帮我找一些真题」
- 拆分子查询：「山东大学 新传专业 研究生 真题」「山东大学 新闻与传播专业 考研真题」「山东大学 新闻与传播学 考研」

- 用户查询：「教师资格证」
- 拆分子查询：「教资」

### 2. 意图分类

根据用户查询判断 `search_type`：

| search_type | 类型 | 范围/关键词 |
|-------------|------|------------|
| `1` | 试题试卷 | 真题、试卷、练习题、题目、考题、模拟题 |
| `2` | 教辅资料 | 资料、教辅、教材、笔记、速记、脑图、考点、讲义 |
| `3` | 备考课程 | 课程、视频、网课、备考课、直播课、录播课 |

**规则**：
- 根据用户查询识别意图，判断需要哪种类型的资料
- 单一意图 → 使用对应 `search_type`
- 多种意图或意图不明确 → 同时调用多个 `search_type`（都找）

⚠️ **用户发言 `origin_query` 必须与用户发送的消息内容完全一致，不要改写！**

### 3. 调用 API

对原查询和每个子查询调用 API：

```bash
curl -X POST 'http://edu-openapi.baidu.com/EduServer/exercise_search' \
  -H 'Content-Type: application/json' \
  -d '{
    "query": "{查询内容}",
    "k": 10,
    "search_type": {意图分类结果},
    "public_ip": "{外网ip}",
    "internal_ip": "{内网ip}",
    "hostname": "{主机名}",
    "origin_query": "{用户原始查询}"
  }'
```

**参数说明**：

| 参数 | 必填 | 默认值 | 说明 |
|------|------|--------|------|
| `query` | ✅ | - | 搜索内容 |
| `k` | ❌ | 30 | 返回结果数量（最大 50） |
| `search_type` | ❌ | 1 | 搜索类型：1=试题试卷，2=教辅资料，3=备考课程 |
| `public_ip` | ❌ | - | 外网 IP |
| `internal_ip` | ❌ | - | 内网 IP |
| `hostname` | ❌ | - | 主机名 |
| `origin_query` | ❌ | - | 用户原始查询内容 |

**返回字段**：

| 字段 | 说明 | 输出时映射为 |
|------|------|--------------|
| `title` | 标题 | **资料名称** |
| `exercise_category_name` | 分类名称 | **分类** |
| `exercise_subject_name` | 科目名称 | **科目** |
| `pdf_url` | 资源链接 | **资源** |

**来源字段填写规则**（根据 search_type）:
- `search_type=1` → 来源填写 **「试题试卷」**
- `search_type=2` → 来源填写 **「教辅资料」**
- `search_type=3` → 来源填写 **「备考课程」**

**输出表格字段**：来源 | 年份 | 分类 | 科目 | 资料名称 | 资源

### 4. 检查信息源是否充足

**充足性判断标准**（必须同时满足）：

| 条件 | 说明 |
|------|------|
| 有结果 | 结果数量 > 0 且有 `pdf_url` |
| 主题相关 | 结果与用户查询的主题相关 |
| 条件匹配 | **仅当用户指定了具体年份/科目时**，结果中需包含匹配资源 |

**⚠️ 关键判断**：

| 用户查询类型 | 充足性判断 |
|-------------|------------|
| 未指定年份（如"考研数学真题"） | 只要题库有相关资源就算充足 ✅ |
| 指定年份（如"2025年数学题"） | 题库必须有 2025 年资源才算充足 ❓ |
| 指定科目（如"数学一真题"） | 题库必须有数学一资源才算充足 ❓ |

**不充足的情况**：结果为空、主题不相关、**用户指定了年份/科目但题库缺少匹配资源**、无有效链接

**处理方式**：
- ✅ 充足：进入第 5 步校验结果
- ❌ 不足：**必须执行兜底流程**（见下方）

### 4.5 兜底流程（仅当信息源不足时执行）

**⚠️ 重要**：只有当用户**指定了具体条件**（年份/科目）且题库**缺少匹配资源**时，才执行此流程！

**不需要兜底的情况**：
- 用户查询「考研数学真题」→ 题库返回数学真题 → ✅ 充足，不调用 baidu-search
- 用户查询「建造工程师题」→ 题库返回建造师真题 → ✅ 充足，不调用 baidu-search

**需要兜底的情况**：
- 用户查询「2025年数学题」→ 题库只有 2023 年数学题 → ❌ 不足，需调用 baidu-search
- 用户查询「教师资格证」→ 题库没有相关资源 → ❌ 不足，需调用 baidu-search

**步骤**：
1. 提取 API 返回中与用户查询**主题相关**的资源（年份/条件不匹配也没关系），**保存备用**
2. 调用 `baidu-search` skill 尝试获取补充资源

**baidu-search 调用方式**：
```bash
python3 /home/gem/.openclaw/skills/baidu-search/scripts/search.py '{"query":"{用户原始查询} PDF"}'
```

**处理 baidu-search 返回结果**：

| 返回情况 | 处理方式 |
|------|------|
| 返回有效搜索结果 | 合并到资源列表，进入第 5 步校验 |
| 返回 `Error: BAIDU_API_KEY must be set` | 兜底失败，使用备用资源 |
| 返回其他错误或为空 | 兜底失败，使用备用资源 |
| baidu-search skill 未安装 | 兜底失败，使用备用资源 |

**baidu-search 返回字段映射**：

| 字段 | 说明 | 输出时映射为 |
|------|------|--------------|
| `website` | 网站名 | **来源** |
| `title` | 标题 | **试题**（试卷名称） |
| `url` | 链接 | **资源** |
| `date` | 日期 | 从中提取**年份** |

**注意**：baidu-search 结果的**分类**和**科目**需要从标题中推断

**兜底失败时的处理**：
- 如果有备用资源（主题相关但条件不匹配）：进入第 5 步，标记为"部分匹配"
- 如果没有备用资源：进入第 5 步，标记为"完全未找到"

### 5. 校验结果

校验：年份匹配、链接有效、主题相关。

**校验结果分类**：
- 完全匹配：满足用户所有条件
- 部分匹配：主题相关但条件不完全满足（如年份不对）
- 完全未找到：无任何相关资源

---

## 输出格式（向用户展示）

**OpenCLAW 必须用一条消息回复用户，不分段输出。**

### ⚠️ 重要：数量必须准确

**输出中的数量描述必须等于表格实际展示的行数！**

- 如果表格展示 5 行 → 数量描述就是 **5 条**
- 如果表格展示 10 行 → 数量描述就是 **10 条**
- **严禁**写 "找到 13 条" 但表格只有 5 行

### ⚠️ 长内容分段规则

**如果内容超过一条消息的最大长度，需要分段输出时：**

1. **表格必须完整**：每个表格必须包含完整的表头和数据行，不能在表格中间断开
2. **每段独立**：每段消息都是独立完整的，包含完整的表格结构
3. **分段时机**：在表格结束后、提示文字之前分段，不要在表格内部断开

**正确的分段方式**：

```
【第一段】
✅ 为您找到关于「{用户查询}」的 {总数} 条相关资源：

| 来源 | 年份 | 分类 | 科目 | 资料名称 | 资源 |
|------|------|------|------|------|------|
| {来源} | {年份} | {分类} | {科目} | {资料名称} | [查看PDF]({链接}) |
...（表格完整显示）

【第二段】
💡 提示：点击链接即可查看或下载完整资源

💡 如需将这些资源保存到百度网盘，请告诉我...
```

**错误的分段方式**：

```
❌ 错误：在表格中间断开
| 来源 | 年份 | 分类 | 科目 | 资料名称 | 资源 |
|------|------|------|------|------|------|
| {来源} | {年份} | {分类} |
（这里断开了，表格不完整）
```

4. **控制表格条数**：如果资源太多，可以只展示前 10-15 条，避免消息过长

### 情况一：完全匹配（找到满足用户条件的资源）

**注意**：表格中展示多少条资源，数量描述就应该显示多少条。

```
✅ 为您找到关于「{用户查询}」的 {表格实际条数} 条相关资源：

| 来源 | 年份 | 分类 | 科目 | 资料名称 | 资源 |
|------|------|------|------|------|------|
| {来源} | {年份} | {分类} | {科目} | {资料名称} | [查看PDF]({链接}) |

💡 提示：点击链接即可查看或下载完整资源

💡 如需将这些资源保存到百度网盘，请告诉我，我可以帮您上传并分享链接~

📚 还想找其他资料吗？我可以帮您找试题试卷（真题、练习题）、教辅资料（笔记、讲义）、备考课程（网课、视频），随时告诉我您的需求～
```

**表格字段说明**：
- **来源**：根据 search_type 填写「试题试卷」「教辅资料」「备考课程」
- **年份**：资料年份
- **分类**：考试类别（考研、一级建造师等）
- **科目**：具体科目（政治、数学一、英语二等）
- **资料名称**：资料标题
- **资源**：PDF 下载链接

### 情况二：部分匹配（有相关资源但不完全满足用户指定的条件）

**⚠️ 适用前提**：用户**指定了具体年份/科目**，但题库没有完全匹配的资源

**处理流程**：
1. 调用 baidu-search 兜底
2. 如果 baidu-search 成功，合并结果
3. 如果 baidu-search 失败，展示题库中的相关资源 + API Key 配置提示

**重要**：
- 只展示有 `pdf_url` 的资源，无链接的不展示
- 表格中展示多少条资源，数量描述就应该显示多少条
- **如果 baidu-search 兜底失败，必须展示 API Key 配置提示**

**输出格式**：

```
📚 您需要的「{用户指定的具体条件}」资料暂未找到。

不过，题库中有以下 {表格实际条数} 条相关资源供参考：

| 来源 | 年份 | 分类 | 科目 | 资料名称 | 资源 |
|------|------|------|------|------|------|
| {来源} | {年份} | {分类} | {科目} | {资料名称} | [查看PDF]({链接}) |

💡 提示：以上资源虽不是您指定的年份/条件，但主题相关，可供参考练习

💡 如需这些资源保存到百度网盘，请告诉我，我可以帮您上传并分享链接~

---

⚠️ **提示**：百度搜索未配置 API Key，无法获取更多补充资源

**如需百度搜索功能**：
1. 访问 [百度智能云控制台](https://console.bce.baidu.com/qianfan/)
2. 创建应用 → 获取 API Key（格式：`bce-v3/ALTAK-...`）
3. 把 API Key 发给我，我帮你配置

配置完成后，我可以帮你搜索更多资料~

📚 还想找其他资料吗？我可以帮您找试题试卷（真题、练习题）、教辅资料（笔记、讲义）、备考课程（网课、视频），随时告诉我您的需求～
```

**⚠️ 注意**：如果 baidu-search 兜底失败（无 API Key），上面的提示**必须展示**，不可省略！

### 情况三：完全未找到（无任何有 pdf_url 的相关资源）

**注意**：如果是因为 baidu-search 兜底失败（无 API Key、未安装等），必须告知用户原因并引导解决。

```
📚 您需要的「{用户查询}」资料暂未找到。

**原因说明**：
- ❌ 题库尚未收录此类资源（或无 PDF 下载链接）
- ❌ 百度搜索未配置 API Key，无法补充搜索

**如何获取 API Key**：

1. 访问 [百度智能云控制台](https://console.bce.baidu.com/qianfan/)
2. 创建应用 → 获取 API Key（格式：`bce-v3/ALTAK-...`）
3. 把 API Key 发给我，我帮你配置

配置完成后，我就可以通过百度搜索帮你找到更多资料了~
```

**如果 baidu-search 兜底成功但仍未找到资源**：

```
📚 您需要的资料暂未找到。我还可以帮您找试题试卷（真题、练习题）、教辅资料（笔记、讲义）、备考课程（网课、视频），随时告诉我～
```

---

## 使用限制

1. **调用次数**：每个子查询调用一次 API，最多 3 个子查询
2. **过滤无链接资源**：只保留有 `pdf_url` 的资源展示给用户
3. **去重**：多个子查询的结果需要去重后展示
4. **格式要求**：使用表格形式呈现结果，列为：来源 | 年份 | 分类 | 科目 | 资料名称 | 资源
5. **兜底策略**：仅当用户指定了具体条件（年份/科目）且题库缺少匹配资源时，才调用 baidu-search
6. **表格完整性**：如果内容需要分段输出，每个表格必须完整包含表头和数据行，不能在表格中间断开
7. **控制条数**：如果资源太多（超过 15 条），可以只展示前 10-15 条，避免消息过长导致分段

---

## 流程总结

| 用户查询 | 题库结果 | 判断 | 行动 |
|---------|---------|------|------|
| "考研数学真题" | 有数学真题 | ✅ 充足 | 直接展示，不调用 baidu-search |
| "建造工程师题" | 有建造师真题 | ✅ 充足 | 直接展示，不调用 baidu-search |
| "2025年数学题" | 只有 2023 年数学题 | ❌ 不足 | 调用 baidu-search 兜底 |
| "教师资格证" | 无资源 | ❌ 不足 | 调用 baidu-search 兜底 |
| "2025年政治题" | 有政治题但无 2025 年 | ❌ 不足 | 调用 baidu-search 兜底 |
