AI Agent 的基本模型:

Agentic Coding
    ↓
Context Engineering
    ↓
MCP
    ↓
Tool Design
    ↓
Agent Loop

但还有一个问题没有解决:

Agent 知道有哪些工具,也知道怎么调用工具,为什么它还是经常“不知道应该怎么做”?

例如让 Agent 完成一次代码 Review。

它可能拥有:

git_diff
read_file
search_code
run_test

这些 Tool 已经足够让它操作代码库。

但它仍然需要知道:

先看什么?
重点检查什么?
什么问题值得报告?
如何判断问题严重程度?
什么时候应该运行测试?
最终应该如何输出?

这些内容既不是 Tool,也不是 MCP。

它更接近一种:

任务级的知识、流程和操作规范。

这就是 Agent Skill。

今天的 Agent Skills 已经不只是某个产品里的一个概念,而是正在形成一个开放的文件格式和生态。官方规范将 Skill 定义为一个包含 SKILL.md 的目录,可以进一步携带脚本、参考资料和其他资源,并通过 Progressive Disclosure 按需加载。

1. Skill 到底是什么?

先给出一个比较工程化的定义:

Skill 是围绕某一类任务封装的可复用知识、操作流程、规则、示例和辅助资源,让 Agent 能够以更加稳定和一致的方式完成这类任务。

例如:

code-review

不是一个具体的 Tool。

它可能包含:

代码 Review 原则
    ↓
Review 流程
    ↓
问题分类
    ↓
严重程度判断
    ↓
测试策略
    ↓
输出格式

Agent 可以进一步调用:

git_diff
read_file
search_code
run_test

这些 Tool。

所以可以把两者简单理解成:

Tool
=
“我能做什么?”

Skill
=
“面对这类任务,我应该怎么做?”

例如:

Tool:

search_code()

Skill:

发现 Bug
→ 定位相关代码
→ 阅读上下文
→ 判断影响范围
→ 搜索调用方
→ 验证假设
→ 给出修改建议

Tool 提供能力。

Skill 提供方法。

2. Skill、Prompt、Tool、MCP 和 Workflow 有什么区别?

这是最容易混淆的地方。

可以把几个概念放在同一个任务里理解。

假设用户说:

「帮我检查这个 Pull Request。」

Agent 可能拥有:

Prompt
↓
当前用户提出的任务


Skill
↓
告诉 Agent 如何进行 Code Review


Tool
↓
git_diff
read_file
search_code
run_test


MCP
↓
负责把 GitHub 等外部系统的能力标准化提供给 Agent


Workflow
↓
如果某些步骤是固定的,可以按照固定流程执行

因此:

概念主要解决什么问题
Prompt当前这次要做什么
ToolAgent 能执行什么动作
MCPAgent 如何标准化连接外部能力
Skill某一类任务应该怎么做
Workflow一组确定步骤应该怎么执行
Agent根据目标、Context 和环境决定下一步

可以进一步画成:

                    User Task
                        │
                        ↓
                      Agent
                        │
             ┌──────────┼──────────┐
             ↓          ↓          ↓
          Context     Skill       Memory
                        │
                        ↓
                 Task Methodology
                        │
             ┌──────────┼──────────┐
             ↓          ↓          ↓
           Tool      Workflow     Rules
             │
             ↓
            MCP
             │
             ↓
       External Systems

因此,Skill 并不是「另一个 Prompt」。

也不是「Tool 的别名」。

它实际上位于 Agent 的任务知识层。

3. 为什么 Agent 需要 Skill?

因为 Tool 越多,Agent 不一定越强。

假设一个 Coding Agent 有:

git_status
git_diff
git_log
read_file
write_file
search_code
run_test
create_branch
commit
push
create_pr

从能力上看,它已经非常强。

但如果用户说:

「这个登录接口偶尔返回 500,帮我排查。」

Agent 还是需要决定:

先看日志?
还是先看代码?

先复现?
还是先搜索异常?

修改之前需要不需要测试?

测试失败以后应该怎么继续?

如果没有明确的任务方法,模型只能依靠训练数据和当前 Context 临时推断。

于是同一个任务可能出现:

第一次:
搜索代码 → 修改 → 测试

第二次:
直接修改 → 测试 → 再搜索

第三次:
分析半天 → 没有执行测试

这就是 Agent 工程中一个非常现实的问题:

模型具有通用能力,但企业级任务通常需要稳定的方法。

Skill 的作用,就是把这些方法沉淀下来。

人的经验
    ↓
Skill
    ↓
Agent
    ↓
重复执行

因此 Skill 的价值并不是让模型「知道更多知识」,而是让模型在某一类任务上按照更稳定的方法工作。

04. 一个 Skill 到底长什么样?

目前已经出现了一个开放的 Agent Skills 格式。

按照官方规范,一个 Skill 最基本的结构是:

my-skill/
└── SKILL.md

更完整的 Skill 可以是:

my-skill/
├── SKILL.md
├── scripts/
│   └── validate.py
├── references/
│   ├── api.md
│   └── guidelines.md
└── assets/
    └── template.md

其中:

SKILL.md

是核心。

它包含 YAML Front Matter 和 Markdown 指令。

最简单的例子:

---
name: code-review
description: Review code changes for correctness, security, performance, and maintainability. Use when reviewing pull requests, diffs, or requested code changes.
---

# Code Review

Review the change systematically.

## Process

1. Understand the purpose of the change.
2. Inspect the diff.
3. Check business logic.
4. Check error handling.
5. Check security.
6. Check performance.
7. Check tests.

## Output

For every issue, provide:

- file
- line
- severity
- problem
- impact
- recommendation

这里最值得注意的是:

Skill 本身不需要复杂的 SDK。

它可以只是一个目录和一份 Markdown。

这也是 Agent Skills 非常有意思的地方:

传统扩展:

代码
+
SDK
+
Plugin API
+
配置


Agent Skill:

文件
+
指令
+
可选资源

官方规范要求 name 和 description,其中 description 不只是介绍 Skill 做什么,还应该说明什么时候使用,因为它参与 Agent 对 Skill 的发现和选择。

5. 最关键的设计:Progressive Disclosure

Skill 最值得理解的一个设计,是:

不要一开始把所有内容全部塞进 Context。

假设有:

100 个 Skill

每个 Skill:

5000 Token

如果启动时全部加载:

100 × 5000  = 500,000 Token

显然不可行。

因此 Agent Skills 采用 Progressive Disclosure:

第一层:Discovery
    ↓
name + description

第二层:Activation
    ↓
SKILL.md

第三层:Execution
    ↓
scripts / references / assets

也就是:

启动时:

code-review
debugging
testing
mysql-optimization
pdf-analysis
...

只知道“有哪些 Skill”。


用户:

“帮我 Review 这个 PR。”

↓

匹配:

code-review

↓

加载:

code-review/SKILL.md

↓

发现需要数据库检查:

读取:

references/database.md

↓

必要时执行:

scripts/check.sh

官方规范明确将 Skill 的加载设计为三个阶段:

  1. 启动时加载 name 和 description;

  2. Skill 被激活后加载完整 SKILL.md;

  3. 执行过程中再按需加载 scripts/、references/、assets/ 等资源。

这实际上和上一篇讲的 Context Engineering 是直接对应的:

Skill
    ↓
减少一次性 Context
    ↓
按任务加载
    ↓
降低上下文成本
    ↓
提高相关信息密度

所以 Progressive Disclosure 并不是一个目录结构技巧。

它本质上是:

Context Engineering 在 Skill 层面的具体实现。

6. 一个高 Star 的经典案例:mattpocock/skills

如果想真正理解 Skill,而不是停留在概念层面,非常推荐直接研究 GitHub 上的:

mattpocock/skills

这个项目的定位很直接:

Skills for Real Engineers.

它不是为了展示几个简单 Prompt,而是把 Skill 真正用于软件工程工作。

当前仓库已经拥有约 19.6 万 Star 和 2.2 万 Fork,并且持续维护。仓库中包含工程开发、代码 Review、Debug、TDD、Issue 管理、需求规格等多个 Skill。

它的一个重要特点是:

Skill 被当成真正的软件工程资产,而不是一次性 Prompt。

例如仓库中的工程 Skill 包括:

ask-matt
triage
code-review
debugging
to-spec
to-tickets
testing
writing-great-skills

这些 Skill 并不是简单地告诉模型:

“请认真写代码。”

而是把工程经验拆成可以复用、组合和维护的能力。

例如 to-spec 的职责就是把当前对话中的需求整理成项目规格,并发布到项目 Issue Tracker。

这就很接近真正的 Agent Engineering:

User Request
     ↓
Skill
     ↓
工程方法
     ↓
Tool
     ↓
项目实际状态
     ↓
产出

7. 重点看一个 Skill:writing-great-skills

这个项目中有一个值得研究的 Skill:

writing-great-skills

它甚至是一个:

用来帮助 Agent 编写 Skill 的 Skill。

这非常有代表性。

它的目标不是简单告诉 Agent:

“写一个 SKILL.md。”

而是围绕:

Skill 是否稳定?
Skill 是否容易误触发?
Skill 是否应该拆分?
哪些内容应该放在 SKILL.md?
哪些内容应该放到 references?
如何降低 Context Load?

进行约束。

项目作者将 Skill 的核心目标概括为:

从随机性的模型系统中尽可能获得确定性。

也就是说:

不是要求:

每次输出完全一样


而是要求:

每次都遵循可靠的过程

这实际上是非常重要的思想。

因为 Agent 本身是概率系统。

我们很难保证:

同一个任务
→
100% 产生完全一样的结果

但可以通过 Skill 约束:

触发条件
↓
执行步骤
↓
判断规则
↓
输出格式

让:

任务输入
→
执行过程

更加稳定。

writing-great-skills 还专门强调 Cognitive Load 和 Context Load,说明 Skill 的设计目标并不是「写得越详细越好」,而是让 Agent 在真正执行任务时获得足够而且相关的指导。

这与 Agent Skills 官方规范建议将较大的参考资料拆到 references/,并保持核心 SKILL.md 精简,是完全一致的。

8. 从这个项目可以学到什么?

研究 mattpocock/skills,最值得学习的不是某一个 Skill 的具体 Prompt,而是它的工程化思路。

第一,Skill 应该足够小

不要设计:

software-engineering

然后把:

开发
测试
Review
部署
数据库
Git
架构

全部塞进去。

更合理的是:

code-review
debugging
testing
to-spec
to-tickets

一个 Skill 负责一个相对完整、可识别的任务。

第二,Skill 应该可以组合

例如:

用户需求
    ↓
to-spec
    ↓
to-tickets
    ↓
implementation
    ↓
testing
    ↓
code-review

每个 Skill 负责自己的职责。

而不是:

super-engineering-skill

把所有事情都做掉。

第三,Skill 不应该把所有知识塞进一个文件

例如:

mysql-optimization/
├── SKILL.md
└── references/
    ├── mysql-8.md
    ├── indexes.md
    ├── transactions.md
    └── performance.md

SKILL.md 负责:

任务流程
选择逻辑
核心原则

具体知识放:

references/

这样 Agent 只有在真正需要时才读取。

第四,Skill 需要明确“什么时候使用”

例如:

description: >
  Review pull requests for correctness, security, performance,
  and maintainability. Use when reviewing PRs, diffs, or requested
  code changes.  

而不是:

description: >
    A useful code review skill.

因为 Agent 首先需要解决的是:

“这个 Skill 与当前任务有没有关系?”

官方规范也明确要求 description 同时描述 Skill 的用途和适用场景。

9. 如何设计一个生产级 Skill?

如果自己开始编写 Skill,可以使用下面这套结构:

skill-name/
├── SKILL.md
├── scripts/
├── references/
└── assets/

然后按照:

第一步:定义任务
    ↓
第二步:定义触发条件
    ↓
第三步:定义核心流程
    ↓
第四步:定义判断规则
    ↓
第五步:定义输出标准
    ↓
第六步:拆分参考资料
    ↓
第七步:加入必要脚本
    ↓
第八步:真实任务测试

例如设计一个:

mysql-optimization

可以是:

mysql-optimization/
├── SKILL.md
├── references/
│   ├── explain.md
│   ├── index.md
│   ├── lock.md
│   └── transaction.md
└── scripts/
    └── explain-analyzer.php

SKILL.md 不应该成为一本《高性能 MySQL》。

它只需要告诉 Agent:

什么时候使用
↓
如何判断问题
↓
应该检查什么
↓
什么时候读取哪份参考资料
↓
应该如何验证
↓
最终如何输出

这才是一个好的 Skill。

10. Skill 的未来:从“Prompt 文件”走向 Agent 能力生态

现在回头看整个 Agent 技术栈:

                    AI Agent
                       │
             ┌─────────┼─────────┐
             ↓         ↓         ↓
          Context    Skill     Memory
                       │
                       ↓
                 Task Knowledge
                       │
             ┌─────────┼─────────┐
             ↓         ↓         ↓
           Tool      Workflow    Rules
             │
             ↓
            MCP
             │
             ↓
       External Systems

可以发现:

MCP
解决:

“Agent 如何连接外部能力?”


Tool
解决:

“Agent 可以执行什么?”


Skill
解决:

“Agent 应该如何完成某类任务?”

而 Skill 的开放格式正在进一步解决:

Skill 如何打包?
Skill 如何发现?
Skill 如何加载?
Skill 如何跨 Agent 复用?

目前 Agent Skills 已经有公开规范,核心格式保持非常简单:

SKILL.md
+
scripts/
+
references/
+
assets/

这种设计的一个重要价值,就是把 Skill 变成普通的、可版本控制的文件,而不是绑定某一个厂商的内部数据库或专有 API。官方文档也明确将其定位为一种开放、可移植的 Agent 扩展格式。

这意味着未来我们可能会看到:

GitHub
    ↓
Skill Repository
    ↓
Agent Skill Registry
    ↓
Agent

就像今天:

GitHub
    ↓
npm / Composer / PyPI
    ↓
Application

一样。

但 Skill 和传统软件包又有一个根本区别:

Library:

提供代码


Skill:

提供“完成任务的方法”

因此,Skill 很可能成为 Agent 生态中的一种新型软件资产。

总结

Skill 不是给 Agent 增加一个按钮,而是把人的经验、流程和专业方法,封装成 Agent 可以发现、加载和复用的任务能力。

一个成熟的 Agent 系统最终不会只有:

Model
+
Tools

而更可能是:

Model
+
Context
+
Memory
+
Skills
+
Tools
+
MCP
+
Workflow
+
Runtime
+
Evaluation

其中:

Tool 决定 Agent 能做什么,Skill 决定 Agent 应该怎么做。

而真正优秀的 Skill,也不是越长越好、规则越多越好,而是能够在正确的任务中被正确触发,以尽可能少的 Context 提供足够明确的方法,并通过真实任务持续验证和迭代。

这也是 mattpocock/skills 这类项目值得研究的原因:它已经不再把 Skill 当成一段 Prompt,而是在尝试把 Skill 当成可组合、可维护、可版本化的工程资产。

参考资料