智能体技能

E16
概念 · AI 模型与工具生态

智能体技能(Agent Skills)。

技能不会给智能体带来任何新能力——模型本来就写得出那份报告,它只是不知道你们家的行文规矩。技能真正买到的是"按需加载":一个装着指令的文件夹,只有当任务对得上时智能体才会去读它,于是两百条流程的技能库在被用到之前几乎不花什么代价。所以难的并不是把指令写好,而是写好那句决定它会不会被读到的一句话描述。

STEP 1

一个文件夹、一个 Markdown 文件、三层加载。

一个技能就是一个目录,里面放着 SKILL.md:YAML frontmatter 加上正文指令,旁边还可以放脚本、模板与正文所指向的参考文档。frontmatter 中只有两个字段是必填的——namedescription——另有 licenseallowed-toolsmetadatacompatibility 可选,而所有无法识别的键都会被忽略,正是这一点让同一个文件夹能在不同运行时之间搬来搬去。Anthropic 于 2025 年 12 月把这一格式作为开放标准发布;整个 2026 年,编码智能体、CLI 与 IDE 助手陆续采用了它。

真正要紧的机制是渐进式披露,它是一次分三层的读取:

  • 常驻——每个已安装技能的 namedescription,量级在百来个 token。对一个你从未用到的技能,你只付这一份钱。
  • 命中时加载——完整的 SKILL.md 正文,这也是该格式自己的建议把正文控制在五千 token 上下的原因。只有当智能体判定"任务就是这一个"时,它才进入上下文。
  • 用到才加载——随包的参考文件,和其他文件一样被读取,且只在正文把智能体引过去时才读。一本两百页的风格指南在技能正文里那句"去打开它"被执行之前,一分钱都不花。

对照另一条路。写进系统提示词的指令,会在每一次请求、每一段对话里永远常驻;技能这套设计要甩掉的正是这份预算。两百个技能各一百 token,是两万 token 的索引——不算小,但有界;而两百条流程全部内联,哪个上下文窗口都扛不住。

STEP 2

描述是一个检索索引,而技能正是在这里失效的。

既然正文只在命中时才加载,那么描述就不是文档,而是智能体拿任务去比对的那条查询。一个指令写得极好、描述却含混的技能,等于白占地方:它待在上下文里自报家门,却永远不会被触发。这也把作者该花力气的地方反了过来——多数人几乎全花在正文上。

  • 既说它做什么,说什么时候用。"格式化报告"输给"把季度营收报告排成财务团队的董事会材料模板;凡是被要求做面向董事会或投资人的营收摘要时使用"。触发条件才是承重的那一半。
  • 描述重叠就是规模上限。两个技能的描述都能勉强对上"帮我把这张表清理一下",那就是掷硬币,而输的那个的缺席是无声的——不报错,只是答案更差一点。技能库停止扩张的那个点,是描述开始撞车,而不是 token 数封顶。
  • 按触发场景取名,而不是按实现机制。名称必须小写加连字符、与所在文件夹同名、上限 64 个字符;在这个框子里,它是又一个检索信号,所以要把它花在"什么情况下"而不是"里面怎么做"。

由此得到的实操结论:当一个技能"不好使"时,先查它到底有没有被加载。被报上来的技能故障,大多数是穿着"指令没写好"外衣的检索故障。

STEP 3

技能、工具,还是 MCP 服务器——放置规则。

这三者常被混为一谈,而且两个方向的混淆都很贵。界线其实很干净:工具或 MCP 服务器带来的是模型本来没有的能力——一条通往某个系统的连接、一份凭据、一个在真实世界里的作用。技能带来的是流程——模型本来就执行得了,只是不知道你们这一版怎么走。

  • 需要够到某个东西?那是工具。散文查不了你的数仓;任何技能都不会凭空给智能体一份它没有的数据库凭据。
  • 需要按某种特定方式去做?那是技能。把一条流程包成 MCP 服务器,什么也没换来,代价却是一份工具定义在每一次请求里永远常驻——这恰好是技能想做的那笔交易的反面。参见面向智能体的工具设计
  • 处处适用、永远适用?那属于系统提示词。技能赚到钱的地方是"有时候才适用"的流程;一个每个任务都命中的技能,不过是一段多付了一层间接成本的系统提示词。

好用的技能多半两半都占——指令告诉智能体该调哪些工具、按什么顺序、返回的东西怎么解读。那就是带文件系统的上下文工程,这也是对整个概念最诚实的描述。

STEP 4

它的代价:技能是会被执行的文本。

技能是智能体读了就照做的指令,从文件里加载,而且常常来自一个共享仓库或一个市场。凡是能往你的智能体会读取的位置写入 SKILL.md 的东西,都能改写你的智能体的行为——而且不同于工具调用,"读一段指令"这件事上没有任何审批弹窗。从公开目录里拉来的技能,更接近一个依赖项,而不是一份文档。

  • 像审代码一样审技能。更新时看 diff、安装时钉版本、明确规定智能体可以从哪些目录加载技能。这个失败并不奇特:它就是普通的提示注入问题,只不过换了个更亲切的文件后缀。
  • 限定爆炸半径。allowed-tools 的存在,就是为了让一个排版技能够不到发邮件的工具。用上它;一个能调用智能体所能调用的一切的技能,是一次没必要的放宽。
  • 它们会腐烂。技能编码的是一套流程,而流程会变。一个没有版本管理、描述着去年审批流的技能,比没有技能更糟,因为智能体会满怀信心地照做。

先写描述,并且把它当成"必须赢过你手上其他所有技能"的那句话来写。然后把正文压在一页以内,把所有长东西推进正文链接过去的参考文件里。一个在正确时刻加载、说了四件具体事的技能,会胜过一个写得漂亮完备却从不触发的技能——而后一种失败是看不见的,所以你不会靠通读自己的技能库把它找出来。

延伸阅读:上下文工程——这一切服务的那份预算;提示缓存——为什么加载顺序有讲究;以及智能体供应链安全——安装别人写的指令究竟放进来了什么。