先说个我最近的经历。团队里有个老哥,跟我用同一个 AI 编程助手,做差不多的任务,但他的产出质量明显比我高一截。后来我翻了他的配置目录才明白,他把我们组里平时 code review、日志排查、测试用例设计的那套流程,全都做成了 Skill,让模型每次干活都按这套流程走。而我那会儿还停留在“每次对话临时描述需求、碰运气式地等模型发挥”的阶段。同样是 AI 编程助手,他是让 AI 稳定地产出,我是让 AI 随机地发挥,差距就是这么拉开的。
这事让我意识到,Skill 不是某个工具的某个小功能,而是 AI 用法上一个阶段性的分水岭。最近半年,Claude Code、Codex、Trae、CodeBuddy 这些工具几乎在同一时间开始推 Skill 机制,社区里也冒出了一堆关于 skill 脚本、skill 插件、skill 推荐的讨论。如果你现在还在困惑“Skill 到底是什么、跟普通提示词有什么区别、模型是怎么在合适的时候想起它的”,那这一篇就是给你准备的。
这一篇作为系列的第一章,我不急着教你写代码,也不打算一上来就让你复制各种复杂的技能包。我只讲两件事:第一,Skills 到底是什么,为什么各家工具都在做;第二,它的工作原理是什么——模型是怎么在合适的时机想起并加载某个 Skill 的。把这两件事吃透,后面你再看别人的 Skill 项目、动手写自己的第一个 Skill,心里才有底。
1. Skills 到底是什么——先搞清楚我们讨论的对象
1.1 两个“Skill”,别混为一谈
想查资料的人最先遇到的坑就是:随便搜一下“skill”,你会看到两类完全不同的东西。一边是 Cadence Allegro 这类 EDA 软件里的 Skill 脚本语言,那是芯片和 PCB 设计领域用来做二次开发、自动化布线与封装操作的类 Lisp 方言,跟 AutoCAD 里的 AutoLISP 一个路子;另一边是近两三年在 AI Agent 和 AI 编程工具圈子里火起来的 Skill 机制,指的是一套让大模型按预设流程完成特定任务的指令包。热搜词里同时出现“allegro skill”和“codex skill”,正好说明这两个圈层的人都在用同一个词,但聊的完全是两码事。
这篇文章讨论的是后者,AI 时代的 Skill。但有意思的是,这两类 Skill 的底层思想其实一脉相承——都是把“专家反复做某件事的经验”,固化成可以复用、可以分享、可以版本化管理的“操作手册”。区别只是执行者不同:一个由解释器执行,一个由大模型执行。你只要抓住了这条主线,后面理解各种细节就不会跑偏。
1.2 Skill 不是提示词,也不是插件
很多刚入门的朋友容易把 Skill 跟 Prompt、Plugin 混在一起,我第一次接触时也绕了一下。先说 Prompt。普通 Prompt 是你跟模型对话时临时给出的指令,比如你敲一句“帮我看一下这段代码的命名规范”,模型就按这句话去执行。它的特点是即时、一次性、内容完全靠你当时发挥,下次想让它做一模一样的事情,你还得重新描述一遍,而且往往描述得不够细,出来的结果也不够稳定。
Plugin 解决的是另一个方向的问题——能力边界。比如浏览器插件、文件读写插件、数据库连接插件,这些是给模型开放原本没有的“手”和“眼”,让它能查网页、读写文件、执行命令。Plugin 管的是“能做什么”。
Skill 管的则是“怎么做得更好”。它是一套可复用的、结构化的、带版本管理的最佳实践集合。一个 Skill 里通常包含完整的任务描述、操作步骤、输出格式要求、示例和校验规则。模型加载 Skill 之后,在匹配的场景下会强制把执行路径切换到这套标准流程上,而不是“想起来就按它来、想不起来就随便来”。
我用一个生活化的类比总结三者的区别:Plugin 是给你一把好菜刀,解决“能不能切”的问题;Prompt 是你随口说的一句“把菜切好”;Skill 则是一本由主厨亲手写的菜谱,里面写明了选料标准、火候区间、装盘方式,甚至“如果这一步失败,可能是哪三种原因”。菜刀决定上限,菜谱决定下限。Skill 的真实价值,是把结果的下限抬到一个可接受的高度。
还有一个容易忽略的层面:Prompt 本质上是聊天,质量随缘;Skill 是有明确文件结构、元数据规范、支持版本迭代的工程化产物。这也是为什么 Skill 机制出来之后,“手写长提示词”这种偏民科式的玩法,开始逐渐被工业化的 Skill 体系取代。
1.3 为什么最近各家 AI 工具都在推 Skill
如果只能用一个角度解释这件事,我会说:因为模型本身的能力已经够强了,真正的瓶颈转移到了“怎么稳定地让模型按高质量标准干活”。
这个判断可以从几个现象里得到印证。第一,同一个模型,在同样的上下文里,给不给出具体流程约束,输出质量差距极大。我在代码审查场景里专门做过对比,一句“帮我审查这段代码”和一套完整的 code review Skill(规定从安全、性能、可维护性三个维度逐步检查,并输出带严重级别的报告),出来的结果根本不是同一个量级。前者像实习生看了一眼,后者像资深工程师拿着检查清单逐项过。
第二,社区生态在快速向 Skill 方向倾斜。Claude Code 开放了 Skills 目录规范,Codex 在配置里支持挂载技能包,Trae 和 CodeBuddy 也在往这个方向走。你会发现这些工具的定位正在发生微妙变化——不再只是“能聊天的编码助手”,而是“可配置、可沉淀、可传承的协作系统”,Skill 正是这种转变的载体。
第三,从成本角度也说得通。把一个大而全的操作手册常驻在上下文里,Token 消耗极高;把手册拆成按需加载的 Skill,只在任务匹配时注入,明显更省。对重度使用者来说,这是实打实的成本优化。所以 Skill 不是某家公司拍脑袋发明的功能,而是 AI 应用从“能干活”走向“稳定地干好活”这个阶段的必然产物。
2. 从一条指令到一次调用:Skill 的工作原理拆解
2.1 Skill 的底层结构:一个按规则组织的目录
先说结论:绝大多数主流 AI 工具里,一个 Skill 的本质就是一个“特殊格式的文件夹/文件包”,里面必有一个 Markdown 格式的主指令文件,常见命名是 SKILL.md,顶部带 YAML 格式的元信息,用来声明名字、用途描述、适用场景等关键字段。
以 Claude Code 的规范为例,一个典型的 Skill 目录大致长这样:
code-review-skill/ ├── SKILL.md # 主指令文件,YAML 头 + Markdown 正文 ├── examples/ # 示例输入输出 │ ├── good-output.md │ └── bad-output.md ├── templates/ # 输出模板 │ └── review-report.md └── scripts/ # 辅助脚本(可选) └── extract-diff.pySKILL.md 的 YAML 头一般包含 name 和 description 两个字段,其中 description 是整个 Skill 机制里最容易被低估、也最关键的一环。它决定了模型能不能在合适的场景下想起这个 Skill。很多人花大量时间打磨正文、写模板,却忽略了这个描述字段,结果 Skill 躺在目录里,模型根本不知道什么时候该用它,等于写了白写。
2.2 触发机制:模型是怎么知道该用哪个 Skill 的
不少人误以为 Skill 的工作方式是“模型先把所有技能通读一遍存进记忆,干活时再掏出来用”。实际上,工程上完全不是这么干的。目前主流工具的实现路径,更像一个“注册—匹配—注入—执行”的四阶段过程。
第一阶段叫注册与发现。工具启动时会扫描指定目录下的所有 Skill,读取每个 Skill 的元信息,尤其是 name 和 description,形成一个精简的“技能索引清单”。这个清单通常每个 Skill 只保留一两行描述,不加载完整内容,所以启动阶段的成本可以忽略不计。
第二阶段是匹配与注入。当用户发起一个任务时,模型或工具内部的调度逻辑会拿当前任务去跟索引清单里的描述做匹配。匹配方式可能是纯靠模型语义判断,也可能结合关键词召回,各家实现有差异。一旦判定某个 Skill 与当前任务高度相关,工具就把那个 Skill 的完整 SKILL.md 注入到上下文里,让模型“看见”整套操作手册。
第三阶段是执行与约束。模型读到 SKILL.md 后,按照里面定义的步骤、格式、质量标准来执行任务。这个阶段 Skill 起到的是“软约束加硬模板”的混合作用:硬模板部分(比如输出的 Markdown 结构、必须包含的检查项)模型通常会严格遵守;软约束部分(比如“遇到边界情况时优先选择最保守方案”)则由模型在生成时自行权衡。
这套机制的关键在于,Skill 不是“一直在上下文里待命”,而是“需要时才被加载”。就像你去大型图书馆,不会把整馆的书全背在脑子里,而是先查目录,锁定几本相关的,再翻到对应章节。正是这个设计,让 Token 消耗变得可控。
2.3 上下文压缩与 Token 经济
来算一笔实际的账。假设你有一份非常详尽的项目规范手册,一共 1 万字。如果每次都把它塞进上下文,按一个汉字约等于 1.5 到 2 个 token 估算,1 万字就占掉 1.5 万到 2 万 token。假设一天对话 50 轮,这个手册就被重复计费 50 次,成本直接起飞。
用 Skill 的思路改造一下:把这 1 万字拆成 N 个小型 Skill,每个只有几百到一两千字。上下文里常驻的只有“技能索引描述”,每项 Skill 的描述控制在 100 字以内。即使挂载了 20 个 Skill,常驻开销也只有 2000 token 左右。真正需要某个 Skill 时,才把那几百到一两千字注入一次。50 轮对话里假设有 10 轮触发了不同 Skill,总增量也只是几千 token 的量级,远远小于常驻完整手册的代价。
所以社区里流传的“某个 Skill 很省 token”,并不是 Skill 有什么黑魔法,本质是“按需加载”这个设计省下来的。这也反过来解释了为什么 Skill 的 description 必须写得精准、可检索、少废话:描述写得太泛,模型会在不相关场景也触发它,白白浪费 token;写得太偏,模型该触发时不触发,Skill 就形同虚设。我自己写 Skill 的默认标准是:description 控制在 80 字以内,说清楚“解决什么问题、在什么场景下使用、产出什么格式”,不写多余修饰语。AI 模型的语义匹配对场景词很敏感,description 里埋好关键词,触发率会有肉眼可见的提升。
注意:description 是整个 Skill 的“门面”。我见过太多人反复打磨正文模板,却随便写一行描述,结果模型根本不知道什么时候该调它。宁可先花十分钟把描述写准,也不要急着堆正文。
3. 主流工具里的 Skill:形态、生态与选型
3.1 各家实现的共同点与差异点
目前主流 AI 编程和 Agent 工具里,Skill 机制大同小异,但细节上有几个维度的差异值得关注。
存储位置方面,Claude Code 约定放在项目根目录的.claude/skills/下,也支持用户级全局目录;Codex 的同类机制往往通过AGENTS.md这类配置文件来引用;Trae、CodeBuddy 这类产品则可能在应用配置面板里统一管理。不管放在哪,核心逻辑都是“扫描一个目录里的标准格式文件”,所以你在不同工具间迁移 Skill 时,需要适配的其实只是目录位置和少量元数据字段。
触发方式方面,有的工具完全靠模型语义判断,有的提供显式声明(比如手动指定某个 Skill),还有的做了半自动召回——先由工具做一层关键词筛选,再由模型做语义判断。对使用者来说,最重要的差异是“能不能手工强制指定 Skill”。我个人的经验是,生产环境里的关键流程,手工指定比纯自动触发要稳得多。很多工具支持在指令里直接说“按某某 Skill 执行”,这相当于给模型一个明确开关,能有效避免它临场换路径。
执行粒度方面,有的 Skill 覆盖一个端到端任务,比如“生成周报”,从收集信息到排版输出一步到位;有的 Skill 只负责任务中的一个片断,比如“输出 Markdown 表格时必须遵循的格式规范”。前者适合独立场景,后者适合做约束注入。理解这个差异,能帮你决定一个流程是拆成一个大 Skill 合适,还是拆成多个小 Skill 拼装更灵活。
3.2 场景化 Skills:从代码到 PPT、电商、日志分析
从热词里就能看出,Skill 早已不限于程序员圈子。测试用例 Skill、日志分析 Skill、PPT 制作 Skill、电商运营 Skill、数学建模 Skill、科研辅助 Skill,这些场景化的技能包正在快速蔓延。
拿日志分析举例。一个写得好的日志分析 Skill,会明确规定执行路径:第一步,先让用户提供日志文件路径或粘贴关键片段;第二步,按时间线梳理异常点;第三步,对每个异常点做可能原因排序;第四步,输出一份带严重级别、影响范围、初步排查建议的报告。没有这个 Skill,模型面对一堆日志常常只会泛泛地说“看起来有报错”;有了 Skill,它就变成了一个按套路排查的运维老手,思路清晰,结论可执行。
PPT 类 Skill 也很典型。它通常会内置结构模板,比如封面、痛点、方案、对比、落地计划、风险与应对,还会限制每页的字数和配图建议。严格按 Skill 生成的 PPT 大纲,跟直接说“帮我做个 PPT”出来的东西,专业度高两个档次。电商运营场景的 Skill 最近同样火,比如给商品文案定调性、批量生成标题、分析竞品评价。这类 Skill 更多是把运营专家的经验转成可执行的检查清单,例如标题必须包含核心关键词、前多少个字要抓眼球、结尾要不要加行动号召,全部落到具体规则上。
你会发现,这些场景化 Skill 看起来五花八门,内核却是同一个套路:把专家判断的隐性经验,转译成模型能一步步照做的显性流程。谁对某个场景的隐性经验理解得深,谁写出来的 Skill 就越好用。
3.3 怎么判断一个 Skill 好不好
我见过太多人看到社区里有人分享 Skill 就直接往配置目录里塞,结果跑出来一堆格式统一但内容空洞的东西。判断一个 Skill 质量,我一般看四件事。
第一,有没有可验证的输出结构。好 Skill 一定会规定输出的版式、标题层级、检查项,而不是只说“要认真、要高质量”。结构是可验证的,质量是主观的,Skill 里能写进结构的部分越多,落地性越强。第二,有没有示例。一份完整的输入输出示例,能让模型直观理解“这个场景下的好结果长什么样”,效果远胜于抽象描述。第三,有没有边界和异常处理。比如代码审查 Skill 会不会写明“遇到无法判断时明确说不知道”“出现误报时如何澄清”。边界处理是区分“提示词拼盘”和“工程化 Skill”的分水岭。第四,有没有依赖关系说明。有些 Skill 依赖特定工具或文件格式,文档里写清依赖,能避免大量踩坑。
这套标准同样适用于你自己写 Skill:写完先问自己,输出结构是否可验证、示例是否齐全、异常分支有没有覆盖、依赖有没有说明。四样都齐,基本不会太差。
4. 手把手理解:一个 Skill 从加载到执行的全过程
4.1 一个最小可用的 Skill 实例
直接给你看我实际在用的一个“代码审查 Skill”的核心结构,对照着理解前面说的原理,比空谈概念直观得多。
--- name: code-review description: 对代码变更做结构化审查,覆盖安全、性能、可维护性、命名规范,输出带严重级别的审查报告。适用于 code review、pull request review、diff 审查。 --- # Code Review 执行手册 ## 步骤 1. 先请用户提供变更文件列表或 diff 内容;若未提供,明确要求先提供。 2. 按顺序逐项检查: - 安全:注入、硬编码密钥、越权访问、不安全反序列化。 - 性能:N+1 查询、大对象常驻内存、明显可避免的重复计算。 - 可维护性:函数是否过长、重复代码、命名是否表达真实意图。 - 兼容性:是否引入破坏性变更、是否有向后兼容方案。 3. 输出报告,必须按以下模板: - 总体结论(通过 / 需修改 / 不通过) - 问题列表(编号、级别、文件、行数、问题描述、修改建议) - 严重级别从高到低排序 ## 边界 - 只审查用户提供的内容,不臆测范围之外的代码。 - 无 diff 时不要强行输出结论,提示用户补充材料。有了这份 SKILL.md,模型在完成 code review 任务时,输出结构、检查维度、严重级别标记方式都会稳定下来。你不会再看到它“随便点评两句”就交差的情况。
4.2 从加载到输出的完整链路
我把一条完整链路拆开,方便你对照排查问题。
第一步,工具启动后,扫描.claude/skills/目录,看到code-review-skill这个文件夹,读取 SKILL.md 的 YAML 头,把 name 和 description 注册进技能索引。此时上下文里只增加了几个 token 的开销。
第二步,你发起一个任务,说“帮我 review 一下这个 PR 的 diff”。模型或调度层识别到“review”“diff”这些词,结合语义判断,命中 code-review 这个 Skill 的 description。工具随即把完整的 SKILL.md 注入当前上下文。
第三步,模型看到执行手册,先按步骤一提示你提供 diff 内容。你粘贴 diff 后,它按顺序检查安全、性能、可维护性、兼容性,最后生成带严重级别的报告。整个过程你的角色只是提供输入和接收结果,检查路径完全被 Skill 接管。
第四步,如果对报告不满意,你可以直接说“按模板重出”或“只保留高级别问题”,模型会基于已经加载的 Skill 框架做局部调整,比从零开始重新描述需求高效得多。
这条链路里最容易出问题的是两个点:一是注册失败,通常是因为目录层级放错、YAML 头格式不合法,工具根本识别不了;二是触发不中,description 写得太抽象,Skill 躺在那里但模型从来没想起来用过。排查这两类问题,我从“目录放对没有、YAML 合法没有、description 里有没有场景关键词、输出模板是否清晰”这四个方向逐一核。
4.3 调试 Skill 的三个实用技巧
写完一个 Skill,怎么确认它真的生效?我自己常用的土办法有三个。
第一,加一个“自检开关”。在 Skill 正文里写上“如果已加载本 Skill,请先输出一行:已加载 Code Review Skill”。第一次对话时先验证模型有没有准确响应,确认加载无误后,再删掉这句话。
第二,用同一个输入跑两组对比。一组不带 Skill 直接让模型做任务,一组带上 Skill,对比输出结构、完整度和稳定性。这个对比能直观展示 Skill 带来的增量,方便自己复盘,也方便向团队解释为什么要引入 Skill。
第三,故意在 description 里埋一个稳定触发词。比如你希望 Skill 在“变更审查”场景被触发,description 里就要出现“变更”“diff”“review”这些词。如果模型在对话里换了同义表达但就是不触发,你就要考虑调整描述的自然度——关键词该埋,但别埋得像个指令炸弹,语义自然、检索友好才是度。
5. 常见问题与避坑经验
5.1 高频问题速查
| 现象 | 可能原因 | 处理方式 |
|---|---|---|
| 模型完全不触发某个 Skill | description 太抽象,或缺场景关键词 | 重写 description,明确问题、场景、输出三要素 |
| Skill 加载了但输出还是失控 | SKILL.md 流程约束太弱,模板不够硬 | 把必须输出的结构写成强约束模板,减少模糊语 |
| 多个 Skill 互相抢任务 | description 场景重叠,边界不清 | 给每个 Skill 划定专属场景词,避免重叠 |
| Token 消耗异常增加 | description 太宽泛,导致高频误触发 | 收窄 description,增加条件限定词 |
| 工具识别不了 Skill | 目录位置不对、YAML 头不合法 | 核对官方目录规范,检查 YAML 缩进和必填字段 |
这里面还有一个更大的坑,叫“过度依赖 Skill 而放弃临场判断”。Skill 是流程增强,不是万能解药。遇到超纲任务,模型强行套用某个 Skill,反而会产出教条、空洞的结果。我现在的习惯是:需要稳定标准的任务用 Skill 管住,需要发散和创造的任务,反而要有意识地把 Skill 摘掉,让模型自由发挥。这个平衡点,只能靠实际使用慢慢找。
5.2 我给新手的四条建议
第一条,别一上来就收藏一堆别人分享的 Skill。先把自己日常最高频、最重复、最需要稳定输出的两三个场景列出来,把这几个场景做深。Skill 的核心价值在沉淀,不在数量。收藏一百个不用的 Skill,除了让启动扫描变慢、触发判断变乱,没有任何好处。
第二条,复制别人的 Skill 之前,先读懂它的 description 和边界。很多 Skill 是针对特定工具、特定项目结构写的,直接搬进你的环境可能会水土不服。我的做法是先看结构,再看示例,最后在自己的测试项目里跑一遍,确认效果再决定是否正式启用。
第三条,把 Skill 当作团队知识库来维护。一个人写 Skill 提升的是个人效率,一群人共建 Skill 库,提升的是整个团队的底线质量。哪怕只是统一用同一个“周报 Skill”,产出的格式都会整齐很多,评审成本也会降下来。这也是为什么很多团队开始把 Skill 纳入代码库版本管理,跟代码一起评审、一起迭代。
第四条,持续迭代,别把 Skill 当一次性用品。第一版 Skill 往往是“把你想当然的流程写下来”,跑几轮之后一定会发现漏洞和遗漏。把它当成活项目来维护,每次用的时候留意哪里不顺,回填到 SKILL.md 里。一个 Skill 迭代到第三版第四版,才会真正逼近“专家的操作手册”。
5.3 关于 Skill 和 Agent 的关系,多说几句
热词里很多人问“Skill 和 Agent 的区别”,我用一句话概括:Agent 是决策者,Skill 是执行手册。Agent 负责拆解目标、决定行动顺序、调用什么工具、什么时候切换策略;Skill 则在执行某一个具体环节时,提供专业的操作路径和质量标准。
用一个项目管理的类比:Agent 是项目经理,Skill 是各工种的操作规范。项目经理决定“先做需求分析,再做技术方案,最后实施”,而需求分析具体怎么做专业、方案文档用什么结构、有哪些检查项,由需求分析 Skill 来接管。两者是配合关系,不是替代关系。
所以你会看到“Agent 需要 Skill”这种说法,本质含义是:一个合格的 Agent 如果缺少领域专业知识的支撑,产出很容易空泛;挂上合适的 Skill,等于给这个项目经理配了一组各领域的专家顾问。这也是为什么 Skill 生态会成为 Agent 应用落地的重要拼图。
最后再说一点个人感受。我最早接触 Skill 时,也把它当成“高级版提示词”,直到自己踩过几次坑、迭代过几个技能包,才意识到它本质上是一种知识工程——把散落在人脑里的专家经验,转化成模型能稳定执行的规范。这套思路放到任何领域都成立:写代码、做 PPT、分析日志、跑运营,只要你能把某个流程稳定地描述出来,你就能把它变成 Skill,让 AI 帮你稳定地复制这个能力。
第一章先把认知和工作原理讲清楚。后面的内容我会继续聊怎么写一个高质量的 Skill、怎么调试、怎么在团队里落地 Skill 库。你现在最该做的,是从自己手头最重复的那件事开始,尝试写成第一份 SKILL.md。不用追求完美,先跑起来,迭代快比一次到位重要得多。