エージェントのツール実行にサンドボックスを使う理由
RL でコードエージェントをトレーニングするには、分離された環境でツール呼び出し (bash コマンド、ファイル操作) を実行する必要があります。信頼できないモデル生成コードは、ホストのファイルシステムを変更したり、ネットワークにアクセスしたり、非決定的な結果を生成したりする可能性があります。サンドボックスは、ホストや他のロールアウトに影響を与えずにツール呼び出しを実行できる、分離されたエフェメラルな環境を提供します。 トレーニングループでは、モデルが action (ツール呼び出し) を生成し、サンドボックスがそれを実行して、観測値をモデルに返します。サンドボックスは、エピソード内のツール呼び出し間で維持されるため、ファイルの変更やインストール済みパッケージはステップ間で引き継がれます。報酬は、サンドボックスの最終状態 (たとえば、テストの成功) や軌跡の品質から得られます。 タグ付け API と一覧取得 API により、数千のサンドボックスを使用するトレーニング run のクリーンアップや監視を実用的に行えます。前提条件
始める前に、次のセットアップ手順を完了してください。CWSANDBOX_API_KEY に
CoreWeave API アクセストークンを設定します。
SandboxDefaults からサンドボックスを作成し、デフォルトで CoreWeave 認証を使用します。Forge APIキーを使用する場合は、はじめにに記載されている明示的な認証セットアップの手順に従い、生成された auth の値を各 SandboxDefaults(...) に渡してください。
コアパターン
コアのセットアップは、トレーニング インフラストラクチャー上で実行されるエージェントループで、ツール呼び出しはサンドボックス内で実行されます。並列エピソードを用いたトレーニングステップ
エピソードごとに 1 つのサンドボックスを使用して、タスクのバッチを処理します。ジョブのメタデータのタグ付け
タグを使用すると、トレーニング ジョブによって作成されたサンドボックスをフィルターして検索できます。単一の run から数千ものサンドボックスが生成されることもあるため、タグは欠かせません。デバッグやクリーンアップの際にサンドボックスを特定しやすくなるよう、メタデータを含めてください。
サンドボックスのタグは Kubernetes の Pod ラベルになり、CoreWeave の可観測性プラットフォームでフィルタリングやダッシュボードに使用されます。
報酬関数の例を試す
コード実行の報酬を並列サンドボックス実行で計算する最小限のインテグレーションです。 実行内容:- 算術、文字列操作、構文エラー、ランタイムエラーなどのおもちゃのコード完了のセットを実行します。
- 隔離のために完了ごとに1つのサンドボックスを作成します。
- 二値報酬を計算します: 実行成功で1.0、失敗で0.0。
- 結果が到着するにつれて進捗を表示します (より高速な実行が先に完了します)。
cwsandbox.wait() を使用して、完了した結果を処理します:
TRL GRPOTrainer インテグレーション
TRL では、完了が直接報酬にマッピングされる報酬関数インターフェースを使用しています。エージェントが完了を出力し、報酬関数がそれをサンドボックスで実行します。 標準的なパターンでは、コード抽出に<answer> XML タグを使用します (GRPO の数学例で使用される \boxed{} 形式に一致) :
TRL GRPO インテグレーションの例を試す
CoreWeave Sandboxes を TRL の GRPOTrainer と組み合わせて使用し、コード実行の報酬を計算します。 内容:- 小規模なモデル (
Qwen/Qwen2.5-0.5B-Instruct) を読み込みます。 - シンプルなコーディング問題で構成されるトイデータセットを作成します。
- サンドボックスベースの報酬計算を用いて、GRPO でモデルをトレーニングします。
- インテグレーションの動作を示すために、10 トレーニングステップを実行します。
<answer> タグからコードを抽出し (標準的な GRPO パターン)、Session を通じてサンドボックスを並列に作成して各完了を実行し、二値の報酬を返します。
<answer> タグで囲んで出力するようモデルに指示するシステムメッセージを使用します:
extract_xml_answer() がモデルの完了から抽出可能なコードを検索した場合にのみサンドボックスを作成するためです。モデルが期待される <answer>...</answer> タグなしでテキストを生成した場合、その完了はスキップされ、報酬 0.0 を受け取ります。
2 sandboxes, 0/2 passed: モデルが 2 個のコードブロックを生成し、どちらも実行に失敗しました。1 sandboxes, 0/1 passed, 1 skipped (no code): モデルが 1 個のコードブロック (失敗) と 1 個のテキストのみの完了を生成しました。0 sandboxes, 0/0 passed, 2 skipped (no code): モデルがどちらの完了からも抽出可能なコードを生成しませんでした。
エージェントエピソードにおけるエラーの処理
サンドボックス操作は、タイムアウト、ファイルの欠落、サンドボックスの終了などによって失敗することがあります。こうした失敗をどのようにエージェントに伝えるかによって、エージェントが何を学習するかが決まります。何が問題だったのかを説明する観測値を返してください。Weights & Biases メトリクス インテグレーション
Weights & Biases をトレーニングに使用すると、cwsandbox Sessions はサンドボックスの使用状況メトリクスを実行中の wandb run に自動的にログします。これにより、サンドボックスの健全性 (起動時間、実行の失敗、ロールアウトごとのツール呼び出し) を同じダッシュボード内のトレーニング メトリクスと関連付けることができます。 以下のセクションでは、自動検出の仕組み、report を明示的に制御する方法、および追跡されるメトリクスについて説明します。自動検出
wandb パッケージがインストールされていて、Weights & Biases の run が実行中 (wandb.run が存在する) の場合、メトリクスをログする機能が自動的に有効になります。実験管理を行うには、省略可能な wandb パッケージをインストールし、Forge の APIキーを設定してください:
wandb.login() に明示的に渡してください。FORGE_API_KEY はこの例のコードで読み取っているもので、SDK が自動的に検出するわけではありません。サンドボックスの認証には、引き続き CWSANDBOX_API_KEY を使用します:
明示的な制御
report_to パラメーターで、メトリクスのレポート先を制御します:
メトリクス
exec() が完了すると、実行メトリクスが自動的に追跡されます:
追跡は自動的に行われます。セッションに関連付けられた任意のサンドボックスで
exec() を呼び出します。特定のトレーニングステップでログするには、session.log_metrics(step=N) を呼び出します:
exec_stats プロパティを使用して、サンドボックスごとの統計にアクセスすることもできます:
サンドボックスごとの exec メトリクス
Weights & Biases インテグレーションを使用するセッションでは、サンドボックスごとのメトリクスもトラッキングします。
これらのメトリクスからわかるエージェントの動作:
- avg_execs_per_sandbox の値が高い場合、エージェントが 1 エピソードあたりに多数のツール呼び出しを行う冗長な動作をしている可能性があります。
- ばらつき (max-min の差) が大きい場合、エピソード間でロールアウトの動作に一貫性がない可能性があります。
- トレーニングステップごとの傾向から、ポリシーの改善に伴ってエージェントの動作がどのように変化するかを確認できます。
avg_execs_per_sandboxをトレーニングステップに対してプロットし、トレーニングを通じたツールの使用傾向を確認します。max_execs_per_sandboxがしきい値を超えた場合にアラートを発行します (過剰なツール呼び出しを行う暴走エージェントの検知)。- min/max の幅を比較し、エージェントがループに陥ったエピソードと短時間で完了したエピソードを見分けます。
log_metrics() はログした後にカウンターをリセットします。累積を継続するには、reset=False を設定します。
モニタリングとデバッグ
以下のパターンを使用すると、トレーニング run の動作をリアルタイムで確認し、障害の診断に役立つ詳細情報を取得できます。実行中のサンドボックスのカウント
トレーニング中のサンドボックス使用状況を監視します:execution の詳細をログする
報酬計算のデバッグのために execution の詳細を取得します:ART を使用したマルチステップ ロールアウト
前の TRL の例では、single-shot 実行にサンドボックスを使用しています: 完了ごとに 1 つのサンドボックスで、1 回実行して報酬を返します。これは、モデルをトレーニングして 1 回の試行で正しいコードを生成するのに適しています。 ステートフルなマルチステップ ロールアウトは異なります: エージェントは単一のサンドボックス内で複数の action を実行し、サンドボックスは action 間で状態を維持します。エージェントはファイルを書き込み、実行し、エラーを観察し、ファイルを編集して再試行できます。すべて同じサンドボックス内で行われます。examples/rl_training/art/ ディレクトリは、MBPP ベンチマークでこのパターンを示しています。ソリューションが失敗した場合、エージェントはエラーのフィードバックを受け取り、アプローチを反復できます。
概要
このセクションの以降の内容では、ART の概要、この例で使用するトレーニング手法、前提条件、インストール、例の実行方法、および各コンポーネントの連携について説明します。 ART (Agent Reinforcement Trainer) は、GRPO を使用して複数ステップのエージェントをトレーニングするための、OpenPipe によるオープンソースの RL フレームワークです。この例では、CoreWeave Sandboxes を ART と統合します。artパッケージ (openpipe-art) を使用して、軌跡の収集とトレーニングを行います。LocalBackend(GPU が必要) とTinkerBackend(GPU 不要) の 2 つのバックエンドをサポートします。- CoreWeave Sandboxes でツール呼び出しを通じてコードを実行します。
- MBPP テストケースの結果に基づいて二値の報酬を計算します。
GRPO と蒸留を用いたトレーニングアプローチ
この例では、強化学習を用いた蒸留を使用します。より強力なモデルがデモンストレーションを生成し、より小さなモデルが成功したものを複製することを学習します。 2 つのモデルが関与します:-
Inference model (
--model, default:gpt-5.1-codex-mini): ロールアウト中に軌跡を生成します。このモデルはツール呼び出しを行い、サンドボックスの結果を確認し、エラーを反復し、ソリューションを送信します。トレーニングされません。 -
Base model (
--base-model, default:Qwen/Qwen3-8B): トレーニングされるモデルです。inference model が生成した軌跡を受け取り、GRPO (Group Relative Policy Optimization) を通じてそれらから学習します。
- inference model は問題ごとに複数の軌跡を生成し、それぞれのツール呼び出しは CoreWeave サンドボックスで実行されます。
- 各軌跡には二値報酬が与えられます。テストに合格した場合は 1.0、不合格の場合は 0.0 です。
- 同じ問題の軌跡はグループを形成し、GRPO は各グループ内の軌跡を比較します。
- base model (Qwen3-8B) は、より高い報酬の軌跡を低い報酬の軌跡よりも優先するようにトレーニングされます。
前提条件
環境変数:
WANDB_API_KEY 変数を確認します。バックエンドを作成する前に、次の互換性マッピングを train.py に追加してください。このキーには Forge の APIキーを使用します。
インストール
例の実行
設定オプション
アーキテクチャ
art.Trajectory を返します:
execute_code: サンドボックスでコードをテストし、標準出力/標準エラー出力を返します。submit_solution: 最終的な解答を送信し、すべてのテストケースを実行します。
データフロー
トレーニングパイプラインは、いくつかのコンポーネントで構成されます。-
ローカルマシン: トレーニングスクリプト (
train.py) は、マシンまたはトレーニングサーバー上で実行されます。MBPP データセットから問題を読み込み、トレーニングループを制御します。 - OpenAI API (推論): 軌跡の収集中、ロールアウトコードは OpenAI API (または互換エンドポイント) を呼び出してモデルの応答を生成します。モデルはツール定義を受け取り、ロールアウトが実行するツール呼び出しを返します。
-
CoreWeave サンドボックス (コード実行): 各ロールアウトは、すべてのツール呼び出しにわたって維持される単一の CoreWeave サンドボックスを使用します。モデルが
execute_codeまたはsubmit_solutionを呼び出すと、コードはそのサンドボックス内で実行されます。そのため、エージェントが処理を繰り返すにつれて、ファイルの変更と状態が蓄積されます。ファイルを書き込み、実行し、エラーを確認して修正できます。サンドボックスは隔離環境を提供するため、モデルが生成した信頼できないコードがホストに影響を及ぼすことはありません。結果 (stdout、stderr、終了コード) はロールアウトに返されます。 -
軌跡の収集: ロールアウトは、会話の履歴 (メッセージとツール結果) を最終報酬とともに
art.Trajectoryオブジェクトに蓄積します。同じ問題に対する複数の軌跡が、1 つのart.TrajectoryGroupを形成します。 -
トレーニングバックエンド: 収集された軌跡グループは、トレーニングバックエンドに送信されます。
LocalBackendでは、ローカル GPU 上でトレーニングが行われます。TinkerBackendでは、軌跡が Thinking Machines の Tinker サービスにアップロードされ、リモートでトレーニングが行われます。ローカル GPU は必須ではありません。