28. 에이전틱 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는 토큰마다 방향이다. 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이다. 토큰마다 가중치가 같으니 길게 써서 벌을 피할 수 없고 (나)의 습관이 사라진다. 에이전트 궤적은 길이 편차가 훨씬 커서 길이로 나눌 때의 편향이 증폭된다.