跳转到内容

第 33 节 · Skills 系统:为什么需要、SKILL.md 标准、加载机制

一句话回答

Skills = 可热插拔的领域知识包。 它把团队规范、操作流程、参考资料和小脚本打包成文件夹,让同一个 Agent 面对不同项目时按需加载正确能力,而不是把所有规则都塞进 system prompt。

为什么 system prompt 不够

为什么需要 Skills

想象你在同一家公司接了 3 个项目:

项目代码规范测试要求提交格式
前端 React函数组件 + hooks + 禁止 classvitestfeat(ui): xxx
后端 Go错误必须用 sentinel + wrapgo test -racefix(api): xxx
数据流水线PEP8 + type hint 100%pytest --cov ≥80%chore(etl): xxx

如果把 3 套规范全塞进 system prompt:

  • token 炸裂(每次都付 3 倍钱)
  • LLM 容易"串台"
  • 规则没人敢维护(prompt 变成一坨巨型文档)

Skills 的解法:

  • 每套规范 = 一个 skill 文件夹
  • 启动时只加载索引(name + description,极小)
  • 用户问题匹配到哪个 skill,才加载对应的完整指令
  • 更大的参考资料和脚本放在旁边,等真的需要时再读或执行

2026 年的 Skills 标准:渐进式披露

Anthropic 在 2025-2026 年把 Agent Skills 推成了一个很清晰的格式:文件夹 + SKILL.md + 渐进式披露

add-docstring/
├── SKILL.md        # 元数据 + 核心规则
├── reference.md    # 更长的参考资料,可选
├── examples.md     # 示例,可选
└── scripts/
    └── check.py    # 可执行脚本,可选
层级什么时候进入上下文内容
Level 1:元数据启动时总是加载name + description
Level 2:核心指令匹配到 skill 时加载SKILL.md body
Level 3+:资源 / 脚本需要时再读或执行参考文档、模板、Python / Bash 脚本

这叫 progressive disclosure(渐进式披露):先给目录,再给章节,最后才打开附录。它解决的是 Day4 的上下文问题:让 Agent 知道有这些能力,但不要一上来把所有内容塞进窗口。

SKILL.md 格式标准

markdown
---
name: add-docstring
description: 给 Python 函数添加 Google 风格 docstring;当用户要求加注释、补文档、写 docstring 时使用
---

# 使用规则

当用户要求"加注释""加文档""补 docstring"时,遵循以下规范:

## 格式

- Google 风格 docstring
- 第一行是简短描述(不超 72 字符)
- Args / Returns / Raises 三段

## 示例

```python
def fetch_user(user_id: int, timeout: float = 5.0) -> dict:
    """根据 ID 获取用户信息。

    Args:
        user_id: 用户唯一标识符。
        timeout: HTTP 超时(秒),默认 5.0。

    Returns:
        用户信息字典,包含 name / email / role。

    Raises:
        NotFoundError: user_id 不存在时。
    """
```

frontmatter 字段

字段必填作用
nameSkill 唯一标识(用于匹配 + 加载)
description一句话描述(注入 system prompt 索引里,也是触发质量的关键)

description 不是随便写的广告语,而是匹配提示。写得太泛会误触发,写得太窄又触发不到。

渐进式加载机制

Level 1(启动时):
扫描 skills/ 解析 frontmatter 生成索引
注入到 system prompt:
"可用 Skills: add-docstring(给函数加 docstring) / go-sentinel(Go 错误规范) / ..."

Level 2(运行时):
用户问 "帮我给这个函数加文档"
 匹配到 add-docstring
 加载完整 SKILL.md body 注入到 system prompt
 LLM 按照 body 里的格式规范生成 docstring

Level 3(进阶):
SKILL.md 里写 "复杂场景请阅读 reference.md"
 Agent 按需 read reference.md
 或运行 scripts/check.py 做确定性校验

好处

  1. 启动 token 极小(索引只有几十个 token)
  2. 只付当次真正需要的 skill 的 token 成本
  3. 新增 skill 不用改代码——放一个文件夹进去就行
  4. 领域专家也能维护——Markdown 比改 Python 代码容易

Skills、Memory、MCP 到底有什么区别

机制解决什么问题例子
Skills流程和规范怎么做"写 commit message 要按这个模板"
Memory长期事实记什么"用户偏好中文提交信息"
MCP / Tools外部能力怎么调用查 issue、读数据库、跑浏览器

一句话:Skills 教 Agent 怎么做,Memory 告诉它以前发生过什么,Tools 让它真的能做。

给 Agent 加 list_skillsload_skill 工具

最小实现只要 2 个新工具:

python
@registry.tool("列出所有可用的 Skills 名称和描述")
def list_skills() -> str:
    return skills.to_index_prompt()

@registry.tool("加载指定 skill 的完整规范到上下文中")
def load_skill(name: str) -> str:
    return skills.load(name)

这样 LLM 就可以自己决定什么时候该加载哪个 skill。课程里的简化版也演示了关键词匹配:先用 query 匹配 skill 索引,再加载最相关的 body。

安全提醒:Skill 也是供应链

Skill 很像"给 Agent 装插件",所以要按供应链看待:

  • 只安装可信来源的 skill
  • 先读 SKILL.md,再决定是否启用
  • 特别审查 scripts/ 里的脚本和联网行为
  • 不要把 API key、token、密码写进 skill
  • 对团队共享 skill 做版本管理和 code review

一个恶意 skill 可以诱导 Agent 泄露文件、乱跑命令或连接陌生网络。Skills 提升能力,也扩大攻击面。

动手试试

  1. my_coding_agent/skills/ 下建一个 add-docstring/SKILL.md
  2. 给 ToolRegistry 添加 list_skills + load_skill 两个工具,或复用 skills_loader.py 的匹配逻辑
  3. 用 Agent 问"帮我给 bash.py 里的函数加 docstring"
  4. 观察 Agent 是否自动 load_skill("add-docstring") → 按规范生成

演示代码:labs/07-skills-and-npc/demo_33_skills.py

小结

  • Skills = 热插拔的领域规范包,解决"多项目多规范"问题
  • SKILL.md = YAML frontmatter(元数据)+ Markdown body(完整指令)
  • 2026 的核心思想是渐进式披露:索引常驻,正文按需,资源和脚本再按需
  • Skills 教流程,Memory 存事实,Tools 接外部能力
  • Skill 也要审计,不要把不可信脚本直接交给 Agent 跑

Released under the MIT License.