设计一个高效的 Skills 管理系统,解决存储、检索、冲突检测和复用问题
---
想象这个场景:
你花了一下午写了一个"数据抓取器",能完美抓取 B 站热门视频。
一周后,你想做类似的事情,却找不到那个脚本了。于是你又写了一个"视频下载器"。
又过了一周,朋友问你有没有抓取工具,你说有,但翻遍了文件夹也找不到。
最后,你在三个不同的地方找到了三个功能相似的脚本。
问题出在哪?
没有一个好的管理系统,Skills(技能)就会散落各处,重复造轮子成为常态。
这篇文章聊聊 OpenClaw 的 Skills 管理系统设计——如何让每个 Skills 都能被快速找到、复用、迭代。
---
在讨论解决方案之前,先明确要解决的 4 个核心问题:
现状:
~/scripts/~/.config/问题: 分散存储,难以统一管理。
现状:
grep -r "bilibili" ~问题: 检索效率低,很多时候找不到现成的。
现状:
问题: 复用率低,大量重复劳动。
现状:
问题: 缺乏编排机制,协同效率低。
---
OpenClaw 采用文件夹 + Tags的混合分类方式。
skills/ ├── 01-data/ # 主分类(文件夹) │ ├── collector/ # 原子 Skills │ │ ├── skill.json # 技能定义 │ │ ├── metadata.json # 元数据 │ │ └── code/ # 代码 │ │ └── main.py │ ├── cleaner/ │ └── exporter/ ├── 02-content/ │ ├── summarizer/ │ ├── writer/ │ └── translator/ ├── 03-automation/ │ ├── scheduler/ │ └── triggered/ ├── 04-utilities/ │ ├── convert/ │ └── query/ └── archives/ # 历史版本存档pipelines/ # Pipeline 编排 ├── data-processing/ │ ├── metadata.json │ └── execution_logs/ └── content-creation/
index.json # 全局索引
1. 编号排序
01-, 02-, 03-... 便于排序和查找2. 2 层结构
01-data)collector)3. 原子 Skills
4. 历史存档
archives/ 存放旧版本---
每个 Skill 都有完整的元数据,这是高效检索的关键。
{
"id": "data-collector-v2",
"name": "数据收集器",
"name_en": "Data Collector",
"description": "从指定网站抓取结构化数据",
"primary_category": "01-data",
"tags": ["数据", "爬虫", "自动化", "底层"],
"aliases": ["scraper", "fetcher", "grabber"],
"version": "2.0",
"status": "active",
"creator": "builder",
"created_at": "2026-03-20T10:00:00+08:00",
"updated_at": "2026-03-25T15:30:00+08:00",
"last_used": "2026-03-28T09:15:00+08:00",
"usage_count": 42,
"input_schema": {
"url": {
"type": "string",
"required": true,
"description": "目标网站 URL"
},
"format": {
"type": "string",
"enum": ["json", "csv", "markdown"],
"default": "json"
}
},
"output_schema": {
"items": {"type": "array"},
"count": {"type": "number"}
},
"dependencies": ["requests", "beautifulsoup4"],
"complexity": "high",
"estimated_duration": "30s-5min"
}
| 字段 | 用途 | 示例 |
|---|
tags |
标签,用于精确检索 | ["数据", "爬虫"] |
|---|
aliases |
别名,用于容错匹配 | ["scraper", "fetcher"] |
|---|
usage_count |
使用次数,用于推荐 | 42 |
|---|
last_used |
最后使用时间 | 2026-03-28 |
|---|
input_schema |
输入参数定义 | 用于自动填充 |
|---|
output_schema |
输出格式定义 | 用于 Pipeline 连接 |
|---|
OpenClaw 采用文件夹粗筛 → Tags 精筛 → Aliases 容错的三层检索策略。
用户输入:"帮我抓取 B 站数据"
↓
┌─────────────────────────────────┐
│ Layer 1: 文件夹粗筛 │
│ 扫描 "01-data/" 分类 │
│ 快速排除无关类别 │
│ 耗时:<0.1 秒 │
└─────────────────────────────────┘
↓
┌─────────────────────────────────┐
│ Layer 2: Tags 精筛 │
│ 匹配 tags 包含"数据"或"爬虫" │
│ 计算相关性得分 │
│ 耗时:~0.5 秒 │
└─────────────────────────────────┘
↓
┌─────────────────────────────────┐
│ Layer 3: Aliases 容错 │
│ 匹配 aliases(scraper, fetcher)│
│ 处理拼写错误和同义词 │
│ 耗时:~0.3 秒 │
└─────────────────────────────────┘
↓
返回结果:
| 场景 | 检索方式 | 示例 |
|---|
| 任务驱动 | 关键词匹配 description/tags | "帮我抓取数据" → 匹配"数据"、"爬虫" |
|---|
| 避免重复 | 创建前检索 | "创建数据收集 Skills" → 提示已有类似 |
|---|
| 浏览探索 | 按分类展示 | "看看自动化 Skills" → 展示 03-automation/ |
|---|
| 类型 | 场景 | 解决方案 |
|---|
| 功能冲突 | 两个 Skills 都能做同一件事 | 优先级排序(使用频率高的优先) |
|---|
| 资源冲突 | 两个 Skills 同时占用同一文件/API | 队列机制,串行执行 |
|---|
| 输出冲突 | 两个 Skills 输出格式不一致 | 标准化接口,自动转换 |
|---|
| 版本冲突 | v1 和 v2 同时存在 | 默认用最新版,可指定旧版 |
|---|
| 检测时机 | 检测内容 | 处理方式 |
|---|
| 创建 Skills 时 | 与现有 Skills 功能重叠 | 提示相似度,建议合并/改名 |
|---|
| 创建 Pipeline 时 | Skills 选择冲突 | 人工确认,记录决策 |
|---|
| 执行 Pipeline 前 | 版本变更、依赖冲突 | 提示变更,确认继续 |
|---|
| 定期审计 | 整体重叠分析 | 生成报告,建议优化 |
|---|
场景:用户任务需要多个 Skills 配合
↓
---
单个 Skills 能力有限,多个 Skills 组合才能完成复杂任务。
{
"id": "data-processing-v1",
"name": "数据处理流程",
"description": "抓取网站数据 → 清洗 → 导出 CSV",
"steps": [
{
"order": 1,
"skill_id": "data-collector-v2",
"skill_path": "01-data/collector",
"input_mapping": {
"url": "${user.input.url}",
"format": "json"
},
"output_mapping": {
"raw_data": "${next_step.input.data}"
}
},
{
"order": 2,
"skill_id": "data-cleaner",
"skill_path": "01-data/cleaner",
"input_mapping": {
"data": "${prev_step.output.raw_data}",
"rules": ["remove_nulls", "deduplicate"]
}
},
{
"order": 3,
"skill_id": "csv-exporter",
"skill_path": "01-data/exporter",
"input_mapping": {
"data": "${prev_step.output.clean_data}",
"filename": "output_${timestamp}.csv"
}
}
],
"conditions": [
{
"type": "if",
"check": "${step1.output.count} > 0",
"then_step": 2,
"else_step": null
}
]
}
┌─────────────────────────────────────────────────────────┐ │ 可视化编排界面 │ ├─────────────────────────────────────────────────────────┤ │ │ │ 画布区域: │ │ │ │ [collector] ──→ [cleaner] ──→ [exporter] │ │ │ │ 条件分支示例: │ │ │ │ ┌─→ [email-notify] (成功时) │ │ [execute] ────┤ │ │ └─→ [error-handler] (失败时) │ │ │ │ 配置面板: │ │ - 拖拽 Skills 到画布 │ │ - 连线定义执行顺序 │ │ - 点击节点配置输入/输出映射 │ │ - 条件分支:设置判断规则(if/else) │ │ │ └─────────────────────────────────────────────────────────┘
示例:
{
"conditions": [
{
"type": "if",
"check": "${step1.output.count} > 0",
"then_step": 2,
"else_step": 3
},
{
"type": "if",
"check": "${step2.output.error_count} < 5",
"then_step": 4,
"else_step": 5
}
]
}
---
用户输入:"帮我处理网站数据"
↓
检索 Pipeline 库
↓
匹配到 "data-processing-v1" (相似度 85%)
↓
返回:"找到现成流程:抓取→清洗→导出,是否使用?"
↓
用户确认 → 执行 Pipeline
检测到用户每周一都会执行"周报生成"任务
↓
AI 主动提醒:
"检测到您每周一都会生成周报,
是否需要设置定时任务自动执行?"
用户经常使用"数据抓取器"和"情感分析器"
↓
AI 推荐:
"检测到这两个 Skills 经常一起使用,
是否创建一个 Pipeline 自动串联?"
---
用户 A 的经历:
~/scripts/bilibili.py时间成本: 3 次 × 2 小时 = 6 小时
第 1 次:创建 Skills
用户(/builder):帮我写个 B 站抓取器AI:✅ 已创建 Skill:bilibili-collector v1 路径:01-data/collector/bilibili 标签:["数据", "爬虫", "B 站"] 别名:["bilibili", "b 站", "抓取器"] 下次需要时,直接说"帮我抓取 B 站数据"即可。
第 2 次:复用 Skills
用户(/user):帮我抓取 B 站热门视频AI:✅ 找到匹配的 Skill:bilibili-collector v1 参数确认: - 关键词:AI 工作流(默认) - 数量:50 条(默认) - 格式:JSON(默认) 是否使用?
用户:确认
AI:✅ 执行中... ✅ 完成!抓取 50 条数据 📄 文件:/data/bilibili/2026-03-28.json
第 3 次:分享给朋友
朋友:你有 B 站抓取工具吗?用户:有!用我的 OpenClaw: "帮我抓取 B 站数据" AI:✅ 找到匹配的 Skill:bilibili-collector v1 开始执行...
时间成本:
节省时间: 6 小时 - 2 小时 = 4 小时
---
---
Skills 管理系统的核心价值:
| 价值 | 说明 |
|---|
| 避免重复 | 创建前检索,提示已有 Skills |
|---|
| 快速复用 | 三层检索,秒级找到 |
|---|
| 冲突解决 | 前置检测,人工确认 |
|---|
| 组合价值 | Pipeline 编排,1+1>2 |
|---|
让每个 Skills 都能被快速找到、理解、复用,形成可积累的技能资产,而非散落各处的脚本碎片。
---
下一篇预告: 《Pipeline 编排:让多个 AI 技能协同工作》
深入探讨 Pipeline 的可视化编排、条件分支、错误处理和执行监控。
---
本文基于 OpenClaw 架构设计研究报告第 5 章改写
完整报告:docs/openclaw-architecture-research-report.md