多くの複雑な問題を解決するには、複数のターンが必要。LLM エージェントは、システム内の他のモデルやツールから有用なフィードバックを得るために、環境と相互作用する
マルチターン MAGRPO#
マルチターン MAGRPO は、異なる共同応答 (TreeRPO) を表す rollout ツリーを構築します。
各 episode は、データセットからサンプリングされたタスクから開始され、すべてのエージェントの初期の観察値と履歴 \( \mathbf{o}_0=\{o_{1, 0}, \cdots, o_{n, 0}\} \) および \( \mathbf{h}_0=\{h_{1, 0}, \cdots, h_{n, 0}\} \) を提供します。 各ターンで、エージェントは現在の観察値と行動履歴 \( \mathbf{h}_t \) から共同応答のグループ \( \mathbf{a}^{\mathcal{G}}_t\gets\boldsymbol{\pi}^{\mathcal{G}}(\cdot|\mathbf{h}_t) \) を生成します。 各応答は、異なる rollout を開始します。 エージェントは、累積された履歴と現在の共同行動 \( \mathbf{a}^{(g)}_{t} \in \mathbf{a}^{\mathcal{G}}_{t} \) に基づいて、各応答に対して共同報酬 \( r^{(g)}_{t} \) を受け取ります。 各 rollout は独立して進化 し、環境が変化するにつれて新しい共同観察値 \( \mathbf{o}^{\mathcal{G}}_{t+1} \) を生成し、次のターンで rollouts に分岐します \( t+1 \)。 このプロセスは、ターミナルターン \( H \) に達するまで続きます。
共同モード#
MAGRPO は、各ターンで共同応答を形成するための 2 つのモードをサポートします:
- 一致 (
joint_mode="aligned"): 同じ生成インデックスを持つ応答は、エージェント間で統合されます。各エージェントはサンプリング \( G \) 応答 (固定されたnum_generations値) 各ノードで。 \( T \) ターンごとに終了せず、木構造は \( G^T \) 残差.
- クロス (
joint_mode="cross"): エージェントのサンプリングされた応答のカルテシアン積は、各ノードで共同アクション \( G^N \) を生成します。 早期終了なしの場合、ツリーには \( G^{N \cdot T} \) のリーフがあります。 応答は組み合わせで再利用されるため、共同サンプルは独立していません。 これにより、報酬の評価数と rollout のサイズが増加しますが、より正確な価値の推定を保証するわけではありません。
rollouts が独立して進化するため、rollout からの応答のみを組み合わせることができます。 現在の MAGRPO 実装は、割引なしの収益を累積します:
discountはツリー再帰を変更しません。 MAREINFORCE は収益の集約と利点正規化について説明します。
複数ターン MAAC/IAC#
MAGRPO rollout ツリーは、episode ごとに多数のサンプルを生成します。 複数ターン設定では、MAAC/IAC はエージェントごとにターンごとに 1 つのサンプルのみを生成し、episode はターンの終了まで継続します。
MAAC/IAC は 1 ステップのテンポラル・ディファレンス目標を使用し、discount は次の rollout の価値に適用され、最終ターンまたは早期終了したターン後にブートストラップは行われません。 現在の実装では、episode の完全な収集後にサンプルをバッファします。 ポリシーの更新は、rollout_buffer_size に到達したときに発生し、残りのバッファは epoch の終了時にフラッシュされます。 同じ episode のターンの間でポリシーは更新されません。
IAC/MAAC の複数ターン学習では、
num_generationsを 1 に設定する必要があります。
環境遷移#
外部フィードバック機構は、後続のターンにおけるプロンプトへの環境観測の組み込み方法を制御します。 これらの機構は通常、CoMLRL の下流環境に実装されます。
カスタム外部フィードバック#
ユーザーは、次のインターフェースを持つ関数を定義することで、カスタム外部フィードバックを実装できます:
prompt: 元のタスクプロンプトまたは問題の説明 (必須)agent_completions: 以前のターンからの完了のリストまたはタプル、エージェントごとに 1 つ (必須)num_agents: システム内のエージェント数 (必須)prompt_history_per_agent: 各エージェントに対する、以前のプロンプトのリストを含むリスト (任意)response_history_per_agent: 各エージェントに対する、以前の応答のリストを含むリスト (任意)
関数は、各エージェントに対する次のターンのプロンプトのリストまたはタプルを返す必要があります。
trainer は、上記の引数のみを受け取り、追加のキーワード引数は含まれません。 モード固有のパラメータは、クロージャーまたは functools.partial を使用して構成できます。
デフォルトでは、返された各プロンプトが新しい prompt フィールドになり、対応するエージェントのフォーマッタを介して渡されます。
external_prompt_passthrough=True の場合、返されたプロンプトは再フォーマットせずに直接使用されます。
MAGRPO では、各 rollout 分岐に対して外部遷移が呼び出され、その分岐の履歴が含まれます。
次の例は、次のターンのプロンプトを構築します:
from typing import List, Optional
def custom_external(
prompt: str,
agent_completions: List[str],
num_agents: int,
prompt_history_per_agent: Optional[List[List[str]]] = None,
response_history_per_agent: Optional[List[List[str]]] = None,
) -> List[str]:
# Custom logic to format next-turn prompts
# Access environment feedback, tool outputs, etc.
next_turn_prompts = []
for i in range(num_agents):
# Format prompt for agent i based on history and feedback
next_prompt = f"{prompt}\nPrevious attempt: {agent_completions[i]}\nPlease revise."
next_turn_prompts.append(next_prompt)
return next_turn_prompts例: モード#
コード生成のための 環境 には、3 つの例のエクスポート遷移モードが含まれています:
external.mode=expert_edits: 外部 LLM (デフォルト: DeepSeek-Coder) がコードの編集を提案します。 続行プロンプトには、編集の提案と以前のターンのコンテキストが含まれます。 必要な API キーを使用すると、ユーザーはexpert_modelを使用して、別の専門家 (例: Claude, GPT) を選択できます。
external.mode=level_feedback: 静的な AST のチェックと動的コード実行により診断が可能。 デフォルトでは、サンドボックスには最初のテストのみが含まれます。sandbox_sliceパラメータは、すべてのテスト (0、None、または ‘all’) または特定のテスト数 (負の値もサポート) を選択します。
external.mode=plain: この自己改善モードには、過去のターンからのプロンプトと応答、および修正指示のみが含まれます。