사람 동작을 보고 배운 휴머노이드(사람 모양 로봇)가 있다. 상자를 밀고, 들고, 나른다. 손끝으로 작은 물건을 집는 것도 제법 한다. 여기 새 지시가 떨어진다. "그 상자를 옆으로 넘어뜨려봐." 로봇이 멈춘다.
이상한 건, 넘어뜨리기에 필요한 동작을 로봇이 다 할 줄 안다는 점이다. 밀기, 기대기, 무게 옮기기 — 부품은 전부 손에 있다. 없는 건 "이 동작들을 이렇게 엮어라"라고 적어 준 지시서뿐이다. 몸은 됐다. 말이 없었다.
InterEvolve라는 로봇 학습법은 여기서 방향을 튼다. 몸을 더 똑똑하게 만들지 않는다. 몸에게 건네는 말을 더 똑똑하게 만든다. 이미 학습을 끝낸 몸(컨트롤러)은 그대로 얼려 두고, 과제를 '보상 프로그램' — 무엇을 하면 잘한 것인지 적은 규칙 묶음 — 으로 바꿔 그 지시서만 고쳐 나간다. 기본기를 익힌 베테랑을 다시 학교에 보내지 않고, 새 작업지시서만 건네는 방식이다.
솔직히 짚자. 이 몸이 처음부터 완전히 준비돼 있던 건 아니다. 기존 휴머노이드 컨트롤러는 제 몸만 봤지 눈앞의 상자는 보지 않았다. 그래서 '상자를 왼쪽으로'와 '오른쪽으로'가 컨트롤러 눈에는 같은 동작으로 뭉개졌다. 추적 실험에서 이 몸만 보는 모델은 상자를 거의 놓쳤다(성공률 8%).
고친 방법은 몸을 통째로 다시 가르치는 게 아니었다. 몸을 담당하는 부분은 얼려 두고, 대상을 읽는 부분만 위에 얹었다. 여기서 '잔차(residual)'라는 말이 나온다 — 기존 것을 다시 만들지 않고, 달라진 차이만 그 위에 덧붙여 배운다는 뜻이다. 중요한 건 이 작업이 딱 한 번이라는 점이다. 상자를 볼 줄 아는 몸을 한 번 만들어 두면, 이후 새 과제가 쏟아져도 몸은 다시 배우지 않는다.
이제 완성된 몸을 두고 지시서만 고친다. 보상 프로그램은 세 조각이다. 무엇을 보상할지, 언제 다음 단계로 넘어갈지, 그 둘을 어떤 숫자로 보정할지. 들기에서 밀기로 바꾸고 싶다면 관절 궤적을 처음부터 짜지 않는다. 대상을 어디로 옮길지에 대한 보상과 단계 조건만 손보면 된다.
지시서는 누가 고치나. 두 개의 루프가 맞물린다. 바깥 루프에서 LLM(사람 말을 다루는 언어 모델)이 프로그램의 '구조'를 바꾼다. 어떤 보상과 단계를 쓸지다. 안쪽 루프에서 수치 최적화기가 그 구조에 딸린 '숫자'를 맞춘다. 왜 나눴을까. 구조가 좋아도 숫자가 틀리면 실패하기 때문이다. 그래서 모든 제안은 심사에 오르기 전 숫자부터 맞춘다. 창의적인 분해는 언어를 다루는 쪽에, 끈질긴 숫자 맞추기는 최적화에 맡긴 분업이다.
심사 기준은 잠가 둔다. 과제가 말로 주어지면 성공 기준(검증기)을 한 번 세우고 고정한다. 에이전트가 기준을 슬쩍 느슨하게 고쳐 과제를 쉽게 만드는 길을 막기 위해서다. 교체도 신중하다. 새 후보는 같은 상황들에서 현재 최고와 겨루고, 상위 후보는 각각 세 번씩 다시 평가된다. 개선폭이 실행마다 생기는 노이즈를 넘을 때만 교체를 승인한다. 운 좋은 한 번을 실력으로 치지 않겠다는 것이다. 이렇게 살아남은 프로그램은 '스킬 라이브러리'에 요약돼, 다음 과제가 백지에서 시작하지 않게 돕는다.
표를 읽기 전에 지표 둘만. SR(성공률)은 과제의 모든 기준과 물리 제약이 한 번의 시도에서 동시에 성립한 비율이다. 넘어지거나 목표를 놓치면 그 시도는 실패다. Earned는 통과한 기준의 평균 비율인데, 함정이 있다. 가만히 서 있기만 해도 기준의 절반 가까이는 저절로 통과한다(아래 Inaction의 Earned 49.1%). 그래서 Earned는 부풀기 쉽다. 진짜 주지표는 SR이다. 아래는 여덟 과제군의 평균이다.
| 프로그램 | 상수 튜닝 | 진화 | SR(%) | Earned(%) |
|---|---|---|---|---|
| Inaction(가만히) | – | – | 0.0 | 49.1 |
| Human(사람 작성) | ✗ | ✗ | 8.0 | 65.2 |
| Agent(초기안) | ✗ | ✗ | 32.2 | 73.3 |
| Human + 튜닝 | ✓ | ✗ | 18.0 | 75.2 |
| Agent + 튜닝 | ✓ | ✗ | 34.6 | 82.5 |
| InterEvolve | ✓ | ✓ | 86.5 | 95.6 |
사람이 소박하게 쓴 보상은 성공률 8%에 그친다. 몸이 역량을 품고 있어도, 손으로 쓴 지시서로는 그 역량을 거의 꺼내지 못한다는 뜻이다. 에이전트가 쓴 초안에 숫자 보정까지 더해도 34.6%, 아직 절반이 안 된다. 구조를 실행 결과로 고치는 '진화'가 붙고서야 86.5%에 올라선다.
이 34.6%에서 86.5%로의 도약 — 약 2.5배 — 이 논문의 한 줄 요약이다. 눈여겨볼 건 숫자의 크기가 아니다. 사람도 쉽게 떠올리지 못한 동작을, 언어 모델의 제안과 진화의 선별이 함께 찾아냈다는 사실이다. 상자를 제자리에서 돌리는 동작은 학습 데이터에 없었다. 진화된 프로그램은 몸을 새로운 방식으로 써서 그걸 해냈다. 시뮬레이션에서 이렇게 찾아낸 기술 일부는 실제 Unitree G1 로봇이 카메라와 센서만으로 스스로 수행했다.
그 '왜'의 바닥에는 분명한 태도가 있다. 이 연구가 좇은 건 정답을 똑같이 베끼는 능력이 아니라, 어떤 상황이 와도 임무를 끝내는 강건함이었다. 성공률이 높다는 건, 정해진 궤적을 완벽히 흉내 내진 못해도 넘어지거나 상자를 완전히 놓치는 치명적 실패를 덜 한다는 뜻이다. 추적 과제의 수치가 이걸 드러내는데, 상세는 부록에 뒀다. 판단을 하나 보태자면 — AI를 실제 현장에 내보낼수록, 벤치마크 점수의 소수점보다 이 강건함이 더 중요해진다.
과장하지 않으려면 선부터 긋자. 컨트롤러는 고정이고, InterEvolve는 몸이 이미 가진 역량을 다시 꺼내 쓸 뿐이다. 몸이 낼 수 있는 동작의 목록(모터 레퍼토리)에 아예 없는 능력을 새로 만들지는 못한다. 그 범위를 벗어난 과제라면 몸 자체를 키워야 한다.
진화가 도는 곳도 분명히 하자. 진화는 시뮬레이션에서 일어난다. 실제 로봇 결과는 거기서 고른 프로그램을 가져와 재생한 것이다. '실기에서 자율로 해냈다'와 '진화가 실기에서 일어났다'는 전혀 다른 말이고, 후자는 사실이 아니다. 성공의 정의가 검증기에 달려 있다는 것도 양날의 칼이다. 그 기준을 누가 어떻게 세우느냐가 해석을 좌우한다. 다룬 물체도 상자류와 작은 물건들이라, 더 다양한 형상·재질로의 일반화는 이 결과만으로 단정할 수 없다.
이 설계가 로보틱스 바깥에서도 읽히는 이유가 여기 있다. '과제의 지시서 자체를 탐색한다'는 발상은, 온틀에서 우리가 매달리는 질문과 같은 자리를 건드린다. AI 에이전트를 어디까지 믿을 수 있는가.
한 장면으로 따라가 보자. 온틀의 AI 프로젝트 매니저에게 고객이 "다음 주 납기를 앞당겨 달라"고 요청한다. 프로젝트 중간에 들어온, 애초 절차엔 없던 일이다. 여기서 우리가 InterEvolve와 공유하는 원칙은 하나다. 제안은 언어 모델이 하되, 실행과 판정은 에이전트가 손댈 수 없는 서버 쪽 결정론 레이어 — 정해진 규칙대로만 처리하고 즉흥 판단이 끼어들지 않는 계층 — 가 맡는다. 에이전트가 "처리했습니다"라고 말로 때우거나 '완료'의 기준을 제 입맛대로 느슨하게 바꾸는 길을 막기 위해서다.
그러려면 '끝났다'를 말이 아니라 조건으로 적어야 한다. 납기 변경이 완료됐다는 건, 예컨대 관련 공정 일정이 새 날짜로 갱신되고, 자재 입고일이 그 앞에 잡히고, 고객이 변경을 수락한 상태가 모두 참일 때다. 이 조건이 참이 되기 전엔 누구도 '완료'를 선언할 수 없다.
다만 로봇 연구와 우리 현장 사이엔 접어 둘 수 없는 차이가 하나 있다. InterEvolve는 후보 지시서를 시뮬레이터에서 수없이 굴려 '이 처리 방식이 낫다'를 미리 검증한다. 거기서는 '노이즈를 넘는 개선일 때만 채택'이 성립한다. 반복할 수 있으니까. 하지만 실제 고객 요청 하나하나엔 그 재시도가 없다. 한 번의 실행이 곧 실제 결과다. 그래서 우리가 반복해서 검증하는 건 '처리 방식'이고, 실제 요청에 대해 할 수 있는 건 위 조건을 통한 '완료 확인'이다. 이 둘은 분리해서 봐야 한다. 그러니 남는 질문은 담백하다. 우리의 '완료'는 정말 사람이 못 건드리는 조건으로 적혀 있는가.
본문에서 뺀 상세 수치와 용어를 모았다.
추적 과제 — 낮은 오차가 곧 높은 성공은 아니다. 정해진 정답 궤적을 그대로 따라가는 과제에서, 전용 추적기 ULTRA는 오차가 가장 낮다(몸 15.68cm, 객체 21.45cm, 성공률 66%). 그런데 InterEvolve의 컨트롤러는 진화 없이도 성공률 60%(27.20/30.80cm)로 근접하고, 추적용 보상을 얹어 진화하면 72%(19.80/24.92cm)로 전용 추적기를 넘어선다. 오차는 ULTRA가 낮은데 성공률은 InterEvolve가 높다. 에이전트가 찾아낸 보상은 '대상을 기준점으로 삼은 흔들림 보정'이었다. 컨트롤러는 제 몸 주변 좌표(자기 중심 좌표)만 본다. 그래서 세계 전체를 기준으로 하면 조금씩 밀려나는데(드리프트) 자기는 그걸 못 본다. 눈앞의 상자를 기준점 삼아 이 사각지대를 메우자, 몸통 기준점(루트)과 상자의 최종 이탈이 거의 절반으로 줄었다(논문 Figure 5).
구성요소 실험 — 어느 조각이 성과를 냈나. 대상의 상태나 몸과 대상 사이 거리 신호를 빼면, 컨트롤러는 제 몸은 그럴듯하게 따라가도 성공은 드물다. 같은 신경망을 얼리지 않고 처음부터 학습시키면 거의 작동하지 않는다. 반대로 몸을 얼린 위에 잔차를 키울수록 성적이 좋아진다. 기본기는 얼린 부분이 나르고 상호작용은 잔차가 배운다는 분업이 숫자로 확인된 셈이다. 상자 여섯 개를 한 번에 다루거나, 작은 물건을 손가락으로 섬세하게 집는 장면까지 나왔다.
비용 — 한 과제군을 완전히 진화시키는 데 단일 GPU로 2.1시간, LLM 토큰 0.23M이 든다. 고정 프로그램(0.6시간, 0.03M)보다 큰 건 다섯 라운드를 돌며 라운드마다 여러 제안의 숫자를 맞추기 때문이다. 라운드 수로 상한을 묶으면 비용의 천장이 분명하다.
용어
아니다. 가중치는 고정이고, 매 라운드 '프롬프트 안에서만' 배운다. 그 프롬프트에는 과제 요청, 장면 맥락, 검증기, 현재 최고 프로그램과 그 실행 피드백, 스킬 라이브러리가 담긴다. 언어 모델은 이 맥락만 보고 구조를 바꾼 새 프로그램 여러 개를 내놓는다.
유효성 검사기가 실행 전에 그런 제안을 걸러낸다. 규칙을 어긴 제안은 아예 실행 단계로 넘어가지 못한다. 검증기를 과제당 한 번 세우고 잠그는 것과 더불어, 에이전트가 과제를 제 입맛대로 쉽게 만드는 두 번째 통로를 막는 장치다.
과제별로 장면, 과제문, 기준별 통과율, 그리고 튜닝까지 끝낸 프로그램(구조와 상수)을 텍스트 문서로 적는다. 그래서 다음 과제는 백지에서 시작하지 않고 이 자산을 조합·변형하는 데서 출발한다.
그게 전통적인 방식이고, 느린 이유도 거기 있다. 보상을 한 번 고칠 때마다 정책을 처음부터 새로 학습시켜야 했다. InterEvolve에서는 고정된 모터 모델이 재학습 없이 실행하므로, 후보 하나를 확인하는 값이 'RL 한 판'이 아니라 '롤아웃 한 묶음'으로 줄어든다. 그래서 여러 후보를 빠르게 돌려 비교할 수 있다.