CaPtain이 4B 오픈 VLM을 코드 정책 로봇 에이전트로 학습시킨다
CaPtain: A Pipeline for Post-Training Code-as-Policy Robot Agents
무엇인가
이 논문은 로봇 조작을 코드 정책(code-as-policy)으로 다루는 에이전트를 작은 오픈 VLM으로 직접 학습시키는 문제를 푼다. 기존 CaP 에이전트는 테스트 때 폐쇄형 프런티어 모델을 호출하거나, 미리 학습된 VLA와 grasp·place 같은 고수준 스킬에 조작을 위임했다. 그 결과 조작의 세부 결정은 학습 가능한 정책 밖에 남고, 작은 오픈 VLM은 하네스에서 바로는 거의 실패한다. 논문은 Qwen3.5-4B가 CaPtain-Harness에서 zero-shot으로 LIBERO 에피소드를 하나도 풀지 못했다고 보고한다. 저자들은 테스트 때 VLA, 프런티어 모델, 특권 상태 없이 저수준 프리미티브 위에서 SFT와 다중 턴 RL로 학습하는 완전한 레시피가 빠져 있다고 본다.
어떻게 동작하나
CaPtain-Harness는 정책이 코드로 호출하는 22개의 저수준 인지·기하 측정·가드된 모션 프리미티브와 finish()를 제공한다. grasp, place, open-drawer 같은 스킬도 VLA도 없다. 에이전트는 observe, segment, point, mark_point, track_target 같은 인지 호출과 move_to, hold, recover, release 같은 모션 호출을 사용해 어디를 어떻게 잡고 언제 조를 닫을지 스스로 정한다. 각 호출은 정지 이유, 실행 거리, 최대 힘, 조 개폐, 감지 대상의 위치와 목적지까지의 오프셋 같은 구조화된 영수증(receipt)을 반환한다. 실행은 ReAct식 루프로 진행되며, 요청마다 모델이 추론과 python 호출을 내고 하네스가 결과를 이력에 붙인다. 파이썬 세션은 요청 사이에 변수를 유지하고, 문맥 관리를 위해 오래된 턴을 압축한다. 에피소드는 최대 60요청이며, 호스트의 완료 게이트가 finish()를 검증한다. 정책이 보는 API는 LIBERO, RoboTwin 2.0, RoboDojo, SimplerEnv, CaP-Bench, 실제 로봇에서 동일하다.
무엇과 다른가
SFT 단계는 GPT-6 Astra로 하네스 안에서 생성한 합성 궤적을 사용한다. 궤적은 배포 때와 같은 채팅 템플릿, 시스템 프롬프트, TASK.md, 도구 스키마, 영수증 형식으로 렌더링된다. Qwen3.5-4B를 시작점으로, 손실은 에이전트가 생성한 토큰에만 걸고 반복 실행 실패나 복구 루프가 있는 턴은 가중치 0으로 마스킹한다. 시각 질의응답 예제는 가중치 0.5로 더한다. 모델이 이전 mark_point 좌표를 복사하지 않고 현재 이미지를 보게 하려고, SFT 중 이전 좌표를 확률 0.2로 마스크 토큰으로 바꾼다. 언어모델 전체 가중치는 미세조정하되 비전 타워는 고정한다.
어떻게 쓰나
RL 단계의 핵심은 수십 개 요청 뒤에야 드러나는 물리적 효과를 단일 에피소드 결과로부터 요청별로 배분하는 것이다. 학습은 시뮬레이터에서 돌기 때문에 정책이 볼 수 없는 특권 물리 상태 s_t를 요청 전에 저장한다. 이로부터 말단장치·조 상태, 목표 진행, 거리, 목표물 들어올림·변위, 관절 위치와 파지 플래그 등 36개 특징을 계산하되, 정책 자신의 행동 횟수 같은 시간 대리 변수는 의도적으로 제외한다. 크리틱 V(s_t,t)는 이 특징과 요청 인덱스, 과제 임베딩을 입력으로 받는 5개 소형 MLP 앙상블로 최종 성공 확률을 예측하고, 이전 정책 에피소드로 워밍스타트한 뒤 온라인으로 BCE 학습한다. 요청별 신용은 δ_t = c_t + V(s_{t+1}, t) - V(s_t, t)로 정의하고 마지막 요청은 δ_T = c_T + R_i - V(s_T, T)로 둔다. 두 값을 같은 인덱스 t에서 평가하므로 시간 경과만으로는 신용이 생기지 않고, 인지·검증만 한 요청은 거의 0의 신용을 받는다. 여기에 λ=0.9의 GAE와 같은 시작 상태에서 4회 롤아웃한 그룹 상대 결과 항을 더한다. 반환은 finish()를 포함한 성공 1, finish() 없는 성공 0.25, 기타 실패 0, 예산 소진 -0.1, 실패 상태에서의 거짓 finish() -0.3이며, 실패·거부된 물리 행동과 과도한 행동, 장면이 이미 해결된 뒤의 행동에 비용을 준다. 정책 갱신은 SAO식 스트리밍 단일 패스로 하되 토큰 비율이 0.2에서 4를 벗어나면 버리고, SFT 모델과의 KL 항을 둔다. 긴 에피소드 비용을 줄이려고 궤적당 최대 8개 요청만 정책 경사에 쓰고 크리틱은 모든 요청을 쓴다. 그래디언트는 1,024 에피소드마다 누적한다.
전제와 한계
실험은 40개 원본 LIBERO 과제로만 학습하고, 평가는 공식 held-out 초기 상태 11~16의 240 에피소드와 LIBERO-PRO, LIBERO-Plus, LIBERO-MAX 변형 스위트에서 한다. Qwen3.5-4B는 0%에서 SFT 후 55.4%, RL 후 73.8%의 held-out LIBERO 성공률을 보였다. 엄격 성공률은 52.1%에서 67.5%로 오르고, 거짓 finish() 비율은 7.1%에서 2.1%로 줄며, 에피소드당 평균 요청 수는 39.1에서 32.6으로 감소했다. RL 이득은 goal 스위트 +26.7, spatial +18.3, long-horizon +13.3으로, 학습 없는 Qwen3.5-4B는 어느 스위트에서도 최대 0.3%에 그쳤다. LIBERO-PRO 3개 단기 스위트 평균은 78.5%로 K1 77.2%, WAA 75.6%, ASPIRE 71.7%를 넘었고, held-out 초기 상태 11에서는 74.6%, SFT 모델은 57.8%였다. RL 이득은 LIBERO-PRO 3개 스위트 +19.0(4개 전체 +19.4), LIBERO-Plus +17.6, LIBERO-MAX Dynamic +21.2와 Base +18.8로 변형에서도 유지됐다. LIBERO-Plus의 7개 변형 차원은 모두 p<0.05로 개선됐고 6개는 Bonferroni 보정 후에도 살아남았으며, 조명 +23, 카메라·물체 배치·로봇 초기 상태 +18, 센서 노이즈 +13이었다. LIBERO 한 에피소드는 평균 32.6요청, 16.6 물리 행동, 7.3k 출력 토큰, 8개 에피소드를 공유한 GPU에서 417초가 걸려 약 52 GPU초, GPU 시간당 2~4달러 기준 0.03~0.06달러로 추정됐다. 이는 기존 코드 에이전트의 0.18~0.24달러에서 8~22달러보다 낮다.
학습 없이 다른 벤치마크로 옮긴 결과도 제시된다. SimplerEnv WidowX 4과제 24개 시각 매칭 에피소드에서 평균 83.3%(spoon on towel 75.0, carrot on plate 79.2, block stacking 91.7, eggplant in basket 87.5)를 냈다. CaP-Bench에서는 75.0으로 Gemini-3-Pro 73.5, GPT-5.2 55.5, Claude Opus 4.5 54.0, CaP-Bench에서 CaP-RL로 학습한 7B 코더 62.0을 넘었다. CaP-Bench의 다중 턴 RL은 55.0(SFT)에서 75.0으로 올렸고, 같은 하네스의 미학습 Qwen3.5-4B는 5.0이었다. 전체 에피소드 호라이즌을 허용하면 Cube Lift 20/20, Cube Stack 19/20으로 평균 97.5% 성공을 보여, 75.0과 97.5%의 차이는 과제 실패보다 CaP-Gym의 스텝 컷오프 대비 실행 속도 차이라고 설명한다. 반면 RoboTwin 2.0은 전체 50과제 22.6%, 단일 팔 하위 집합 30.0%였고, RoboDojo는 전체 0.8% 성공, 점수 1.7로 GPT-6 Astra의 29.0에는 크게 못 미쳤다. 실제 로봇에서는 Astrabot XR1에 하드웨어 백엔드를 붙여, 실제 데이터 없이 XR1의 거친 시뮬레이션 트윈 에피소드로만 적응한 체크포인트로 황색 큐브를 나무 트레이에 넣기와 간접 지시로 색·모양을 먼저 해석해야 하는 두 과제를 완료했다. 크리틱은 테스트 때 쓰지 않는다.
크리틱 분석은 신용이 실제 물리 조작 결정에 집중됨을 보여준다. 이전 9B 정책의 15k 에피소드, 573k 요청 상태를 오프라인 분석한 결과 최종 성공 예측 AUC는 0.970, 같은 시작 상태 그룹 내 AUC는 0.904, 보정 오차는 0.006이었고, 4B RL에 쓴 워밍스타트 크리틱은 held-out AUC 0.907이었다. 성공한 파지는 ΔV 중앙값 +0.058, 실패한 파지는 -0.0075, 인지만 한 요청은 -0.0002였다. 전체 |A| 질량의 65%가 모션, 14%가 파지, 14%가 놓기에 배정되고 인지만 한 턴은 1.3%에 불과했다. 정책 행동 카운터나 언어모델 은닉 상태를 크리틱에 넣으면 시간 대리 변수와 누출이 생겨 인지 턴에 부정 신용이 몰릴 수 있어, 저자들은 특권 물리 상태와 고정 시간 인덱스만 쓰는 설계를 강조한다. 개발자 관점에서 이 논문은 로봇 조작을 범용 코드 에이전트처럼 후처리하는 구성을 보여준다. 구조화된 영수증을 주는 실행 하네스, 그 하네스 안에서의 SFT, 시뮬레이터 특권 상태를 쓰는 다중 턴 RL 크리틱이 핵심이며, 테스트 때는 카메라와 영수증만으로 동작하고 프런티어 호출이나 VLA가 필요 없다. 로봇뿐 아니라 도구 호출 에이전트에서 지연된 결과의 요청별 신용 배분을 설계할 때 참고할 만하다.
저자들이 밝힌 한계는 분명하다. RL은 40개 LIBERO 과제와 단일 7-DoF 팔에서만 학습했으며, 단일 팔 과제와 다른 몸체로 zero-shot 전이되지만 교차 벤치마크 성능은 도메인 내 정확도보다 낮고 동시 양팔 협응이나 낯선 6-DoF 팔의 좁은 도달 범위는 아직 다루지 못한다. 시뮬레이터 크리틱은 정확한 시뮬레이터 상태에 의존한다. 오프라인 민감도 연구에서 정답 물체 자세를 2cm 잡음으로 바꾸면 특권 ΔV와의 상관이 0.49, 5cm에서는 0.36, 정책 자체 인지로는 0.21로 떨어져, 실제 하드웨어에서 온라인 RL을 하려면 외부 상태 추정기가 필요하다. 또한 행동 공간은 22개 프리미티브와 합성 SFT 궤적이 보여준 행동으로 제한되며, Wipe처럼 지속적인 하향 압력을 요구하는 힘 제어 작업은 가드된 직교 위치 프리미티브로 표현할 수 없다.