# RLでAIエージェントを学習する

「エージェント的」AIは時間とともにより一般的になりつつあります。この文脈では「エージェント」とは、高レベルの目標とそれを達成するためのツール群が与えられた大規模言語モデル（LLM）を指します。エージェントは通常「マルチターン」でもあり、行動を実行してその環境への影響を確認し、目標を達成するか失敗するまで繰り返し別の行動を実行できます。

残念ながら、非常に有能なLLMであっても、複雑なマルチターンのエージェント的タスクを安定して実行するのは難しいことがあります。興味深いことに、我々は [GRPO（Group Relative Policy Optimization）](/docs/jp/meru/reinforcement-learning-rl-guide/tutorial-train-your-own-reasoning-model-with-grpo.md) という強化学習アルゴリズムでエージェントを訓練すると、それらをはるかに信頼性の高いものにできることを発見しました！このガイドでは、オープンソースツールを使って信頼できるAIエージェントを構築する方法を学びます。

## 🎨 ARTによるRLエージェントの訓練

[ART（Agent Reinforcement Trainer）](https://github.com/openpipe/art) は [Unsloth](https://github.com/unslothai/unsloth)のGRPOTrainer上に構築されたツールで、マルチターンエージェントの訓練を可能かつ容易にします。すでにUnslothでGRPOを使用していて、複雑なマルチターンのやり取りを処理できるエージェントを訓練する必要がある場合、ARTはそのプロセスを簡素化します。

<div align="left"><figure><img src="/files/030de96f357faf482af222535bafd3019a782429" alt="" width="375"><figcaption><p>Unsloth+ARTで訓練されたエージェントモデルは、エージェント的ワークフローにおいてプロンプトベースのモデルを上回ることがよくあります。</p></figcaption></figure></div>

### ART + Unsloth

ARTはUnslothのメモリおよび計算効率の良いGRPO実装の上に構築されています。加えて、以下の機能を追加しています：

#### 1. マルチターンエージェント訓練

ARTはエージェントの実行に伴って構築される「トラジェクトリ（軌跡）」という概念を導入します。これらのトラジェクトリはその後スコア付けされGRPOに使用できます。トラジェクトリは複雑になり得て、非線形な履歴やサブエージェントの呼び出しなどを含むこともあります。また、ツール呼び出しとその応答もサポートします。

#### 2. 既存コードベースへの柔軟な統合

すでにプロンプトモデルで動作するエージェントがある場合、ARTは既存のエージェントループをラップして訓練に使用するために必要な変更を最小限に抑えるように設計されています。

アーキテクチャ的には、ARTはあなたのコードベース内に存在してAPI経由で実際の訓練が行われる「バックエンド」と通信する「フロントエンド」クライアントに分かれています（これらはARTの `LocalBackend`を使用する場合は単一マシンに同居させることもできます）。これにより主な利点が得られます：

* **最小限のセットアップが必要**：ARTフロントエンドは依存関係が最小限で、既存のPythonコードベースに簡単に追加できます。
* **どこからでも訓練可能**：ARTクライアントをラップトップで実行してARTサーバーに一時的なGPU対応環境を起動させることや、ローカルGPUで実行することが可能です
* **OpenAI互換API**：ARTバックエンドは訓練中のモデルをOpenAI互換のAPIを通じて提供するため、ほとんどの既存コードベースと互換性があります。

#### 3. RULER：ゼロショットエージェント報酬

ARTはまた、 [RULER](https://art.openpipe.ai/fundamentals/ruler) （Relative Universal LLM-Elicited Rewards）と呼ばれる汎用の組み込み報酬関数を提供し、手作りの報酬関数の必要性を無くすことができます。驚くべきことに、RULERの自動報酬関数でRL訓練されたエージェントは、手書きの報酬関数で訓練されたエージェントと同等かそれ以上の性能を示すことがよくあります。これにより、RLの導入が容易になります。

<figure><img src="/files/b3a93f5c7d76749079c1df9390ec1528d1b064dd" alt="" width="375"><figcaption></figcaption></figure>

```python
# 以前：何時間もの報酬設計作業
def complex_reward_function(trajectory):
    # 50行以上にわたる慎重なスコアリングロジック...
    pass

# 以降：RULERで1行に
judged_group = await ruler_score_group(group, "openai/o3")
```

### ARTを選ぶべき時

ARTは次のようなプロジェクトに適している可能性があります：

1. **マルチステップのエージェント能力**：ユースケースが複数の行動を取る必要があるエージェント、ツールを使用するエージェント、または長時間の会話を必要とする場合
2. **報酬設計なしでの迅速なプロトタイピング**：RULERの自動報酬スコアリングはプロジェクトの開発時間を2〜3倍短縮できます
3. **既存システムとの統合**：既存のエージェント的コードベースに最小限の変更でRL機能を追加する必要がある場合

### コード例：ARTの実例

```python
import art
from art.rewards import ruler_score_group

# Unsloth対応のベースモデルでモデルを初期化
model = art.TrainableModel(
    name="agent-001",
    project="my-agentic-task",
    base_model="Qwen/Qwen2.5-14B-Instruct",  # 任意のUnsloth対応モデル
)

# ロールアウト関数を定義
async def rollout(model: art.Model, scenario: Scenario) -> art.Trajectory:
    openai_client = model.openai_client()
    trajectory = art.Trajectory(
        messages_and_choices=[
            {"role": "system", "content": "..."},
            {"role": "user", "content": "..."}
        ]
    )
    # ここにエージェントのロジックを記述...    
    return trajectory

# RULERで自動報酬を用いて訓練
groups = await art.gather_trajectory_groups(
    (
        art.TrajectoryGroup(rollout(model, scenario) for _ in range(8))
        for scenario in scenarios
    ),
    after_each=lambda group: ruler_score_group(
        group,
        "openai/o3",
        swallow_exceptions=True
    )
)

await model.train(groups)
```

### はじめに

UnslothベースのプロジェクトにARTを追加するには：

```bash
pip install openpipe-art # または `uv add openpipe-art`
```

次に、 [サンプルノートブック](https://art.openpipe.ai/getting-started/notebooks) をチェックして、ARTが次のようなタスクでどのように動作するかを確認してください：

* o3を上回るメール検索エージェント
* ゲームプレイエージェント（2048、三目並べ、コドネーム）
* 複雑な推論タスク（Temporal Clue）


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://unsloth.ai/docs/jp/meru/reinforcement-learning-rl-guide/training-ai-agents-with-rl.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
