クイック スタート: ホストされるエージェントを最適化する

このクイック スタートでは、最適化サンプル エージェントをデプロイし、エージェント オプティマイザーを実行して手順を改善し、候補をデプロイします。

各手順の背後にある概念と完全なエンド ツー エンド パスについては、 最適化ワークフローを参照してください。

Prerequisites

開始する前に、次のものが必要です。

  • azd CLI (Azure Developer CLI)。

  • 認証用のAzure CLI。

  • azd の microsoft.foundry 拡張機能 ( azure.ai.agents 依存関係の 0.1.40-preview 以降):

    azd ext install microsoft.foundry
    

    既にインストールされている場合は、アップグレードします。

    azd ext upgrade microsoft.foundry
    
  • 認証用のAzure CLI。

  • Python 3.10 以降。

  • このパスで使用されるPython パッケージ:

    pip install "azure-ai-projects>=2.5.0" azure-ai-agentserver-optimization azure-identity python-dotenv
    
  • 最適化に使用するホステッド エージェント、登録済みデータセット、エバリュエーターが既に含まれている既存の Foundry プロジェクト。

  • 認証用のAzure CLI。

  • .NET 10 SDK 以降

  • このパスで使用される.NET パッケージ。

    dotnet add package Azure.AI.Projects --prerelease
    dotnet add package Azure.Identity
    
  • 最適化に使用するホステッド エージェント、登録済みデータセット、エバリュエーターが既に含まれている既存の Foundry プロジェクト。

Tip

Foundry Toolkit がない場合は、Visual Studio Code Marketplace からインストールします。 Foundry Toolkit は、Foundry リソース、モデル カタログ、ホスト型エージェントのデプロイとプレイグラウンド、エージェントの最適化をVisual Studio Codeに取り込みます。 メッセージが表示されたらVisual Studio Code再読み込みし、Azureにサインインします。 拡張機能の概要については、「Visual Studio Code 用 Microsoft Foundry Toolkit 拡張機能を使用する」を参照してください。

  • Microsoft Foundry Skill がインストールされているコーディング エージェント ホスト。

  • Azure CLIおよび Azure Developer CLI (AZD) がインストールされ、認証されました。

    az login
    azd auth login
    
  • AZD の microsoft.foundry 拡張機能。 ワークフローを開始する前にインストールします。

    azd ext install microsoft.foundry
    

    既にインストールされている場合は、アップグレードします。

    azd ext upgrade microsoft.foundry
    
  • Azure サブスクリプションは、エージェント オプティマイザーの許可リストに含まれている必要があります。 アクセス権を要求するには、Microsoft担当者にお問い合わせください。

手順 1: プロジェクトを作成する

最適化サンプル テンプレートから新しいプロジェクトを初期化します。

mkdir my-agent && cd my-agent
azd ai agent init -m https://github.com/microsoft-foundry/foundry-samples/blob/main/samples/python/hosted-agents/bring-your-own/responses/optimization-customer-support/azure.yaml .

このテンプレートは、最適化カスタマー サポート サンプルをインポートします。これは、独自のアプローチと応答プロトコルを使用する、最適化対応のPythonホストされたエージェントです。 これは、注文の問い合わせ、返品、保証請求、トラブルシューティング、苦情、推奨事項、エスカレーションを処理するコンシューマー エレクトロニクス サポート エージェントを表します。 意図的に最小限のベースライン命令を使用すると、命令の最適化とスキル検出の改善を簡単に比較できます。

このサンプルでは、ベースラインまたは候補の構成を読み込む load_config() が呼び出され、 .agent_configs/baseline/、 eval.yaml、完全かつ迅速な評価データセット、コンテナー構成、Foundry 配置マニフェストが含まれます。 対話型フローでは、これらのファイルがインポートされ、Azure サブスクリプション、リージョン、モデルのデプロイ設定が求められます。

Tip

既存のエージェント プロジェクトが既にある場合は、「最適化のサポートを追加するための エージェント オプティマイザーの準備を整 える」を参照してください。

Foundry プロジェクトが既にある場合は、 -p <project-resource-id> を追加して既存のリソースをターゲットにします。

azd ai agent initを実行したり、azure.yamlファイルと.azureファイルを作成したりせずに、既にデプロイされているエージェントを最適化するには、このプロジェクト作成手順をスキップし、AZD プロジェクト ファイルを使用せずに既存のエージェントを最適化します。

手順 2: プロビジョニングとデプロイ

Azure リソースを認証してプロビジョニングします。

az login
azd auth login
azd provision

プロビジョニングには約 2 分かかり、Foundry アカウント、プロジェクト、Azure Container Registry、モデルのデプロイが作成されます。

エージェントをデプロイします。

azd deploy

デプロイをテストします。

azd ai agent invoke "What is 2+2?"

手順 3: 評価スイートを生成して最適化する

エージェントの評価データセットとエバリュエーターを生成します。

azd ai agent eval generate

この手順では、エージェントの指示に基づいて、 eval.yaml、テスト データセット、スコア付けエバリュエーターを作成します。 オプティマイザーは、これらのファイルを使用して改善を測定します。

オプティマイザーを実行します。

azd ai agent optimize --max-candidates 2

CLI によって、最適化モデルの選択が求められます。 プロンプトをスキップするには、直接渡します。

azd ai agent optimize --max-candidates 2 --optimize-model gpt-5

CLI は、 azure.yaml からエージェントを検出し、生成された eval.yaml を自動的に使用します。 2 つの候補がある場合、通常、最適化は約 8 分で完了します。 リアルタイムの進行状況が表示されます。

Optimizing agent "customer-support-py"...
  Config: eval.yaml
  Baseline saved to .agent_configs/baseline/metadata.yaml
  Job ID: opt_162bd0f09....
  Status: pending
  Portal: <OPTIMIZATION-JOB-URL>

ポータル URL を使用して、Foundry ポータルでジョブを監視します。

評価モデルは、各応答にスコアを付けます (チャット完了モデルが機能します)。 最適化モデル (--optimize-model) は、改善された候補を生成し、サポートされている一覧 (gpt-5 ファミリまたは DeepSeek) から取得する必要があります。 optimization_modelのoptions:の下にeval.yamlを設定して、毎回フラグを渡さないようにすることもできます。

手順 4: 勝者をデプロイする

出力の星 (*) は、最適な候補を示します。 最適化された構成をローカルに適用し、デプロイします。

azd ai agent optimize apply --candidate <candidate-id>
azd deploy

apply コマンドは、最適化された構成を.agent_configs/<candidate_id>/にダウンロードし、新しい手順を使用するようにazure.yamlを更新します。 deploy コマンドは、コードデプロイを使用して最適化されたエージェントをライブでプッシュします。

エージェントを呼び出して改善点を確認します。

azd ai agent invoke "What is your return policy?"

評価を実行して、スコアの改善を確認することもできます。

azd ai agent eval run

Python SDK パス

前に説明したAzure開発者 CLI ワークフローではなく、Pythonからオプティマイザーを実行する場合は、次の手順を使用します。

このパスは、既存の Foundry プロジェクトに次のリソースが既に存在することを前提としています。

  • 最適化するホステッド エージェント。
  • 登録済みのトレーニング データセット。
  • 登録済みのエバリュエーター。

前述の Azure Developer CLI フローとは異なり、Python SDK パスはプロジェクトをスキャフォールディングしたり、eval.yaml、データセット、エバリュエーターを生成したりすることはありません。 サンプルでこれらの資産を自動的に作成する場合は、最初に azd ai agent eval generate 使用します。

1. .env ファイルを作成する

作業フォルダーを作成し、次の値を持つ .env ファイルを追加します。

FOUNDRY_PROJECT_ENDPOINT=<your-project-endpoint>
FOUNDRY_AGENT_NAME=<your-hosted-agent-name>
DATASET_NAME=<your-registered-dataset-name>
EVALUATOR_NAME=<your-registered-evaluator-name>
DATASET_VERSION=1
POLL_INTERVAL_SECONDS=10
EVAL_MODEL=<your-eval-model-deployment-name>
OPTIMIZATION_MODEL=<your-optimization-model-deployment-name>

この同じ作業フォルダーからスクリプトを実行 load_dotenv() 、 .env ファイルを自動的に読み込むことができます。 別のディレクトリから実行する場合は、最初にシェル環境で同じ値を設定します。

Foundry プロジェクトの [概要 ] ページにある正確なプロジェクト エンドポイントを使用します。 Python スクリプトは、最初の要求を直ちに送信します。 FOUNDRY_PROJECT_ENDPOINTがプレースホルダーのみであるか、間違ったプロジェクトを指している場合、実行はResourceNotFound: The project does not existで失敗します。

EVAL_MODELとOPTIMIZATION_MODELを、モデル ファミリ名だけでなく、Foundry プロジェクトに既に存在する配置名に設定します。 たとえば、プロジェクトの配置に gpt-4.1-mini または DeepSeek-V3.2という名前が付けられている場合は、 .envでその正確な配置名を使用します。

2. 最適化ジョブを実行する

optimize_hosted_agent.pyと同じフォルダーに .env という名前のファイルを作成します。


"""
DESCRIPTION:
    Create an optimization job for a hosted agent using the latest agent
    optimization API, poll the job to completion, and list its candidates.

USAGE:
    python optimize_hosted_agent_v3.py

    Before running the sample:

    pip install azure-ai-projects azure-ai-agentserver-optimization azure-identity python-dotenv

    Set these environment variables with your own values:
    1) FOUNDRY_PROJECT_ENDPOINT - Required. The Microsoft Foundry project endpoint.
    2) FOUNDRY_AGENT_NAME       - Required. The hosted agent name.
    3) DATASET_NAME             - Required. The registered training dataset name.
    4) EVALUATOR_NAME           - Required. The registered evaluator name.
    5) DATASET_VERSION          - Optional. The dataset version. Defaults to "1".
    6) EVAL_MODEL               - Optional. The evaluation model. Defaults to "gpt-4o".
    7) OPTIMIZATION_MODEL       - Optional. The optimization model. Defaults to "gpt-5".
    8) POLL_INTERVAL_SECONDS    - Optional. Seconds between status polls. Defaults to 10.
    9) OPTIMIZATION_JOB_ID      - Optional. An existing job ID to resume instead of creating a job.
   10) OPTIMIZATION_LOCAL_DIR   - Optional. Path to the local .agent_configs directory.
   11) CREDENTIAL_PROCESS_TIMEOUT_SECONDS
                                - Optional. Credential subprocess timeout. Defaults to 60.
"""

import os
import time
from pathlib import Path

from azure.ai.agentserver.optimization import load_config, load_skills_from_dir
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import (
    AgentOptimizationBaselineAgentConfiguration,
    AgentOptimizationCandidateExpand,
    AgentOptimizationCandidateSearchConfiguration,
    AgentOptimizationConfiguration,
    AgentOptimizationEvaluationConfiguration,
    AgentOptimizationEvaluator,
    AgentOptimizationFoundryAgentTargetConfiguration,
    AgentOptimizationJob,
    AgentOptimizationModelConfiguration,
    AgentOptimizationSkill,
    AgentOptimizationSpace,
    AgentOptimizationTargetCompletionDatasetReferenceDataSource,
    AgentOptimizationTargetCompletionEvaluationSet,
    EvaluationModelConfiguration,
    JobStatus,
    TargetAttribute,
)
from azure.identity import DefaultAzureCredential
from dotenv import load_dotenv

load_dotenv()

endpoint = os.environ["FOUNDRY_PROJECT_ENDPOINT"]
agent_name = os.environ["FOUNDRY_AGENT_NAME"]
dataset_name = os.environ["DATASET_NAME"]
evaluator_name = os.environ["EVALUATOR_NAME"]
dataset_version = os.environ.get("DATASET_VERSION", "1")
eval_model = os.environ.get("EVAL_MODEL", "gpt-4o")
optimization_model = os.environ.get("OPTIMIZATION_MODEL", "gpt-5")
poll_interval_seconds = int(os.environ.get("POLL_INTERVAL_SECONDS", "10"))
existing_job_id = os.environ.get("OPTIMIZATION_JOB_ID")
credential_process_timeout_seconds = int(
    os.environ.get("CREDENTIAL_PROCESS_TIMEOUT_SECONDS", "60")
)

# Reads the hosted agent's baseline config from .agent_configs/baseline/metadata.yaml.
optimization_config = load_config()

target_attributes = [TargetAttribute.INSTRUCTIONS]
baseline_configuration = None
if optimization_config:
    loaded_skills = optimization_config.skills
    if not loaded_skills and optimization_config.skills_dir:
        loaded_skills = load_skills_from_dir(Path(optimization_config.skills_dir))

    skills = [
        AgentOptimizationSkill(
            name=skill.name,
            description=skill.description,
            body=skill.body or None,
        )
        for skill in loaded_skills
    ]

    if skills:
        target_attributes.append(TargetAttribute.SKILLS)
    if optimization_config.tool_definitions:
        target_attributes.append(TargetAttribute.TOOLS)

    baseline_configuration = AgentOptimizationBaselineAgentConfiguration(
        system_prompt=optimization_config.instructions,
        current_model=optimization_config.model,
        skills=skills or None,
        tools=optimization_config.tool_definitions or None,
    )

with (
    DefaultAzureCredential(
        process_timeout=credential_process_timeout_seconds
    ) as credential,
    AIProjectClient(endpoint=endpoint, credential=credential) as project_client,
):
    job_request = AgentOptimizationJob(
        target_configuration=AgentOptimizationFoundryAgentTargetConfiguration(
            name=agent_name
        ),
        optimization_model_configuration=AgentOptimizationModelConfiguration(
            model=optimization_model
        ),
        optimization_configuration=AgentOptimizationConfiguration(
            evaluation_configuration=AgentOptimizationEvaluationConfiguration(
                training_set=AgentOptimizationTargetCompletionEvaluationSet(
                    source=AgentOptimizationTargetCompletionDatasetReferenceDataSource(
                        name=dataset_name,
                        version=dataset_version,
                    )
                ),
                evaluators=[AgentOptimizationEvaluator(name=evaluator_name)],
                evaluation_model=EvaluationModelConfiguration(model=eval_model),
            ),
            candidate_search_configuration=AgentOptimizationCandidateSearchConfiguration(
                max_candidates=2
            ),
            baseline_agent_configuration=baseline_configuration,
            agent_optimization_space=AgentOptimizationSpace(
                target_attributes=target_attributes
            ),
        ),
    )

    if existing_job_id:
        job_id = existing_job_id
    else:
        poller = project_client.agents.begin_create_optimization_job(
            job=job_request,
            polling=False,
        )
        job_id = poller.details.get("job_id")
        if not isinstance(job_id, str):
            raise RuntimeError(
                "The create operation did not return an optimization job ID."
            )

    print(f"Optimization job ID: {job_id}")

    terminal_statuses = {
        JobStatus.SUCCEEDED,
        JobStatus.FAILED,
        JobStatus.CANCELLED,
    }
    job = project_client.agents.get_optimization_job(job_id=job_id)
    print("Optimization job started, waiting for completion...")
    while job.status not in terminal_statuses:
        print(f"\tstatus=`{job.status}`")
        time.sleep(poll_interval_seconds)
        job = project_client.agents.get_optimization_job(job_id=job_id)
    print(f"\tstatus=`{job.status}`")

    for warning in job.warnings or []:
        print(f"[WARNING] {warning}")

    if job.status == JobStatus.FAILED:
        message = job.error.message if job.error else "<no error message>"
        raise RuntimeError(f"Optimization job `{job.id}` failed: {message}")
    if job.status == JobStatus.CANCELLED:
        raise RuntimeError(f"Optimization job `{job.id}` was cancelled.")
    if job.result is None:
        raise RuntimeError(f"Optimization job `{job.id}` completed without a result.")

    result = job.result
    summary = result.candidate_summary
    if summary:
        print(f"Baseline candidate: {summary.baseline_id}")
        print(f"Best candidate: {summary.best_id}")
        print(f"Completed optimized candidates: {summary.completed_candidate_count}")
        if summary.baseline_score is not None:
            print(f"Baseline score: {summary.baseline_score:.4f}")
        if summary.best_score is not None:
            print(f"Best score: {summary.best_score:.4f}")
    if result.termination_reason:
        print(f"Termination reason: {result.termination_reason}")

    for candidate in project_client.agents.list_optimization_candidates(
        job_id=job_id,
        expand=[AgentOptimizationCandidateExpand.MUTATIONS],
    ):
        details = [
            f"{candidate.name}: candidate_id={candidate.candidate_id}",
            f"status={candidate.status}",
        ]
        if candidate.evaluation:
            if candidate.evaluation.score is not None:
                details.append(f"score={candidate.evaluation.score:.4f}")
            if candidate.evaluation.avg_tokens is not None:
                details.append(f"avg_tokens={candidate.evaluation.avg_tokens:.0f}")
        print(", ".join(details))

スクリプトを実行します。

python optimize_hosted_agent.py

最適化ジョブ ID は、送信直後に出力されます。を使用して Foundry ポータルで進行状況を監視します。

ジョブが成功すると、スクリプトが選ばれた候補とその candidate_id を出力します。

azd ai agent optimizeとは異なり、Python SDK フローではローカル .agent_configs/baseline/metadata.yaml ファイルは作成されません。 最適化ジョブのメタデータは、返された job オブジェクトと Foundry サービス応答 (ベースライン候補、最適な候補、スコア付けされた候補リストを含む) にとどまります。

3. 当選者を応募する

上記の CLI フローで使用したローカルの azd プロジェクトでも作業している場合は、Python スクリプトから返された candidate_id を使用して、選ばれた候補を適用してください。

azd ai agent optimize apply --candidate <candidate-id>
azd deploy

結果のみを検査する必要がある場合は、スクリプトによって出力された候補スコアと評価識別子を使用して、Foundry の成功した構成を昇格する前に確認します。

C# SDK のパス

前に説明したAzure開発者 CLI ワークフローを使用する代わりに、.NETからオプティマイザーを実行する場合は、次の手順を使用します。

このパスは、既存の Foundry プロジェクトに次のリソースが既に存在することを前提としています。

  • 最適化するホステッド エージェント。
  • 登録済みのトレーニング データセット。
  • 組み込みの builtin.task_adherence 評価子などの、登録済みの評価子。

前述の Azure Developer CLI フローとは異なり、.NET SDK パスはプロジェクトをスキャフォールディングしたり、eval.yaml、データセット、エバリュエーターを生成したりすることはありません。 サンプルでこれらの資産を自動的に作成する場合は、最初に azd ai agent eval generate 使用します。

1. 環境変数を設定する

コンソール アプリを作成し、シェルでこれらの値を設定してから実行します。

FOUNDRY_PROJECT_ENDPOINT=<your-project-endpoint>
FOUNDRY_AGENT_NAME=<your-hosted-agent-name>
DATASET_NAME=<your-registered-dataset-name>
DATASET_VERSION=1
EVALUATOR_NAME=builtin.task_adherence
EVAL_MODEL=<your-eval-model-deployment-name>
OPTIMIZATION_MODEL=<your-optimization-model-deployment-name>

Foundry プロジェクトの [概要 ] ページにある正確なプロジェクト エンドポイントを使用します。

EVAL_MODELとOPTIMIZATION_MODELを、モデル ファミリ名だけでなく、Foundry プロジェクトに既に存在する配置名に設定します。 最適化モデルは、オプティマイザーがサポートする推論モデルである必要があります。 サポートされていないデプロイを選択した場合、サービスは許可されているモデルを一覧表示するエラーを返します。

2. 最適化ジョブを実行する

Program.cs を次のコードに置き換えます。

エージェントの最適化には、すべての要求で AgentsOptimization=V2Preview 機能ヘッダーが必要です。 この例の FoundryFeaturesPolicy クラスは、クライアントが送信するすべての要求にそのヘッダーを追加します。

using System.ClientModel.Primitives;
using Azure.AI.Projects;
using Azure.AI.Projects.Agents;
using Azure.Identity;

#pragma warning disable AAIP001

// Adds the feature header that agent optimization requires.
public sealed class FoundryFeaturesPolicy(string features) : PipelinePolicy
{
    public override void Process(PipelineMessage message, IReadOnlyList<PipelinePolicy> pipeline, int index)
    {
        message.Request.Headers.Set("Foundry-Features", features);
        ProcessNext(message, pipeline, index);
    }

    public override ValueTask ProcessAsync(PipelineMessage message, IReadOnlyList<PipelinePolicy> pipeline, int index)
    {
        message.Request.Headers.Set("Foundry-Features", features);
        return ProcessNextAsync(message, pipeline, index);
    }
}

public static class Program
{
    public static void Main()
    {
        var endpoint = Environment.GetEnvironmentVariable("FOUNDRY_PROJECT_ENDPOINT")!;
        var agentName = Environment.GetEnvironmentVariable("FOUNDRY_AGENT_NAME")!;
        var datasetName = Environment.GetEnvironmentVariable("DATASET_NAME")!;
        var datasetVersion = Environment.GetEnvironmentVariable("DATASET_VERSION") ?? "1";
        var evaluatorName = Environment.GetEnvironmentVariable("EVALUATOR_NAME") ?? "builtin.task_adherence";
        var evalModel = Environment.GetEnvironmentVariable("EVAL_MODEL")!;
        var optimizationModel = Environment.GetEnvironmentVariable("OPTIMIZATION_MODEL")!;

        var options = new AIProjectClientOptions();
        options.AddPolicy(new FoundryFeaturesPolicy("AgentsOptimization=V2Preview"), PipelinePosition.PerCall);

        AIProjectClient projectClient = new(new Uri(endpoint), new DefaultAzureCredential(), options);
        AgentOptimizationJobs optimizationJobs = projectClient.AgentAdministrationClient.GetAgentOptimizationJobs();

        OptimizationJob job = new()
        {
            Inputs = new OptimizationJobInputs(
                new OptimizationAgentIdentifier(agentName),
                new OptimizationReferenceDatasetInput(datasetName) { Version = datasetVersion },
                new[] { new OptimizationEvaluatorRef(evaluatorName) })
            {
                Options = new OptimizationOptions
                {
                    MaxCandidates = 2,
                    EvalModel = evalModel,
                    OptimizationModel = optimizationModel,
                    // The optimizer needs at least one optimizable target, such as the
                    // baseline system prompt, the tool definitions, or skills.
                    OptimizationConfig =
                    {
                        ["system_prompt"] = BinaryData.FromObjectAsJson(
                            "You are a helpful assistant that answers user requests accurately and concisely."),
                    },
                },
            },
        };

        OptimizationJob created = optimizationJobs.Create(job);
        Console.WriteLine($"Optimization job started: {created.Id}");

        OptimizationJob current = created;
        while (current.Status != AgentsJobStatus.Succeeded
            && current.Status != AgentsJobStatus.Failed
            && current.Status != AgentsJobStatus.Cancelled)
        {
            Thread.Sleep(TimeSpan.FromSeconds(20));
            current = optimizationJobs.Get(created.Id);
            Console.WriteLine($"\tstatus=`{current.Status}`");
        }

        Console.WriteLine($"Final status: {current.Status}");

        if (current.Result is not null)
        {
            Console.WriteLine($"Baseline candidate: {current.Result.Baseline}");
            Console.WriteLine($"Best candidate: {current.Result.Best}");

            foreach (OptimizationCandidate candidate in current.Result.Candidates)
            {
                Console.WriteLine(
                    $"{candidate.Name}: candidate_id={candidate.CandidateId}, " +
                    $"avg_score={candidate.AvgScore:F4}, " +
                    $"avg_tokens={candidate.AvgTokens:F0}");
            }
        }
    }
}

次のようにアプリを実行します。

dotnet run

ジョブが成功すると、アプリは勝利候補とその candidate_idを出力します。

Optimization job started: opt_<job-id>
        status=`in_progress`
        status=`succeeded`
Final status: succeeded
Baseline candidate: cand_opt_<job-id>_0000
Best candidate: cand_opt_<job-id>_0000
baseline: candidate_id=cand_opt_<job-id>_0000, avg_score=1.0000, avg_tokens=0

azd ai agent optimizeとは異なり、.NET SDK フローではローカル .agent_configs/baseline/metadata.yaml ファイルは作成されません。 最適化ジョブのメタデータは、返されたジョブ オブジェクトと Foundry サービス応答 (ベースライン候補、最適な候補、スコア付けされた候補リストを含む) にとどまります。

3. 当選者を応募する

CLI フローで使用されるローカル azd プロジェクトからも作業している場合は、アプリから返される candidate_id を使用して、受賞候補を適用します。

azd ai agent optimize apply --candidate <candidate-id>
azd deploy

結果を確認するだけでよい場合は、昇格させる前に、アプリが出力した候補スコアと評価識別子を使用して、Foundry で最適な構成を確認してください。

VS Code で最適化を実行する

Foundry Toolkit には、デプロイされたホステッド エージェント用のネイティブ エージェント最適化エクスペリエンスが含まれています。 エージェントのプレイグラウンドから、最適化の実行を開始し、候補をベースラインと比較し、構成の変更を検査し、最適な候補をデプロイできます。

手順 1: デプロイされたホステッド エージェントを選択する

  1. アクティビティ バーで Foundry Toolkit を選択します。
  2. [ マイ リソース] で、[エージェント] を選択 します。
  3. デプロイされたホステッド エージェントがある場合は、それを選択して、ホストされたエージェントのプレイグラウンドを開きます。
  4. デプロイされたホスト型エージェントがない場合は、「 クイック スタート: 最初のホストされたエージェントをデプロイする」の VS Code パスを完了します。 デプロイが完了したら、 エージェント に戻り、新しいホステッド エージェントを選択します。

手順 2: 最適化の実行を開始する

  1. [ 最適化 ] タブを選択します。

Foundry Toolkit でホストされているエージェントのスクリーンショット。[最適化] タブが選択され、[新しい最適化] ボタンが表示されています。

  1. [ 新しい最適化] を選択します。

  2. [ ワークスペースの選択] で、選択したホステッド エージェントのコードを含むワークスペースを選択します。

    • 現在のワークスペースにエージェント コードとそのazure.yaml ファイルが含まれている場合は、[現在のワークスペース] を選択します。
    • [ 参照]... を選択して、エージェント コードを含むワークスペースを開きます。

    Foundry Toolkit は、ワークスペース ファイルを使用して最適化を準備し、一致する azure.ai.agent サービスに候補を適用します。

Foundry Toolkit の [ワークスペースの選択] プロンプトのスクリーンショット。現在のワークスペースと、ホストされているエージェント コードを検索するための [参照] オプションが表示されています。

  1. Foundry Toolkit によって GitHub Copilot Chatが開き、選択したエージェントの種類、名前、および Foundry プロジェクト エンドポイントが設定されたエージェント オプティマイザー要求が送信されます。

  2. Copilot Chatの 4 つの最適化の質問に回答します。

    入力 提供する内容
    評価メトリック 使用するメトリックまたはエバリュエーターを入力します。 お持ちでない場合は、 azd ai agent eval generate 実行するか、オプティマイザーの組み込みの既定値を使用するかを選択します。
    Dataset 最適化データセットを選択します。 お持ちでない場合は、 azd ai agent eval generate 実行するか、オプティマイザーの組み込みの既定値を使用するかを選択します。
    最大候補数 生成する候補の最大数 ( 2など) を入力します。
    最適化モデル サポートされている最適化モデルから既存のデプロイを選択します。

GitHub Copilotは、最適化を開始する前に、これらの入力を待機します。 生成されたリクエストは、Copilot に対して Microsoft Foundry Skill の Agent Optimizer ワークフローと Azure Developer CLI コマンドのみを使用するよう指示します。 Foundry MCP ツールは使用されません。 コパイロット:

  • 選択したワークスペース内のエージェント コードを検査します。
  • プロジェクトにまだ AZD 環境がない場合は、既存の azure.yaml と .env の値から AZD 環境を初期化します。
  • 最適化のためにエージェントをワイヤ化し、更新されたホステッド エージェントをデプロイします。
  • エージェント サービス フォルダーに eval.yaml を作成します。
  • 提案されたファイルの変更とコマンドを確認して承認した後、最適化を開始します。

Copilot がジョブを送信した後、最適化 タブに戻ってください。実行結果が 最適化の実行 の下に表示されます。 テーブルには、実行 ID、状態、候補数、ベースライン スコア、ベスト スコア、作成時間が表示されます。

手順 3: 最適な候補を比較してデプロイする

  1. 実行が成功したら、[ 最適化の実行] で選択します。
  2. ベースラインとベスト スコアを比較します。 各候補の スコアの詳細 を確認し、[ 変更の表示 ] を選択して構成の変更を検査します。
  3. ベースラインで最適な候補が改善された場合は、[ 最適な候補のデプロイ ] を選択して現在のエージェントを更新します。 新しいエージェントとしてデプロイするか、デプロイ設定を変更するには、代わりに [カスタム デプロイ ] を選択します。

注

すべての候補がベースラインより低いスコアの場合は、候補をデプロイしないでください。 オプティマイザーを再度実行する前に、現在のエージェントを保持し、データセットまたは最適化の設定を変更します。

Foundry Toolkit で完了した最適化実行のスクリーンショット。ベースラインと生成された候補と、スコア、構成の変更、デプロイ オプションを比較しています。

Microsoft Foundry スキルを使用して最適化を実行する

このパスは、Visual Studio Code、Copilot CLI、Claude Code のGitHub Copilotなど、Microsoft Foundry スキルをサポートする任意のコーディング エージェント ホストで使用します。 スキルは、 azure.yamlからエージェント コンテキストを解決し、エージェント オプティマイザー ワークフローを読み込み、候補アプリケーションとデプロイをレビュー ゲートの背後に保持します。

手順 1: エージェント ワークスペースを開く

コーディング エージェント ホストで空のフォルダーを開きます。 microsoft-foundryスキルが使用可能であることを確認します。 スキルを利用できない場合は、コーディング エージェントで Microsoft Foundry スキルを使用するに従ってください。

手順 2: エージェント オプティマイザーを実行するようにスキルに依頼する

このプロンプトをコーディング エージェントに送信します。

Use the Microsoft Foundry Skill to run the Agent Optimizer workflow for a
Python hosted agent. If this workspace doesn't contain an agent, initialize the
customer support optimization sample from this template:
https://github.com/microsoft-foundry/foundry-samples/blob/main/samples/python/hosted-agents/bring-your-own/responses/optimization-customer-support/azure.yaml
Resolve the AZD environment and hosted-agent service, verify that the agent is
optimizer-ready, and deploy and invoke the baseline. Generate and show me the
evaluation dataset, evaluators, and eval.yaml before running optimization.
Verify that the project has a supported optimization model deployment, then run
Agent Optimizer with two candidates. Stop after reporting the operation ID,
portal URL, candidate IDs, and scores. Don't apply or deploy a candidate yet.

ワークスペースからこれらの値を解決できない場合、コーディング エージェントからサブスクリプション、リージョン、Foundry プロジェクト、エージェント サービス、評価モデル、または最適化モデルを選択するように求められる場合があります。 変更やコマンドを承認する前に、生成されたファイルとコストの高いリソースを確認します。

手順 3: 承認済みの候補者を適用して展開する

最適化の結果を確認したら、次のフォローアップ プロンプトを送信します。

Recommend the best optimization candidate and explain the score improvement.
Summarize the candidate changes before applying anything. After I approve the
candidate, apply it locally, show the source diff, and stop again before
deployment. After I approve deployment, run azd deploy, invoke the agent with
"What is your return policy?", and rerun the evaluation to confirm the
improvement.

スキルでは azd ai agent optimize apply --candidate <candidate-id> を使用するため、最適化された構成をローカルで確認できます。 承認後にのみデプロイされ、更新されたホステッド エージェントが呼び出されて評価されます。

リソースをクリーンアップする

ワークフローで AZD プロジェクトを使用してリソースを作成した場合は、実験が完了したら、プロビジョニングされたリソースを削除します。

azd down --force --purge

Tip

なぜ --purge? Foundry アカウントでは、既定でソフト削除が使用されます。 --purgeしないと、リソース名は 48 時間予約されたままになり、同じ名前で再プロビジョニングできません。

Troubleshooting

問題 原因 修正
azd ai agent optimize コマンドが見つからない 拡張機能が古すぎます azd ext upgrade microsoft.foundryを実行して、0.1.40-preview 以降を取得します。
optimization_model is required モデルを構成せずに非対話型モードで実行する コマンドに--optimize-model gpt-5を追加するか、optimization_model: gpt-5の [options:] でeval.yamlを設定します。 対話型モードでは、CLI によってモデルの選択が求められます。
PythonスクリプトがKeyError: 'DATASET_NAME'または別の不足している変数で失敗する スクリプトで .env ファイルが読み込まれていないか、変数が見つかりません .envと同じフォルダーからスクリプトを実行するか、python optimize_hosted_agent.pyを実行する前にシェルに必要な値をエクスポートします。
Python スクリプトが失敗するResourceNotFound: The project does not exist FOUNDRY_PROJECT_ENDPOINT は、既存の Foundry プロジェクトを指していません Foundry プロジェクトの [概要] ページからプロジェクト エンドポイントをコピーし、FOUNDRY_PROJECT_ENDPOINTで.envを更新します。
Python スクリプトが失敗するOptimization model deployment '<name>' not found OPTIMIZATION_MODEL は Foundry プロジェクトに配置されたモデルの名前ではありません プロジェクト内の既存の ファミリや DeepSeek デプロイなど、>gpt-5 の正確なデプロイ名を使用します。
ジョブ要求は次のエラーで失敗します。 evaluators is required and cannot be empty Foundry-Features ヘッダーが要求に含まれていない C# パスの FoundryFeaturesPolicy クラスに示すように、AgentsOptimization=V2Preview ヘッダーを追加します。
ジョブは No optimizable element found for the hosted agent で失敗します 要求に最適化可能なターゲットが含まれていない ベースライン system_prompt、ツール定義、スキルなど、少なくとも 1 つのターゲットをoptimization_configに指定します。
ジョブは AllEvaluatorsFailedError で失敗します エバリュエーターが正しく構成されていないため、すべての行でスコア付けに失敗する エラー内の評価実行リンクを開き、評価者があなたのエージェントの応答を採点していることを確認してください。 builtin.task_adherenceなどの組み込みのエバリュエーターから始めます。
ホストされているエージェントの [最適化 ] セクションが表示されない Foundry Toolkit がバージョン 1.6.4 より前であるか、選択したエージェントがデプロイ済みのホスト型エージェントではありません Foundry Toolkit を更新し、Visual Studio Code再読み込みし、[エージェント] タブからデプロイされたエージェントをもう一度開きます。
ワークスペースを選択した後に GitHub Copilot Chatが開かない GitHub Copilotがインストールされていない、アカウントで使用できない、またはエージェント モードが無効になっている Visual Studio CodeでGitHub Copilotを設定し、エージェント モードを有効にしてから、もう一度 [新しい最適化] を選択します。
Foundry Toolkit で現在のワークスペースに最適な候補を適用できない ワークスペースには、デプロイされたホステッド エージェントと一致する名前の azure.yaml サービスが含まれません 選択したエージェントのコードと一致する azure.ai.agent サービスを含むワークスペースを開き、もう一度やり直してください。
コーディング エージェントがホストされているエージェントを見つけることができません 間違ったフォルダーが開いているか、 azure.yaml が azure.ai.agent サービスを定義していない azure.yamlを含む AZD プロジェクト フォルダーを開き、コーディング エージェントに hosted-agent サービスをもう一度解決するように依頼します。
コーディング エージェントは、候補を適用またはデプロイする前に停止します エージェント オプティマイザー スキルでは、ソースの変更とデプロイの前にレビューが必要です 候補スコアとローカル差分を確認し、適用またはデプロイの手順を明示的に承認します。
最適化スコアが 0 または非常に低い 評価にエラーが発生した行が多数あります 結果の Eval リンクを開きます。 応答生成エラーまたはエバリュエーター エラーを修正してから、再実行します。
azd provision クォータ エラーで失敗する サブスクリプションに容量がない 別のリージョンを試すか、クォータの引き上げを要求します。

学習した内容

このクイック スタートでは、次の操作を行います。

  • カスタマー サポート テンプレートを使用して最適化サンプル エージェントをデプロイしました。
  • Azure Developer CLI、Python SDK、.NET SDK、Visual Studio Code、または Microsoft Foundry スキルを使用してエージェント オプティマイザーを実行しました。
  • 当選候補を配置し、改善を検証しました。

次のステップ