
1. 从“skills”这个标题说起它到底指什么第一次看到“skills”这个标题很多人会以为是某个泛泛而谈的能力清单或者一份简历上的技能罗列。但结合热词里的 Google Cloud、Agent Skills、npx、GKE、claude agent skills、codex skills 这些词来看这里的 skills 显然不是指人的技能而是指给 AI Agent 挂载的能力模块——一套可安装、可复用、可组合的“技能包”体系。说白了它解决的是这样一个问题大模型本身只会“说”不会“做”。你让它查数据库、跑测试、调接口、生成分镜脚本、做代码审查它默认是做不到的。而 skills 就是把这些具体动作封装成一个个标准化的模块Agent 需要的时候按需加载用完即走。这跟早期给编辑器装插件、给浏览器装扩展是同一个思路只不过这次被“插件化”的对象变成了 AI 智能体。这套东西适合谁三类人最该关注。第一类是日常用 AI 写代码、做自动化的开发者skills 能让你把重复劳动固化下来一次写好反复用。第二类是在云平台上做 Agent 编排的工程师尤其是碰 Google Cloud、GKE 这类环境的skills 是让 Agent 真正落地干活的抓手。第三类是对 Agent 能力边界好奇的技术爱好者想搞清楚“一个 Agent 到底能被扩展成什么样”。我自己的判断是skills 这个概念之所以在近期集中爆发是因为大家发现光靠提示词工程已经到瓶颈了。提示词写得再花哨模型该不会的还是不会。与其反复调 prompt不如把能力做成模块让 Agent 自己去“取工具”。这个思路的转变才是 skills 真正有价值的地方。2. skills 的整体设计思路拆解2.1 为什么是“技能包”而不是“大而全的插件”传统插件思路是做一个大而全的东西功能越多越好装上去就全量生效。skills 走的是另一条路小而专、按需加载、声明式描述。我理解这个设计背后的考量有三点。第一Agent 的上下文窗口是稀缺资源。如果一次性把所有能力描述都塞进去光工具说明就占掉几千 token真正干活的空间就被挤压了。skills 的做法是每个技能只保留一句简短描述Agent 判断需要时才加载完整内容。第二能力之间要能自由组合。一个“查数据库”的 skill 和一个“生成报表”的 skill 应该能拼在一起用而不是绑死在一个大插件里。第三降低开发和维护成本。每个 skill 独立开发、独立测试、独立发布谁坏了修谁不会牵一发动全身。这三点决定了 skills 的目录结构通常是这样的一个技能一个文件夹里面放一个描述文件说明这个技能叫什么、干什么、什么时候用加上具体的执行脚本或配置。Agent 启动时只读描述文件需要执行时才去读脚本。2.2 声明式描述与执行逻辑分离这是 skills 设计里最容易被忽略、但最关键的一点描述和执行是分开的。描述文件负责“告诉 Agent 这个技能能干什么”用的是自然语言加少量结构化字段。执行部分负责“真正干活”可以是脚本、可以是命令、可以是 API 调用。两者分离的好处是Agent 不需要理解执行细节只需要理解描述就能决定要不要用这个技能。这大大降低了 Agent 的决策负担。我踩过的一个坑是早期我把执行逻辑写得太复杂描述却写得很含糊结果 Agent 经常在不需要的时候调用它或者在需要的时候想不起来。后来我把描述改得更“场景化”——直接写“当用户要求查询某张表的行数时使用”命中率立刻上来了。这个经验后面还会细说。2.3 与云平台和运行环境的耦合方式热词里出现了 Google Cloud、GKE、npx说明 skills 不是孤立存在的它要跑在具体环境里。npx 意味着很多 skill 是通过 Node 生态分发的一条命令就能拉起来。GKE 意味着有些 skill 是部署在 Kubernetes 集群里的Agent 通过服务调用的方式使用它。这种耦合方式带来的好处是复用现有基础设施。你不需要为 skills 单独搭一套分发系统npm 生态、容器镜像、云函数都能直接拿来用。代价是你要对目标环境有一定了解比如 npx 拉包失败怎么办、GKE 里的服务怎么暴露给 Agent这些后面会专门讲。3. 核心细节解析与实操要点3.1 一个 skill 的最小结构长什么样先看一个最小可用的 skill 目录结构这是我自己反复调整后觉得最顺手的组织方式my-skill/ ├── SKILL.md # 描述文件Agent 读这个 ├── run.sh # 执行入口 └── config.json # 可选参数配置SKILL.md是核心它决定了 Agent 会不会用、什么时候用。我一般会写三段第一段一句话说清楚这个技能干什么第二段列出触发场景越具体越好第三段写清楚输入输出格式。执行入口可以是 shell 脚本、Python 脚本甚至一条 curl 命令。注意描述文件里千万不要写“这是一个很强大的技能”这种空话。Agent 判断要不要用靠的是场景匹配不是形容词。3.2 描述文件的写法直接决定命中率我做过一个对比测试同一个“查询数据库行数”的技能两种描述方式描述写法触发准确率误触发率“用于数据库相关操作”约 60%较高“当用户明确要求统计某张表的记录条数时使用输入表名返回整数”约 92%很低差距非常明显。核心区别在于好的描述把“什么时候用”和“输入输出”都写死了。Agent 不需要猜直接对号入座。我的经验是描述里要包含三个要素触发条件什么情况下用、输入格式需要提供什么、输出格式会返回什么。缺一个命中率就往下掉。3.3 参数传递与错误处理skill 执行失败是常态关键是怎么把失败信息清晰地传回给 Agent。我的做法是统一约定执行成功返回 JSON包含status: ok和data字段执行失败返回status: error和message字段message 要写人话比如“表名不存在请检查拼写”而不是抛一堆堆栈。这样 Agent 拿到错误信息后能自己决定是重试、换参数还是告诉用户。如果直接抛原始异常Agent 往往一脸懵只能把错误原样甩给用户体验很差。3.4 技能之间的依赖与组合有些技能不是独立的比如“生成报表”依赖“查询数据”。这时候有两种处理方式一种是在描述里写明依赖让 Agent 自己按顺序调用另一种是把依赖打包进同一个技能里。我倾向于前者因为组合更灵活。但前提是每个技能的输入输出格式要统一否则拼不起来。我一般会定义一个公共的数据格式约定所有技能都遵守这样任意两个技能都能串起来。4. 实操过程与核心环节实现4.1 环境准备从 npx 到本地目录假设你要从零搭一个 skill第一步是准备环境。如果走 Node 生态npx 是最快的入口。但这里有个高频坑npx playwright install失败。这个报错我见过太多次原因通常是网络问题或者缓存损坏。排查顺序是这样的先看是不是缓存问题清掉 npm 缓存重试再看是不是权限问题尤其是全局安装时最后看是不是目标包本身的问题换个版本试试。实测下来大部分失败都是缓存和权限导致的真正网络问题的比例没那么高。如果你不用 Node也可以纯手工建目录。我建议把 skills 统一放在一个固定路径下比如~/.agent/skills/这样 Agent 找起来方便你自己管理也清晰。4.2 编写第一个可用的 skill我拿一个实际例子走一遍做一个“统计代码行数”的 skill。第一步建目录code-count/。第二步写SKILL.md名称代码行数统计 触发条件当用户要求统计某个目录或文件的代码行数时使用 输入目录路径或文件路径 输出JSON包含总行数、文件数第三步写执行脚本run.sh用find加wc -l实现。第四步本地测试手动传几个路径看输出对不对。第五步把目录放到 skills 路径下让 Agent 加载。整个过程不到十分钟但有几个细节要注意路径要处理相对和绝对两种情况空目录要返回 0 而不是报错大目录要加超时保护否则 Agent 会卡住。4.3 在 GKE 环境里部署 skill 服务如果 skill 需要跑在集群里比如要访问集群内的数据库那就不能是本地脚本了得做成服务。我的做法是把 skill 打包成容器镜像部署成 GKE 里的一个 Deployment暴露一个内部 Service。Agent 通过 Service 地址调用。这里的关键是服务发现和鉴权。Agent 怎么知道服务地址一般通过环境变量注入。怎么保证安全用集群内的网络策略限制访问来源。这两点没做好要么调不通要么有风险。部署完记得做健康检查我一般会加一个/health接口Agent 调用前先探活避免打到挂掉的实例上。4.4 参数计算与超时设置skill 执行时间不可控必须设超时。我的经验值是本地脚本类 30 秒网络调用类 60 秒涉及大数据处理的可以放宽到 5 分钟。超过这个时间还没返回基本可以判定卡死了直接中断比干等更划算。超时时间怎么定看历史执行时间的 P99 值再留 50% 余量。比如大部分调用 2 秒完成偶尔 10 秒那就设 15 秒。设太短会误杀正常请求设太长会拖垮整个 Agent 的响应。5. 常见问题与排查技巧实录5.1 技能不触发或误触发这是最高频的问题。技能该用的时候不用不该用的时候乱用。排查思路分三步先看描述文件是不是写得太模糊这是最常见原因再看是不是有多个技能描述重叠导致 Agent 分不清最后看是不是 Agent 的加载机制有问题技能根本没被读到。我的解决套路是把描述改得更具体加上明确的触发词如果有重叠就合并技能或者明确划分边界加载问题就检查路径和权限。5.2 npx 安装失败的完整排查表现象可能原因解决方式卡在下载网络慢或源不可达换源或重试权限报错全局目录无写权限改本地安装或修权限缓存损坏上次安装中断清缓存重装版本冲突依赖不兼容指定版本号这张表我基本是背下来的遇到问题按顺序过一遍八成能解决。5.3 技能执行超时或卡死超时问题前面提过设阈值但还有一种情况是技能本身有 bug比如死循环。这种光靠超时只能止损根治还得看日志。我一般会在执行脚本里加日志输出记录开始、结束、关键中间状态。出问题时一看日志就知道卡在哪。提示日志不要写太多否则本身就成了性能负担。只记关键节点就够了。5.4 多技能协同时的上下文污染当 Agent 同时加载多个技能时可能出现上下文互相干扰。比如技能 A 的输出被技能 B 误当成输入。这个问题的根源是格式不统一。解决办法是强制所有技能遵守同一套输入输出约定并且在描述里写清楚“我只接受什么格式”。我踩过这个坑当时两个技能都用 JSON 但字段名不一样结果串了。后来统一了字段命名规范问题就没了。6. 技能生态的扩展与个人经验6.1 从单机到团队技能库的组织方式一个人用 skills随便放放就行。团队用就得有规范。我的做法是建一个技能仓库按领域分目录比如dev/、data/、ops/。每个技能有负责人有版本号有变更记录。新技能进来要经过评审确保描述清晰、格式统一。这样做的价值在于可发现和可复用。别人写好的技能你能直接拿来用不用重复造轮子。热词里说的“skills 大全”“skills 推荐”本质就是在做这件事。6.2 技能开发中的几个反直觉经验第一个反直觉的点技能不是越多越好。技能太多Agent 选择困难命中率反而下降。我一般控制在 20 个以内超过就合并或归档。第二个描述比实现重要。很多人花大力气写执行逻辑描述随便写两句结果技能根本不被调用。实际上描述才是 Agent 唯一能看到的东西值得反复打磨。第三个错误信息要写给 Agent 看不是写给人看。人看到堆栈能猜Agent 看到堆栈只会懵。错误信息要结构化、要包含下一步建议。6.3 后续可以怎么扩展skills 这套东西往上走可以做成技能市场大家发布和订阅。往深走可以做技能编排让多个技能自动组合成工作流。往细走可以给每个技能加质量评分用得好的排前面。我个人最看好的方向是技能的自适应组合。现在还需要人手动指定用哪些技能未来 Agent 应该能根据任务自动挑选和串联技能。这才是 skills 真正的想象力所在。最后分享一个我自己的小习惯每写完一个 skill我都会隔一天再回来看它的描述文件假装自己是第一次见到它的 Agent看能不能一眼看懂什么时候该用它。如果看不懂就改到看懂为止。这个笨办法帮我省了很多调试时间。