1. 从“skills”这个标题说起:它到底指什么
第一次看到“skills”这个标题,很多人会以为是某个泛泛而谈的能力清单,或者一份简历上的技能罗列。但结合热搜词里的 Agent Skills、Google Cloud、npx、AI agents、claude agent skills、codex skills 这些词来看,这里说的 skills 显然不是人类的能力项,而是给 AI agent 使用的一种可插拔能力包。你可以把它理解成给一个通用助手装上的“专业工具箱”:装上一个“分镜 skills”,它就能按分镜逻辑拆解脚本;装上一个“写论文 skills”,它就能按学术规范组织文献与论证;装上一个“自动挖洞 skills”,它就能按既定流程做安全测试。
我最早接触这个概念,是在折腾 agent 工作流的时候。当时我手里有一个能读文件、能执行命令的 agent,但它面对稍微专业一点的任务就露怯——写出来的东西结构松散,步骤跳来跳去。后来我意识到,问题不在于模型本身,而在于它缺少一套领域内的操作规范。skills 解决的正是这个问题:它把某个领域的流程、模板、约束、检查清单打包成一个可复用的单元,agent 加载之后,行为立刻变得专业且稳定。
所以这篇内容适合谁看?如果你是刚听说 skills、想知道它和普通提示词有什么区别的人,前面几节会帮你把概念理清;如果你已经在用 Claude、Codex 这类工具,想自己开发或安装 skills,中间几节有完整的实操路径和参数说明;如果你踩过 npx 安装失败、skills 找不到、加载不生效这些坑,最后一节的排查表可以直接抄。我尽量把每一步背后的“为什么”讲透,而不是只给一串命令让你照敲。
2. skills 的核心设计逻辑:为什么不是简单的提示词
2.1 提示词与 skills 的本质区别
很多人第一反应是:skills 不就是一段写得比较长的提示词吗?我一开始也这么想,直到我把同一个任务分别用提示词和 skills 跑了一遍,才发现差别很大。提示词是一次性的,你这次写得好,下次换个会话就没了;skills 是可持久化、可复用、可组合的。它通常以目录或包的形式存在,里面有描述文件、执行脚本、模板资源,agent 在需要的时候按需加载。
更关键的是,skills 带有触发条件。一个设计良好的 skill 会声明“我在什么场景下应该被调用”,比如当用户要求生成分镜时、当任务涉及论文引用时。这就像给 agent 装了一个路由器,遇到对应任务自动切到对应工具箱,而不是每次都靠人去提醒。这一点是纯提示词做不到的,因为提示词没有元数据,agent 无法在合适的时机主动想起它。
从工程角度看,skills 把“能力”从“模型权重”里解耦出来了。模型负责通用推理,skills 负责领域知识。这样带来两个好处:一是更新领域知识不需要重新训练模型,改一个 skill 文件就行;二是不同团队可以各自维护自己的 skills,互不干扰。这也是为什么 Google Cloud、各大 agent 平台都在推 skills 生态——它让能力扩展变得像装 App 一样简单。
2.2 一个 skill 通常包含哪些部分
我拆过不少 skills 包,结构大同小异,核心就三块。第一块是元数据描述,一般是一个清单文件,写明这个 skill 叫什么、干什么用、什么时候触发、需要哪些依赖。第二块是指令正文,也就是给 agent 看的操作规范,包括步骤、约束、输出格式。第三块是辅助资源,可能是脚本、模板、示例文件、参考数据。
这三块的分工很明确:元数据负责“被找到”,指令负责“被理解”,资源负责“被执行”。我见过新手只写指令不写元数据,结果 skill 装进去了但 agent 从来不调用,就是因为缺少触发声明。也见过元数据写得很漂亮但指令含糊,agent 加载后依然不知道具体怎么做。所以一个能用的 skill,三块都得扎实。
提示:如果你只想快速验证一个想法,可以先只写指令正文,手动在对话里粘贴使用;但要让它成为可复用、可自动触发的 skill,元数据和资源目录迟早要补上。
2.3 为什么 skills 生态突然火起来
热搜里出现“claude agent skills: a first principles deep dive”“codex skills”“github skills”这些词,说明 skills 已经从概念走向了实际使用。我觉得火起来的原因有三个。一是 agent 本身普及了,大家手里都有能执行任务的 agent,缺的是让它变专业的“插件”。二是 skills 的门槛低,不需要训练模型,会写结构化文档就能做一个。三是社区效应,有人做了“skills 大全”“skills 推荐”,新手可以直接下载现成的用,形成了正反馈。
但门槛低也带来一个问题:质量参差不齐。我下载过一些所谓的“skills 安装包”,打开一看就是把一段提示词塞进文件里,既没有触发条件也没有错误处理。这种 skill 装上去,agent 要么不调用,要么调用了反而添乱。所以后面我会专门讲怎么判断一个 skill 值不值得装,以及自己开发时怎么避免这些坑。
3. 环境准备:安装 skills 前必须搞清楚的几件事
3.1 确认你的 agent 运行时支持 skills
不是所有 agent 都支持 skills 机制。有的只支持对话,有的支持工具调用但不支持外部能力包。在动手之前,先确认你用的运行时有没有 skills 加载能力。判断方法很简单:看它的文档里有没有“skills 目录”“加载 skill”“skill 注册”这类描述,或者看它有没有一个约定的存放路径。
以常见的命令行 agent 为例,通常会有一个配置目录,里面有个 skills 子目录,你把 skill 文件夹放进去,重启或重新加载后它就能识别。如果找不到这样的目录,那可能这个运行时还不支持,你需要换一个支持 skills 的运行时,或者退而求其次,把 skill 内容当普通提示词手动使用。
注意:不同运行时的 skills 目录位置和加载方式不一样,有的需要显式注册,有的是扫描目录自动加载。装之前一定先读对应运行时的说明,别凭感觉放。
3.2 npx 相关安装方式与常见失败原因
热搜里“npx”“npx playwright install失败”“claude mcpservers npx”这几个词放在一起,说明很多人是通过 npx 来安装或运行 skills 相关组件的。npx 的好处是不用全局安装,直接拉取并执行。但它对网络和缓存比较敏感,失败率不低。
我总结了几类常见失败。第一类是网络超时,拉取包的时候卡住,表现为一直转圈然后报错。第二类是缓存损坏,之前下了一半的包留在缓存里,导致后续安装一直失败。第三类是权限问题,在某些系统上 npx 需要写临时目录,权限不够就报错。第四类是版本冲突,本地已有旧版本,npx 拉新版本时解析出问题。
对应的处理思路:网络问题就换时间段重试或配置镜像源;缓存问题就清缓存后重装;权限问题就用合适的用户身份运行或调整目录权限;版本冲突就显式指定版本号。这些在后面的排查章节会展开。
3.3 目录结构与命名规范
在放 skill 之前,先把目录结构规划好。我的习惯是每个 skill 一个独立文件夹,文件夹名用英文小写加连字符,比如storyboard-helper、paper-writer。文件夹内部再放清单文件、指令文件、资源目录。这样做的好处是清晰,卸载的时候直接删文件夹,不会残留。
命名上有个坑:不要用中文名或空格。有些运行时的加载器对路径里的非 ASCII 字符处理不好,中文文件夹名可能导致 skill 识别失败。我踩过这个坑,排查了半天才发现是文件夹名的问题。改成英文之后立刻正常。所以哪怕你的 skill 内容是中文的,文件夹名也建议用英文。
4. 从零开发一个 skill:完整实操流程
4.1 第一步:明确 skill 的边界与触发场景
开发之前先想清楚一件事:这个 skill 到底解决什么问题,在什么情况下被调用。边界越清晰,skill 越好用。比如“写论文 skills”,如果它既管选题又管文献还管排版,那就太宽了,agent 很难判断什么时候该用它。更好的做法是拆成“文献综述 skill”“论证结构 skill”“引用格式 skill”,各管一段。
触发场景要写成明确的判断条件。不要写“当用户需要帮助时”,这等于没写。要写“当用户要求生成分镜脚本时”“当任务涉及学术引用格式检查时”。这样 agent 在路由时才有依据。我一般会列三到五个典型触发语句,作为测试用例,开发完逐个验证。
4.2 第二步:编写元数据清单
元数据清单是 skill 的身份证。不同运行时的字段名可能不同,但核心信息一致:名称、描述、触发条件、依赖、版本。下面是一个通用结构的示例,字段名请按你所用运行时的规范调整。
name: storyboard-helper description: 将文字脚本拆解为分镜脚本,输出镜头编号、画面描述、时长建议 triggers: - 用户要求生成分镜 - 用户提供脚本并希望拆解为镜头 - 任务涉及画面节奏规划 dependencies: - none version: 1.0.0写元数据有几个要点。描述要一句话说清能力,不要堆形容词。触发条件要具体,宁可多列几个也不要含糊。依赖要如实写,如果 skill 需要调用外部脚本或需要特定工具,必须声明,否则运行时会报错。版本号建议遵循语义化版本,方便后续更新和回滚。
4.3 第三步:撰写指令正文
指令正文是 skill 的灵魂。它要告诉 agent:接到任务后按什么步骤做、每步产出什么、有什么约束、输出成什么格式。我写指令正文的习惯是分四段:角色设定、操作步骤、约束条件、输出格式。
角色设定一句话即可,比如“你是一名分镜师,负责把文字脚本转化为可拍摄的镜头列表”。操作步骤要编号,每步是一个明确动作。约束条件列出不能做的事,比如“每个镜头时长不超过 8 秒”“不要添加脚本中没有的场景”。输出格式给出模板,让 agent 知道最终交付长什么样。
这里有个经验:步骤不要写太细,细到每一步的每个字都规定死,agent 反而会僵化。留出合理的推理空间,只约束关键节点和输出格式。我早期写的 skill 就是因为步骤太死,遇到稍微变形的任务就卡住,后来放宽了中间步骤,只锁死输入输出,效果好很多。
4.4 第四步:准备辅助资源与测试用例
如果 skill 需要模板、示例、参考数据,就放在资源目录里,并在指令正文里说明什么时候读取哪个文件。比如“引用格式 skill”可以放一个常见格式的示例文件,agent 需要时读取对照。资源不要塞太多,够用就行,塞太多会拖慢加载。
测试用例是很多人忽略的一步。我一般准备三类用例:标准用例(正常触发)、边界用例(触发条件擦边)、反例(不该触发的情况)。标准用例验证功能,边界用例验证触发判断,反例验证不会误触发。三类都通过,这个 skill 才算可用。我见过不少 skill 只测了标准用例,结果在实际使用中频繁误触发,把不相干的任务也接管了。
5. 安装与加载 skills 的实操细节
5.1 本地安装:手动放置与自动扫描
本地安装最简单的方式是把 skill 文件夹放到运行时的 skills 目录。放之前先确认目录位置,放之后确认加载方式。如果是自动扫描,重启运行时即可;如果是显式注册,需要在配置里加一条记录。我建议先用手动放置加自动扫描的方式,减少配置出错的可能。
放置完成后,怎么确认加载成功?我的做法是发一条触发语句,看 agent 是否按 skill 的流程响应。如果响应里出现了 skill 定义的输出格式,说明加载成功。如果还是通用回答,说明没加载上,需要检查目录位置、文件夹命名、元数据格式。
提示:有些运行时会在启动日志里打印已加载的 skills 列表,这是最直接的确认方式。启动时留意一下日志,能省很多排查时间。
5.2 通过包管理器安装:npx 方式的注意事项
用 npx 安装 skills 相关组件时,有几个细节要注意。第一,确认包名准确,热搜里“claude mcpservers npx”这类词说明包名容易记混,装之前核对一下。第二,注意版本,不指定版本会拉最新版,最新版可能有破坏性变更,生产环境建议锁定版本。第三,注意安装位置,npx 默认装在临时目录,如果你希望持久化,需要指定安装路径或改用其他方式。
安装完成后,同样要验证。验证方法和本地安装一样:发触发语句看响应。如果 npx 安装的组件需要额外配置,按它的说明补上。我遇到过装完没配置、结果组件静默不工作的情况,排查时以为是安装失败,其实是配置缺失。
5.3 从社区下载 skills 的筛选标准
社区里 skills 很多,热搜里也有“skills 大全”“skills 推荐”“skills 下载平台有哪些”这类词。下载之前先看几个指标。一看更新时间,太久没更新的可能不兼容当前运行时。二看元数据是否完整,没有触发条件的直接跳过。三看指令正文是否具体,通篇空话的不要。四看有没有测试用例或使用说明,有的说明作者认真做过验证。
我下载过一个“自动挖洞 skills”,元数据写得很全,但指令正文里全是“根据情况判断”这种模糊表述,实际用起来 agent 完全不知道该干什么。后来我自己重写了指令部分才勉强能用。所以下载来的 skill 不要直接信,先读一遍指令正文,判断它是否真的可执行。
6. 常见问题与排查技巧实录
6.1 skills 装了但 agent 不调用
这是最高频的问题。排查顺序我一般是这样:先确认 skill 是否真的加载了,看启动日志或发触发语句测试;如果加载了但不调用,检查触发条件是否太窄或太模糊;如果触发条件没问题,检查是否有其他 skill 抢占了同一触发场景。多个 skill 触发条件重叠时,运行时可能只选一个,导致你期望的那个没被选中。
还有一种情况是元数据格式不对,运行时解析失败但没报错,静默跳过。这时候把元数据拿去和官方示例逐字段对比,往往能发现拼写或缩进问题。YAML 对缩进敏感,一个空格错位就可能导致整个文件解析失败。
6.2 npx 安装失败的排查路径
npx 失败先看报错信息。如果是网络相关,换镜像源或换时间段重试。如果是缓存相关,清缓存后重装。如果是权限相关,检查临时目录权限。如果是版本冲突,显式指定版本。下面这张表是我整理的速查表,遇到问题可以对照。
| 现象 | 可能原因 | 处理方式 |
|---|---|---|
| 一直转圈后超时 | 网络不通或镜像源慢 | 换镜像源,换时间段重试 |
| 报缓存相关错误 | 缓存损坏 | 清理缓存目录后重装 |
| 报权限拒绝 | 临时目录不可写 | 调整权限或换用户运行 |
| 报版本解析失败 | 本地版本冲突 | 显式指定版本号安装 |
| 装完无反应 | 缺少配置或未注册 | 按说明补配置并验证 |
6.3 skill 输出格式不符合预期
有时候 skill 加载了、也调用了,但输出格式不对。原因通常是指令正文里的输出模板不够明确,或者 agent 在生成时忽略了模板。解决办法是把输出模板写得更结构化,给出字段名和示例值,而不是只描述“输出一个列表”。我试过把模板从文字描述改成带占位符的示例,格式稳定性明显提升。
另一个原因是 skill 之间有冲突,比如两个 skill 都定义了输出格式,agent 混着用。这时候要检查触发条件是否重叠,必要时收窄其中一个的触发范围。
6.4 我踩过的三个典型坑
第一个坑是文件夹名用了中文,导致加载失败,排查了很久。第二个坑是元数据里触发条件写得太宽,结果这个 skill 把很多不相干的任务都接管了,输出质量反而下降。第三个坑是资源目录塞了太多大文件,加载变慢,后来精简到只留必要的几个。
这三个坑的共同点是:都不是功能逻辑的问题,而是工程细节的问题。但恰恰是这些细节,决定了 skill 能不能稳定用起来。所以我现在开发 skill,功能写完只是第一步,命名、触发条件、资源体积这些都要再过一遍。
7. skills 的进阶用法与扩展方向
7.1 skill 组合:让多个能力协同工作
单个 skill 能力有限,真正强大的是组合。比如“分镜 skills”负责拆镜头,“画面描述 skills”负责细化每个镜头的视觉元素,两个串起来用,产出比单用一个完整得多。组合的关键是触发条件要能衔接:第一个 skill 的输出,正好是第二个 skill 的输入触发条件。
组合时要注意顺序和依赖。有的 skill 必须在另一个之后运行,有的可以并行。我一般会在指令正文里写明“本 skill 假设上游已产出镜头列表”,这样 agent 在组合使用时不会搞错顺序。
7.2 把 skill 接入自动化流程
skills 不一定要在对话里手动触发,也可以接入自动化流程。比如定时任务里调用某个 skill 处理固定类型的输入,或者把 skill 作为流水线的一环。接入自动化的前提是 skill 的输入输出足够稳定,不能有太多依赖对话上下文的模糊判断。
我做过一个自动化流程,每天定时用“论文 skills”处理新增文献,输出结构化摘要。跑了一周后发现,凡是输入格式规范的都能正常处理,格式不规范的会卡住。后来加了一个前置的格式校验步骤,稳定性才上来。所以接入自动化之前,先把输入的边界情况处理好。
7.3 维护与迭代:skill 不是一次性的
skill 写完不是终点。运行时会更新,模型会更新,任务需求也会变。我建议给每个 skill 记一个简单的变更日志,写清楚每次改了什么、为什么改。这样过几个月回头看,能快速回忆起当时的决策。
迭代时优先改指令正文,因为它是影响行为最直接的部分。元数据改动要谨慎,尤其是触发条件,改宽了会误触发,改窄了会不触发。每次改完都要跑一遍测试用例,确认没有回归问题。
8. 关于 skills 的一些个人体会
我用 skills 这段时间,最大的感受是:它把“让 agent 变专业”这件事从玄学变成了工程。以前要让 agent 写好某类内容,只能反复调提示词,效果还不稳定;现在把规范固化成 skill,一次写好,反复使用,行为一致。这个转变对经常用 agent 干活的人来说,价值很大。
另一个体会是,skill 的质量取决于你对任务的理解深度。你自己都没想清楚步骤和约束,写出来的 skill 必然是模糊的。所以开发 skill 的过程,其实也是梳理自己工作流程的过程。我好几个 skill 都是在梳理流程时发现,原来自己平时做这件事有这么多隐含的判断,把这些写出来,skill 就好用了。
最后分享一个小技巧:如果你不确定一个 skill 该怎么写,先手动做一遍任务,把每一步的操作和判断记下来,这份记录就是指令正文的草稿。我最早的那个 skill 就是这么来的,比凭空想要靠谱得多。