可发现
AI 能知道“我有这个能力”
很多人使用 AI 助手的核心困境是:不是不知道怎么问,而是 AI 不知道怎么做。
| 任务 | 用户以为 AI 会做 | 实际还需要 |
|---|---|---|
| 补单元测试 | 写几个 test() |
理解逻辑 → 设计边界用例 → 验证覆盖率 |
| 整理 Markdown | 总结文字 | 统一格式 → 提取信息 → 生成目录 → 检查链接 |
| 找合适的 Skill | 搜索文件名 | 评估适用场景 → 判断能力边界 |
共同特点:很多任务不是一句答案能结束的,而是需要稳定的、可复用的能力链。
真正缺的不是更多话术,而是:
可发现
AI 能知道“我有这个能力”
可执行
AI 能按结构化流程完成任务
可复用
同样的能力可跨场景持续使用
因此,Skill 的本质不是“多一个工具”,而是把能力变成可发现、可执行、可复用的模块。
核心痛点
不是 AI 不会回答,而是真实任务需要稳定的能力链,普通聊天无法保证执行质量
根本原因
缺少可发现的能力、可执行的流程、可复用的结构三大要素
Skill 解决什么
把能力变成可发现、可执行、可复用的模块,让 AI 从“会说”走向“会做”
与长 Prompt 的区别
Skill 不是更长的提示词,而是有路由、有流程、有资源支撑的独立能力单元
手机类比:Agent 像手机(理解意图、调度能力),Skill 像 App(提供可调用功能 + 使用说明书),生态目录像应用商店(发现、安装、管理)。
| 类型 | 典型特征 | 局限 |
|---|---|---|
| 长 Prompt | 一次性塞入大量指令,高度依赖当前上下文 | 跨场景复用弱,维护困难 |
| 工具 / 插件 | 强调执行动作 | 不一定天然可发现,常缺少教学式描述层 |
| Skill | 描述能力边界,告诉 Agent 什么时候该用 | 需要设计清楚触发、流程与资源层 |
Skill 多出来的关键价值:
可发现
Agent 能知道这个能力适合什么任务
可复用
同一份能力可以跨场景持续使用
可组合
多个 Skill 可以共同完成复杂任务
可治理
能力边界、触发条件和执行流程可被维护和优化
使用 Prompt vs 使用 Skill 的对比
用户:"帮我给这个函数补充单元测试,要覆盖边界情况,要用 Jest 框架,要检查覆盖率,要..."问题:每次都要重新描述需求,容易遗漏细节;AI 可能理解偏差,执行不一致;下次遇到类似任务又要重新写一遍。
用户:"帮我补充单元测试"Agent:识别到 test-driven-development Skill → 自动执行标准化流程优势:一句话触发,无需重复描述;执行流程一致,结果可预期;下次遇到类似任务自动复用。
所有机制设计都围绕可发现、可执行、可复用展开。Agent 调用 Skill 不是“想起了就用”,而是走一条完整的判断链。
路由的核心问题:Agent 如何从多个可用 Skill 中选出最合适的?
Agent 内部走的是一套简化决策树:
| 判断问题 | 结论 |
|---|---|
| 普通聊天就能完成?(总结、解释、改写) | 不需要 Skill |
| 需要结构化流程或外部能力?(批处理、环境依赖、多步验证) | 需要 Skill |
| 多个 Skill 都能匹配? | 选语义最贴近当前语境的那个 |
当多个 Skill 都能匹配时,Agent 依据三个维度排序:
| 维度 | 判断内容 |
|---|---|
| 语义匹配度 | description 与用户请求的语义相似度 + 关键词命中 |
| 能力边界覆盖 | Skill 的能力范围是否完整覆盖当前任务需求 |
| 优先级规则 | 平台推荐、用户偏好或显式优先级标记 |
示例:
| 用户请求 | 判断结果 |
|---|---|
| 把函数写成中文解释 | 普通语言任务,无需 Skill |
| 找出当前环境的 PDF 处理能力 | 触发发现类 Skill |
| 帮我给这个函数补充单元测试 | 触发 test-driven-development Skill |
| 把一批 Markdown 整理成课程大纲再转 HTML | 需要多个 Skill 组合 |
Skill 的关键设计是按需加载:空闲时系统仅持有数百 Token 的 Skill 元数据(name + description),匹配后才注入完整 Skill 内容。
| 场景 | 全量注入 | 按需加载 | 节省 |
|---|---|---|---|
| 补充测试 | ~5000 tokens | ~500 tokens | 90% |
| 代码审查 | ~4500 tokens | ~450 tokens | 90% |
| 文档整理 | ~4000 tokens | ~400 tokens | 90% |
从使用者视角切换到创建者视角,Skill 可以拆成三层:
| 层级 | 组成 | 核心职责 |
|---|---|---|
| 路由层 | frontmatter(YAML 元信息) | 决定“能不能被找到、什么时候触发” |
| 控制层 | SKILL.md 正文(body) |
决定“进来以后怎么做” |
| 支撑层 | references/、scripts/、assets/ 等 |
提供知识、脚本、模板,把能力做实 |
frontmatter 不是备注,是 Agent 路由系统的入口。它决定 Skill 能否被发现和调用。
---name: test-driven-developmentdescription: 在实现任何功能或修复 bug 前,先编写测试用例---| 字段 | 作用 | 设计要点 |
|---|---|---|
name |
让能力可被识别和引用 | kebab-case,简洁唯一 |
description |
决定触发语义是否清晰 | 动词开头,说明适用场景和边界(做什么、什么时候用、什么时候不用) |
body 决定 Agent 进入 Skill 后如何执行(怎么做)。不是普通文档,而是可执行的流程规范。
一个完整的 body 通常包含四个核心模块:
| 模块 | 回答的问题 |
|---|---|
| Goal | 这个 Skill 解决什么问题?(与 frontmatter description 一致) |
| Workflow | 执行步骤是什么?遇到分支怎么走? |
| Constraints | 什么不能做?什么必须遵守?验收标准是什么? |
| Examples | 典型用法长什么样? |
## Goal引导使用 TDD 方法论实现功能
## Workflow1. 阅读功能描述,识别验收标准2. 设计测试用例(正常/边界/异常)3. 编写测试代码,确认测试失败4. 编写最小实现,让测试通过5. 重构代码,确保测试仍然通过
## Constraints- 不要在编写测试前编写实现代码- 每个测试必须有清晰的断言- 测试之间必须独立且可重复运行- 验收标准:所有测试通过且覆盖率达标
## Examples用户请求:"给 calculateTotal 函数补充单元测试"→ 识别函数签名 → 设计正常/空数组/负数三组用例 → 编写测试 → 验证通过| 目录 | 放什么 | 解决什么问题 |
|---|---|---|
references/ |
深入知识、变体细节 | 让主 Skill 保持轻量,按需引用 |
scripts/ |
重复或脆弱的确定性动作 | 降低手工失误,保证执行一致 |
assets/ |
模板、结构骨架、可复用产物 | 提供起点,提升输出质量 |
引用辅助文件时,不要只写路径——要写契约,告诉 Claude 何时加载、加载后得到什么:
# ❌ 弱引用(Claude 不知道何时加载)See `reference/revenue.md` for more details.
# ✅ 契约式引用## 收入分析当用户询问收入增长、ARPU 或收入构成时:→ 加载 `reference/revenue.md` 获取计算公式和行业基准三要素:触发条件(什么情况下)+ 文件路径(去哪里找)+ 内容预期(加载后得到什么)。
Claude 根据文件名判断是否需要加载,命名要有描述性:
# 好的命名 # 差的命名reference/revenue.md reference/ref1.mdtemplates/quarterly_report.md docs/misc.md脚本适合封装确定性逻辑,让 Claude 执行而不需要“理解”,节省 token:
# 适合脚本 # 不适合脚本财务比率计算(公式固定) 开放性分析(需要判断)数据格式转换(规则明确) 创意性任务(需要灵活性)文件批量处理(重复性高) 交互式决策(需要反馈)脚本还能生成可视化 HTML,Claude 只需知道“运行什么命令”(10 tokens),而非“如何生成 HTML”(2000+ tokens)——这是渐进式披露的极致形态。
三层不是各自独立的文件集合,而是在不同运行场景中各有侧重:
| 场景 | 路由层重点 | 控制层重点 | 支撑层重点 |
|---|---|---|---|
| 能力发现 | 触发语义能否被 Agent 读懂 | — | — |
| 执行任务 | 判断“是不是 Skill 问题” | 把任务拆成步骤和验证 | 脚本执行 + 模板输出 |
| 持续维护 | 边界是否仍然清晰 | 流程和分支是否需要更新 | 资源是否需要补强 |
目录结构不是固定模板,而是按任务复杂度组织。SKILL.md 是唯一必需文件,其余按需添加。
所有内容(Goal、Workflow、Constraints)都在 SKILL.md 正文中。适合单一任务或标准化流程,创建成本低。
需要外部参考资料支撑判断和输出。适合领域知识密集的专业任务。
有确定性执行动作需要脚本化。注意:参考文件不必放在 references/ 目录里,组织方式可以灵活。
包含子 Agent、评估系统和模板资产。适合创建和管理其他 Skill 的元级能力。
| 模式 | 解决的问题 | 核心手段 |
|---|---|---|
| 模板驱动 | 输出不稳定 | templates/ 统一格式 |
| 脚本增强 | 结果不稳定 | scripts/ 确定性执行 |
| 知识分层 | 上下文膨胀 | 渐进加载 + 契约引用 |
| 工具隔离 | 越权风险 | allowed-tools 最小权限 |
生产级 Skill 通常组合多种模式,按需叠加。
适用报告生成、文档输出等需要格式一致的场景。模板负责呈现,不负责决策,逻辑应放在 SKILL.md。
report-generating/├── SKILL.md # 路由 + 流程└── templates/ ├── weekly_report.md # 周报模板 ├── incident.md # 事故报告模板 └── review.md # 评审报告模板## Output Rules- ALWAYS use the template from `templates/` that matches the request type- Fill ALL placeholders — do not leave {placeholder} unfilled- Do NOT add sections beyond what the template defines反模式警告:
适用公式计算、正则匹配、指标统计等确定性场景。把概率型推理替换为确定性执行。
data-analyzing/├── SKILL.md # 路由 + 流程└── scripts/ ├── parse_csv.py # 数据解析 ├── calculate.py # 指标计算 └── visualize.py # 生成图表 HTML脚本规则:
适用规则多、领域复杂的 Skill(SKILL.md 超过 500 行时)。通过渐进加载控制认知复杂度。
security-reviewing/├── SKILL.md # 核心检查清单(~200 行,80% 请求够用)├── QUICKREF.md # 常见漏洞速查(中频)├── reference/│ ├── xss.md # XSS 防护详解(按需)│ ├── sqli.md # SQL 注入详解(按需)│ └── auth.md # 认证问题详解(按需)└── examples/ └── bad_patterns.md # 反模式示例(按需)分层策略:SKILL.md 内联高频内容(80/20 法则)→ 契约式引用中频内容 → 文件名描述性命名供按需加载。
allowed-tools 的核心价值在于明确不能做什么,把安全约束前置为结构设计:
# 审计类:只读allowed-tools: [Read, Grep, Glob]
# 生成类:只写不改allowed-tools: [Read, Grep, Glob, Write]
# 分析类:只读 + 脚本allowed-tools: [Read, Grep, Glob, Bash(python:*)]
# 执行类:受控执行allowed-tools: [Read, Bash(npm test:*), Bash(pytest:*)]你的 Skill 需要……│├─ 标准化输出格式? → 加 templates/(模板驱动)├─ 确定性计算/匹配? → 加 scripts/(脚本增强)├─ 知识量 > 500 行? → 拆分 reference/(知识分层)└─ 安全边界控制? → 配置 allowed-tools(工具隔离)
| 阶段 | 名称 | 特征 | 适用场景 |
|---|---|---|---|
| 第一级 | SOP | 单一 SKILL.md,流程清晰 | 标准化、可复现的操作 |
| 第二级 | 专家系统 | 知识库 + 模板 + 脚本 + 权限控制 | 复杂变体处理 |
| 第三级 | 组织智能 | 多 Skills + SubAgents + Hooks | 大规模多智能体协作 |
| 维度 | Tool / Function Calling | MCP | Agent Skills |
|---|---|---|---|
| 核心定义 | 代码级接口(JSON Schema) | 通讯协议标准 | 业务逻辑封装(Markdown) |
| 擅长 | 单点执行、精确动作 | 稳定接入外部系统 | 组织工作流、封装判断 |
| 局限性 | 不够灵活,需要编程 | 实现复杂,学习成本高 | 精确度相对较低 |
| 开发方式 | JSON Schema + Python/Node.js | TypeScript/Python SDK | Markdown / 自然语言 |
| 适用人群 | 后端工程师 | 全栈工程师 | 技术与非技术人员均可 |
快速原型 / 非技术团队
优先 Agent Skills — Markdown 编写,修改即生效,低门槛
精确控制
优先 Tool(Function Calling)— 确定性执行,结构化数据,可监控
生产级跨平台集成
优先 MCP — 标准化协议,稳定可复用
Skills(知识/经验)和 Tools(执行手段)之间有三层关系:
| 关系 | 说明 | 实现方式 |
|---|---|---|
| Skills 约束 Tools | 最小权限原则 | allowed-tools 精确到操作类型 |
| Skills 编排 Tools | 脚本是预编译的 Tool 调用序列 | scripts/ 固化确定性逻辑,Claude 执行但不理解 |
| Tools 反哺 Skills | Tool 输出在 Skill 加载前注入上下文 | !`command` 语法预处理 |
# Tools 反哺 Skills 示例---name: pr-summary---
## Context- PR diff: !`gh pr diff`- Changed files: !`git diff --name-only`Shell 命令在 Skill 加载之前执行,Claude 收到的是已包含实时数据的知识——这就是动态上下文注入的底层机制。
Skill 失效 = 某一层设计不清楚。按层排查:
| 失效层 | 症状 | 修法 |
|---|---|---|
| 路由层 | Agent 触发不到或误触发 | 明确适用场景、非适用场景、典型对象 |
| 控制层 | 进入后仍在自由发挥 | Goal + Workflow + Constraints 都写清楚 |
| 支撑层 | 复杂任务退回泛化回答 | 补齐 references / scripts / assets |
| 运行时 | 设计没错但执行失败 | 检查平台依赖和上下文是否满足 |
Skill 支持接收用户传入的参数,使同一个 Skill 能处理不同输入。
| 方式 | 语法 | 适用场景 |
|---|---|---|
| 整体传参 | $ARGUMENTS |
接收全部参数作为一个字符串 |
| 位置传参 | $1、$2、$3 |
按位置拆分多个独立参数(从 1 开始) |
示例:
---name: 计算器description: 简单四则运算。用法:/计算器 数字 运算符 数字,例如 /计算器 10 + 5---
计算 $1 $2 $3 = ?
直接输出结果,不要输出任何其他内容。
$1 和 $3 必须是数字,$2 必须是 + / - / * / / 之一,否则给出友好提示。调用 /计算器 30 + 20 时,$1=30、$2=+、$3=20,输出 50。
Agent 进入 Skill 时并不自动感知环境。如果 Workflow 不明确要求收集状态,Agent 会边做边探索,产生多轮无效工具调用。
解法:在 Workflow 的第一步显式要求运行脚本或读取文件,把环境状态收集前置。
## Workflow1. 运行 `scripts/gather-context.sh`,获取当前分支、未合并 commit 数、改动文件列表。2. 根据上一步输出判断风险等级。3. 按风险等级执行对应操作。对比没有注入的写法:
## Workflow1. 判断风险等级。 ← Agent 不知道从哪里取数据,开始自由探索2. 执行对应操作。适用场景:凡是 Skill 依赖运行时状态(git 状态、文件是否存在、环境变量、API 返回值),都应在 Workflow 第一步明确收集,而不是依赖 Agent 自行发现。
设计一个 Skill 时,按顺序回答这些问题:
| 原则 | 正确做法 | 错误做法 |
|---|---|---|
| 单一职责 | 一个 Skill 做一件事 | 一个 Skill 包揽所有 |
| 清晰命名 | 从名字就知道做什么 | 模糊命名(do-stuff、cmd1) |
| 参数语义化 | 提示含义([commit message]) | 无意义提示([args]) |
| 权限最小化 | 只授权必需的工具/命令 | 授权所有权限 |
| 显式错误处理 | Workflow 中写明失败路径 | 只写正常流程 |
在 Workflow 中显式覆盖失败分支,不要只写正常路径:
## Steps1. 检查前置条件是否满足 - 不满足 → 告知用户原因并停止2. 检查是否有可操作的对象 - 没有 → 告知用户当前状态3. 条件满足,执行核心操作| 你需要记住的 | 核心要点 |
|---|---|
| 解决什么问题 | 能力边界——让 AI 从“会说”走向“会做” |
| 调用五步 | 识别 → 判断 → 匹配 → 执行 → 整合 |
| 内部三层 | 路由层(能不能找到)+ 控制层(怎么执行)+ 支撑层(靠什么做实) |
| 失效排查 | 按层查:触发不到?流程太浅?资源缺失?环境不支持? |
在企业级应用场景下,同一个任务往往需要在不同时间、由不同用户高频触发。如果系统行为依赖动态的上下文生成或临时的短提示词,系统输出将展现出极大的随机性。工程化系统要 求的是确定性和高可靠性,需要一种机制能够将资深专家的“隐性知识”转化为大模型可理解的“标准操作流程(SOP)”