1. 从"skills"这个热词说起:它到底指什么
最近一段时间,不管是在技术社区还是各类开发者群组里,"skills"这个词出现的频率高得离谱。很多人第一次看到"skills"这个词,脑子里浮现的是"技能"这个通用含义,但如果你最近在关注 AI Agent 相关的技术动态,你会发现它已经变成了一个专有名词——Agent Skills,也就是给 AI 智能体挂载的"技能包"。
我最初接触这个概念的时候也是一头雾水。项目标题就一个词"skills",正文是空的,关键词也是空的,但相关热搜词却给了一大堆线索:Agent Skills、Google Cloud、npx、AI agents、claude agent skills、codex skills、skills开发、skills安装、skills市场……把这些词串起来,基本能还原出这个领域的全貌:这是一套围绕 AI Agent 能力扩展的机制,通过类似"插件"或"技能包"的方式,让 AI 智能体获得原本不具备的专项能力。
打个比方你就明白了。一个通用大模型就像一个刚毕业的大学生,脑子好使,但具体到某个岗位的实操,比如"用 Playwright 做浏览器自动化测试""按照特定格式写学术论文""做分镜脚本设计",它未必能一次做对。而 Skills 就是给这个大学生配的"岗位操作手册"——一份结构化的、可复用的、带明确触发条件的技能描述文件。当用户提出相关需求时,Agent 会自动加载对应的 Skill,按照里面定义的流程和规范来执行。
这个思路其实并不新鲜,早些年我们做自动化脚本的时候就有类似"函数库""工具集"的概念。但 Skills 的特别之处在于,它是面向自然语言交互场景设计的,不是给程序员调用的 API,而是给 AI 理解并执行的"说明书"。这就意味着它的编写门槛比传统插件低得多,一个懂业务逻辑但不太会写代码的人,也能写出一个可用的 Skill。
热搜词里还出现了"skills推荐""skills大全""skills下载平台有哪些""skills安装包下载"这些词,说明已经形成了一个小生态:有人在做 Skill 的开发,有人在收集整理,有人在分发。这个生态目前还比较早期,但增长很快。我个人的判断是,未来半年到一年内,Skills 会像当年的浏览器插件、VS Code 扩展一样,成为 AI 工具链里的标配。
这篇文章我打算把 Skills 这件事从头到尾讲清楚:它解决什么问题、核心机制是什么、怎么安装、怎么开发自己的 Skill、实际用起来有哪些坑。不管你是刚听说这个词的新手,还是已经装过几个 Skill 但没搞明白原理的老手,应该都能从里面找到有用的东西。
2. Skills 要解决的核心问题:为什么不能只靠提示词
2.1 提示词工程的三个天花板
很多人会问:我直接写一段详细的提示词不就行了吗,为什么还要搞个 Skills 机制?这个问题问到点子上了。我刚开始也是这么想的,直到实际用了一段时间之后,才明白单纯靠提示词有几个绕不过去的坎。
第一个坎是长度限制。你不可能把几十个不同场景的操作规范全部塞进系统提示词里。就算上下文窗口够大,塞太多东西进去也会导致模型注意力分散,该用 A 规范的时候它给你混进 B 规范的内容。我实测过一个案例:把三个不同格式要求的文档写作规范同时放进系统提示词,结果模型写出来的东西变成了"缝合怪",每种格式都沾一点,但每种都不标准。
第二个坎是复用性差。你辛辛苦苦调好的一段提示词,换一个对话窗口就没了,换一个工具平台也不通用。团队里其他人想用你的提示词,只能靠复制粘贴,版本管理一塌糊涂。这个痛点在团队协作场景下特别明显——张三改了一版提示词,李四不知道,还在用旧版,最后两个人产出的结果风格完全不一致。
第三个坎是触发时机不可控。系统提示词是"常驻"的,不管用户问什么,它都在那里占着位置。但很多技能只在特定场景下才需要,比如"生成分镜脚本"这个能力,用户不问分镜相关的问题时,它完全没必要加载。常驻提示词做不到这种"按需加载"。
2.2 Skills 的解题思路:按需加载的能力模块
Skills 机制的核心思路就是把"能力"从"提示词"里拆出来,做成独立的、可描述、可触发、可加载的模块。每个 Skill 本质上是一个结构化的描述文件,里面包含几个关键部分:
- 元信息:这个 Skill 叫什么、干什么用的、什么时候该触发
- 触发条件:用户在什么场景下、说了什么类型的话,应该激活这个 Skill
- 执行规范:激活之后,Agent 应该按照什么步骤、什么格式、什么约束来完成任务
- 依赖声明:这个 Skill 需要哪些外部工具、命令、环境支持
这种设计的好处是显而易见的。首先,上下文占用是动态的——只有匹配到触发条件时,Skill 的内容才会被加载进上下文,平时不占地方。其次,复用和分发变得简单——一个 Skill 就是一个文件(或一组文件),可以像代码一样做版本管理、可以打包分发、可以放到市场里共享。最后,职责边界清晰——每个 Skill 只管一件事,做分镜的就只管分镜,写论文的就只管论文,不会互相干扰。
我打个比方:传统的系统提示词就像把所有的工具都堆在桌面上,桌子再大也会乱;而 Skills 就像是一个工具箱,每个抽屉里放一类工具,需要哪个开哪个抽屉。桌面始终是干净的,找工具也更快。
2.3 和 MCP、Function Calling 的区别在哪
热搜词里出现了"claude mcpservers npx"这样的词,说明很多人会把 Skills 和 MCP(Model Context Protocol)搞混。这两个东西确实有关联,但定位完全不同。
MCP 解决的是**"Agent 怎么和外部世界通信"**的问题。它定义了一套协议,让 Agent 能够调用外部服务、读取外部数据、操作外部系统。你可以把 MCP 理解成"USB 接口标准"——它规定了插头和插座的形状,但具体插上去的是什么设备,它不管。
Skills 解决的是**"Agent 怎么知道该做什么、怎么做"**的问题。它更像是"设备驱动程序"——告诉 Agent 在什么情况下该调用什么能力、按照什么流程执行、输出什么格式。
Function Calling 则是更底层的东西,它是模型本身的一种能力,让模型能够输出结构化的函数调用请求。Skills 在执行过程中可能会用到 Function Calling,也可能用到 MCP 提供的工具,但 Skills 本身是更高层的"行为规范"。
三者关系可以这样理解:Function Calling 是"手",MCP 是"工具接口",Skills 是"操作手册"。手能抓东西,接口能接工具,但具体做什么、怎么做,得看操作手册。
3. 安装一个 Skill 到底发生了什么:从 npx 命令说起
3.1 npx 在 Skills 生态里的角色
热搜词里"npx"出现的频率很高,还有"npx playwright install失败"这样的具体问题。这说明 Skills 的安装和分发很大程度上是围绕 npm 生态来做的。npx 是 npm 自带的包执行工具,它可以直接运行一个 npm 包里的可执行文件,而不需要先全局安装。
为什么 Skills 生态会选择 npx 作为主要的分发方式?我的理解是几个原因叠加的结果。第一,开发者群体熟悉——大部分做 AI 工具的人本身就在 JavaScript/TypeScript 生态里,npm 是他们最顺手的包管理工具。第二,版本管理天然支持——npm 包天然带版本号,可以精确控制用哪个版本的 Skill。第三,依赖声明方便——Skill 如果需要依赖某个工具(比如 Playwright),可以直接在 package.json 里声明,安装时自动拉取。
一个典型的 Skill 安装命令大概长这样:
npx @some-org/some-skill install或者有些 Skill 是通过初始化命令来安装的:
npx create-some-skill@latest执行这个命令之后,背后发生的事情大致是:npx 从 npm registry 拉取对应的包,运行包里的安装脚本,安装脚本会把 Skill 的描述文件复制到 Agent 能够识别的目录下(通常是某个约定的 skills 文件夹),然后注册到 Agent 的 Skill 索引里。
3.2 安装目录与文件结构
不同平台的 Skill 存放位置不太一样,但基本逻辑是相似的。以我实际用过的几个平台为例,Skill 通常放在用户主目录下的一个隐藏文件夹里,或者放在项目根目录下的特定文件夹里。
用户级别的 Skill(对所有项目生效)一般放在:
~/.agent/skills/项目级别的 Skill(只对当前项目生效)一般放在:
<project-root>/.agent/skills/每个 Skill 是一个独立的子文件夹,里面至少包含一个描述文件(通常是 markdown 或 yaml 格式),可能还包含辅助脚本、模板文件、示例数据等。一个典型的 Skill 文件夹结构如下:
my-skill/ ├── SKILL.md # 核心描述文件 ├── scripts/ # 辅助脚本 │ └── helper.sh ├── templates/ # 输出模板 │ └── report.md └── examples/ # 使用示例 └── sample.mdSKILL.md是最关键的文件,它定义了 Skill 的元信息、触发条件和执行规范。Agent 在启动时会扫描这个目录,读取所有 Skill 的元信息,建立一个索引。当用户输入内容时,Agent 会根据索引里的触发条件判断是否需要加载某个 Skill 的完整内容。
3.3 安装失败的常见原因排查
"npx playwright install失败"这个热搜词说明安装环节是踩坑重灾区。我整理了几类最常见的失败原因和排查思路。
网络问题是最常见的。npm registry 在国内的访问速度不稳定,有时候包能拉下来但依赖的二进制文件拉不下来。Playwright 就是一个典型例子——它的 npm 包很小,但安装时会去下载浏览器二进制文件,这个下载走的是另一套 CDN,很容易超时。解决办法是配置镜像源,或者手动设置下载地址。
权限问题也很常见。如果 Skill 安装脚本需要写入系统目录,而当前用户没有写权限,就会失败。这种情况下要么用管理员权限运行,要么把 Skill 安装到用户目录下。
版本冲突是第三类常见问题。有些 Skill 依赖特定版本的 Node.js 或特定版本的其他工具,如果你的环境版本不匹配,安装脚本可能会报错。排查方法是先看错误信息里有没有版本号相关的提示,然后对照 Skill 的文档检查环境要求。
依赖缺失是第四类。有些 Skill 依赖系统级的工具,比如 git、python、ffmpeg 等。如果这些工具没装或者不在 PATH 里,安装脚本调用时会失败。这类问题的排查方法是看错误信息里有没有"command not found"之类的提示。
我个人的经验是,遇到安装失败先别急着重试,先把完整的错误日志看一遍。大部分情况下错误信息里已经写清楚了原因,只是很多人习惯性地忽略。如果错误信息看不懂,把关键几行复制出来搜索一下,通常能找到遇到同样问题的人。
4. 自己动手写一个 Skill:从需求到落地
4.1 什么样的需求适合做成 Skill
不是所有需求都适合做成 Skill。我踩过的坑是:一开始觉得什么都能做成 Skill,结果做了一堆用不上的,反而把 Skill 目录搞得乱七八糟,Agent 加载索引的速度都变慢了。
判断一个需求是否适合做成 Skill,我总结了一个简单的标准:这个需求是否会在多个不同的对话里反复出现,并且每次出现时你都希望 Agent 按照同一套规范来处理?如果答案是肯定的,那就适合做成 Skill。如果只是一次性的需求,或者每次的规范都不一样,那直接写提示词就行了,没必要做成 Skill。
举几个适合做成 Skill 的例子:
- 固定格式的文档生成:比如周报、会议纪要、技术方案模板,格式固定,反复出现
- 特定领域的分析流程:比如代码审查、安全扫描、性能分析,步骤固定,有明确的检查清单
- 特定工具的操作规范:比如用某个 CLI 工具做部署、用某个库做数据处理,命令和参数固定
- 特定风格的创作:比如分镜脚本、短视频文案、产品描述,风格要求固定
反过来,下面这些就不太适合做成 Skill:
- 一次性的、探索性的任务
- 每次都需要大量定制化输入的任务
- 规范还在频繁变化、尚未稳定的任务
4.2 SKILL.md 的写法:结构比文采重要
写 SKILL.md 的核心原则是结构清晰、触发明确、步骤可执行。它不是一篇给人读的文章,而是给 Agent 读的"操作指令"。所以文采不重要,重要的是信息密度和可执行性。
一个 SKILL.md 通常包含以下几个部分:
元信息部分定义 Skill 的基本属性:
--- name: weekly-report-generator description: 根据本周的工作记录生成结构化周报 version: 1.0.0 author: your-name tags: [report, weekly, documentation] ---触发条件部分告诉 Agent 什么时候该用这个 Skill:
## 触发条件 当用户提到以下关键词或意图时,激活本 Skill: - "写周报"、"生成周报"、"本周总结" - 用户提供了本周的工作记录,并要求整理成报告 - 用户询问周报模板或格式执行规范部分是核心,定义具体怎么做:
## 执行步骤 1. 收集用户提供的工作记录,如果信息不完整,主动询问缺失的部分 2. 按照以下结构组织内容: - 本周完成事项(按项目分组) - 进行中事项及进度 - 遇到的问题及解决方案 - 下周计划 3. 每个事项用一句话描述,不超过 50 字 4. 输出格式使用 Markdown,标题层级不超过三级 5. 最后附上本周工时统计(如果用户提供了数据)输出示例部分给出一个参考样例,帮助 Agent 理解期望的输出形态:
## 输出示例 ### 本周完成事项 **项目 A** - 完成了用户登录模块的重构,支持手机号+验证码登录 - 修复了 3 个线上 bug,平均响应时间从 800ms 降到 200ms **项目 B** - 完成了数据库表结构设计评审 - 输出了接口文档初稿我个人的经验是,触发条件写得越具体越好。太宽泛的触发条件会导致 Skill 在不该激活的时候被激活,反而干扰正常对话。比如"用户提到报告"这个触发条件就太宽了,用户可能只是随口提了一句"这个报告不错",并不需要生成周报。更精确的写法是"用户明确要求生成周报,或提供了工作记录并要求整理成周报格式"。
4.3 调试 Skill 的实用技巧
写完 SKILL.md 之后,怎么验证它是否按预期工作?我常用的方法是构造一组测试用例,覆盖正常场景和边界场景。
正常场景就是典型的用户输入,比如"帮我写一下这周的周报,这是工作记录:……"。边界场景包括:用户只提供了部分信息、用户提供了格式混乱的信息、用户的要求和 Skill 规范有冲突等。
测试的时候重点观察几个点:Skill 有没有被正确触发(有时候该触发没触发,有时候不该触发却触发了)、执行步骤有没有被完整遵循(有时候 Agent 会跳步或者自己发挥)、输出格式是否符合预期(有时候格式会跑偏)。
如果发现 Skill 没有被触发,通常是触发条件写得太窄或者太模糊。太窄就放宽一点,太模糊就加一些具体的例子。如果发现执行步骤被跳过,通常是步骤描述不够明确,或者步骤太多导致 Agent 记不住。这时候可以把步骤拆成更小的子步骤,或者在关键步骤上加"必须""务必"这样的强调词。
还有一个技巧是在 SKILL.md 里加入"反例",明确告诉 Agent 什么情况下不要这样做。比如"不要在用户没有提供工作记录的情况下凭空编造内容""不要输出超过三级标题的层级结构"。反例有时候比正例更有效,因为它能帮 Agent 划清边界。
5. Skills 在实际场景中的落地案例
5.1 用 Skill 做浏览器自动化测试
热搜词里"npx playwright install失败"和"自动挖洞skills"放在一起看,能看出一个典型场景:用 Skill 封装浏览器自动化能力,做安全测试或功能测试。
这个场景的痛点很明显:Playwright 本身是个强大的工具,但它的 API 比较底层,写一个完整的测试脚本需要不少代码。如果每次做测试都从零写脚本,效率很低。而如果把常见的测试模式封装成 Skill,用户只需要用自然语言描述测试需求,Agent 就能自动生成并执行测试脚本。
我实际搭过这样一个 Skill,核心思路是:在 SKILL.md 里定义几种常见的测试模式(比如"检查页面所有链接是否可访问""检查表单提交是否正常""检查页面加载性能"),每种模式对应一段 Playwright 脚本模板。当用户提出测试需求时,Agent 根据需求匹配对应的模式,填充参数,生成脚本,然后调用 Playwright 执行。
这个 Skill 的依赖声明部分需要写清楚:
## 依赖 - Node.js >= 18 - Playwright(通过 `npx playwright install` 安装) - 如果安装失败,检查网络连接,或手动设置 PLAYWRIGHT_DOWNLOAD_HOST 环境变量这里就呼应了热搜词里的"npx playwright install失败"——很多人在这一步卡住,是因为 Playwright 的浏览器二进制文件下载走了单独的 CDN,网络不通就会失败。解决办法在 Skill 的文档里写清楚,能帮使用者省很多时间。
5.2 用 Skill 做学术论文写作辅助
"codex写论文的skills"和"nature skills"这两个热搜词指向另一个高频场景:学术写作。这个场景的需求很具体:论文有固定的结构(摘要、引言、方法、结果、讨论、结论),每个部分有固定的写作规范,引用格式有严格要求,语言风格要学术化。
我帮朋友搭过一个论文写作 Skill,核心是把论文写作的规范拆解成可执行的步骤。比如"引言"部分的写作规范是:先交代研究背景和问题的重要性,再综述现有工作的不足,最后引出本文的贡献。每一步都有具体的字数建议和句式模板。
这个 Skill 的特别之处在于引用管理。学术论文对引用的要求很严格,格式错了会被审稿人挑刺。我在 Skill 里定义了一套引用格式规范,并要求 Agent 在生成内容时标注引用来源,最后统一整理成参考文献列表。这样虽然不能完全替代人工检查,但能大幅减少格式错误。
实际用下来,这个 Skill 最大的价值不是"代写论文"——那既不现实也不应该——而是帮作者理清思路、检查结构完整性、统一语言风格。很多研究者写论文时容易陷入细节,忘了整体结构,这个 Skill 能起到"结构检查清单"的作用。
5.3 用 Skill 做分镜脚本设计
"分镜skills下载"这个热搜词指向的是创意领域的应用。分镜脚本是视频制作的前置环节,需要把文字脚本转化成一个个具体的镜头描述,包括景别、角度、运镜、时长、画面内容、音效等。
这个场景做成 Skill 的优势在于格式高度标准化。分镜脚本虽然有各种风格,但核心字段是固定的。我在 SKILL.md 里定义了一个标准的分镜表格格式:
| 镜号 | 景别 | 角度 | 运镜 | 时长 | 画面内容 | 音效 | 备注 |
|---|---|---|---|---|---|---|---|
| 1 | 远景 | 平视 | 固定 | 3s | 城市天际线,日出 | 环境音 | 开场 |
然后定义转换规则:用户提供文字脚本后,Agent 先拆分场景,再为每个场景设计镜头,最后填充表格。规则里还包含一些经验性的约束,比如"相邻镜头的景别不要重复""动作镜头时长不超过 2 秒""对话场景优先用中近景"。
这个 Skill 我实际用下来,最大的感受是它把"创意"和"规范"分开了。创意部分还是人来把控——你想表达什么情绪、什么节奏,这是人的判断。但规范部分——表格格式、字段完整性、镜头语言的基本规则——交给 Skill 来保证。这样人可以把精力集中在创意上,不用分心去记那些格式细节。
6. Skills 生态的现状与选型建议
6.1 当前生态的碎片化现状
热搜词里"skills下载平台有哪些""skills大全""skills推荐"这些词,反映了一个现状:Skills 生态还很碎片化,没有形成统一的分发标准。
目前我观察到的分发渠道大概有几类:一是官方市场,某些平台会提供官方的 Skill 市场,里面的 Skill 经过审核,质量相对有保障;二是社区仓库,比如 GitHub 上的各种 awesome-skills 列表,由社区维护,质量参差不齐;三是个人分享,在技术社区、群组里零散传播,没有统一的索引。
这种碎片化状态有利有弊。好处是门槛低、创新快,任何人都可以做一个 Skill 分享出来,好的想法能快速传播。坏处是质量不可控、安全有隐患——你从不明来源下载的 Skill,里面可能包含恶意指令,或者会调用你不希望它调用的工具。
我的建议是:优先用官方市场或知名社区仓库里的 Skill,用之前先读一遍 SKILL.md 的内容。特别是要看清楚它声明了哪些依赖、会执行哪些命令、会访问哪些数据。如果一个 Skill 的 SKILL.md 写得含糊不清,或者要求执行一些看起来不合理的操作,那就不要用。
6.2 选型时该看哪几个指标
面对一个 Skill,怎么判断它值不值得用?我总结了一个简单的评估框架,主要看四个维度。
触发准确性是最重要的。一个 Skill 如果触发条件写得太宽,会在不该激活的时候激活,干扰正常对话;写得太窄,又会在该激活的时候不激活,形同虚设。评估方法是看它的触发条件描述是否具体、是否有明确的边界。
步骤可执行性是第二重要的。有些 Skill 的 SKILL.md 写得很漂亮,但步骤描述含糊,Agent 执行时只能靠猜。好的 Skill 应该把每一步都写清楚:输入是什么、输出是什么、遇到异常怎么处理。
依赖合理性也需要关注。一个 Skill 如果需要安装一大堆依赖,或者依赖一些冷门的、维护不善的工具,使用成本就会很高。理想情况下,Skill 的依赖应该尽量少、尽量主流。
更新频率是最后一个指标。AI 领域变化很快,一个半年没更新的 Skill 可能已经不适配新版本的 Agent 了。看它的版本号和更新日志,能大致判断维护状态。
6.3 组合使用多个 Skill 的注意事项
实际使用中,你往往会同时装多个 Skill。这时候要注意几个问题。
触发条件冲突是最常见的。两个 Skill 的触发条件如果有重叠,Agent 可能会同时激活两个,导致行为混乱。解决办法是在写 Skill 时就把触发条件写得足够具体,避免和其他 Skill 重叠。如果已经装了有冲突的 Skill,可以手动调整其中一个的触发条件。
上下文占用是第二个问题。虽然 Skills 是按需加载的,但如果一次对话中激活了太多 Skill,上下文还是会被占满。我的经验是,一次对话中激活的 Skill 不要超过三个,超过三个就要考虑是不是需求太发散了,应该拆成多次对话。
执行顺序是第三个问题。有些任务需要多个 Skill 配合完成,比如先用 A Skill 收集信息,再用 B Skill 生成报告。这种情况下,需要在对话中明确指定顺序,或者写一个"编排 Skill"来协调其他 Skill 的执行。
7. 踩坑记录:那些文档里不会写的问题
7.1 Skill 不生效的排查链路
Skill 装了但不生效,这是最常见的问题。我遇到过的原因大概有五六种,排查的时候建议按下面的顺序来。
第一步,确认 Skill 放对了目录。不同平台对 Skill 目录的要求不一样,有的要求放在用户主目录下,有的要求放在项目目录下。放错位置是最低级但也最常见的错误。检查方法是看平台的文档,确认目录路径。
第二步,确认 Skill 文件格式正确。SKILL.md 的元信息部分(通常是 YAML front matter)如果格式有误,比如缩进不对、冒号后面没空格,解析就会失败。这种错误很隐蔽,因为文件看起来是正常的,但解析器就是读不出来。检查方法是用 YAML 校验工具过一遍。
第三步,确认触发条件匹配。有时候 Skill 本身没问题,但用户的输入没有匹配到触发条件。这时候可以试着用更明确的关键词重新提问,看 Skill 是否被激活。如果换了关键词还是不激活,那就是触发条件写得太窄了。
第四步,确认没有和其他 Skill 冲突。如果同时装了多个 Skill,可能有触发条件重叠的情况。检查方法是暂时移除其他 Skill,只保留一个,看是否生效。
第五步,查看 Agent 的日志。大部分平台都会输出日志,记录 Skill 的加载和触发情况。看日志能快速定位问题出在哪个环节。
7.2 依赖安装的坑:以 Playwright 为例
前面提到过"npx playwright install失败",这里展开说一下这类依赖安装问题的通用排查思路。
Playwright 的安装分两步:第一步是 npm 包安装,第二步是浏览器二进制文件下载。第一步通常没问题,问题基本都出在第二步。浏览器二进制文件比较大(几百 MB),下载走的是 Playwright 自己的 CDN,国内访问不稳定。
解决办法有几个:一是设置镜像源,把下载地址指向国内可访问的镜像;二是手动下载,从其他渠道下载好二进制文件,放到指定目录;三是跳过下载,如果只是用 Playwright 的部分功能(比如不需要真实浏览器),可以跳过浏览器下载。
这类问题的通用排查思路是:先确认是哪一步失败,再针对那一步找解决方案。不要一上来就重试,重试大概率还是失败。看错误日志,确认是网络问题、权限问题还是版本问题,然后对症下药。
7.3 Skill 输出不稳定的应对方法
同一个 Skill,有时候输出很规范,有时候又跑偏,这种不稳定问题很让人头疼。我分析下来,原因主要有几个。
模型本身的随机性是第一个原因。大模型的输出本身就有随机性,同样的输入两次,输出可能不一样。这个没法完全消除,但可以通过在 SKILL.md 里加更多约束来降低随机性。比如明确指定输出格式、给出具体的示例、加入"必须""务必"这样的强调词。
上下文干扰是第二个原因。如果对话历史很长,或者同时激活了其他 Skill,当前 Skill 的执行可能会受到干扰。解决办法是尽量在干净的上下文里使用 Skill,或者把复杂任务拆成多个简单任务。
触发条件模糊是第三个原因。如果触发条件写得不够具体,Agent 可能在不同的时候对"是否该激活"做出不同的判断。解决办法是把触发条件写得更精确,减少歧义。
我个人的经验是,Skill 的输出稳定性,80% 取决于 SKILL.md 写得好不好。写得好的 Skill,输出基本稳定;写得含糊的 Skill,输出就飘忽不定。所以与其反复调试,不如一开始就把 SKILL.md 写好。
8. 我对 Skills 这件事的一些个人判断
用了这段时间的 Skills,我最大的感受是:它把 AI 应用的门槛又降低了一层。以前要让 AI 做一件特定的事,你得懂提示词工程,得反复调试;现在你可以直接装一个别人写好的 Skill,或者照着模板写一个自己的。这个变化看起来不大,但实际影响很深——它意味着 AI 能力的"可组合性"和"可分发性"上了一个台阶。
另一个感受是,Skills 的价值不在于单个 Skill 有多强,而在于组合。一个 Skill 只能做一件事,但十个 Skill 组合起来,就能覆盖一个完整的工作流。我现在的做法是,把日常工作中反复出现的任务都做成 Skill,用的时候按需激活,效率提升很明显。
当然,现在这个生态还很早期,问题也不少:分发渠道碎片化、质量标准不统一、安全机制不完善。但这些问题都是发展中的问题,随着生态成熟,应该会逐步解决。我个人的建议是,现在就可以开始积累自己的 Skill 库,不用等生态完全成熟。早积累早受益,等生态成熟了,你的 Skill 库就是一笔资产。
最后分享一个小技巧:写 Skill 的时候,先写触发条件和输出示例,再写执行步骤。因为触发条件决定了 Skill 什么时候被用,输出示例决定了 Skill 产出什么,这两个是最关键的。执行步骤可以慢慢调,但触发条件和输出示例如果一开始就错了,后面怎么调都别扭。这个顺序是我踩了几次坑之后总结出来的,希望对你有用。