1. 这个 Skill 解决什么具体问题

如果你写过 AI 代理(Agent),一定遇到过这些场景:

  • 同一个代码审查提示词,每次都要重写一遍
  • 想让代理执行“先查文档再写代码”的流程,但顺序总乱
  • 团队里不同项目用到相同的能力(如API封装、日志分析),但没有统一标准

Skill 就是解决方案:将一次性的 prompt 升级为可复用的能力模块,带有明确的触发条件、输入输出格式和上下文注入逻辑。就像把散装的螺丝刀、扳手整理成工具箱,需要哪个直接取用。

使用 Skill 后,你的代理不再是“你问我答”的聊天窗口,而是能根据任务自主调用能力的队友。每个 Skill 就是一个独立的任务处理器,你可以像拼乐高一样把它们组合成复杂工作流。

2. Skill 的触发条件和适用场景

触发条件通常有两种:

  • 显式触发:用户明确说“帮我对这段代码做代码审查” → 对应“代码审查” Skill
  • 隐式触发:系统检测到新提交了代码 → 自动触发“代码审查” Skill

适用场景很广,只要任务具有重复性、可标准化、输入输出格式明确的特点,就应该封装成 Skill。典型案例:

  • 代码审查 / 重构建议
  • API 接口文档生成
  • 日志异常检测与报告
  • 数据库迁移脚本生成
  • 依赖包版本检查与升级建议

什么时候不该用 Skill?当任务需要极高创造性、输入极度模糊、或一次性探索性任务时,直接对话更灵活。Skill 适合需要“稳定输出”的场景。

3. 完整 Skill 结构(SKILL.md 示例)

一个 Skill 通常以一个文件夹存在,核心是 SKILL.md 文件,里面定义了技能的所有元信息。下面是我推荐的最小化结构(也是 multica 项目采用的方式):

text
1 2 3 4 5 6 7
my-skill/
├── SKILL.md          # 技能定义:触发词、描述、输入输出
├── prompt.md          # 主要AI提示词(可选,也可以直接在SKILL.md里)
├── tools/             # 工具函数(如API调用、文件读写)
│   └── fetch.js
└── examples/          # 示例输入输出,用于测试
    └── input.json

SKILL.md 完整模板(可直接复制使用):

markdown
1 2 3 4 5 6 7 8 9 10 11 12 13
# Skill: Code Review Reviewer

## 描述
对提交的代码进行同行评审,输出结构化报告:覆盖率、代码规范、潜在bug、改进建议。

## 触发关键词
["review", "code review", "代码审查"]

## 输入格式
```yaml
diff: string          # git diff 内容, 或完整文件内容
language: string      # 编程语言 (如 python, javascript)
context: string       # 项目背景(可选)

输出格式

yaml
1 2 3 4 5 6 7 8
summary: string          # 整体评价
issues:                  # 问题列表
  - line: int
    severity: enum[low, medium, high]
    message: string
    suggestion: string
score: int               # 0-100 分
approved: boolean        # 是否允许合并

系统提示词 (system prompt)

你是一个精通 {{ language }} 的高级代码审查员。
严格按照输出格式返回 JSON,不要额外解释。

步骤

  1. 分析输入代码/ diff
  2. 检查语法、逻辑、安全、性能、可读性
  3. 按照输出格式生成报告

示例

json
1 2 3 4 5 6 7 8 9 10 11 12
// input
{
  "diff": "+function add(a,b) { return a+b }",
  "language": "javascript"
}
// output
{
  "summary": "简单函数,无问题",
  "issues": [],
  "score": 95,
  "approved": true
}
text
1 2 3 4 5 6 7 8 9 10 11 12 13

**为什么这样写有效?**
- 明确的输入输出格式:降低 AI 理解偏差,让输出可被下游程序直接消费
- 示例:few-shot 样例,减少 CoT 漂移
- 步骤:结构化思维链,引导 AI 按顺序处理,而不是跳步
- 触发关键词:避免无关对话唤醒 Skill

## 4. 实际案例演示:差 Prompt vs 好 Prompt

**差的 Prompt(直接聊天模式)**

```text
请帮我审查这段 Python 代码:def foo(): pass

效果:AI 可能随意输出一段文字,有时给JSON有时不给,格式不统一,无法自动化。

好的 Skill 封装

markdown
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
# SKILL.md 内容(使用上面的模板)

触发词: ["review", "review python"]
输入格式:
  code: string
  language: "python"
输出格式:
  issues: list[{ line, severity, message }]
  score: int
  approved: bool

系统提示词:
你是严格的 Python 代码审查专家。
严格按照 JSON 格式返回。

步骤:
1. 读取 code 字段
2. 识别所有函数/类定义
3. 检查 PEP8 规范
4. 检查安全漏洞(SQL注入、eval等)
5. 输出 JSON

调用后返回:

json
1 2 3 4 5 6 7
{
  "issues": [
    { "line": 1, "severity": "low", "message": "函数名 foo 不符合 snake_case", "suggestion": "改为 foo_bar" }
  ],
  "score": 85,
  "approved": false
}

对比差在哪?

  • 差 prompt 没有格式约束,你无法程序化处理返回结果
  • 好 Skill 定义了输入输出,并强制 JSON 输出,可以集成到 CI/CD 流程中
  • 好 Skill 加入了步骤和示例,AI 表现更稳定

5. 复用和组合技巧

技巧1:链式组合

前一个 Skill 的输出作为后一个 Skill 的输入。例如:

  • Skill A:从代码仓库提取变更文件列表 → 输出 JSON
  • Skill B:代码审查(输入 JSON 中的 diff 字段)→ 输出审查报告
  • Skill C:根据审查报告自动创建 GitHub Issue

技巧2:条件分支

根据 Skill 输出中的 approved 字段,决定是否触发下一个 Skill。例如:

  • 如果 approved: false,自动触发“代码修复建议” Skill
  • 如果 approved: true,触发“合并请求批准” Skill

技巧3:参数化 Skill

通过环境变量或配置注入不同上下文,让同一个 Skill 适配不同项目。例如:

  • context: "project A coding standards" vs context: "project B conventions"
  • 在 system prompt 里用 {{ context }} 占位符,运行时替换

实际代码片段(伪代码)

javascript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
// 组合调用示例
async function runWorkflow(agent, task) {
  const result1 = await agent.invokeSkill('list-changed-files', task.repo);
  const files = JSON.parse(result1.output);
  for (const file of files) {
    if (file.extension === '.py') {
      const review = await agent.invokeSkill('code-review-python', { 
        code: file.content,
        language: 'python'
      });
      if (!review.output.approved) {
        await agent.invokeSkill('create-github-issue', {
          repo: task.repo,
          title: `Review failed: ${file.filename}`,
          body: review.output.issues
        });
      }
    }
  }
}

扩展变体

  1. 日志分析 Skill:输入日志文本,输出按时间线整理的关键事件 + 异常级别
  2. SQL 生成 Skill:输入自然语言描述,输出 SQL 查询和 explain 分析
  3. Docker 合规 Skill:输入 Dockerfile,输出是否遵循 best practices 和优化建议

每个变体只需修改 SKILL.md 中的输入输出示例、system prompt 里的角色描述、以及步骤细节,核心结构完全复用。

写在最后

Skill 的本质是把 AI 从“临时工”变成“正式员工”——它知道自己的职责、怎么做、产出什么格式。别再每次手动写 prompt 了,从今天开始把你最常用的 3 个任务封装成 Skill,你的代理就会从“有点笨”变成“靠谱队友”。

如果你已经在用 multica 或类似平台,直接套用上面的模板;如果你是自己写代理框架,也可以按这个思路定义你的 Skill 文件。

developer coding agent with modular skill icons