1. 从“skills”这个热词说起:它到底是什么,为什么突然火了
最近半年,不管是在开发者社区还是各种技术群里,“skills”这个词出现的频率高得离谱。你随便翻一下热搜词列表就能看到:skills、claude code、codex、plugin、agents、find skills、skills推荐、codex skills、claude agent skills……这些词几乎绑在一起出现。很多人第一次看到“skills”会以为是某种新框架或者新语言,其实不是。它更像是一种能力封装机制——把一段可复用的指令、工具调用逻辑、上下文约束打包成一个独立单元,让 AI 代理(agent)在需要的时候直接加载使用。
我最早接触这个概念是在折腾 Claude Code 的时候。当时想让它在项目里自动完成一些重复性工作,比如按团队规范生成组件、跑测试、整理变更日志。一开始我把所有要求都塞进一个巨大的系统提示里,结果就是:提示词越写越长,模型开始“忘事”,改一个地方影响另一个地方,维护成本极高。后来我把这些要求拆成一个个独立的 skill,每个 skill 只负责一件事,需要哪个加载哪个,整个流程立刻清爽了。这就是 skills 的核心价值:模块化、可组合、按需加载。
那它解决了什么问题?简单说三个痛点。第一,上下文污染。一个 agent 如果同时背着几十条规则,它的注意力会被稀释,输出质量下降。skills 让你只在当前任务需要时才注入相关能力。第二,复用困难。以前你写好的一套提示词,换个项目就得复制粘贴再改,现在打包成 skill 可以直接迁移。第三,协作混乱。团队里每个人对 AI 的用法不一样,skills 提供了一种标准化的“能力接口”,大家可以共享、版本管理、按需组合。
适合谁来参考?我觉得三类人最该看。一是日常用 Claude Code、Codex 这类工具干活的开发者,你不需要懂底层实现,但得知道怎么找 skill、装 skill、写 skill。二是团队里负责搭建 AI 工作流的人,你需要理解 skills 的组织方式和加载逻辑,才能设计出可维护的流程。三是对 agent 架构感兴趣的技术爱好者,skills 是理解“代理能力扩展”这件事最直观的入口。下面我会从设计思路、核心细节、实操过程到问题排查,把我踩过的坑和总结的方法完整讲一遍。
2. 内容整体设计与思路拆解:为什么是“技能”而不是“插件”或“提示词”
2.1 skills 与 plugin、agent 的关系到底怎么理解
很多人会把 skills 和 plugin 混为一谈,其实两者定位不同。我用一个生活化的类比:agent 是一个人,plugin 是他手里的工具(比如螺丝刀、计算器),skill 是他脑子里的操作流程(比如“怎么拧螺丝”“怎么算折扣”)。工具是外部能力,技能是内部知识。你给一个人一把螺丝刀(plugin),他未必知道怎么用;你教他一套拧螺丝的流程(skill),他拿到任何螺丝刀都能干活。
在 Claude Code 和 Codex 的语境里,这个区分更明显。plugin 通常指对宿主环境的扩展,比如给编辑器加个面板、给 CLI 加个子命令。而 skill 是一段结构化的指令集合,它告诉 agent“遇到这类任务时,按这个步骤、用这些工具、遵守这些约束来做”。热搜词里出现的claude agent skills: a first principles deep dive和codex skills其实都在讨论同一件事:如何把领域知识封装成 agent 可加载的能力单元。
那为什么不用纯提示词?因为纯提示词没有结构。一个 skill 通常包含几个固定部分:名称、触发条件、执行步骤、可用工具、输出格式、边界约束。这种结构让 agent 在加载时能快速定位“这个 skill 是干什么的、什么时候用、怎么用”。而一堆散落的提示词,模型需要自己猜哪条适用,效率低且容易出错。
2.2 方案选型背后的考量:为什么我最终选择“按需加载”而不是“全量注入”
我试过三种方案,这里直接给对比。
| 方案 | 做法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 全量注入 | 把所有规则写进系统提示 | 实现简单,一次配置 | 上下文膨胀,规则互相干扰,维护困难 | 规则极少且稳定的场景 |
| 固定分组 | 按任务类型分成几组提示词,手动切换 | 比全量好一些 | 切换靠人,容易忘,组内仍会膨胀 | 任务类型固定的个人使用 |
| 按需加载 skills | 每个能力独立成 skill,agent 根据任务自动或手动加载 | 上下文干净,复用性强,可版本管理 | 需要设计触发逻辑,初期搭建成本高 | 多任务、多项目、团队协作 |
我最终选按需加载,核心原因是上下文窗口是稀缺资源。你塞进去的每一条无关规则,都在消耗模型的注意力。实测下来,当一个系统提示超过一定长度后,模型对后面内容的遵循度会明显下降。skills 的按需加载让每次任务只带相关能力,输出稳定性提升非常明显。
另一个考量是可测试性。一个 skill 独立之后,你可以单独测它:给它一个输入,看输出是否符合预期。而混在一起的提示词,你改一处,整个行为都可能变,回归测试几乎没法做。热搜词里有个agent skills测试,说明已经有人在做这件事了,这是很自然的需求。
2.3 一个 skill 的典型结构长什么样
虽然不同平台的具体格式有差异,但核心字段大同小异。我按通用结构拆一下:
- name:唯一标识,最好用动宾短语,比如
generate-component、run-migration。 - description:一句话说明这个 skill 干什么,agent 靠它判断是否加载。
- trigger:触发条件,可以是关键词、文件类型、命令前缀等。
- steps:执行步骤,按顺序列出,每步说明用什么工具、输入什么、期望输出什么。
- constraints:边界约束,比如“不要修改测试文件”“必须使用项目已有的工具函数”。
- output:输出格式要求,比如 JSON schema、Markdown 模板。
这个结构的好处是人机都能读。人看一遍就知道这个 skill 的职责边界,agent 加载后也能按步骤执行。我建议你在写第一个 skill 时就把这几个字段填满,哪怕有些暂时用不上,留着占位也比后面补要省事。
3. 核心细节解析与实操要点:从找 skill 到写 skill 的关键环节
3.1 怎么找到靠谱的 skill:官方市场、社区仓库与自建
热搜词里有find skills、skills推荐、claude 国内安装skills 官方市场,说明“找 skill”是很多人的第一道坎。我按可靠性从高到低排一下来源。
第一优先级是官方或半官方市场。Claude Code 和 Codex 都有自己的 skill 分发渠道,里面的 skill 经过基本审核,格式规范,兼容性好。安装方式通常是命令行一条指令,或者把 skill 目录放到指定路径。这里要注意版本匹配:不同版本的宿主工具对 skill 格式的支持可能有差异,装之前先看 skill 的兼容说明。
第二优先级是社区仓库。GitHub 上有很多人分享自己写的 skill 集合,质量参差不齐。我筛选的标准是:看 star 数、看最近更新时间、看有没有测试用例、看 README 写得是否清楚。一个连 README 都懒得写的 skill,大概率作者自己都没怎么用过。热搜词里前任skills官方下载这种明显是误匹配,不用理会。
第三优先级是自建。当你发现现有 skill 都不完全符合需求时,就该自己写了。自建的好处是完全贴合你的工作流,坏处是要花时间调试。我的建议是先从改别人的 skill 开始,改着改着就知道怎么写自己的了。
提示:不管从哪找 skill,装之前先读一遍它的 steps 和 constraints。有些 skill 会执行文件写入或命令调用,不看清楚就装,可能把你项目搞乱。
3.2 写一个 skill 的核心步骤:我总结的五步法
写 skill 这件事,说难不难,说简单也不简单。我按自己写了几十个 skill 的经验,总结成五步。
第一步,明确单一职责。一个 skill 只做一件事。如果你发现描述里出现了“并且”“同时”“顺便”,那说明该拆了。比如“生成组件并且跑测试并且更新文档”,这是三个 skill,不是一个。
第二步,写清楚触发条件。触发条件决定了 agent 什么时候加载这个 skill。写得太宽,会频繁误触发;写得太窄,该用的时候用不上。我的经验是:用具体的文件路径、命令前缀、关键词组合来限定。比如“当用户提到 .vue 文件且要求新建时触发”,就比“当用户要求新建文件时触发”精确得多。
第三步,把步骤拆到可执行粒度。每一步都要说明:用什么工具、输入是什么、输出是什么、失败怎么办。不要写“处理数据”这种模糊描述,要写“读取 src/data 下的 JSON 文件,用项目已有的 parseData 函数解析,输出标准化对象”。粒度越细,agent 执行越稳定。
第四步,加约束和边界。这是最容易被忽略但最重要的一步。约束包括:不能改哪些文件、必须用哪些已有函数、输出必须符合什么格式、遇到不确定情况时是询问还是跳过。我踩过的坑是:没写约束,agent 自作主张重构了我的工具函数,导致其他模块报错。从那以后我每个 skill 都加一条“不要修改 utils 目录下的任何文件”。
第五步,写测试用例。至少准备三个输入:正常情况、边界情况、异常情况。跑一遍看输出是否符合预期。热搜词里agent skills测试说的就是这个环节。测试通过后再发布或共享,能省掉后面很多麻烦。
3.3 参数与配置:几个容易搞错的地方
skill 的配置里有一些参数容易让人困惑,我挑几个高频的讲。
加载优先级。当多个 skill 的触发条件重叠时,谁先加载?一般平台会按优先级字段排序,没写的按加载顺序。我的做法是给核心 skill 设高优先级,辅助性的设低优先级,避免辅助 skill 抢了主流程的注意力。
上下文预算。每个 skill 加载后都会占用上下文。如果一个任务需要加载很多 skill,总占用可能超限。我的经验是:单个 skill 的指令部分控制在 500 字以内,超过就考虑拆分或精简。实测下来,精简后的 skill 执行效果反而更好,因为模型能抓住重点。
工具权限。有些 skill 需要调用文件写入、命令执行等敏感操作。配置时要明确声明需要哪些权限,不要一股脑全开。最小权限原则在这里同样适用:只给完成这个 skill 所必需的权限。
版本锁定。如果你在团队里共享 skill,建议锁定版本。skill 更新后行为可能变化,锁定版本能保证大家用的是同一套逻辑。热搜词里codex无法加载组织设置这类问题,有时候就是版本不一致导致的。
4. 实操过程与核心环节实现:从零搭一个可用的 skill 工作流
4.1 环境准备:Claude Code 与 Codex 的安装要点
热搜词里claude code安装、codex安装、codex安装教程、claude code windows、ubuntu配置claude code出现频率很高,说明安装是很多人的第一道门槛。我按自己的安装经验讲几个关键点。
Claude Code 的安装。主流方式是通过包管理器或官方安装脚本。Windows 用户注意:如果你在 WSL 里用,路径和权限跟纯 Linux 环境有差异,skill 目录的位置要确认清楚。Ubuntu 用户相对省事,按官方文档走基本没问题。安装完成后,先跑一个最简单的命令验证环境,比如让它读一个文件、输出一句话,确认基础功能正常再往下走。
Codex 的安装。Codex 的安装包和安装教程网上很多,但要注意版本。热搜词里codex官网下载、codex下载、codex安装 csdn说明大家找安装包的需求很旺。我的建议是优先从官方渠道获取,第三方来源的安装包有被篡改的风险。安装后同样先做基础验证。
编辑器集成。热搜词里vscode配置claude code、claude code for vs code、idea使用skills、idea设置plugin中插件仓库地址都是关于编辑器集成的。我的经验是:先在命令行里把工具跑通,再配编辑器插件。因为编辑器插件出问题时,你很难判断是工具本身的问题还是插件的问题。命令行跑通了,插件只是多一层壳,排查起来简单得多。
注意:安装过程中如果遇到网络相关的报错,先检查本地环境配置,不要盲目改配置。很多问题其实是路径、权限或版本不匹配导致的。
4.2 搭建第一个 skill:一个完整的实操记录
我拿一个真实场景来演示:自动生成符合团队规范的 React 组件。这个场景足够具体,又能体现 skill 的核心价值。
第一步,建目录。在项目的 skills 目录下新建一个文件夹,命名generate-component。里面放一个主文件,按平台要求的格式写。
第二步,写描述和触发条件。描述写“根据给定名称和类型生成符合团队规范的 React 组件文件”。触发条件写“当用户要求新建 React 组件,且指定了组件名称时”。
第三步,写步骤。我列了五步:
- 读取
templates/component.template模板文件。 - 用用户提供的组件名称替换模板中的占位符。
- 根据组件类型(函数组件/类组件)选择对应的代码结构。
- 在
src/components下创建同名文件夹和index.tsx文件。 - 更新
src/components/index.ts的导出列表。
第四步,加约束。我加了三条:不要修改模板文件本身;不要覆盖已存在的组件文件,如果存在则提示用户;生成的代码必须通过项目的 ESLint 检查。
第五步,测试。我准备了三个用例:正常新建一个函数组件、新建一个已存在的组件名、新建一个类组件。跑下来前两个符合预期,第三个发现模板里类组件的结构没写全,补上后通过。
这个 skill 写完后,我每天新建组件的时间从几分钟降到几秒,而且再也不会忘记更新导出列表。这就是 skill 的价值:把容易忘、容易错的重复流程固化下来。
4.3 组合多个 skill:让 agent 处理复杂任务
单个 skill 解决单点问题,组合起来才能处理复杂任务。我举一个实际例子:提交代码前的检查流程。这个流程涉及多个步骤,我拆成了三个 skill。
lint-check:跑 ESLint 和 TypeScript 类型检查。test-run:跑相关测试用例。changelog-update:根据 git diff 更新变更日志。
然后在主流程里按顺序加载这三个 skill。agent 收到“准备提交”的指令后,依次执行:先 lint,通过后跑测试,测试通过后更新日志,最后输出一份检查报告。如果中间任何一步失败,就停下来报告问题,不继续往下走。
这种组合方式的好处是每个 skill 可以独立维护和测试。lint 规则变了只改lint-check,测试框架换了只改test-run,互不影响。热搜词里superpower skills和skills开发讨论的其实就是这种组合能力。
4.4 本地模型接入:Claude Code 调用本地模型的注意事项
热搜词里claude code 调用lmstudio的本地模型和codex接入deepseek说明很多人想把 skill 工作流接到本地或第三方模型上。我试过这条路,讲几个关键点。
接口兼容性。不同模型对接口格式的支持程度不一样。有些模型对工具调用的支持不完整,skill 里的工具步骤可能执行不了。接入前先确认模型是否支持你 skill 里用到的所有能力。
上下文长度。本地模型的上下文窗口通常比云端小。如果你的 skill 组合起来占用上下文较多,本地模型可能装不下。解决办法是精简 skill,或者减少单次加载的数量。
响应稳定性。本地模型的输出稳定性跟硬件、量化程度有关。同样的 skill,在不同配置下表现可能差异很大。建议先在简单任务上验证,再逐步上复杂流程。
提示:接入本地模型时,先把 skill 的约束写得更严格一些。本地模型对模糊指令的遵循度通常不如云端模型,明确的边界能减少跑偏。
5. 常见问题与排查技巧实录:我踩过的坑和解决方法
5.1 skill 不触发或误触发怎么办
这是最高频的问题。表现是:该用 skill 的时候 agent 没加载,不该用的时候反而加载了。排查思路如下。
先看触发条件是否太宽或太窄。太宽就加限定词,比如加上文件类型、目录路径、命令前缀。太窄就放宽一点,或者增加同义词。我一般会看 agent 的日志,确认它收到任务后判断加载了哪些 skill,再对照触发条件找原因。
再看优先级是否冲突。如果两个 skill 触发条件重叠,优先级高的会先加载,可能把另一个挤掉。解决办法是明确区分两者的适用场景,或者合并成一个 skill。
最后看描述是否清晰。agent 靠描述判断是否加载。如果描述写得含糊,比如“处理文件相关操作”,agent 很难判断该不该用。改成“当用户要求批量重命名 src 下的图片文件时触发”,就明确多了。
5.2 skill 执行到一半失败怎么排查
执行失败的原因通常分三类:工具调用失败、输入不符合预期、约束冲突。我整理了一个速查表。
| 现象 | 可能原因 | 排查方法 | 解决方式 |
|---|---|---|---|
| 工具调用报错 | 权限不足或工具不存在 | 检查 skill 声明的权限和实际环境 | 补权限或换工具 |
| 输入解析失败 | 上游输出格式变了 | 看上游步骤的实际输出 | 加格式校验或容错 |
| 约束冲突 | 两条约束互相矛盾 | 逐条检查 constraints | 删掉或改写冲突项 |
| 中途停止无报错 | 上下文超限 | 看加载的 skill 总长度 | 精简或拆分 skill |
| 输出格式不对 | 输出要求不明确 | 对照 output 字段 | 补充示例或 schema |
我遇到最多的是输入解析失败。上游 skill 的输出格式稍微变了一点,下游就崩了。后来我养成了一个习惯:每个 skill 的输入输出都加校验,不符合就明确报错,而不是让 agent 猜。这样问题定位快很多。
5.3 团队协作中 skill 管理的经验
团队里用 skill,最大的问题是版本混乱。张三改了一个 skill,李四不知道,用的时候行为对不上。我的做法是三条。
第一,skill 进版本控制。跟代码一样,skill 也放 Git 里管理。每次修改走 PR,有人 review。这样谁改了什么、为什么改,都有记录。
第二,写变更说明。每个 skill 的修改都要写清楚改了什么、影响范围是什么。特别是改了触发条件或约束的,一定要标注,因为这两类改动最容易影响使用者。
第三,定期清理。用不上的 skill 及时删掉或归档。我见过一个团队积累了上百个 skill,一半没人用,新人进来根本不知道从哪看起。定期清理能保持 skill 库的可维护性。
5.4 几个容易被忽略的细节
skill 命名要一致。用统一的命名风格,比如全用 kebab-case,全用动宾结构。这样找起来快,也不容易重名。
描述里不要写实现细节。描述是给 agent 判断用的,写清楚“做什么”就行,“怎么做”放在 steps 里。描述太长反而影响判断。
约束要具体可验证。“不要写烂代码”这种约束没法验证,等于没写。“函数不超过 50 行”“必须用项目已有的 request 函数”这种才能验证。
定期回顾 skill 的使用频率。如果一个 skill 半年没被触发过,要么是触发条件有问题,要么是需求变了。该修就修,该删就删。
6. 关于 skills 后续可以怎么扩展
我现在的工作流里,skill 已经成了基础设施的一部分。除了前面讲的代码生成和提交流程,我还在几个方向上做了扩展,这里分享出来供参考。
一个是把 skill 和项目文档打通。比如写一个 skill,在生成代码的同时,自动从项目文档里拉取相关的接口说明和字段定义,保证生成的代码跟文档一致。这样文档更新后,代码生成也跟着更新,减少不一致。
另一个是给 skill 加反馈回路。每次 skill 执行完,记录执行结果和耗时。积累一段时间后,能看出哪些 skill 经常失败、哪些步骤最耗时,据此优化。这个思路跟热搜词里agent skills测试是相通的,只是从单次测试变成了持续监控。
还有一个方向是跨项目复用。我把通用的 skill 抽出来放在一个共享目录,项目特有的 skill 放在项目目录。加载时先找项目目录,找不到再找共享目录。这样通用能力不用每个项目复制一遍,维护成本低很多。
最后分享一个小技巧:写 skill 的时候,先别急着写完整,先写一个最小可用的版本,跑通一个最简单的用例,然后再逐步加步骤和约束。我一开始总想一次写完美,结果调试起来特别痛苦。后来改成小步迭代,每个 skill 从十行开始,跑通了再加,效率高很多,也不容易出错。