用 Claude 写 CUDA 核,再教给开源模型
智能体技能(Agent Skills)最棒的地方在于,它能帮你解决难题。这可以从两个角度看:
- 你可以用 Claude Opus 4.5 这类顶级模型去攻克最棘手的任务。
- 你可以让能在你笔记本上运行的模型,通过技能学习去处理更困难的问题。
这篇博客将聚焦于后者,展示如何使用一个新工具 upskill,来生成和评估智能体技能,并让更小的模型也能用上这些技能。我们以编写 diffusers 模型 CUDA 核(CUDA kernels)的任务来测试 upskill,但这个过程同样适用于降低成本,或让小型模型处理特定领域的难题。
什么是智能体技能?
简单说,智能体技能就是把模型的上下文定义成文件,比如用 Markdown 写说明,用脚本写代码。这种文件格式让技能易于生成、分享和审查。本质上,它是一种在不同模型和工具间共享能力的实用媒介,在特定领域或难题上尤其有用。
本文将通过一个具体案例来展示这个过程:用 Claude 生成一个技能文件,然后让开源模型用这个技能来完成一项复杂且专业的任务——编写 CUDA 核。我们最初尝试了一个基于现有文档的基础技能,发现它能提升部分模型的性能,但并非全部。在某些情况下,它甚至可能降低性能或增加 token 消耗。下图展示了模型在使用基础技能前后的性能对比。
接下来,我们一步步看看如何用 upskill 来提升智能体处理难题的能力,并测量其效果。
1. 让“老师”(Claude Opus 4.5)编写一个核
首先,我们用 Claude Code 交互式地构建一个核,并导出执行轨迹(trace)。我们通过指令、验证和添加文档链接来完成这个过程。这个看似简单的步骤很重要,它能揭示模型最初遇到的挑战。事实上,你可以多次迭代这个过程:用技能的草稿版本尝试解决任务,并用更小的模型进行测试。每次你都可以指导智能体改进技能,并在小模型上测试。
这是我们创建并用来构建核的技能示例。我们从这个智能体执行轨迹开始,其中智能体在少量帮助下成功构建了一个核。
2. 从执行轨迹创建智能体技能
一旦“老师”模型完成了任务,我们需要让它生成一个技能。有几种有效的方法:
- 在同一会话中,指示智能体为它刚完成的任务创建一个技能文件。
- 使用 Anthropic 的‘技能创建者’技能,可以在原会话内,也可以基于导出的轨迹开启新会话。
- 使用
upskill工具基于轨迹创建技能。
大多数情况下,前两种方法能生成可用的技能。但智能体使用该技能后的性能是未知的。这正是 upskill 的用武之地,因为它还会根据轨迹为你的技能生成测试用例。然后,它会比较两种场景下的结果:使用原始轨迹,或应用技能。如下图所示,原始模型(Claude Opus)在使用技能前后的表现相同。这意味着该技能为这个模型成功捕获了任务。很好!
3. 将你的技能带给开源、更小或更便宜的模型
最后,我们需要将新创建的技能迁移到我们打算使用的工具或模型上。像 codex、cursor 和 opencode 这类工具大多采用一致的技能格式,即一个位于 {agent}/skills/{skill_name}/SKILL.md 的目录,所以我们只需要将技能目录复制到这个位置。
使用 upskill,我们可以通过 eval 命令传入一个技能和一组模型,upskill 会在这些模型上运行测试用例,比较它们在使用技能前后的性能。从下图可以看到,该技能提高了一些开源模型的准确率,但并非对所有模型都有效。
在这种情况下,我们可能想通过重新生成技能来进一步迭代针对 gpt-oss 的技能。我们可以执行 upskill generate --from {skill}。
智能体技能的价值不止于模型性能。通常,智能体无论是否使用技能都能达到某个准确率,但可能需要消耗更多 token 才能达到。对于重复性任务,我们希望优化智能体,使其用更少的 token 达到相同的准确率。下面的结果揭示了技能的另一个维度。一些模型在使用技能后显著减少了 token 消耗,而另一些模型用了技能后 token 消耗反而增加了。例如,对于 moonshotai/Kimi-K2-Thinking,该技能在准确率和 token 消耗方面都明显有效。然而,对于 Claude Opus 4.5,性能没有明显提升,token 消耗却增加了,所以你肯定不会想对 Claude Opus 4.5 使用这个技能。
简单说: 用你创建的技能去尝试和评估模型。使用 upskill eval 或类似工具来评估模型在使用技能前后的性能。
以上就是用技能提升编码智能体处理难题能力的端到端高级概述。现在就可以这样试试 upskill:
# 安装 upskill
pip install upskill
# 或者用 uvx 一次性运行
uvx upskill --help
# 基于智能体执行轨迹生成技能
upskill generate "write nvidia kernels" --from ./trace.md
# 在模型上评估技能
upskill eval ./skills/my-skill/ --model haiku --model sonnet
# 为本地模型生成技能
upskill generate "parse YAML" \
--model opus \
--eval-model "unsloth/GLM-4.7-Flash-GGUF:Q4_0" \
--eval-base-url http://localhost:8080/v1
用智能体技能构建核的深度教程
我们已经对如何提升智能体能力有了高层理解。现在来看看我们为解决编写 CUDA 核这个用例所做的具体工作。
我们不只是想写核代码,还想理解完整的核构建器(kernel-builder)工作流:项目结构、build.toml 配置、针对特定架构的优化以及 PyTorch 绑定。本教程展示了 upskill 如何创建经过验证且真正有效的技能。
kernel-builder-cuda-kernels 这个技能教会了 Claude 关于 CUDA 开发所需的一切:针对哪种 GPU 架构、如何构建核构建器项目、何时使用共享内存而非寄存器,以及如何编写 PyTorch 绑定。
有了这个技能,你可以这样告诉 Claude:
Build a fused LayerNorm + GELU kernel optimized for H100.
Claude 就会创建完整的项目结构、CUDA 实现和构建配置——完全遵循核构建器所期望的规范。
这不仅仅是生成样板代码。该技能编码了领域专业知识:H100 使用计算能力 9.0,共享内存应对齐到 128 字节,异步内存拷贝需要 __CUDA_ARCH__ >= 900。这些需要花费数小时从文档中搜集的知识,被打包成约 500 个 token,可以按需加载。
设置与安装
安装 upskill:
pip install upskill
# 或者用 uvx 一次性运行
uvx upskill --help
设置你的 API 密钥:
export ANTHROPIC_API_KEY=sk-ant-...
export HF_TOKEN=hf_...
就这样。Upskill 默认使用 Anthropic Claude Opus-4.5 模型,但也支持 OpenAI 和通过 OpenAI 兼容端点访问的本地模型作为生成器。我们的思路是用更贵、质量更高的模型来生成技能,然后用更小的模型来使用它们。有点“劫富济贫”的意思。
技能生成
我们一步步来看看如何生成一个能教智能体使用 HuggingFace 的 kernels 库构建 CUDA 核的技能。
生成技能
从一个清晰的任务描述开始:
upskill generate "build optimized CUDA kernels for PyTorch using HuggingFace kernel-builder"
上面我们用了 upskill,但实际上也可以是任何智能体或聊天工具以及导出的轨迹。
upskill generate "write kernels" --from <agent-trace>.md
我们也可以从现有技能开始并添加内容:
upskill generate "add more error handling and edge cases" \
--from ./skills/kernel-builder-cuda-kernels/
upskill 会加载现有技能,应用你的改进,并重新评估以确保改动有帮助。
upskill 会创建一个技能,生成测试用例,评估性能,并根据失败情况进行优化:
Generating skill with sonnet...
Generating test cases...
Evaluating on sonnet... (attempt 1)
60% -> 95% (+35%) OK
kernel-builder-cuda-kernels
Build optimized CUDA kernels for PyTorch using HuggingFace kernel-builder.
SKILL.md ~520 tokens
baseline ████████████ 60%
with skill ███████████████████ 95% (+35%)
Saved to ./skills/kernel-builder-cuda-kernels
基线(baseline)显示了模型在没有任何技能时的表现。“使用技能后”(with skill)的结果显示了技能注入上下文后的表现。35% 的提升意味着技能起作用了。
技能会按照 Agent Skills 规范保存为一个目录:
./skills/kernel-builder-cuda-kernels/
├── SKILL.md # 主要说明(约 520 个 token)
└── skill_meta.json # 元数据和测试用例
打开 SKILL.md 看看 upskill 生成了什么:
---
name: kernel-builder-cuda-kernels
description: Build optimized CUDA kernels for PyTorch using HuggingFace kernel-builder.
---
# Building CUDA Kernels with kernel-builder
## Overview
This guide explains how to create optimized CUDA kernels for PyTorch models
using HuggingFace's kernel-builder. It covers project setup, kernel implementation,
and building for specific GPU architectures like NVIDIA H100.
## Project Structure
project/
├── build.toml # Build configuration
├── kernel_src/ # CUDA kernel implementations
│ ├── attention.cu
│ ├── layernorm.cu
│ └── geglu.cu
└── torch-ext/ # PyTorch C++ bindings
└── torch_binding.cpp
## Build Configuration
Create `build.toml` to define your kernel package:
[general]
name = "diffuser_kernels"
backends = ["cuda"]
[general.cuda]
# H100 is compute capability 9.0
capabilities = ["9.0"]
...
真正的考验在于:这个技能能否帮本地或更便宜的模型构建 CUDA 内核?
# 启动一个带 Web UI 的本地 OpenAI 兼容服务器:
llama-server -hf unsloth/GLM-4.7-Flash-GGUF:Q4_K_M
# 在本地模型(llama.cpp 服务器)上评估
upskill eval ./skills/my-skill/
--model "unsloth/GLM-4.7-Flash-GGUF:Q4_0"
--base-url http://localhost:8080/v1
Generating skill with sonnet...
Generating test cases...
Evaluating on "unsloth/GLM-4.7-Flash-GGUF:Q4_0"... (attempt 1)
40% -> 85% (+45%) OK
baseline ████████░░░░░░░░░░░░ 40%
with skill █████████████████░░░ 85% (+45%)
Saved to ./skills/kernel-builder-cuda-kernels
在 "unsloth/GLM-4.7-Flash-GGUF:Q4_0" 上实现了 45% 的性能提升,这意味着技能成功地将领域知识从能力更强的模型转移到了更快、更便宜的模型上。能在较弱模型上运行的技能,在更强的模型上肯定也能用。
这就是核心价值主张:用昂贵的模型创建技能,然后用便宜或本地的模型来部署这些技能。
upskill 的评估机制
upskill 采用一种师生模式来评估模型:教师模型生成测试用例,学生模型在这些用例上接受评估。
- 教师模型(Opus)生成技能
- 测试用例(Opus)根据任务描述自动生成
- 学生模型(本地模型)在有技能和无技能两种情况下接受评估
- 技能提升(Skill Lift)衡量改进程度
如果你把一个已有的技能传给 upskill eval,它会为该技能生成测试用例,并评估模型在这些用例上的表现。测试用例是简单的输入/输出对,用来验证智能体是否理解任务:
{
"cases": [
{
"input": "Create a build.toml for a CUDA kernel targeting H100",
"expected": {"contains": "9.0"}
},
{
"input": "Write a basic CUDA kernel template with proper includes",
"expected": {"contains": "cuda_runtime.h"}
}
]
}
我们还可以测试一个技能在不同模型上的表现:
upskill eval ./skills/kernel-builder-cuda-kernels/
--model haiku --m kimi --runs 5
Evaluating kernel-builder-cuda-kernels across 2 model(s)
3 test case(s), 5 run(s) per model
haiku
Pass rate: 4/5 (80%) Avg assertions: 2.8/3
sonnet
Pass rate: 5/5 (100%) Avg assertions: 3.0/3
┏━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┓
┃ Model ┃ Pass Rate ┃ Avg Assertions ┃ Avg Tokens ┃
┡━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━┩
│ haiku │ 4/5 │ 2.8/3 │ 1250 │
│ kimi │ 5/5 │ 3.0/3 │ 1890 │
└────────┴───────────┴────────────────┴────────────┘
这能帮你找到性价比的最佳平衡点:也许 Haiku 配上技能就足够满足你的需求了,能省下不少 API 调用成本。
下一步可以做什么
我们已经展示了 upskill 可以创建经过验证的技能,将领域专业知识从强大的模型转移到更便宜的模型上。内核构建技能只是一个例子,可能性还有很多。
可以尝试的方向:
- 为你的内部工具生成技能
- 为你的代码库构建技能库
- 捕获团队内部知识
- 跨模型进行基准测试
这种方法适用于任何需要反复编写详细提示词的专业任务。这些技能可以跨平台使用,包括 Claude Code、Codex、Cursor 以及其他支持 Agent Skills 规范 的工具。
相关资源
觉得有用?分享给更多人



