Skills ディレクトリ構造

Skill のディレクトリ構造と動作メカニズムを理解することは、保守可能で再利用可能な AI Agent 能力を構築する基礎です。

この記事では、標準的な Skill のディレクトリ構造、各ファイルの役割、完全なワークフローをゼロから分解します。


Skill とは

Skill は、特定の種類のタスクを完了するための独立した能力ユニットです。

Agent をオペレーティングシステムに例えるなら、Skill はアプリケーションのようなものです。Agent をプロジェクトマネージャーに例えるなら、Skill は呼び出すことのできる専門能力です。

Skill の一般的なタイプ

以下は典型的な Skill の適用シナリオです:

タイプ説明適用シナリオ
PDF ドキュメント分析PDF の内容を抽出し、要約を生成するドキュメント処理、情報抽出
ウェブスクレイピングWeb ページのデータを自動的に取得するデータ収集、情報監視
SQL最適化SQL クエリを分析および最適化するデータベースパフォーマンスのチューニング
データ統計データ計算と統計処理データ分析、レポート生成
画像認識画像内のコンテンツを認識するOCR、画像分類

Skill と Agent の関係

Skill 自体はいつ使用するかを決定する責任はなく、実際に決定を担当するのは Agent です。

完全なワークフローは次のとおりです:

Skill 工作流程

重要なポイント:Agent はすべての Skill の完全な内容を一度に読み込みません。最初に各 Skill の説明情報を読み取り、ターゲットの Skill にヒットした後に完全な内容を読み込みます。この理由は、数百の Skill がある場合、毎回すべてを読み込むと Token を非常に浪費するからです。


Skill の標準ディレクトリ構造

完全な Skill は単一のファイルではなく、複数のファイルを含むディレクトリです。

以下は標準的な Skill の完全なディレクトリ構造です:

my-skill/
│
├── SKILL.md          ← 核心执行文件
├── metadata.json     ← 元信息
├── examples/         ← 示例目录
│   ├── example1.md
│   └── example2.md
│
├── scripts/          ← 可执行脚本
│   ├── main.py
│   └── utils.py
│
├── resources/        ← 资源目录
│   ├── prompt.md
│   └── config.yaml
│
├── tests/            ← 测试目录
│   ├── test_cases.md
│   └── eval.yaml
│
├── README.md         ← 使用说明
│
└── CHANGELOG.md      ← 变更日志

次に、各ファイルとディレクトリの役割を一つずつ分解します。


SKILL.md:コア実行ファイル

これは Skill の中で最も重要なファイルであり、Skill のすべての実行ロジックを定義します。

これには以下の重要な情報が含まれます:

部分説明役割
DescriptionSkill の機能説明Agent がマッチングに使用するため
When to use適用シナリオを明確にする誤発動を防ぐ
When NOT to use不適用シナリオを明確にする他の Skill との競合を防ぐ
Input入力形式を定義する呼び出し方法を標準化する
Instructions実行手順タスクの実行をガイドする
Output出力形式の説明結果の一貫性を保証する

以下は規範的な SKILL.md の例です:

例

# PDF 分析 Skill

## Description
PDF の内容を分析し、要約を生成するために使用します。

## When to use

適用対象:

- PDF の読み取り
- 要約の抽出
- コンテンツ分析

## When NOT to use

適用外:

- 画像編集
- 動画処理

## Input

PDF ファイル

## Instructions

1. テキストを抽出
2. 章構造を識別
3. 主要な内容を要約
4. 要点を出力

## Output

Markdown 形式の要約

よくある誤った書き方

多くの初心者はあまりにも簡略化された SKILL.md を書くことがあります。例えば:

推奨されない書き方

# PDF Skill

PDF を読み取る
内容を要約する
結果を返す

この書き方の問題は、いつ使用するかがわからない、いつ使用しないかがわからない、出力形式が不明確、他の Skill と競合しやすいことです。

合格な SKILL.md は、Agent がひと目で「この Skill が現在のタスクに適しているかどうか」を判断できるようにする必要があります。


metadata.json:Skill メタ情報

このファイルは、マシンが読み取り可能な構造化データを提供し、Agent が Skill をすばやく絞り込むのに役立ちます。

例

{
  "name": "pdf-analyzer",
  "version": "1.0.0",
"description": "PDF を分析し要約を生成する",
  "tags": ["pdf", "summary"],
  "category": "document"
}

一般的なフィールドの説明

フィールド役割重要度
nameSkill 名必須
description機能説明。Agent はこれに基づいてマッチングを行う最も重要
versionバージョン番号推奨
tagsタグ。検索を容易にする推奨
categoryカテゴリ任意
author作者任意
permissions必要な権限任意

この中でdescriptiondescription フィールドが最も重要であり、Agent は通常それに基づいてマッチングを行います。

マッチングプロセスはおおよそ次のとおりです:ユーザーがリクエストを出すと、Agent はすべての Skill の description をスキャンし、一致する説明を見つけた後に完全な Skill の内容を読み込んで実行します。


examples:サンプルディレクトリ

多くの開発者はこの部分を無視しますが、実際には非常に重要です。

ディレクトリ構造

examples/
├── example1.md
├── example2.md

サンプルファイルの内容

例

入力:

この PDF を分析してください

出力:

# ドキュメント要約

## コアコンテンツ

1. ...
2. ...
3. ...

examples の役割

役割説明
Few-shot の例を提供するモデルが例を通じて期待される動作を理解するのを助ける
出力形式を標準化する例を通じて出力構造とスタイルを明確にする
出力の安定性を向上させるランダムな振る舞いを減らし、結果をより予測可能にする

経験上、良い examples はプロンプトを増やすよりも効果的であることが多いです。


scripts:実行可能スクリプト

Skill は単なるプロンプトではなく、実際の作業を完了するために実際にコードを実行する必要がある場合があります。

スクリプトが必要となる一般的なシナリオには、PDF の読み取り、OCR の実行、データベースの呼び出し、データ処理、グラフ生成などがあります。

ディレクトリ構造

scripts/
├── main.py
└── utils.py

Python スクリプトの例

例

# ファイルパス:scripts/extract.py
# 機能:PDF ファイルからテキスト内容を抽出する

from pypdf import PdfReader

# PDF ファイルを開く
reader = PdfReader("demo.pdf")

# 抽出したテキストを保存する
text = ""

# 各ページをループしてテキストを抽出する
for page in reader.pages:
    text += page.extract_text()

# すべてのテキスト内容を出力する
print(text)

Skill のワークフローは:ファイルを読み込む → スクリプトを実行する → 結果を取得する、その後結果を大規模言語モデルに処理させる。


resources:リソースディレクトリ

補助コンテンツを保存し、設定とコードを分離するために使用します。

ディレクトリ構造

resources/
├── prompt.md
├── config.yaml

含まれる可能性のあるリソースタイプ

リソースタイプ説明例
プロンプトテンプレート再利用可能なプロンプトテンプレートprompt.md
設定ファイルパラメータと設定config.yaml
テキストテンプレートメール、レポートテンプレートtemplate.txt
画像リソースアイコン、図解logo.png
SQLテンプレート定義済みのクエリテンプレートquery.sql

設定ファイルの例

例

# ファイルパス:resources/config.yaml
# サマリー関連設定

max_length
: 1000    # サマリー最大長(文字数)
language
: zh        # 出力言語:zh=中国語, en=英語

設定を独立したファイルに置くことで、今後パラメータを変更する際にコードを変更する必要がなくなります。


tests:テストディレクトリ

成熟したプロジェクトには通常テストが含まれており、Skill の効果と安定性を検証します。

ディレクトリ構造

tests/
├── test_cases.md
└── eval.yaml

テストケースの例

例

テスト:

入力:

PDFを分析して

期待:

サマリーを出力する
重要なポイントを含む

テストの役割

役割説明
効果の検証Skill の出力が期待どおりであることを確認する
回帰テスト修正後に既存機能に影響がないことを検証する
自動評価自動化フローと組み合わせて一括テストする
A/B テスト異なるバージョンの出力品質を比較する

テストのない Skill は「一文を変更しただけで、既存機能が突然使えなくなる」という問題が発生しやすいです。


README:使用方法

README は開発者向けで、この Skill のインストール方法と使用方法を説明します。

例

# インストール

skills ディレクトリにコピーする

# 使用方法

PDFをアップロードする

# 出力形式

Markdown

これが解決する核心的な問題は:後で自分が書いた Skill の使い方が自分でもわからなくなることです。


完全な例:PDF 分析 Skill

以下では完全な例を使って上記のすべての概念を結びつけます。

ディレクトリ構造の概要

pdf-analyzer/
├── SKILL.md
├── metadata.json
├── examples/
│   └── summary.md
├── scripts/
│   └── extract.py
├── tests/
│   └── eval.md
└── README.md

完全な呼び出しフロー

用户:
上传 PDF 并总结

        ↓

Agent:
扫描所有 Skills

        ↓

发现:
description: 分析 PDF 并生成摘要

        ↓

命中 pdf-analyzer

        ↓

读取 SKILL.md

        ↓

调用 extract.py

        ↓

提取 PDF 内容

        ↓

生成摘要

        ↓

返回结果

なぜ Skill をディレクトリ構造にするのか

多くの人が疑問に思うでしょう:なぜ1つの prompt.txt ですべてを済ませないのか?

理由は、規模が大きくなると制御不能になるからです。

単一ファイル方式の問題

問題具体的な症状
保守が困難すべてのコンテンツが1つのファイルに詰め込まれ、修正が困難
テストが不可能テストケースがないため、修正後も正常かどうかわからない
再利用が不可能すべての Skill をゼロから書く必要がある
バージョン管理が不可能変更履歴の追跡が難しい
複数人での協業が不可能1つのファイルを複数人が変更すると競合が発生しやすい

ディレクトリ化方式の利点

利点実現方法
保守が容易各ファイルの役割が明確で、修正箇所を素早く特定できる
再利用が可能スクリプトと設定は Skill 間で共有できる
テストが可能独立したテストディレクトリで、自動化検証をサポート
拡張が可能新機能の追加はファイルを追加するだけでよい
公開が可能ディレクトリをパッケージ化するだけで配布できる

まとめ

Skill は本質的にプロンプトではなく、完全なソフトウェア能力パッケージです。

コアファイルの関係

SKILL.md
    ↓
定义行为

metadata.json
    ↓
定义信息

examples/
    ↓
定义示例

scripts/
    ↓
定义能力

tests/
    ↓
定义质量

README
    ↓
定义使用方式

プロンプトは一度の問題を解決するだけですが、Skill は能力を資産として蓄積します。

その他の拡張