在当下的AI编程助手(如 Claude Code、Cursor)工作流中,开发者常需要向模型提供明确的规则和上下文,即所谓的 RULES。这些规则通常定义了项目的技术栈、编码规范、异常处理原则等,以确保AI生成的代码符合项目要求。
然而,规则的长短带来了两难困境:
- 如果规则过于简略,其覆盖的范围有限,难以应对复杂的项目需求。
- 如果规则过于冗长,每次与AI交互时都需要将其完整载入上下文,这不仅消耗宝贵的Token,还可能因上下文过长而增加模型的“幻觉”风险,降低输出准确性。
因此,一种模块化、“懒加载”规则的诉求变得十分迫切。而 SKILLS 正是为解决这一痛点而生的机制。
SKILLS 的核心:元数据与内容的分离
SKILLS 的核心思想在于“按需加载”。要实现这一点,其结构通常分为两个部分:
- 元数据 (Metadata):用于向大模型描述技能的“身份”和“能力”,即“我是谁、我能做什么、何时该调用我”。
- 内容 (Content):具体的指导性内容,即告诉大模型“具体该如何做”。
一个典型的 SKILL.md 文件结构如下所示:
---
name: API设计规范
description: 适用于当前代码库的 RESTful API 设计模式
---
在编写 API 接口(端点)时:
- 遵循 RESTful 命名规范
- 返回统一的错误格式
- 包含请求参数校验
文件头部由 --- 包裹的部分就是元数据,它定义了技能的 name(名称)和 description(描述)。下方的列表部分则是该技能的具体内容。
在工作流程开始时,AI通常只加载所有可用技能的元数据部分。只有当用户的指令与某个技能的描述高度匹配时,该技能的内容部分才会被动态加载到上下文中。这种方式极大地节约了Token消耗,并提升了模型响应的精准度。
技能文件的存放位置
目前,主流的AI编程工具对 SKILLS 的存放路径有自己的约定。以下是几种常见工具的目录结构:
Claude Code
技能应放置在项目根目录的 .claude/skills/ 下。
ProjectRoot/
└── .claude/
└── skills/
├── skill-a/ # 技能名称文件夹
│ ├── SKILL.md # 核心定义 (SOP & Prompts)
│ └── scripts/ # (可选) 对应的 Python/Node 脚本
└── skill-b/
└── SKILL.md
Claude Code 启动时会自动扫描此目录,并根据用户提示词和 SKILL.md 中的描述自动选择挂载合适的技能。
OpenCode
通常支持多种路径:
- 项目配置:
.opencode/skills/<name>/SKILL.md
- 全局配置:
~/.config/opencode/skills/<name>/SKILL.md
- 兼容Claude的项目路径:
.claude/skills/<name>/SKILL.md
- 兼容Claude的全局路径:
~/.claude/skills/<name>/SKILL.md
Cursor
技能通常存放在 .cursor/skills/ 目录下,结构可能更丰富:
.cursor/
└── skills/
└── deploy-app/
├── SKILL.md
├── scripts/
│ ├── deploy.sh
│ └── validate.py
├── references/
│ └── REFERENCE.md
└── assets/
└── config-template.json
Trae
路径通常为 .trae/skills/,结构相对简洁:
.trae/skills/
├──skill-name/
├── SKILL.md
├── scripts
└── references
虽然目前各家标准尚未完全统一,但将 SKILLS 理解为一种模块化的 RULES,有助于我们理解其设计初衷。
SKILLS 与 MCP:能力与规则的黄金组合
一个常见的误解是有了 SKILLS 就不再需要 MCP (Model Context Protocol)。事实恰恰相反,二者是互补的“黄金搭档”,可以理解为 底层能力 与 上层应用规则 的关系。
用一个比喻来理解:
- MCP 像是员工的“手”和“感官”。它定义了AI可以调用哪些外部工具和能力(如执行Shell命令、查询数据库、调用API),解决了“如何连接和操作”的问题。
- SKILLS 像是员工的“职业培训手册”或标准作业程序(SOP)。它定义了在特定场景下,AI应该按照什么逻辑、什么规范去思考和行动,解决了“如何思考和决策”的问题。
因此,SKILLS 是建立在 MCP 等基础能力之上的、模块化的业务规则和最佳实践。
软硬一体:当规则遇见轻量脚本
SKILLS 的威力不仅在于模块化的文本规则。一个更完整的定义揭示,它是“软硬一体”的解决方案。一个技能包可以包含其私有的、轻量级的本地脚本。
完整的公式可以定义为:
Skill = 🧠 业务规则 (SOP) + 🛠️ 专用脚本 (Local Scripts)
其中,SKILL.md 是指导行动的“大脑”,而 /scripts/ 目录下的 Python 或 Node.js 脚本则是随时可调用的“随身工具包”。
那么,在已有功能强大的 MCP 工具的情况下,为何还需要技能自带脚本?主要有以下三个原因:
1. 降低依赖,实现自包含 (Self-Contained)
如果某个技能仅需完成简单的文本格式化或数据清洗,为此专门启动一个 MCP 服务器显得过于繁重。将一个几十行的 Python 脚本直接放在技能目录中,随取随用,体现了“技能包”的便携性和独立性。
2. 封装胶水逻辑 (Glue Logic)
MCP 通常提供原子化的能力(如 get_file_list, analyze_file)。一个技能脚本可以编写逻辑,循环调用这些原子能力,进行过滤、转换和聚合,最终输出一个复杂任务的结果(如统计报表)。这样做的一个关键优势是,将“循环与判断”的计算逻辑从LLM(成本高、速度慢)转移到了本地CPU(成本低、速度快)。
3. 高效的本地文件操作
由于 Claude Code 等工具在本地运行,技能脚本可以通过 bash 或 Python 直接、高效地访问项目文件系统,这比通过 MCP Server 进行网络传输和远程操作要直接和快速得多。
总而言之,SKILLS 机制通过将庞大的、固定的规则手册拆分为可动态加载的、专注特定领域的技能模块,并结合轻量级脚本提供即时的执行力,显著优化了AI编程助手的上下文利用效率和任务执行精准度。它并非替代 MCP,而是在其提供的通用能力之上,构建了一层灵活、可组合的业务逻辑层。
参考资料
[1] 秒懂SKILLS: 模块化的RULES + 轻量化脚本, 微信公众号:mp.weixin.qq.com/s/cJG5iOuOTQulpZb8qDcnNA
版权声明:本文由 云栈社区 整理发布,版权归原作者所有。