23. 에이전틱 AI — 행동하는 모델을 정렬하기

시그널의 해상도: 스칼라 하나에서 토큰별 방향으로

스텝마다 보상을 매겨도 그 보상은 "좋았다/나빴다"의 숫자 하나다. 그런데 에이전트가 행동할 때마다 돌아오는 사용자의 답장이나 터미널 에러에는 그보다 훨씬 많은 정보가 들어 있다. 이것을 버리지 않고 학습에 쓸 수 있을까?

쓰면서 배운다 — OpenClaw-RL

OpenClaw-RL(Wang et al., “OpenClaw-RL: Train Any Agent Simply by Talking”, arXiv:2603.10165, 2026년 3월)은 이 물음을 가장 정면으로 다룬다. 출발점은 관찰 하나다: 에이전트가 행동할 때마다 다음 상태가 생긴다. 사용자의 답장, 도구 출력, 터미널 에러, GUI 화면 변화 — 모두 방금 행동에 대한 암묵적 평가인데, 기존 시스템은 이것을 다음 행동의 컨텍스트로만 쓰고 버렸다. OpenClaw-RL은 여기서 두 가지 시그널을 뽑는다.

시스템은 정책 서빙(사용자 요청에 답하도록 모델을 띄워 두기), 환경, PRM 심사, 학습의 네 루프로 분리되어 서로 기다리지 않고 따로 돈다. 서빙을 멈추지 않고 파라미터를 갱신하므로, 온라인 학습의 어려움 중 하나인 "정책을 계속 갱신해야 한다"를 인프라로 푼 셈이다. 드리프트(정책이 조금씩 어긋나는 것)는 KL 벌점과, 위쪽 클립만 넓힌 비대칭 클리핑(Clip-Higher)으로 묶는다. 첫 판(2026년 3월)은 퍼스널 에이전트 실험에서 심사 모델이 매긴 개인화 점수가 0.17에서, 평가 시그널과 방향 시그널을 함께 쓴 갱신 16번 뒤 0.81로 올랐다고 보고했다.

숫자로 보는 토큰별 방향

에이전트가 「파일을 바로 고친다」라고 쓰고 설정 파일을 덮어썼다. 사용자가 「파일을 먼저 확인했어야지」라고 답했다. 이 답장에서 힌트를 뽑아 프롬프트 뒤에 붙이고, 같은 모델에게 방금 쓴 세 토큰의 확률을 다시 묻는다. 토큰마다의 어드밴티지는 힌트를 본 확률과 안 본 확률의 로그 차이다.

A^t=log⁡πθ(yt∣x,h,y<t)−log⁡πθ(yt∣x,y<t) \textcolor{#8e44ad}{\hat A_t} = \log \textcolor{#1565c0}{\pi_\theta}(\textcolor{#1c9c60}{y_t} \mid \textcolor{#0093b8}{x}, \textcolor{#cc00ff}{h}, \textcolor{#1c9c60}{y_{<t}}) - \log \textcolor{#1565c0}{\pi_\theta}(\textcolor{#1c9c60}{y_t} \mid \textcolor{#0093b8}{x}, \textcolor{#1c9c60}{y_{<t}})
A^t토큰 t의 어드밴티지. 양수면 그 토큰을 밀어 주고 음수면 누른다πθ학습 중인 정책. 교사와 학생이 같은 모델이다.x원래 프롬프트h다음 상태(사용자의 답장)에서 뽑은 힌트yt, y<t에이전트가 쓴 토큰 t와 그 앞의 토큰들 \small\begin{array}{ll} \textcolor{#8e44ad}{\hat A_t} & \text{토큰 } t \text{의 어드밴티지. 양수면 그 토큰을 밀어 주고 음수면 누른다} \\ \textcolor{#1565c0}{\pi_\theta} & \text{학습 중인 정책. 교사와 학생이 같은 모델이다.} \\ \textcolor{#0093b8}{x} & \text{원래 프롬프트} \\ \textcolor{#cc00ff}{h} & \text{다음 상태(사용자의 답장)에서 뽑은 힌트} \\ \textcolor{#1c9c60}{y_t},\ \textcolor{#1c9c60}{y_{<t}} & \text{에이전트가 쓴 토큰 } t \text{와 그 앞의 토큰들} \end{array}
토큰 힌트 없이 (학생) 힌트를 보고 (교사) A^t\textcolor{#8e44ad}{\hat A_t}
「파일을」 0.55 0.60 +0.087
「바로」 0.50 0.05 −2.303
「고친다」 0.70 0.40 −0.560

확률은 설명을 위해 정한 예시다. 스칼라 보상이었다면 세 토큰이 같은 크기의 벌을 받았을 것이다. 토큰별 어드밴티지는 벌의 대부분을 「바로」에 몰고, 「파일을」은 오히려 조금 밀어 준다. 「먼저 확인했어야지」라는 말이 가리키던 곳이 정확히 「바로」였다.

해상도 스펙트럼

이 흐름을 시그널의 해상도로 보면 여러 알고리즘이 한 줄로 이어진다. DPO는 쌍 전체에 마진 하나(시퀀스 수준 스칼라), GRPO는 그룹 안의 상대 점수 하나(에피소드 수준 스칼라), PRM은 스텝마다 보상 하나, OPD는 토큰마다 방향 — "스칼라 보상 하나로는 무엇이 달라져야 하는지에 대한 정보를 버린다"는 문제에 대한 가장 직접적인 대답이다(아래 그림).

graph LR
    subgraph resolution["시그널 해상도 스펙트럼"]
        direction LR
        DPO["<b>DPO</b><br/>시퀀스 수준<br/>스칼라 1개"] --> GRPO["<b>GRPO</b><br/>에피소드 수준<br/>그룹 상대"] --> PRM["<b>PRM</b><br/>스텝 수준<br/>매 행동 보상"] --> OPD["<b>OPD</b><br/>토큰 수준<br/>방향 시그널"]
    end

    class DPO m-red
    class GRPO m-orange
    class PRM m-green
    class OPD m-blue
    class OPD m-strong

해상도를 토큰까지 내리면, 궤적 수준의 점수 하나를 토큰들에게 어떻게 나눠 주는지도 따져야 한다. 궤적 길이가 제각각인 에이전트에서는 이 나눗셈 하나가 습관을 바꾼다. 원래 GRPO는 궤적마다 손실을 그 궤적의 토큰 수로 나눠 평균낸다. 2025년 3월 리우(Zichen Liu)와 동료들은 GRPO가 나누는 두 곳, 곧 길이로 나누기와 그룹 표준편차로 나누기가 학습에 의도하지 않은 편향을 넣는다고 짚고, 이 두 나눗셈을 고친 변형을 Dr. GRPO라 불렀다. 길이로 나누기가 에이전트에게 무엇을 가르치는지는 아래 문제에서 계산한다.

문제 9 — (킬러) 길게 틀리면 덜 혼난다

원래 GRPO는 응답마다 손실을 토큰 수 ∣oi∣\textcolor{#915a08}{|o_i|}로 나눠 평균낸다. 같은 태스크의 네 궤적이 있다: 짧은 성공(100토큰), 긴 성공(1000토큰), 짧은 실패(100토큰), 긴 실패(1000토큰). 어드밴티지는 성공 +1, 실패 −1이다. (가) 각 궤적에서 토큰 하나가 받는 그래디언트 가중치(곱하는 수 — 신경망 파라미터가 아니다) A^i/∣oi∣\textcolor{#8e44ad}{\hat A_i} / \textcolor{#915a08}{|o_i|}를 구하시오. (나) 토큰 하나당 가장 약한 벌을 받는 것은 어느 궤적인가? 에이전트는 어떤 습관을 배우게 되는가? (다) Dr. GRPO는 1/∣oi∣1/\textcolor{#915a08}{|o_i|} 대신 모든 궤적을 같은 상수로 나눈다. 상수가 1000이면 네 궤적에서 토큰 하나의 가중치와 궤적 하나의 가중치 합은 각각 얼마인가? (나)의 습관은 남는가? 왜 에이전트에서 길이로 나누기의 문제가 더 커지는가?

선생님 (평상)
선생님
(가)부터 볼까요.
김민준 (평상)
김민준
짧은 성공 +1/100 = +0.01, 긴 성공 +0.001, 짧은 실패 −0.01, 긴 실패 −0.001.
선생님 (질문)
선생님
(나) 토큰 하나당 가장 덜 혼나는 건요?
김민준 (자신만만)
김민준
긴 궤적이 토큰이 많으니까 전체적으로 그래디언트를 더 많이 받죠. 긴 게 더 크게 움직여요.
이서연 (의심)
이서연
그건 1/|o|로 나누기 전 얘기 아니야? 나누면 궤적 하나가 받는 총합은 토큰 수와 상관없이 딱 A^\textcolor{#8e44ad}{\hat A}야. 1000 × 0.001 = 1, 100 × 0.01 = 1. 그러니까 길이에 공정해.
선생님 (질문)
선생님
서연 학생 말대로 총합은 같아요. 그런데 그래디언트는 총합이 아니라 토큰 하나하나의 로그확률에 붙어요. “쓸데없이 같은 파일을 다시 읽는” 토큰 패턴이 긴 실패 궤적에 들어 있다면, 그 토큰은 얼마나 혼나죠?
이서연 (생각)
이서연
−0.001이요. 짧은 실패에 있었다면 −0.01.
이서연 (깨달음)
이서연
같은 나쁜 습관이 긴 궤적 안에 있으면 10배 덜 혼나네요. 총합이 공정하다고 토큰마다 공정한 건 아니었어요.
이서연 (평상)
이서연
확률론 수업에서 전체 평균이 같아도 각 개체가 받는 몫은 다를 수 있다는 거요. 기대값이 같다고 분포가 같은 건 아니죠.
김민준 (놀람)
김민준
그럼 실패할 것 같으면 길게 늘어놓는 게 이득인 거네요. 성공은 짧게 하는 게 이득이고.
선생님 (평상)
선생님
그래요. 민준 학생은 나누기 전의 "토큰이 많으면 힘이 세다"로 봤고, 서연 학생은 궤적 총합만 봤어요. 결과적으로 GRPO는 "틀릴 때는 길게"를 가르쳐요. (다)로 가 볼까요. 1/|o| 대신 상수 1000으로 나누면요?
김민준 (평상)
김민준
네 궤적 모두 토큰 하나가 ±0.001이에요.
이서연 (의심)
이서연
그럼 이번엔 궤적 총합이 짧은 성공 +0.1, 긴 성공 +1, 짧은 실패 −0.1, 긴 실패 −1이네. 긴 실패가 짧은 실패보다 10배 혼나잖아. 이번엔 반대로 불공평한 거 아니야?
선생님 (질문)
선생님
서연 학생, 긴 실패의 토큰 하나하나는 짧은 실패의 토큰보다 더 혼나나요?
이서연 (깨달음)
이서연
아니요, 똑같이 −0.001이에요. 총합이 큰 건 혼날 토큰이 열 배 많아서일 뿐이에요. 같은 나쁜 습관은 어느 궤적에 있든 똑같이 혼나니까, 길게 써서 벌을 피할 길이 없어졌어요.
김민준 (평상)
김민준
에이전트는 궤적이 수십 턴이니까 길이 차이가 훨씬 크겠네요. 100 대 1000이 아니라 1천 대 5만일 수도 있고.
김민준 (평상)
김민준
보고서 쓸 때 "틀린 부분이 전체 분량에서 차지하는 비율로 감점"하면, 틀린 내용을 긴 보고서에 묻는 게 유리해지는 거랑 같아요.

정리 (가) 짧은 성공 +0.01, 긴 성공 +0.001, 짧은 실패 −0.01, 긴 실패 −0.001. (나) 긴 실패의 토큰이 가장 약하게 벌을 받는다(짧은 실패의 1/10). 궤적 총합은 모두 ±1\pm 1로 같지만 토큰별 몫이 다르다. 결과적으로 “틀릴 때는 길게” 쓰는 습관이 강화된다. (다) 상수 1000으로 나누면 토큰 하나는 네 궤적 모두 ±0.001, 궤적 총합은 짧은 궤적 ±0.1, 긴 궤적 ±1이다. 토큰마다 몫이 같으니 길게 써서 벌을 피할 수 없고 (나)의 습관이 사라진다. 에이전트 궤적은 길이 편차가 훨씬 커서 길이로 나눌 때의 편향이 증폭된다.