Skills 技能系统¶
本文你会学到:
- 🧩 Skills 解决什么问题,和自定义指令有什么区别
- ⚡ Skills 的自动触发机制
- 🛠️ 如何创建和管理 Skill
- 💼 实战示例:代码审查 Skill、文档生成 Skill
打个比方:如果自定义指令是给 Copilot 的入职手册(始终生效的规则),那 Skill 就像是岗位操作指南——只有当 Copilot 被安排做特定工作时才拿出来参考。比如"生成测试"时参考测试指南,"写文档"时参考文档指南。
⚖️ Skills 与指令的区别¶
一句话判断
自定义指令:几乎每次对话都需要的规则(如编码规范、项目结构)Skills:只在相关任务出现时才需要的详细工作流(如"生成 Playwright 测试")
为什么两者都需要?因为指令文件会始终占用上下文窗口——如果你把所有操作指南都塞进指令文件,上下文窗口会被挤满,Copilot 的响应质量反而下降。Skill 只在需要时加载,更节省上下文空间。
🎯 自动触发机制¶
Skill 的核心特性是自动触发——你不需要手动激活它,Copilot 会根据你的 prompt 自动判断是否加载。判断依据是 Skill 的 description 字段。
description 是关键
Skill 是否被触发完全取决于 description 字段的描述质量。写清楚 Skill 的功能和适用场景,能显著提高自动匹配的准确性。
匹配原理¶
自动触发基于**关键词语义匹配**:Copilot 将用户 prompt 与所有 Skill 的 description 进行比对,找出语义最相关的 Skill 加载到上下文中。匹配过程是异步的,不会显著增加响应延迟。
手动调用 vs 自动触发¶
| 场景 | 推荐方式 | 说明 |
|---|---|---|
| prompt 中包含明确的任务关键词(如"生成测试""代码审查") | 自动触发 | description 中包含对应关键词即可 |
| prompt 意图模糊但你想使用特定 Skill | 手动调用 /skill-name |
通过斜杠语法显式指定 |
| Skill 内容超大超过 token 限制 | 手动调用 | 不参与自动触发,但仍可显式调用 |
| 同一 prompt 可能匹配多个 Skill | 自动触发 | Copilot 选择最相关的一个;也可手动叠加 |
description 避免过于宽泛
如果 description 写成"帮助开发者提高代码质量",几乎所有 prompt 都会匹配,导致不相关的 Skill 被频繁加载,浪费上下文空间。应明确限定适用场景,如"审查 Python 代码的类型安全性和错误处理"。
🛠️ 创建 Skill¶
目录结构¶
每个 Skill 拥有独立目录,目录名使用小写字母加连字符:
SKILL.md 格式¶
由 YAML Frontmatter 和 Markdown 正文两部分组成:
Frontmatter 字段¶
| 字段 | 必需 | 说明 |
|---|---|---|
name |
✅ | 唯一标识符,小写字母加连字符,通常与目录名一致 |
description |
✅ | 描述功能和适用场景,用于自动匹配 |
license |
❌ | 许可证说明 |
📂 Skills 存放位置¶
团队共享,提交到 Git:
.github/skills/.claude/skills/(兼容 Claude Code).agents/skills/
仅本机可用:
~/.copilot/skills/~/.claude/skills/(兼容 Claude Code)~/.agents/skills/(1.0.11 新增)
内置 Skills
Copilot CLI 内置部分 Skills(如 Copilot Cloud Agent 环境定制指南),无需手动安装即可使用(1.0.17 新增)。使用 /skills list 可查看所有可用 Skills(含内置和自定义)。
Copilot CLI 不加载 ~/.claude/ 目录(1.0.36)
从 1.0.36 起,~/.claude/skills/ 目录中的 Skills 不再被 Copilot CLI 加载。如果你之前将个人 Skill 放在了 ~/.claude/skills/,需要迁移到 ~/.copilot/skills/ 或 ~/.agents/skills/。
🎮 使用 Skill¶
自动触发¶
大多数情况下,只需要正常写 prompt,Copilot 会自动判断是否需要加载某个 Skill:
Skill 指令(SKILL.md 正文)在对话的多个轮次间持久保留(1.0.25 修复)。此前存在一个 bug:Skill 在首轮加载后,后续轮次中指令内容会丢失,导致 Copilot 在长对话中忘记 Skill 的约束。
通过 -i(--interactive)启动时,Skill 斜杠命令(如 /skill-name)现在能在启动时正确识别(1.0.35 修复),此前在非交互模式启动后再切换到交互模式时,Skill 命令可能无法被发现。
显式调用¶
也可以通过 /skill-name 语法显式调用:
🔧 Skill 管理命令¶
| 命令 | 功能 |
|---|---|
/skills list |
列出当前可用的所有技能 |
/skills info <name> |
查看某个技能的详细信息 |
/skills add <path> |
添加一个额外的技能搜索路径 |
/skills reload <name> |
重新加载技能(修改后无需重启 CLI) |
/skills remove <dir> |
移除技能目录 |
超大 Skill 也可调用
如果某个 Skill 的内容超过了 token 限制,它仍然会出现在 /skills list 中并可以通过名称显式调用(1.0.32 改进),只是不参与自动触发。这避免了大型 Skill 因体积问题被完全屏蔽。
禁用的 Skill 不再显示
被禁用的 Skill 不再出现在斜杠命令列表中(1.0.36 改进),减少了列表中的噪音。如需重新使用,先通过 /skills list 确认状态再启用。
ACP 客户端中的 Skill 斜杠命令(1.0.40 新增)
Skills 现在在 ACP 客户端(如 VS Code 中的 Copilot)中也可用作斜杠命令,与 CLI 中的使用体验保持一致。这意味着你在 VS Code 中也能通过 /skill-name 的方式显式调用项目定义的 Skill。
💼 实战示例¶
创建代码审查 Skill¶
创建文档生成 Skill¶
| .github/skills/doc-generator/SKILL.md | |
|---|---|
🔗 在 Agent 中预加载 Skills¶
Agent 可以通过 frontmatter 中的 skills 字段**预加载**指定的 Skills 到上下文。这意味着当该 Agent 被激活时,列出的 Skills 会自动注入,无需依赖 prompt 匹配。
| .github/agents/code-reviewer.agent.md | |
|---|---|
适用场景¶
| 场景 | 说明 |
|---|---|
| Agent 职责与特定 Skill 强绑定 | 如安全审计 Agent 必须加载安全检查 Skill |
| 确保 Agent 始终遵循特定工作流 | 不依赖 prompt 匹配的不确定性 |
| 组合多个互补 Skill | 一个 Agent 可以预加载多个 Skill 形成完整工具链 |
与自动触发不冲突
skills 字段是**预加载**机制,与基于 description 的自动触发并行工作。即使 Agent 没有在 skills 中列出某个 Skill,该 Skill 仍然可以通过 prompt 匹配被自动触发。
⚖️ Skills vs Agent vs 指令 vs MCP¶
| 维度 | Skills | Agent | Instructions | MCP |
|---|---|---|---|---|
核心功能 |
任务增强工作流 | 专业角色扮演 | 全局规则 | 外部数据源 |
激活方式 |
自动(prompt 匹配) | 手动(/agent) |
始终生效 | 自动(需要时调用) |
定义方式 |
SKILL.md + 资源文件 |
.agent.md |
.instructions.md |
JSON 配置 |
包含资源 |
✅ 示例、模板、配置 | ❌ 仅 Markdown | ❌ 仅 Markdown | ✅ 外部工具 |
典型用例 |
测试生成、代码审查 | 安全专家、DBA | 编码规范 | GitHub API、数据库 |