SkillCraft 深度体验报告:当 AI 学会"积累经验"
项目概况
SkillCraft 是 Roboflow 和 CMU 研究团队发布的基准测试,专门评估 LLM Agent 的"技能习得"能力——不是简单地调用工具,而是能否在执行任务的过程中,识别出可复用的工具组合,将其封装为"技能",并在后续任务中复用这些技能。
- 📄 论文:arXiv:2603.00718
- 💻 代码:https://github.com/shiqichen17/SkillCraft
- 🌐 官网:https://skillcraft-website.github.io/page/
核心创新:从"原子操作"到"技能沉淀"
传统 Agent 的困境
想象一个 AI 助手接到任务:"收集 10 个猫品种的信息,包括特征、亲属关系和被毛类型"。传统做法是什么?
循环 10 次:
调用 API-1 获取品种特征
调用 API-2 获取亲属关系
调用 API-3 获取被毛类型
整理数据
30 次 API 调用,大量重复逻辑,Token 爆炸。
SkillCraft 的思路
第一次任务(学习阶段):
- Agent 执行一遍完整流程
- 发现"获取品种完整信息"是一个可复用的模式
- 调用
save_skill保存为技能:get_breed_full_profile(breed_name)
- 直接调用
execute_skill执行已保存的技能 - 10 个品种 = 10 次技能调用,而非 30 次原子调用
- 论文报告:最高减少 80% Token 消耗
技术架构拆解
1. 基础框架
- OpenAI Agents SDK:Agent 运行时
- MCP 协议:工具调用标准(Model Context Protocol)
- Python 3.12:要求精确版本
2. 核心组件
| 文件 | 职责 | 亮点 |
|---|---|---|
skill_cache.py | 技能的增删改查 | ToolBridge + ToolCallQueue 双机制 |
skill_analyzer.py | 技能复杂度分析 | 自定义复杂度公式 |
runner.py | 任务执行引擎 | 支持断点续跑 |
evaluator.py | 结果评估 | 多维度成功率统计 |
3. 四个核心工具
tool_save_skill # 保存技能(Python 脚本形式)
tool_execute_skill # 执行已保存技能
tool_get_skill # 查看技能代码
tool_list_skills # 列出所有技能
4. 技能的本质
技能是一段 Python 脚本,而非简单的 JSON 配置:
# 示例:一个保存的技能
data = call_tool('catfacts_breed_profile', breed=breed_name)
relatives = call_tool('catfacts_breed_relatives', breed=breed_name)
coat = call_tool('catfacts_breed_coat_family', breed=breed_name)
result = {
'breed': breed_name,
'profile': data,
'relatives': relatives,
'coat': coat
}
关键设计:技能内部可以调用其他工具(包括其他技能),形成嵌套复用。
5. ToolBridge:同步调用异步工具
MCP 工具都是异步的,但技能脚本是同步执行的。怎么解决?
class ToolCallQueue:
"""队列桥接模式"""
# 技能线程将请求放入队列
# 主事件循环消费队列、执行异步调用
# 结果通过 Event 通知回技能线程
精巧的设计:既保持了技能脚本的简洁性(同步写法),又不阻塞事件循环。
---
任务设计:渐进式难度
21 个任务族
每个任务族有 6 个难度级别:
- e1-e3 (easy):简单、中等、困难
- m1-m2 (medium):更长的工具链
- h1 (hard):最大复杂度
两种扩展维度
| 维度 | 说明 | 示例 |
|---|---|---|
| 数量扩展 | 处理更多实体 | 3 个品种 → 10 个品种 → 50 个品种 |
| 结构扩展 | 更复杂的子任务链 | 3 步操作 → 6 步操作 → 10 步操作 |
示例任务:cat-facts-collector
{
"task_type": "SingleUserTurn",
"needed_mcp_servers": ["filesystem"],
"needed_local_tools": ["catfacts_api", "skill_cache", "claim_done"],
"difficulty": "easy",
"estimated_api_calls": 9, // 3 品种 × 3 API
"subtask_count": 3,
"calls_per_subtask": 3
}
---
本地体验实录
环境准备
机器配置:
- Ubuntu Linux,Python 3.12.11
- 3.8G 内存,1G swap
- Node.js 22(已装)
依赖安装:一波三折
第一次尝试:uv sync
- 结果:进程被 SIGKILL(OOM)
- 分析:uv.lock 里有 100+ 个包,解析依赖树时内存爆炸
uv pip install --no-cache openai-agents mcp pydantic numpy pandas pyyaml aiohttp httpx
uv pip install --no-cache addict jsonlines termcolor
- 结果:✅ 成功
- 最终 venv 大小:164M(核心依赖)
配置挑战
运行需要大量 API key:
- LLM:OpenRouter / Anthropic / OpenAI
- 工具:GitHub, HuggingFace, Notion, Google Cloud
- 搜索:Serper
- 可选:Snowflake, Kubernetes
代码阅读收获
虽然没跑通完整任务,但深度阅读代码后有几个发现:
1. 技能复杂度计算公式(skill_analyzer.py)
complexity_score = (
tool_calls × 3 +
loops × 2 +
conditionals × 1 +
lines_of_code / 5
)
这个公式合理:工具调用最贵,循环次之,条件判断再次,代码长度影响最小。
2. 质量检查机制(skill_cache.py)
def check_result_quality(result):
# 检查结果是否低质量
# 比如太多 "Unknown", "None", "N/A"
# 或者数值字段全为 0
Agent 保存技能后,系统会分析执行结果质量,避免保存"空壳技能"。
3. 迭代修复机制
MAX_SKILL_ITERATIONS = 3 # 最大修改次数
如果技能保存后有语法错误或执行失败,Agent 可以读取错误信息、修改代码、重新保存,最多 3 次迭代。
---
优点与局限
做得好的地方
1. 架构清晰:模块化程度高,职责分离明确 2. 协议先进:基于 MCP,工具调用标准化 3. 统计完善:Token 消耗、API 调用次数、技能复杂度、成功率全覆盖 4. 扩展性强:支持跨任务复用、跨模型复用、静态技能加载
门槛较高的地方
1. 依赖繁重:100+ 个包,包含 Google Cloud、Snowflake、Kubernetes 等重型 SDK 2. 配置复杂:需要申请大量外部 API key 3. 资源要求高:uv sync 需要 4G+ 内存 4. 调试困难:生成的 Python 脚本可能有语法错误,需要看日志排查
待验证的宣称
论文报告"最高 80% Token 减少",但:
- 具体是哪个任务?什么难度级别?
- Base mode 和 Skill mode 的准确率对比如何?
- 技能学习的 overhead(第一次任务多花的 Token)算进去了吗?
---
总结:一个值得关注的方向
SkillCraft 解决的是真实问题:Agent 在实际业务中,确实会面对大量重复性的工具调用模式。如果 AI 能自己识别这些模式、沉淀为可复用技能,将大幅提升效率。
适用场景:
- 数据收集类任务(反复调用同一批 API)
- 报表生成类任务(固定流程,不同数据源)
- 内容审核类任务(标准化检查流程)
---
快速开始(最小可行步骤)
如果你也想体验:
# 1. 克隆仓库
git clone https://github.com/shiqichen17/SkillCraft.git
cd SkillCraft
# 2. 创建 venv(不要用 uv sync,内存不够)
uv venv --python 3.12.11
source .venv/bin/activate
# 3. 分批安装核心依赖
uv pip install openai-agents mcp pydantic numpy pandas pyyaml aiohttp httpx
uv pip install addict jsonlines termcolor
# 4. 配置 API key
cp .env .env.local
# 编辑 .env.local,填入 OpenRouter API key
# 5. 运行简单任务
bash run.sh scaled_tasks/cat-facts-collector/e1 base \
--model claude-3.5-sonnet \
--provider openrouter
注意:部分任务需要额外的 MCP 服务器(如 filesystem、gitlab),需要 Node.js 环境运行 npx 命令启动。
---
参考链接
- 论文:https://arxiv.org/abs/2603.00718
- 代码:https://github.com/shiqichen17/SkillCraft
- 官网:https://skillcraft-website.github.io/page/
*体验环境:Ubuntu 22.04, Python 3.12.11, 3.8G RAM* *体验时间:2025年3月24日*