乐于分享
好东西不私藏

别再把 AI 工具当 App 了:一个 skill 到底是个啥

别再把 AI 工具当 App 了:一个 skill 到底是个啥

很多人第一次听说“我装了个 skill”,反应是:装了个 App?装了个插件?——然后就卡住了:它不编译、不上服务,凭什么打一行命令就能让 AI 换一种性格?

你不是不会,是缺一层“地基”。今天不拆任何东西,先把最底下的那块砖讲透——什么是 AI skill。

01

PART

先破个误区:skill 不是 App

NOT AN APP

很多人第一次听到“我装了个 skill”,脑子里自动映射成:装了个 App、装了个插件。

不是的。两点掰开说:App 是程序,它是一堆编译好的代码,有自己的进程、界面和运行逻辑,你点一下它在后台干活;skill 是文本,它就是一份 Markdown 文件,里面写的是“给大模型看的说明书”,没有编译、没有进程、没有服务,客户端把它塞进对话上下文,模型读完后照着演。

一句话区分:App 告诉计算机怎么做;skill 告诉模型怎么做。

这就是为什么 skill 看起来“神出鬼没”——它压根不是个程序,它是一段被临时加载进对话的“指令”。

02

PART

那 skill 到底是什么

A SPEC SHEET

拆开看,一个最小可用的 skill 长这样(下面以 grill-me 这个公开 skill 为例,去掉了无关内容):

✦ 回看上一篇

我们上一篇就拆了 grill-me——想看它被一层层扒开、真正的火力藏在哪,回看《你的 AI 为什么总给你“情绪价值”而不是真挑刺?我拆了个专治这毛病的 skill》

---

name: grill-me

description: 一个专挑毛病的拷问式访谈

---

调用 Skill 工具,加载名为 grilling 的技能。

就这么多。拆开看,这个文件(SKILL.md)的格式是两段式——记住这两段就够:

· 第一段·文件头(写在 --- 之间的几行,是一段 YAML 配置):只放两个字段。

— name:skill 的名字,也是你叫它的“指令名”。比如 grill-me,你打 /grill-me 就是在点它。

— description:用一句话写清“干嘛的、什么时候该用”。它不只是说明,更是模型的“触发开关”——模型靠它判断“现在该不该想起这个 skill”。

· 第二段·正文:普通的 Markdown 指令,写给模型“照着做”的步骤。

一个 skill 不是一个文件,而是一个文件夹——客户端只认 SKILL.md 这一个文件,其余都是给它的“补给”,指令要用到时才加载:

my-skill/

├── SKILL.md # 必需:name + description + 给模型的指令

├── scripts/ # 可选:skill 要跑的脚本

├── references/ # 可选:模板、资料、示例

└── assets/ # 可选:图片等资源

说到底,你本来就习惯“用文本去描述一个系统该怎么做事”——写配置、写文档、写注释都是这个思路。skill 只是把这套思路,从驱动计算机,搬到了驱动模型身上。

所以“懂代码”在这里不是负担,是捷径:你早就熟悉了“用一段文字去指挥一个系统”这件事,现在只是换了一个会读这些文字的“员工”。

03

PART

skill 怎么生效:从文件到行为

LOAD, THEN ACT

skill 没有“运行”这个动作,只有“加载”。agent 不是执行代码,而是把 Markdown 文本塞进对话上下文,让模型按新指令改变行为。

那 agent 到底怎么用一份 SKILL.md?三步走:

1. 扫描注册:agent 启动时扫一遍 SKILL.md,只把 name + description 读进“可用技能清单”(正文先不读,省 token)。

2. 匹配触发:你说话时,模型拿请求去挨个比对清单里的 description,觉得“这句描述对上了”,就决定加载它。

3. 注入执行:agent 把正文那几行指令塞进对话,模型读完照做——于是它换了一种性格 / 行为。

一句话总结:文件头决定“何时被想起来”,正文决定“被想起来后怎么做”。所以 description 写得好不好,直接决定这个 skill 会不会在该出现时出现。

▲ skill 怎么生效:只读清单里的「描述」做匹配 → 命中后从该 skill 卡片里抽出「正文」注入对话

举个具体例子走一遍

假设你做了一个「周报生成器」,description 写的是“当用户要写周报、周总结、本周进展时触发”:

— 你某天在 agent 里随口说“帮我整理下本周周报”;

— agent 启动时,已经把 weekly-report 的 name + description 记在“技能清单”里了(正文还躺着没读,不占 token);

— 模型拿你的话去比对清单,发现 weekly-report 的 description 命中 → 决定加载它;

— 于是正文(三段式输出要求)被注入对话,模型照着吐出“本周做了什么 / 下周计划 / 风险与阻塞”。

整个过程你只说了一句话,没敲任何命令——这就是 skill 的“魔法”:你描述需求,模型自己判断该请哪份“说明书”出场。

这也解释了为什么好的 skill 设计会把“入口”和“逻辑”拆成两层:薄薄的一层入口(SKILL.md 那几行)负责被触发,真正的复杂逻辑放在另一个文件里。入口可以很轻,火力可以很重。

04

PART

为什么你反而容易上手

WHERE THE BAR IS

先把一个可能让你意外的结论摆这:

动手写一个 skill 的门槛,不在写代码,在把需求翻译成模型听得懂的指令

听起来像劝退?别急——对写代码的人,这反而是最该松口气的一章。因为把需求翻成指令这件事,你天天都在干,只是从来没往模型身上想过。

下面这几组对照,你现在的工作经验和 skill 是一一对应的:

写函数、把任务拆成步骤写 skill 时,你就是把一段模糊需求,拆成模型能一步步照做的指令(也就是 SKILL.md 正文那几行)
调 API、接外部系统模型不擅长的事,交给 scripts/ 跑脚本、或用 MCP 接一个真实服务——逻辑留在你熟悉的系统里,不在模型肚子里
工程化、分层解耦把“入口”(SKILL.md 那几行)和“逻辑”(references/ 里的资料)拆成两层,入口轻、火力重——这正是前面 03 章说的“薄入口、重逻辑”

看懂了吗?你不是在学一门新手艺,是在把老手艺换了个对象用。写函数时你教计算机做事,写 skill 时你教模型做事——底层能力一模一样,只是听话的对象从编译器变成了大模型。

所以真正拦住大多数人的,从来不是技术,而是AI 心智那一层:知道模型怎么读指令、什么时机该被谁触发。把这一层补上,你就能从“会用”走到“会做”,而不是停在“只会用”。

而“怎么把需求翻成模型真听得懂的指令”,恰恰是后面几篇要慢慢补的硬功夫。今天你先拿住一件事就够:skill 的本质你已经懂了,剩下的是熟练度,不是天堑。

05

PART

skill 怎么装进你手边的 agent

INSTALL ANYWHERE

讲完是什么、怎么跑,你大概率会想:那我怎么把它装到我自己用的 agent 里?先把一个关键结论放这——skill 不是某一家私有的格式,而是一套开放智能体技能标准:一份 SKILL.md 走天下。我们上一篇拆的 grill-me 用的就是这套标准,所以 Codex 能直接读它的说明、不用改写。下面就用 Codex 演示这套标准具体怎么装:

最标准的样板间:Codex 怎么装

本地放把 skill 文件夹丢进 ~/.agents/skills,Codex 启动时自动扫描识别
命令行叫CLI 里 /skills 看列表,或 $skill-name 直接调(如 $grill-me)
装现成用 $skill-installer 拉社区精选技能
打包发把多个 skill + MCP 打成 plugin,用 /plugins 一键装

一句话:Codex 把“一个 Markdown 文件夹”当成了 agent 的能力插件——这正是 skill 可移植的底气。

装上之后怎么用?两种叫法:

显式调用对话里直接打 $ 加技能名,后面接需求。装好 grill-me 后说「$grill-me 帮我烤问下这个新功能的设计」;想先看有哪些技能,输入 /skills 列出当前可用清单
隐式调用什么都不用打,正常说话就行。比如随口说「帮我审下这段代码」,只要 skill 的 description 写明场景,Codex 自己判断并加载——你甚至感觉不到它在用 skill

补充一句:Claude Code 用 /skill-name 前缀,Codex 用 $skill-name,前缀不同但机制一样——这正是同一份 SKILL.md 两边都能跑的原因。一个接地气的判断标准:同一件事你跟 AI 解释过三遍以上,就值得做成 skill。比如每周都按「Jest 格式、覆盖主要分支、中文注释」写测试,写成 skill 后,$unit-test 一句话就搞定。

会写一份 SKILL.md,你就有了走到哪都能装的本领

06

PART

自己动手做一个最小 skill

BUILD ONE

看到这,你已经具备做第一个 skill 的全部前提:会写文本、会描述需求。下面给一个“今天就能跑”的最小流程,以做一个「周报生成器」为例。

① 建文件夹新建 weekly-report/,文件夹名就是 skill 名
② 写 SKILL.md至少填三样:name、description、正文指令
③ 写好 description最容易踩坑:它不只是说明,而是触发开关——写清“用户说什么话时该用它”
④ 装进 agent丢进 ~/.agents/skills(Codex),也可直接用客户端的 Skills 管理新建

SKILL.md 长这样:

---

name: weekly-report

description: 当用户要写周报、周总结、本周进展时,按三段式生成

---

收到“写周报”时,按以下结构输出:

1. 本周做了什么(按项目列,含结果)

2. 下周计划(具体动作)

3. 风险与阻塞(需要谁帮忙)

不要编造没发生的事。

就这三步、这几行,你就拥有了一个“专属周报助手”。它当然很薄——但“薄”正是 skill 的起点:先让一个典型任务跑通,再慢慢加脚本、加资料。

真正的火候在后面:怎么把需求写成模型真听得懂的指令、怎么动手写你的第一个完整 agent,后面会专门讲。这一篇先把“它长什么样、怎么装、怎么起步”讲到你敢动手,就够了。

///

LAST

写在最后

WRAP-UP

如果这篇帮你把 skill 想明白了,回复关键词「拆解模板」,领我把任意 skill 拆成可抄结构的模板(含评判尺 + 反事实推演框架)。下一篇我们接着讲 agent 到底怎么跑起来。