次の方法で共有


エージェント のスキル

エージェント スキル は、エージェントに特化した機能とドメインの専門知識を提供する、命令、スクリプト、リソースの移植可能なパッケージです。 スキルはオープン仕様に従い、段階的な開示パターンを実装して、エージェントが必要なときに必要なコンテキストのみを読み込みます。

次の状況では、エージェント スキルを使用します。

  • パッケージ ドメインの専門知識 - 再利用可能なポータブル パッケージとして、専門的な知識 (経費ポリシー、法的ワークフロー、データ分析パイプライン) をキャプチャします。
  • エージェントの機能を拡張する - エージェントのコア命令を変更することなく、新しい機能をエージェントに提供します。
  • 一貫性を確保 する - 複数ステップのタスクを、反復可能で監査可能なワークフローに変換します。
  • 相互運用性を有効にする - 異なるエージェント スキル互換製品間で同じスキルを再利用します。

スキルの構造

スキルは、 ファイルや、リソースのためのオプションのサブディレクトリを含むディレクトリです。

expense-report/
├── SKILL.md                          # Required — frontmatter + instructions
├── scripts/
│   └── validate.py                   # Executable code agents can run
├── references/
│   └── POLICY_FAQ.md                 # Reference documents loaded on demand
└── assets/
    └── expense-report-template.md    # Templates and static resources

SKILL.md 形式

ファイルには、YAML frontmatter とそれに続くマークダウン コンテンツが含まれている必要があります。

---
name: expense-report
description: File and validate employee expense reports according to company policy. Use when asked about expense submissions, reimbursement rules, or spending limits.
license: Apache-2.0
compatibility: Requires python3
metadata:
  author: contoso-finance
  version: "2.1"
---
Field 必須 [説明]
name イエス 最大 64 文字。 小文字、数字、ハイフンのみ。 先頭または末尾にハイフンを使用したり、連続するハイフンを含めたりすることはできません。 親ディレクトリ名と一致する必要があります。
description イエス スキルが実行する内容と、それを使用するタイミング。 最大 1024 文字。 エージェントが関連するタスクを識別するのに役立つキーワードを含める必要があります。
license いいえ バンドルされたライセンス ファイルへのライセンス名または参照。
compatibility いいえ 最大 500 文字。 環境要件 (目的の製品、システム パッケージ、ネットワーク アクセスなど) を示します。
metadata いいえ 追加のメタデータに対するキーと値の任意のマッピング。
allowed-tools いいえ スキルが使用する可能性がある、事前に承認されたツールのスペースで区切られた一覧。 試験段階 — サポートは、エージェントの実装によって異なる場合があります。

フロントマッターの後のマークダウン本文には、スキル命令 (ステップ バイ ステップ ガイダンス、入力と出力の例、一般的なエッジ ケース、エージェントがタスクを実行するのに役立つコンテンツ) が含まれています。 500 行以下にし、詳細な参照マテリアルを別のファイルに移動します。

段階的な開示

エージェント スキルは、コンテキストの使用を最小限に抑えるために、3 段階のプログレッシブ開示パターンを使用します。

  1. アドバタイズ (スキルあたり最大 100 トークン) — スキル名と説明は、各実行の開始時にシステム プロンプトに挿入されるため、エージェントは使用可能なスキルを認識します。
  2. 読み込み ( 5,000 トークンを推奨) — タスクがスキルのドメインと一致すると、エージェントは ツールを呼び出して、詳細な手順で完全な SKILL.md 本文を取得します。
  3. リソースの読み取り (必要に応じて) — エージェントは ツールを呼び出して、必要な場合にのみ補助ファイル (参照、テンプレート、資産) をフェッチします。

必要に応じてドメインの深い知識にアクセスできるようにしつつ、このパターンはエージェントのコンテキスト ウィンドウを簡素に保ちます。

エージェントにスキルを提供する

Agent Framework には、ファイルシステム ディレクトリからスキルを検出し、それらをコンテキスト プロバイダーとしてエージェントが使用できるようにするスキル プロバイダーが含まれています。 構成されたパス (最大 2 レベルまで) で ファイルを再帰的に検索し、その形式とリソースを検証し、 と の 2 つのツールをエージェントに公開します。

スクリプトの実行はまだサポートされておらず、今後のリリースで追加される予定です。

基本的なセットアップ

スキルを含むディレクトリを指す を作成し、エージェントのコンテキスト プロバイダーに追加します。

using Azure.AI.OpenAI;
using Azure.Identity;
using Microsoft.Agents.AI;

// Discover skills from the 'skills' directory
var skillsProvider = new FileAgentSkillsProvider(
    skillPath: Path.Combine(AppContext.BaseDirectory, "skills"));

// Create an agent with the skills provider
AIAgent agent = new AzureOpenAIClient(
    new Uri(endpoint), new DefaultAzureCredential())
    .GetResponsesClient(deploymentName)
    .AsAIAgent(new ChatClientAgentOptions
    {
        Name = "SkillsAgent",
        ChatOptions = new()
        {
            Instructions = "You are a helpful assistant.",
        },
        AIContextProviders = [skillsProvider],
    });

エージェントの呼び出し

構成が完了すると、エージェントは使用可能なスキルを自動的に検出し、タスクが一致したときにそれらを使用します。

// The agent loads the expense-report skill and reads the FAQ resource
AgentResponse response = await agent.RunAsync(
    "Are tips reimbursable? I left a 25% tip on a taxi ride.");
Console.WriteLine(response.Text);

基本的なセットアップ

スキルを含むディレクトリを指す を作成し、エージェントのコンテキスト プロバイダーに追加します。

from pathlib import Path
from agent_framework import SkillsProvider
from agent_framework.azure import AzureOpenAIChatClient
from azure.identity.aio import AzureCliCredential

# Discover skills from the 'skills' directory
skills_provider = SkillsProvider(
    skill_paths=Path(__file__).parent / "skills"
)

# Create an agent with the skills provider
agent = AzureOpenAIChatClient(credential=AzureCliCredential()).as_agent(
    name="SkillsAgent",
    instructions="You are a helpful assistant.",
    context_providers=[skills_provider],
)

エージェントの呼び出し

構成が完了すると、エージェントは使用可能なスキルを自動的に検出し、タスクが一致したときにそれらを使用します。

# The agent loads the expense-report skill and reads the FAQ resource
response = await agent.run(
    "Are tips reimbursable? I left a 25% tip on a taxi ride."
)
print(response.text)

複数のスキル ディレクトリ

パスの一覧を渡すことで、複数のディレクトリを検索できます。

var skillsProvider = new FileAgentSkillsProvider(
    skillPaths: [
        Path.Combine(AppContext.BaseDirectory, "company-skills"),
        Path.Combine(AppContext.BaseDirectory, "team-skills"),
    ]);
skills_provider = SkillsProvider(
    skill_paths=[
        Path(__file__).parent / "company-skills",
        Path(__file__).parent / "team-skills",
    ]
)

各パスは、個々のスキル フォルダー ( を含む) またはスキル サブディレクトリを持つ親フォルダーを指すことができます。 プロバイダーは、最大 2 つのレベルの深さまで検索します。

カスタム システム プロンプト

既定では、スキル プロバイダーは、使用可能なスキルを一覧表示するシステム プロンプトを挿入し、 と を使用するようにエージェントに指示します。 このプロンプトは、次のようにカスタマイズできます。

var skillsProvider = new FileAgentSkillsProvider(
    skillPath: Path.Combine(AppContext.BaseDirectory, "skills"),
    options: new FileAgentSkillsProviderOptions
    {
        SkillsInstructionPrompt = """
            You have skills available. Here they are:
            {0}
            Use the `load_skill` function to get skill instructions.
            Use the `read_skill_resource` function to read skill files.
            """
    });

カスタム テンプレートには、スキル リストが挿入される プレースホルダーが含まれている必要があります。 リテラルの中括弧はおよびとしてエスケープする必要があります。

skills_provider = SkillsProvider(
    skill_paths=Path(__file__).parent / "skills",
    instruction_template=(
        "You have skills available. Here they are:\n{skills}\n"
        "Use the `load_skill` function to get skill instructions.\n"
        "Use the `read_skill_resource` function to read skill files."
    ),
)

カスタム テンプレートには、スキル リストが挿入される プレースホルダーが含まれている必要があります。

コード定義スキル

SKILL.md ファイルから検出されたファイル ベースのスキルに加えて、Python コードでスキルを完全に定義できます。 コード定義スキルは、次の場合に役立ちます。

  • スキル コンテンツは動的に生成されます (データベースや環境からの読み取りなど)。
  • スキル定義は、それらを使用するアプリケーション コードと共に保持する必要があります。
  • 静的ファイルを提供するのではなく、読み取り時にロジックを実行するリソースが必要です。

基本的なコード スキル

名前、説明、および命令の内容を含む インスタンスを作成します。 必要に応じて、静的コンテンツ インスタンスをアタッチします。

from textwrap import dedent
from agent_framework import Skill, SkillResource, SkillsProvider

code_style_skill = Skill(
    name="code-style",
    description="Coding style guidelines and conventions for the team",
    content=dedent("""\
        Use this skill when answering questions about coding style,
        conventions, or best practices for the team.
    """),
    resources=[
        SkillResource(
            name="style-guide",
            content=dedent("""\
                # Team Coding Style Guide
                - Use 4-space indentation (no tabs)
                - Maximum line length: 120 characters
                - Use type annotations on all public functions
            """),
        ),
    ],
)

skills_provider = SkillsProvider(skills=[code_style_skill])

動的リソース

デコレーターを使用して、関数をリソースとして登録します。 この関数は、エージェントがリソースを読み取るたびに呼び出されるため、最新のデータを返すことができます。 同期関数と非同期関数の両方がサポートされています。

import os
from agent_framework import Skill

project_info_skill = Skill(
    name="project-info",
    description="Project status and configuration information",
    content="Use this skill for questions about the current project.",
)

@project_info_skill.resource
def environment() -> str:
    """Get current environment configuration."""
    env = os.environ.get("APP_ENV", "development")
    region = os.environ.get("APP_REGION", "us-east-1")
    return f"Environment: {env}, Region: {region}"

@project_info_skill.resource(name="team-roster", description="Current team members")
def get_team_roster() -> str:
    """Return the team roster."""
    return "Alice Chen (Tech Lead), Bob Smith (Backend Engineer)"

引数 () なしでデコレーターを使用すると、関数名がリソース名になり、docstring が説明になります。 を使用して明示的に設定します。

ファイル ベースのスキルとコード定義スキルの組み合わせ

両方のを1つのインスタンスに渡します。 ファイルベースのスキルが最初に検出されます。コード定義スキルが既存のファイルベースのスキルと同じ名前を持つ場合、コード定義スキルはスキップされます。

from pathlib import Path
from agent_framework import Skill, SkillsProvider

my_skill = Skill(
    name="my-code-skill",
    description="A code-defined skill",
    content="Instructions for the skill.",
)

skills_provider = SkillsProvider(
    skill_paths=Path(__file__).parent / "skills",
    skills=[my_skill],
)

セキュリティのベスト プラクティス

エージェント スキルは、プロジェクトに取り込むサードパーティのコードと同様に扱う必要があります。 スキル命令はエージェントのコンテキストに挿入され、スキルにはスクリプトを含めることができるため、オープンソースの依存関係に対して行うのと同じレベルのレビューとガバナンスを適用することが不可欠です。

  • 使用前に確認 する — デプロイする前にすべてのスキル コンテンツ (、スクリプト、リソース) を読み取ります。 スクリプトの実際の動作が、指定された意図と一致することを確認します。 安全性ガイドラインのバイパス、データの流出、またはエージェント構成ファイルの変更を試みる敵対的な指示を確認します。
  • ソース信頼 - 信頼できる作成者または審査済みの内部共同作成者からのスキルのみをインストールします。 明確な由来、バージョン管理、アクティブなメンテナンスを備えたスキルやツールを優先します。 人気のあるパッケージを模倣する入力ミスのスキル名を警戒してください。
  • サンドボックス - 分離された環境で実行可能スクリプトを含むスキルを実行します。 ファイルシステム、ネットワーク、システム レベルのアクセスを、スキルに必要なもののみに制限します。 機密性の高い操作を実行する前に、明示的なユーザー確認が必要です。
  • 監査とログ 記録 - 読み込まれるスキル、読み取られるリソース、実行されるスクリプトを記録します。 これにより、問題が発生した場合にエージェントの動作を特定のスキル コンテンツに戻す監査証跡が提供されます。

スキルとワークフローを使用するタイミング

エージェント スキルと エージェント フレームワーク ワークフロー はどちらもエージェントが実行できる機能を拡張しますが、基本的に異なる方法で動作します。 要件に最も適したアプローチを選択します。

  • 制御 — スキルを使用して、AI が命令の実行方法を決定します。 これは、エージェントをクリエイティブまたはアダプティブにする場合に最適です。 ワークフローでは、実行パスを明示的に定義します。 確定的で予測可能な動作が必要な場合は、ワークフローを使用します。
  • 回復性 - 1 つのエージェント ターン内でスキルが実行されます。 何かが失敗した場合は、操作全体を再試行する必要があります。 ワークフローは チェックポイント処理をサポートしているため、失敗後に最後に成功した手順から再開できます。 プロセス全体の再実行コストが高い場合は、ワークフローを選択します。
  • 副作用 - スキルは、操作がべき等または低リスクである場合に適しています。 再試行時に繰り返してはならない副作用 (電子メールの送信、支払いの請求) がステップによって発生する場合は、ワークフローを優先します。
  • 複雑さ — スキルは、1 つのエージェントが処理できる集中型の単一ドメイン タスクに最適です。 ワークフローは、複数のエージェント、人間の承認、または外部システム統合を調整する複数ステップのビジネス プロセスに適しています。

ヒント

経験則として、AI にタスクの実行 方法 を把握させる場合は、スキルを使用します。 実行するステップと順序を保証する必要がある場合は、ワークフローを使用します。

次のステップ

コンテキスト プロバイダー

  • エージェント スキルの仕様
  • コンテキスト プロバイダー
  • ツールの概要