本文由莫潇羽@源码七号站原创整理发布,转载请注明出处:www.fuyuan7.com
在AI领域,新名词的出现速度可能比你喝完一杯咖啡还快。从最初的提示词工程(Prompt Engineering),到智能体(Agent),再到MCP协议,然后是Computer Use、A2A(Agent to Agent)……而现在,又一个重量级概念走到了聚光灯下——Agent Skills(智能体技能)。
别担心,今天我们不玩那些高大上的学术名词。作为源码七号站的站长,我将用最接地气的方式,带你彻底搞懂Skill到底是什么、怎么工作、以及如何利用它让AI成为你真正的得力助手。
一、从提示词的痛点说起
1.1 一个关于豆浆的悲伤故事
想象一下这个场景:某天你突然想喝豆浆,于是问AI:"豆浆应该怎么做?"
AI回复:"泡黄豆少许,磨碎,加水适量,煮沸,最后放盐。"
等等,什么叫"少许"?"适量"是多少毫升?更重要的是——豆浆怎么能放盐?(甜党表示强烈抗议)
这个例子虽然简单,却精准暴露了早期AI对话的核心问题:模糊的输入导致模糊的输出。AI虽然聪明,但它不会读心术,如果你不告诉它具体要求,它只能按照"通用"的方式回答。
1.2 具体化提示词的诞生
后来,我们学会了一个技巧——向AI提问时要具体。于是问题变成了:
"告诉我豆浆应该怎么做。要求:材料精确到克或毫升,写出每一步的操作时间,并且我只喝甜豆浆,不要放盐。"
这样一来,AI的回答就靠谱多了:
- 干黄豆100克,提前浸泡8小时
- 沥干后放入豆浆机,加水1000毫升
- 选择"湿豆"模式,运行约15分钟
- 过滤后加入白砂糖15克,搅拌均匀
这种精确的提问方式,就是我们常说的提示词工程(Prompt Engineering)的雏形。
1.3 提示词爆炸的困境
随着使用场景越来越多,我积累了大量这种"规定输出内容"的提示词:
- 问菜谱时,有一套专门的菜谱提示词
- 读论文时,有一套专门的论文分析提示词
- 写代码时,有一套专门的编程规范提示词
- 做PPT时,有一套专门的演示文稿提示词
- ……
每次使用时,我都要手动把对应的提示词复制过来。随着时间推移,提示词越积越多,有时候连我自己都忘了曾经写过某个特定场景的提示词。
这时候你可能会想:能不能把所有提示词一股脑儿全部发给AI,让它自己判断用哪个?
理论上可以,但实际操作中会遇到两个致命问题:
问题一:Token消耗爆炸
大模型的上下文窗口(Context Window)是有限的,每一段文字都要占用Token。如果把几十个提示词全部塞进去,还没开始干正事,Token就消耗大半了。这不仅浪费钱(API按Token计费),还会导致AI"记忆不够用",无法充分理解你的实际问题。
问题二:无关信息干扰
当上下文中存在大量与当前问题无关的信息时,AI容易"分心"。它可能会被不相关的提示词误导,给出偏离主题的回答。就像你问一个人怎么做豆浆,旁边却有人一直念叨论文写作规范——换谁都会晕。
二、Skill机制的横空出世
2.1 核心理念:按需加载
有没有一种机制,能让AI只加载与当前问题相关的提示词,而不是把所有提示词都塞进上下文?
有的,这就是Skill机制的核心设计思想。
简单来说,Skill机制实现了一个"智能筛选"的过程:
- 提前准备好多个不同用途的提示词(每个提示词就是一个Skill)
- 当用户提问时,AI先浏览所有Skill的"简介"
- 根据问题内容,判断哪些Skill与问题相关
- 只加载相关的Skill完整内容
- 根据Skill中的指示完成任务
这个机制被Anthropic(Claude的开发公司)称为渐进式披露(Progressive Disclosure)——就像一本组织良好的手册,先给你看目录,你选择需要的章节后,再展开详细内容。
2.2 Skill的物理结构
从技术角度来看,一个Skill本质上就是一个文件夹。这个文件夹里至少包含一个核心文件:SKILL.md。
my-recipe-skill/
├── SKILL.md # 核心文件,存放提示词和元数据
├── scripts/ # 可选:脚本文件夹
│ └── validate.py # Python脚本
├── references/ # 可选:参考资料文件夹
│ └── techniques.md # 详细说明文档
└── assets/ # 可选:资源文件夹
└── template.docx # 模板文件
其中,SKILL.md文件的结构如下:
---
name: recipe-skill
description: 用于生成菜谱的技能。当用户询问如何烹饪某道菜、需要菜谱建议、或提到做饭相关的话题时使用此技能。
---
# 菜谱生成技能
## 输出要求
- 材料精确到克或毫升
- 步骤精确到秒或分钟
- 默认使用中式烹饪方法
- 根据用户口味偏好调整调料
## 格式规范
1. 先列出所有材料和用量
2. 按时间顺序描述步骤
3. 每个步骤说明操作要点
4. 最后给出小贴士
文件开头用---包裹的部分叫做YAML Frontmatter(前置元数据),包含两个关键字段:
- name:Skill的名称,用于标识
- description:Skill的简短描述,这是最关键的字段
为什么description最关键?因为它就是前面说的"简介",AI通过阅读description来判断这个Skill是否与当前问题相关。一个好的description应该清楚说明这个Skill做什么以及什么时候使用。
三、Skill的三阶段工作流程
莫潇羽@源码七号站在这里为大家梳理一下Skill机制的完整工作流程。整个过程可以分为三个阶段:Discovery(发现)、Activation(激活)、Execution(执行)。
3.1 第一阶段:Discovery(发现)
当你打开Claude或其他支持Skill的AI工具时,系统会进行一个初始化操作:
- 扫描所有已安装的Skill目录
- 读取每个Skill的
SKILL.md文件 - 只提取name和description字段
- 将这些元数据整合到系统提示词中
举个例子,假设你安装了三个Skill:
- 菜谱Skill
- 论文分析Skill
- PPT制作Skill
那么AI的系统提示词中会包含类似这样的内容:
可用技能:
1. recipe-skill: 用于生成菜谱的技能。当用户询问如何烹饪...
2. paper-analysis: 用于分析学术论文。当用户上传论文或询问...
3. pptx-creator: 用于制作演示文稿。当用户需要创建PPT...
注意:此时AI只看到描述信息,完整的提示词内容还没有被加载。每个Skill的元数据大约只占用30-50个Token,即使你安装了几十个Skill,也不会对上下文窗口造成太大压力。
3.2 第二阶段:Activation(激活)
当你提出问题后,AI会进行语义理解和匹配:
- 分析用户问题的意图
- 将问题与所有Skill的description进行比对
- 判断哪些Skill与当前问题相关
- 决定是否激活某个Skill
继续上面的例子,当你问"如何做豆浆"时,AI的思考过程大概是这样的:
"用户在问如何烹饪某种饮品...让我看看可用的技能...recipe-skill的描述说它'用于生成菜谱,当用户询问如何烹饪某道菜时使用'...这正好匹配!我需要激活这个技能。"
接下来,AI会生成一个特殊的指令,请求系统读取recipe-skill/SKILL.md的完整内容。这个请求对用户是不可见的——你在对话界面中不会看到这些中间步骤。
3.3 第三阶段:Execution(执行)
一旦Skill被激活,完整的提示词内容就会被加载到AI的上下文中。此时,AI就拥有了完成任务所需的全部"知识"。
但Skill的能力不止于此。如果Skill目录中还包含其他文件,AI可以根据需要继续读取:
- 参考文档:比如
references/cooking_tips.md中的烹饪技巧 - 脚本文件:比如
scripts/nutrition_calculator.py用于计算营养成分 - 模板文件:比如
assets/recipe_template.md标准化输出格式
这就是Skill机制的精妙之处:按需加载,层层深入。
一个设计良好的Skill可以包含大量的参考资料和脚本,但这些内容只在需要时才会被加载,不会无端消耗Token。官方建议SKILL.md主体内容控制在500行以内,超出部分应该拆分到独立的文件中。
四、渐进式披露的设计哲学
4.1 为什么要用文件夹而不是单个文件?
在莫潇羽@源码七号站研究Skill机制的过程中,这个问题曾经困扰了我很久:既然核心内容都在SKILL.md里,为什么还要用整个文件夹来承载一个Skill?
答案就是渐进式披露(Progressive Disclosure)。
假设你的菜谱Skill特别详尽:
- 包含了你七舅姥爷的独家口味偏好
- 记录了你家厨房的全部厨具清单
- 收录了100篇精选美食菜谱
- 还有各种烹饪技巧和小贴士
如果把这些内容全部塞进一个SKILL.md文件,这个文件可能会有几万字。每次激活这个Skill,都要把几万字全部加载到上下文中——这显然不合理。
解决方案是分层存储:
recipe-skill/
├── SKILL.md # 只包含核心提示词和指引
├── references/
│ ├── uncle_preferences.md # 七舅姥爷的口味
│ ├── kitchen_tools.md # 厨具清单
│ └── top_100_recipes.md # 100篇精选菜谱
└── scripts/
└── nutrition_calc.py # 营养计算脚本
在SKILL.md中,我们只需要告诉AI这些文件的存在和用途:
## 可用资源
- 参考文档 `references/uncle_preferences.md`:特殊口味要求
- 参考文档 `references/kitchen_tools.md`:可用厨具列表
- 参考文档 `references/top_100_recipes.md`:精选菜谱合集
- 脚本 `scripts/nutrition_calc.py`:计算营养成分
根据用户需求,选择性地读取上述资源。
这样,AI在激活Skill时只加载核心提示词(可能只有几百字),只有当真正需要时才会去读取详细资料。比如用户问"做一道适合七舅姥爷口味的红烧肉",AI才会去读取uncle_preferences.md。
4.2 嵌套引用的威力
渐进式披露还支持多层嵌套。比如top_100_recipes.md文件本身也很大,我们可以继续拆分:
references/
├── top_100_recipes.md # 只包含菜谱索引和简介
└── recipes/
├── hongshaorou.md # 红烧肉详细做法
├── gongbaojiding.md # 宫保鸡丁详细做法
├── doujiang.md # 豆浆详细做法
└── ...
在top_100_recipes.md中只列出菜名和简介,详细做法放在独立文件中。AI可以先浏览索引,找到用户想要的菜品后,再去读取具体的菜谱文件。
这种层层递进的结构,让Skill可以承载理论上无限量的知识,而不会在启动时拖垮上下文窗口。Anthropic官方数据显示,当Skill存在但未被使用时,Token消耗可以减少高达98%。
五、Skill + 代码执行 = AI的"行动力"
到目前为止,我们讨论的Skill主要是关于"知识"——告诉AI应该怎么回答问题。但Skill真正强大的地方在于它与代码执行能力的结合。
5.1 从"读取Skill"到"执行命令"
让我们回到AI读取Skill的那个步骤。前面说过,当AI决定激活某个Skill时,它会生成一个"请求读取文件"的指令。
这个指令是怎么执行的?
答案是:通过命令执行。
如果你使用的是Claude桌面应用或Claude Code(命令行工具),这些命令会在你的本地电脑上执行。如果你使用