Skills

理解 Agent Skills 的核心定位:把可复用提示词、流程、资源和脚本封装成能力包。

1.为什么需要 Skills

Skills 的价值,就是把这些反复使用的经验整理成可复用、可发现、可按需加载的能力包。

先记住一个简化公式:Skill = 可复用提示词 + 专业流程 + 可选脚本 + 可选资源

三个关键词

关键词 含义 例子
可复用 一套能力可以给多个任务使用 代码审查标准、报告模板、测试修复流程
可发现 Agent 能先看到技能名和描述 通过 namedescription 判断要不要用
按需加载 不用一开始把全部内容塞进上下文 任务匹配后再读完整 SKILL.md、模板、脚本和资源

2.Skill 到底是什么

Skill 可以理解为 Agent 的外置能力包,通常把高质量提示词、任务步骤、触发条件、输出规范,以及可选脚本、依赖、模板、示例和参考资料放在一起。

把这些内容打包后,Agent 就可以在合适场景下加载并使用这项能力。

工程本质

从工程角度看,Skill 的核心并不复杂:

Skill = 可复用提示词 + SOP + 可选脚本 + 可选资源

例如你写了一个“代码审查技能”,里面可以说明:

  • 什么情况下触发代码审查;
  • 审查哪些维度;
  • 哪些问题必须重点标出;
  • 输出什么格式;
  • 如果需要运行脚本,脚本放在哪里;
  • 如果没有发现问题,应该怎么表达剩余风险。

以后其他 Agent 想具备这项能力,就不用重新手写提示词,只要把这个 Skill 配进去。

它和普通复制粘贴提示词的区别在于:Skill 有固定目录结构和元数据,可以被支持 Skills 的工具或框架识别,并按需加载到上下文中。

3.SKILL.md 目录结构

3.1 最小目录结构

一个标准 Skill 通常是一个文件夹,里面至少包含一个 SKILL.md 文件。

示意结构:

skills/
  emoji-translator/
    SKILL.md

其中:

  • skills/ 是技能目录;
  • emoji-translator/ 是某个具体技能包;
  • SKILL.md 是这个技能包的说明文件。

SKILL.md 通常分成两部分:

  1. YAML Frontmatter:给模型或框架看的元数据。
  2. Markdown 正文:给 Agent 执行任务时看的详细说明。

一个最小示例:

---
name: emoji-translator
description: 当用户明确要求把自然语言翻译成 Emoji、把 Emoji 解释成文字,或要求“表情翻译/emoji 翻译”时使用。
---

# Emoji Translator Skill

## 角色定位

你是一个表情翻译助手,负责在自然语言和 Emoji 之间转换。

## 触发边界

- 用户明确要求“用表情翻译”“转换成 Emoji”“解释这些 Emoji”时,使用本技能。
- 用户只是普通聊天、提问或写作时,不要主动把内容转成 Emoji。
- 如果用户要求“只用表情”,最终输出只包含 Emoji,不额外解释。

3.2 元数据字段

元数据里最重要的是两个字段:

字段 作用 建议
name 技能唯一名称,通常和技能文件夹名保持一致 使用小写字母、数字和短横线,避免空格和中文名
description 告诉模型这个技能什么时候应该被使用 写清楚“做什么”和“什么时候用”

因为模型通常会先看 name 和 description,再决定是否加载完整 Skill。如果描述太模糊,Skill 就可能触发不了;如果描述太宽泛,又可能在不该触发时被错误触发。

3.3 常见扩展字段

常见扩展字段包括:

字段 常见用途
license 标记 Skill 的许可证
compatibility 说明依赖环境、网络访问、运行时限制
metadata 放作者、版本、团队、维护信息
allowed-tools 限制 Skill 激活后可用的工具,部分平台支持
module 指向可导入模块或辅助代码,部分 Agent Skills 实现支持

3.4 扩展目录结构

复杂 Skill 不一定只有 SKILL.md,还可以带脚本、依赖和资源。

各目录职责如下:

路径 作用
SKILL.md 技能说明、触发规则、执行步骤
requirements.txt 这个技能需要的 Python 依赖
references/ 技能需要参考的文档、规范和模板
scripts/ 技能执行时可能调用的脚本
assets/ 样例、图片、表格、素材文件

其中 references/ 可以继续按用途拆分:

子目录或文件 适合存放的内容
templates/ 报告模板、代码模板、标准输出模板
examples/ 输入输出样例,帮助 Agent 理解预期格式
config/ 检查规则、字段映射、默认参数等配置文件
style-guide.md 团队编码规范、写作规范、品牌规范

模型并不会凭空知道怎么用这些脚本和资源。需要在 SKILL.md 里写清楚:

当需要做静态检查时,运行 `scripts/run_static_check.py`。
当需要判断 Java 代码风格时,参考 `references/java-style-guide.md`。
最终输出格式参考 `assets/review-template.md`。

3.5 正文要写什么

SKILL.md 正文不要只写愿望,要写执行路径。

信息 要回答的问题
角色定位 这个 Skill 让 Agent 扮演什么专业角色
触发边界 什么时候用,什么时候不用
执行步骤 按什么顺序完成任务
资源引用 需要读哪些模板、规范、样例或脚本
输出格式 最终结果应该长什么样

4. 渐进式加载机制

4.1 按需加载

如果项目里有很多 Skill,每个 Skill 都有一大段说明、脚本介绍和资源引用,不可能一开始就全部塞进模型上下文。

这样会带来三个问题:

  • 上下文窗口被快速撑爆。
  • Token 成本增加。
  • 模型面对太多技能时更难选择。

所以 Skill 通常采用 Progressive Disclosure(渐进式披露)

4.2 三层加载

可以把加载过程理解为三层:

层级 加载内容 什么时候加载
元信息层 namedescription 等 Frontmatter Agent 启动或扫描 Skills 时
指令层 完整 SKILL.md 正文 模型判断当前任务需要这个 Skill 时
资源执行层 references/scripts/assets/ 只有任务真的需要时,才进一步读取或运行

加载顺序可以记成:先让模型知道“我会什么”,任务匹配后再展开“具体怎么做”,真正需要时才读取脚本、模板和资料。

4.3 description 是触发门牌

description 是 Skill 的“触发门牌”。

如果它写得太泛:

description: 用来处理文档。

模型很难判断:是 Word 文档、PDF 文档、Markdown 文档,还是技术文档?

更好的写法:

description: 当用户要求审查 Markdown 技术教程的结构、标题层级、代码块说明和读者理解难度时使用。

这类描述同时包含了:

  • 任务对象:Markdown 技术教程;
  • 任务动作:审查结构、标题、代码块说明;
  • 触发条件:用户要求审查文档;
  • 适用边界:不是所有文档都触发。

4.4 怎么测试触发是否稳定

写完 Skill 后,不要只看文件是否存在,更要测试它能不能在合适场景触发。

可以准备三类测试句:

测试句类型 目的 示例
明确触发 验证模型知道应该用这个 Skill “请用代码审查技能审查这个 diff。”
隐含触发 验证描述是否覆盖真实表达 “帮我看看这个 PR 有没有安全和边界问题。”
不应触发 验证边界是否清楚 “解释一下这段代码在做什么。”

如果明确触发都不稳定,通常是路径、元数据或工具配置问题。 如果隐含触发不稳定,通常是 description 写得不够贴近真实用户表达。 如果不应触发时频繁触发,通常是 description 写得太宽。

5. Skill 与其他能力的边界

形式 适合放什么 典型例子
Prompt 当前任务的一次性要求 “把这段文字改成更口语化”
Rules / AGENTS.md 几乎每次都相关的项目规则 “本项目用 pnpm”“API 返回结构统一”
Memory 历史事实、用户偏好、长期状态 “用户喜欢简洁回答”“这个项目已经迁到 FastAPI”
Skill 特定任务才需要的流程、模板和资源 “代码审查流程”“周报模板”“SQL 生成规范”
形式 解决什么问题 一句话理解
Tool 执行一个明确动作 “我能做什么动作”
MCP 用统一协议接入外部工具和资源 “外部能力怎么标准化接进来”
Skill 封装任务方法、流程、规则和资源 “遇到这类任务应该按什么方法做”

6. 如何写一个高质量的 Skill

6.1 description

一个好的 description 最好同时回答四件事:

要点 示例
做什么 审查 Python / FastAPI 后端代码
什么时候用 当用户要求 code review、查找 bug 或安全风险时
处理什么输入 diff、PR、文件路径、代码片段
不要太泛 不要写成“帮助写代码”这种所有场景都可能匹配的描述

推荐模板:

description: 当用户要求【任务动作】,并且输入是【输入类型】,目标是【预期结果】时使用。不要用于【排除场景】。

6.2 小而专

一个 Skill 最好只解决一类能力。

清晰的 Skill:

  • python-code-reviewer
  • fastapi-api-debugger
  • markdown-doc-editor
  • sql-query-writer
  • frontend-accessibility-reviewer

6.3 脚本和资源要怎么放

适合放脚本的内容:

  • 格式检查;
  • 静态扫描;
  • 数据清洗;
  • 模板渲染;
  • 依赖明确的转换逻辑;
  • 可重复、可测试、确定性强的步骤。

不适合放脚本的内容:

  • 需要大量主观判断的任务;
  • 一次性临时操作;
  • 依赖用户环境但没有说明的命令;
  • 有高风险副作用的操作,比如删库、发邮件、扣款。

一个好经验是:

能稳定自动化的部分交给脚本;
需要理解、判断和表达的部分交给模型;
两者之间的流程写在 SKILL.md 里。

6.4 不要绕开安全边界

Skill 可以说明流程,但不要让 Skill 代替权限控制。

高风险动作包括:

  • 删除文件;
  • 删除数据库;
  • 发送邮件;
  • 调用支付接口;
  • 修改生产配置;
  • 执行不可逆脚本。

这些动作应该由工具权限、人工审批、中间件、沙箱和业务幂等设计来控制。Skill 只能写规则,不能代替安全边界。

6.5 命名和维护

团队里的 Skills 应该被当成工程资产:

  • 名称稳定,尽量使用小写字母、数字和短横线;
  • 放进版本控制;
  • 写清维护人、版本和重要变更;
  • 配套示例输入和示例输出;
  • 定期删除过时 Skill;
  • 对脚本做最小可行测试;
  • 对外部依赖和权限做安全审查。

7. AI 编程工具里的 Skills 实践

不同 AI 编程工具对 Skills 的支持方式不完全一样。学习时不要只背目录名,要理解背后的三类能力:

能力类型 代表形式 解决的问题
技能包 SKILL.mdskills/ 目录 按任务加载专业流程和资源
常驻规则 .cursor/rulesAGENTS.md、项目说明 让 Agent 持续遵守项目约定
外部工具连接 MCP、插件、Connectors 让 Agent 访问外部系统和动作

8. 什么时候应该写 Skill

适合使用 Skill 的场景:

  • 一套提示词会被多个 Agent 或多次任务复用;
  • 某个任务有固定步骤和输出格式;
  • 某项能力需要附带脚本、模板或参考资料;
  • 希望把“能力说明”从主提示词里拆出来;
  • 希望减少主 Agent 的 system prompt 长度;
  • 团队有一套希望复用的标准流程;
  • 某类任务需要按需加载大量上下文,而不是每次都塞进 Prompt。

典型例子:

Skill 名称 适合封装的内容
code-reviewer 审查维度、严重级别、输出格式、测试缺口判断
markdown-doc-editor 文档结构、标题层级、代码块说明、读者视角
frontend-accessibility-reviewer 可访问性、键盘操作、语义标签、视觉层级
sql-query-writer 表结构说明、查询规范、性能注意事项
incident-postmortem-writer 故障复盘模板、时间线、影响范围、改进项

不适合使用 Skill 的场景:

  • 只是一次性的小提示;
  • 任务非常简单,不值得单独封装;
  • 触发条件很模糊,模型难以判断什么时候用;
  • 多个 Skill 描述重叠,容易抢同一个任务;
  • 内容几乎每次都要加载,更适合放 Rules 或项目说明;
  • 本质是外部动作,更适合做 Tool 或 MCP;
  • 需要独立上下文和职责隔离,更适合做 Subagent。
这个能力会重复用吗?
它有明确触发条件吗?
它有固定步骤或输出格式吗?
它需要附带模板、资料或脚本吗?
它不适合每次都放进主提示词吗?
继续阅读

grill-me

【2026-08-14】学习 grill-me 这个 skill