本文へ移動
CoMLRL
複数の LLM と RL

複数ターンインタラクション

translategemma:4b による自動翻訳 英語の原文

多くの複雑な問題を解決するには、複数のターンが必要。LLM エージェントは、システム内の他のモデルやツールから有用なフィードバックを得るために、環境と相互作用する

マルチターン MAGRPO#

マルチターン MAGRPO は、異なる共同応答 (TreeRPO) を表す rollout ツリーを構築します。

共同 rollout 構造 共同の観察と行動が独立した rollouts に分岐

各 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 のサイズが増加しますが、より正確な価値の推定を保証するわけではありません。
クロス共同応答 カルテシアン積が、各 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 のターンの間でポリシーは更新されません。

Actor-critic 軌跡 一つの共同応答がターンごとに進み、episode を左から右へ進める

IAC/MAAC の複数ターン学習では、num_generations を 1 に設定する必要があります。

環境遷移#

外部フィードバック機構は、後続のターンにおけるプロンプトへの環境観測の組み込み方法を制御します。 これらの機構は通常、CoMLRL の下流環境に実装されます。

環境遷移 ターン t において、エージェントの応答が外部遷移に入り、各エージェントはターン t+1 に自身の観察を返す

カスタム外部フィードバック#

ユーザーは、次のインターフェースを持つ関数を定義することで、カスタム外部フィードバックを実装できます:

外部フィードバック パラメータ
  • 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: この自己改善モードには、過去のターンからのプロンプトと応答、および修正指示のみが含まれます。