많은 복잡한 문제는 해결하기 위해 여러 턴이 필요합니다. LLM 에이전트는 시스템 내의 다른 모델 또는 도구로부터 유용한 피드백을 얻기 위해 환경과 상호 작용합니다.
다중 턴 MAGRPO#
다중 턴 MAGRPO는 rollout 트리를 생성하며, 이 트리의 가지는 서로 다른 공동 응답을 나타냅니다 (TreeRPO).
각 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} \)을 생성하고 다음 턴 \( t+1 \)에서 추가적인 rollouts으로 분기합니다. 이 프로세스는 최종 턴 \( H \)에 도달할 때까지 지속됩니다.
공동 모드#
MAGRPO는 각 턴에서 공동 응답을 형성하기 위한 두 가지 모드를 지원합니다:
- 일치 (
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는 각 에이전트당 턴당 하나의 샘플만 생성하며, episode는 종료될 때까지 턴을 통해 지속됩니다.
MAAC/IAC는 단일 단계의 템포럴-차이 목표를 사용하며, discount는 다음 rollout 값에 적용되며, 최종 또는 조기 종료된 턴 이후에는 보팅이 수행되지 않습니다. 현재 구현은 전체 episode를 수집한 다음 샘플을 버퍼에 저장합니다. 정책 업데이트는 rollout_buffer_size에 도달할 때 발생하며, epoch의 끝에서 남아있는 버퍼가 플러시됩니다. 동일한 episode의 턴 사이에 정책은 업데이트되지 않습니다.
IAC/MAAC 다중 턴 훈련에는
num_generations를 1로 설정해야 합니다.
환경 전환#
외부 피드백 메커니즘은 환경 관찰이 후속 턴에 대한 프롬프트에 통합되는 방식을 제어합니다. 이러한 메커니즘은 일반적으로 CoMLRL의 하위 환경에 구현됩니다.
사용자 지정 외부 피드백#
사용자는 다음 인터페이스를 가진 함수를 정의하여 사용자 지정 외부 피드백을 구현할 수 있습니다:
prompt: 원본 작업 프롬프트 또는 문제 설명 (필수)agent_completions: 이전 턴의 완료 목록 또는 튜플, 에이전트당 하나 (필수)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예시 모드#
코드 생성 환경은 세 가지 예시 외부 전환 모드를 포함합니다:
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: 이 자기 개선 모드는 이전 턴의 프롬프트와 응답 및 수정 지시만 포함합니다.