从零构建 Agent Skill 系统:设计哲学与实战全解

从零构建 Agent Skill 系统:设计哲学与实战全解

摘要: 2026年,AI Agent 不再靠 prompt 死记硬背——Skills 框架正在成为 Agent 基础设施的标配。本文将深入剖析三大主流 Skills 框架的设计哲学,并带你从零构建一个可运行的 Agent Skill 系统,附完整代码。


一、为什么 Agent 需要 Skills?

2026 年 5 月的 GitHub Trending 上,前十名中有超过一半是 Agent 相关项目。Anthropic 推出了 anthropics/skills(140k⭐),Jesse Vincent 的 superpowers(205k⭐)成为跨平台标准,Nous Research 的 hermes-agent(166k⭐)甚至让 Agent 自己写 Skill。

这一切指向同一个趋势:Agent 从「靠 prompt 硬记」进化到「像插件一样加载能力」。

Skills 解决的核心问题

问题 没有 Skills 有 Skills
知识复用 每次对话重新教 Agent Skill 文件持久化,一次编写到处运行
质量保证 Agent 凭记忆,质量不稳定 Skill 定义标准流程,Agent 严格遵循
上下文效率 Prompt 越写越长 按需加载,不浪费 token
协作共享 每个人的 Agent 要单独教 Skills 像 npm 包一样分发
自主进化 靠人工维护 Agent 可以自己创建和改进 Skills

agentskills.io 标准

2025 年底,Anthropic 联合社区推出了 agentskills.io 开放标准——一个极简的格式规范:

---
name: my-skill
description: Use when [触发条件]
---

# 指令内容

就这么简单。两个必填字段 + Markdown 正文。但这简单背后,各家框架演化出了完全不同的设计哲学。


二、三大框架设计哲学对比

2.1 Superpowers:方法论驱动的 Skill 编排

核心理念: Skills 不只是参考文档,而是一套强制执行的软件工程方法论。

Superpowers 核心工作流:

  需求分析 ──► 实现计划 ──► Git Worktree 隔离
      │                          │
      ▼                          ▼
  brainstorming            writing-plans
  (苏格拉底式追问)          (任务拆分到2-5分钟粒度)
                                  │
                          ┌───────┴───────┐
                          ▼               ▼
                   TDD 驱动开发      子Agent并发执行
                          │               │
                    test-driven-     subagent-driven-
                    development      development
                          │               │
                          └───────┬───────┘
                                  ▼
                           代码审查 + 分支合并
                           requesting-code-review
                           finishing-a-development-branch

设计特点:

  • 上下文自动触发: Agent 在合适的阶段自动加载对应 Skill,用户无需手动指定
  • TDD 铁律: “NO PRODUCTION CODE WITHOUT A FAILING TEST FIRST”——违反即删除代码
  • Skill 的 Skill: writing-skills 用 TDD 方法论来写 Skill——先让 Agent 在没有 Skill 的情况下失败(RED),再写 Skill 让它成功(GREEN),最后堵漏洞(REFACTOR)
  • 跨 Agent 兼容: 同时支持 Claude Code、Codex、Gemini CLI、Cursor、OpenCode 等 10+ 平台

哲学洞察: Superpowers 把 Skill 从「参考指南」升级为「行为约束」。它不信任 Agent 会”记住”最佳实践——它用 Skill 机制强制执行。

2.2 Anthropic Skills:极简主义的开放标准

核心理念: Skills 应该像文件系统中的文件夹一样简单——一个 SKILL.md 就是一个 Skill。

Anthropic Skills 的设计原则:

  极简格式          渐进复杂度          开放生态
  ┌─────────┐     ┌──────────┐      ┌──────────┐
  │ name     │     │ 入门只需  │      │ 任何人可  │
  │ desc     │ ──► │ 2个字段   │ ──►  │ 创建分发  │
  │ body     │     │ 高级可加  │      │ agentskills│
  └─────────┘     │ 更多元数据│      │ .io 注册表 │
                  └──────────┘      └──────────┘

Skill 结构:

my-skill/
├── SKILL.md           # 必需:YAML frontmatter + Markdown 指令
├── scripts/           # 可选:可执行脚本
├── references/        # 可选:参考文档
└── templates/         # 可选:模板文件

设计特点:

  • 最简格式: 只有 namedescription 两个必填字段,5 分钟就能写一个 Skill
  • 渐进增强: 入门极简,但支持 scripts/references/templates/ 等子目录扩展
  • 官方示范: 仓库包含文档 Skill(docx/pdf/pptx/xlsx)作为生产级参考实现
  • 标准化先行: 通过 agentskills.io 推动行业标准,不做平台锁定

哲学洞察: Anthropic 把 Skill 定位为「AI 时代的文件格式」——像 Markdown 之于文档、JSON 之于数据。格式越简单,生态越繁荣。

2.3 Hermes Agent:自我进化的 Skill 系统

核心理念: Agent 不应该只使用 Skills——它应该能自己创建和改进 Skills。

Hermes Agent 的闭环学习系统:

  ┌──────────────────────────────────────────┐
  │                                          │
  │   执行任务    复杂任务完成     自动创建    │
  │   ────────►  (5+ tool calls) ──► Skill   │
  │                                          │
  │      │                          │        │
  │      │                          ▼        │
  │      │                    使用过程中发现  │
  │      │                    步骤缺失/过时   │
  │      │                          │        │
  │      │                          ▼        │
  │      │                    自动 patch     │
  │      │                    更新 Skill     │
  │      │                          │        │
  │      ▼                          ▼        │
  │   下次会话                  更完善的      │
  │   自动加载 ◄─────────────── Skill         │
  │                                          │
  └──────────────────────────────────────────┘

设计特点:

  • 自主创建: Agent 完成复杂任务后,主动提出保存为 Skill(skill_manage(action='create')
  • 运行时改进: 使用 Skill 时发现步骤缺失,立即 patch(skill_manage(action='patch')
  • 记忆联动: Skills 是「过程记忆」,Memory 是「事实记忆」——两者协同工作
  • 符合标准: 兼容 agentskills.io 格式,Skill 可以跨平台使用

哲学洞察: Hermes 把 Skill 系统从「静态知识库」变成了「活的知识引擎」。Skill 不是人写给 Agent 的命令——而是 Agent 从经验中提炼的方法论。

2.4 三方设计对比总结

维度 Superpowers Anthropic Skills Hermes Agent
定位 方法论强制执行 开放标准 + 参考实现 自我进化的知识引擎
Skill 格式 SKILL.md(YAML + MD) SKILL.md(YAML + MD) SKILL.md(YAML + MD)
触发方式 上下文自动匹配 用户显式调用 自动匹配 + 用户调用
依赖管理 无显式依赖 无显式依赖 requires 字段支持
Skill 创建 人写(TDD 方法) 人写(模板化) Agent 自主创建 + 人写
跨平台 10+ Agent 平台 Claude 生态 自主平台
学习能力 从经验中学习改进

三、动手构建:Agent Skill System

理解了设计哲学,我们来动手实现一个自己的 Agent Skill 系统。目标:

  • 符合 agentskills.io 标准格式
  • 支持 Skill 发现、加载、匹配
  • 支持依赖链解析
  • 完整测试覆盖(30 个测试用例,100% 通过)

3.1 环境搭建

# 克隆项目
git clone https://github.com/liyeping/agent-skill-system.git
cd agent-skill-system

# 安装依赖
pip install -r requirements.txt

# 运行测试
pytest tests/ -v

# 启动交互式 Demo
python examples/chat_demo.py

核心依赖只有两个:pyyaml(解析 YAML frontmatter)和 pytest(测试)。

3.2 架构设计

┌──────────────────────────────────────────────────┐
│                  Agent Skill System                │
│                                                    │
│  ┌──────────────┐   ┌──────────────┐              │
│  │  SKILL.md    │   │  SKILL.md    │   ...        │
│  │  (code-      │   │  (debugging) │              │
│  │   review)    │   │              │              │
│  └──────┬───────┘   └──────┬───────┘              │
│         │                  │                       │
│         ▼                  ▼                       │
│  ┌─────────────────────────────────┐              │
│  │        SkillRegistry            │              │
│  │  ┌───────────┐ ┌─────────────┐ │              │
│  │  │ discover  │ │   index     │ │              │
│  │  │ (walk dir)│ │ (by name/   │ │              │
│  │  │           │ │  tag/prio)  │ │              │
│  │  └───────────┘ └─────────────┘ │              │
│  │  ┌───────────────────────────┐ │              │
│  │  │        match()            │ │              │
│  │  │  name→keyword→partial→prio│ │              │
│  │  └───────────────────────────┘ │              │
│  └──────────────┬──────────────────┘              │
│                 │                                  │
│                 ▼                                  │
│  ┌─────────────────────────────────┐              │
│  │       SkillExecutor             │              │
│  │  ┌────────────┐ ┌────────────┐ │              │
│  │  │ resolve    │ │  format    │ │              │
│  │  │ deps       │ │  prompt    │ │              │
│  │  └────────────┘ └────────────┘ │              │
│  └─────────────────────────────────┘              │
│                                                    │
│  输出:格式化的 Prompt Injection,注入 Agent 的     │
│  System Prompt,让 Agent 按照 Skill 指令执行        │
└──────────────────────────────────────────────────┘

四、核心模块实现

4.1 Frontmatter 解析器

这是整个系统的基石——按照 agentskills.io 标准解析 SKILL.md:

# skill_core/frontmatter.py

@dataclass
class SkillFrontmatter:
    """解析后的 YAML frontmatter"""
    name: str
    description: str
    version: str = "1.0.0"
    author: str = ""
    tags: list[str] = field(default_factory=list)
    priority: int = 0
    requires: list[str] = field(default_factory=list)

@dataclass
class Skill:
    """完整的 Skill 对象"""
    frontmatter: SkillFrontmatter
    body: str              # Markdown 正文
    source_path: Path      # 文件路径

关键设计决策:

  • priority:多个 Skill 匹配同一上下文时,高优先级的胜出
  • requires:声明依赖,加载时自动解析依赖链
  • extras:保留所有未知字段,向前兼容 agentskills.io 规范演进

4.2 Skill 注册表

注册表负责发现、加载、索引和匹配:

# skill_core/registry.py

class SkillRegistry:
    def discover(self, skills_dir: str) -> int:
        """递归扫描目录,发现所有 SKILL.md"""
        for skill_md in Path(skills_dir).rglob("SKILL.md"):
            skill = self._load_one(skill_md)
            self._index(skill)  # 按 name + tags 建索引

    def match(self, context: str) -> Optional[Skill]:
        """四级匹配策略"""
        # 1. 精确名称匹配("review my code" → code-review)
        # 2. 关键词 Jaccard 重叠(描述词 vs 上下文词)
        # 3. 子串/部分匹配("debug" ↔ "debugging")
        # 4. Priority 加成(同匹配度时高优先生效)

匹配算法打分流程:

def _score_one(self, skill, context_lower) -> float:
    exact_score = jaccard(skill_tokens, ctx_tokens)  # 精确重叠
    name_bonus = 30.0 if skill_name in context else 0  # 名称命中强信号
    priority_bonus = priority * 5 if content_match else 0
    return exact + partial + name + priority

跨语言困境:

4.2.1 跨语言匹配:LLM 驱动的语义匹配

问题本质: 关键词匹配依赖词形重叠(”debug” ↔ “debugging”),但中文 “排查Bug” 和英文描述 “encountering bugs” 之间没有任何词形重叠。

Hermes Agent 的做法: 不在代码层做匹配,而是让 LLM 自己做。Agent 的 System Prompt 里注入了所有 Skill 的摘要(name + description),用户发来中文消息后,LLM 读一遍 Skill 列表,自己判断该加载哪个。

这个设计有两个精妙之处:

  1. 语言无关: LLM 理解语义,不依赖词形。中文 “排查Bug” 和英文 “debugging” 在语义空间里是邻居。
  2. 意图理解: “帮我看看这段代码有什么问题” → LLM 判断意图是 code-review,不是 debugging。

我们把这个能力加入系统——不是替换关键词匹配,而是作为fallback

匹配策略架构:

  用户输入
     │
     ▼
  ┌──────────────┐
  │  关键词匹配   │  ← 快速,免费,90%场景
  │  (Jaccard +   │
  │   子串匹配)    │
  └──────┬───────┘
         │
    命中? │─── 是 ──► 返回结果
         │
         否
         │
         ▼
  ┌──────────────┐
  │  LLM 语义匹配 │  ← 准确,跨语言,10%场景
  │  (将 Skill 列表 │
  │   发给 LLM)    │
  └──────────────┘
         │
         ▼
      返回结果

实现代码:

# skill_core/llm_matcher.py

class LLMMatcher:
    """让 LLM 从用户消息中匹配 Skill"""

    MATCH_PROMPT = """You are a skill matching system...

## Available Skills
{skills_summary}

## User Request
{user_message}

## Instructions
...
Respond with ONLY the skill name or "NONE"."""

    def match(self, context: str) -> Optional[Skill]:
        prompt = self.MATCH_PROMPT.format(
            skills_summary=self._build_skills_summary(),
            user_message=context,
        )
        response = self._llm(prompt).strip()
        return self._registry.get(self._parse_response(response))

接入真实 LLM 只需一行:

import openai

def call_openai(prompt: str) -> str:
    return openai.chat.completions.create(
        model="gpt-4o-mini",
        messages=[{"role": "user", "content": prompt}],
    ).choices[0].message.content

matcher = LLMMatcher(llm_call=call_openai)
registry.attach_llm_matcher(matcher)

# 现在中文也能匹配了!
registry.match("帮我审查一下这个PR")  # → code-review ✅

为了可测试,我们内置了一个 mock_llm_call(中英文关键词映射),无需 API 调用即可验证整个链路。

效果对比:

# 纯关键词模式
python examples/chat_demo.py
💬 帮我审查一下这个PR
❌ 未匹配到任何 Skill

# 混合匹配模式(关键词 + LLM fallback) python examples/chat_demo.py --llm
💬 帮我审查一下这个PR
✅ 匹配成功 [🌐 LLM语义]: code-review

💬 生产环境有个报错需要排查
✅ 匹配成功 [🌐 LLM语义]: debugging

💬 调研一下最新的AI框架
✅ 匹配成功 [🌐 LLM语义]: web-research

💬 今天天气怎么样
❌ 未匹配到任何 Skill(无关话题正确拒绝)

关键设计决策: 为什么不做纯粹的中文分词匹配?因为做不到。中文 “排查” 可以映射到 “debugging”,但 “排查” 也可以映射到 “code-review”(审查代码也是一种排查)。只有 LLM 能理解 意图 而非只是 词形

4.3 Skill 执行器

执行器负责加载匹配到的 Skill,解决依赖链,格式化输出:

# skill_core/executor.py

class SkillExecutor:
    def load(self, skill: Skill) -> str:
        """加载 Skill 及所有依赖,返回可注入 Agent 的 prompt"""
        resolved = self._resolve_deps(skill)  # 拓扑排序依赖
        blocks = [self._format_skill(s) for s in resolved]
        return "\n\n".join(blocks)

    def match_and_load(self, context: str) -> Optional[str]:
        """一站式:匹配 + 加载 + 格式化"""
        skill = self.registry.match(context)
        return self.load(skill) if skill else None

依赖链解析:

def _resolve_deps(self, skill, visited=None):
    """深度优先 + 环检测,返回拓扑序(依赖在前)"""
    # base-skill → derived-skill
    # 输出顺序:base-skill 的指令在前,derived-skill 在后

4.4 示例 Skill

系统自带 4 个可用的示例 Skill,覆盖完整的 Agent 工作流:

Skill 用途 Tags
code-review PR 审查流程,含评论规范 code, review, quality
test-driven-dev RED-GREEN-REFACTOR 铁律 testing, tdd, quality
debugging 4阶段系统化排错 debugging, troubleshooting
web-research 网络调研+来源评估 research, web, search

五、运行与测试

5.1 交互式 Demo

$ python examples/chat_demo.py

============================================================
  🧠  Agent Skill System — Interactive Demo
============================================================

📚 Loaded Skills (4):
  🔹 code-review (v1.0.0, pri=10)
     Use when reviewing pull requests, code changes, or merge requests...
     Tags: code, review, quality, collaboration
  🔹 test-driven-dev (v1.0.0, pri=15)
     Use when implementing any feature or bugfix, before writing implementation...
     Tags: testing, tdd, quality, development
  ...

💬 You: please review my pull request
✅ Matched Skill: code-review

💬 You: I found a strange bug in production
✅ Matched Skill: debugging

💬 You: what's the weather like?
❌ No skill matched for this input.

5.2 测试结果

$ pytest tests/ -v
============================= 30 passed in 0.10s ==============================

tests/test_skills.py::TestParseSkill::test_basic_parse PASSED
tests/test_skills.py::TestParseSkill::test_missing_frontmatter PASSED
tests/test_skills.py::TestParseSkill::test_missing_name PASSED
tests/test_skills.py::TestParseSkill::test_missing_description PASSED
tests/test_skills.py::TestParseSkill::test_empty_body PASSED
tests/test_skills.py::TestParseSkill::test_name_too_long PASSED
tests/test_skills.py::TestParseSkill::test_tags_and_priority PASSED
tests/test_skills.py::TestValidateSkill::test_valid_skill PASSED
tests/test_skills.py::TestValidateSkill::test_description_not_starting_with_use_when PASSED
tests/test_skills.py::TestValidateSkill::test_invalid_name_format PASSED
tests/test_skills.py::TestRegistry::test_discover_and_list PASSED
tests/test_skills.py::TestRegistry::test_get_by_name PASSED
tests/test_skills.py::TestRegistry::test_by_tag PASSED
tests/test_skills.py::TestMatching::test_exact_name_match PASSED
tests/test_skills.py::TestMatching::test_tag_match PASSED
tests/test_skills.py::TestMatching::test_no_match PASSED
tests/test_skills.py::TestMatching::test_priority_tiebreaker PASSED
tests/test_skills.py::TestExecutor::test_load_single_skill PASSED
tests/test_skills.py::TestExecutor::test_dependency_chain PASSED
tests/test_skills.py::TestExecutor::test_match_and_load PASSED
tests/test_skills.py::TestExecutor::test_no_match_returns_none PASSED
tests/test_skills.py::TestIntegration::test_full_workflow PASSED
tests/test_skills.py::TestLLMMatcher::test_chinese_code_review PASSED
tests/test_skills.py::TestLLMMatcher::test_chinese_debugging PASSED
tests/test_skills.py::TestLLMMatcher::test_chinese_research PASSED
tests/test_skills.py::TestLLMMatcher::test_auto_strategy_falls_back_to_keyword PASSED
tests/test_skills.py::TestLLMMatcher::test_auto_strategy_llm_fallback PASSED
tests/test_skills.py::TestLLMMatcher::test_llm_no_match PASSED
tests/test_skills.py::TestLLMMatcher::test_mock_llm_keyword_map PASSED
tests/test_skills.py::TestHybridMatcher::test_keyword_first_llm_fallback PASSED

六、进阶玩法

6.1 接入真实 Agent

将 Skill 系统的输出注入到 LLM 的 System Prompt:

from skill_core import SkillRegistry, SkillExecutor

registry = SkillRegistry()
registry.discover("./skills")
executor = SkillExecutor(registry)

# 获取 Skill 上下文
skill_context = executor.match_and_load(user_message)

# 注入到 LLM 调用
system_prompt = f"""You are a helpful coding assistant.
When relevant skills are available, follow them strictly.

{skill_context if skill_context else ""}
"""

response = llm.chat(
    system=system_prompt,
    messages=[{"role": "user", "content": user_message}]
)

6.2 创建自定义 Skill

只需创建一个目录和 SKILL.md

---
name: api-design
description: Use when designing REST APIs, endpoints, or request/response schemas
tags: [api, design, rest]
priority: 10
---

# API Design Skill

## Principles
1. **Resources, not actions**: `/users` not `/getUsers`
2. **Consistent naming**: plural nouns, kebab-case URLs
3. **Proper HTTP methods**: GET (read), POST (create), PUT (replace),
   PATCH (update), DELETE (remove)

## Checklist
- [ ] URLs use nouns, not verbs
- [ ] POST returns 201 with Location header
- [ ] Errors use consistent format: `{"error": "message", "code": "TYPE"}`
- [ ] Pagination via `?page=1&limit=20`, response includes `total` count
- [ ] All endpoints have OpenAPI/Swagger documentation

6.3 接入真实 LLM 做语义匹配(替换关键词匹配)

当前实现使用 Jaccard + 子串匹配 + LLM fallback。对于生产环境,可以直接将默认匹配器切换为 LLM 驱动的语义匹配:

# 使用 embedding 做语义匹配
from sentence_transformers import SentenceTransformer

model = SentenceTransformer('all-MiniLM-L6-v2')

class SemanticSkillRegistry(SkillRegistry):
    def __init__(self):
        super().__init__()
        self._embeddings = {}  # skill_name → embedding

    def _index(self, skill):
        super()._index(skill)
        self._embeddings[skill.name] = model.encode(
            f"{skill.description} {' '.join(skill.frontmatter.tags)}"
        )

    def match(self, context):
        ctx_emb = model.encode(context)
        best = max(
            self._embeddings.items(),
            key=lambda kv: cosine_similarity(ctx_emb, kv[1])
        )
        return self.get(best[0])

6.4 Skill 市场 / 注册表

参考 agentskills.io 注册表 + Claude Plugin Marketplace 的模式:

# 从远程注册表安装 Skill
skill install code-review@community-registry
skill search "api design"
skill publish ./my-skill  # 发布到注册表

七、项目结构

agent-skill-system/
├── README.md
├── requirements.txt          # pyyaml + pytest
├── config.py                 # 环境变量配置
│
├── skill_core/               # 核心库
│   ├── __init__.py           # 公共 API 导出
│   ├── frontmatter.py        # SKILL.md 解析器 + 数据模型
│   ├── registry.py           # Skill 注册表(发现、索引、匹配)
│   ├── executor.py           # Skill 执行器(依赖解析、格式化)
│   └── llm_matcher.py        # LLM 语义匹配器 + 混合匹配策略
│
├── skills/                   # 示例 Skill 库
│   ├── code-review/SKILL.md
│   ├── test-driven-dev/SKILL.md
│   ├── debugging/SKILL.md
│   └── web-research/SKILL.md
│
├── examples/
│   └── chat_demo.py          # 交互式演示
│
└── tests/
    └── test_skills.py        # 22 个测试用例

八、总结

我们做了什么

  1. 深入理解了三套主流 Skills 框架的设计哲学:
    • Superpowers 把 Skill 当方法论强制执行
    • Anthropic 把 Skill 当开放文件格式
    • Hermes 把 Skill 当自我进化的知识引擎
  2. 从零构建了一个可用的 Agent Skill 系统(v1.1):
    • 符合 agentskills.io 标准
    • 支持发现、加载、关键词匹配、LLM 语义匹配、依赖解析
    • 30 个测试用例,100% 通过
    • 4 个可直接使用的示例 Skill
    • 双语支持:关键词匹配(英文,零成本)+ LLM 语义匹配(中文/任意语言,智能 fallback)

Skills 的未来

Agent Skills 正在成为 AI 基础设施的关键层——就像 package manager 之于软件开发,Skills 让 Agent 的能力可以模块化、可复用、可分发。而最令人兴奋的是,像 Hermes Agent 这样的系统正在让 Skills 自我进化——Agent 从经验中学习,自己写自己的 Skill。

未来已来,而且它是分层的。


参考资料