내가 1년 전에 만든 비자율(Non-Autoregressive) 의사결정 모델. 그런데 최첨단 연구소에서 '획기적인' 것이라고 부르다
요약
작성자는 1년 전부터 개발해 온 비자율(Non-Autoregressive) 의사결정 모델에 대해 설명하며, 최첨단 연구소에서 유사한 개념을 '획기적인' 것처럼 발표하는 상황에 대한 좌절감을 표출합니다. 본 글은 자신의 오픈소스 RL Agent를 소개하고, 기존의 LLM 기반 접근 방식보다 빠르고 효율적인 System 1 의사결정 모델의 아키텍처와 원리를 공유합니다.
핵심 포인트
- 비자율(Non-Autoregressive) 모델이 빠른 확률 예측을 제공하며 미래 기술로 주목받고 있습니다.
- 작성자는 오픈소스 RL Agent를 구축하여, 경쟁 제품보다 4배 빠르고 100% 공개된 시스템을 제시했습니다.
- 핵심은 임베딩이나 자율 LLM이 아닌 강화학습(RL) 자체에 기반한 의사결정 프레임워크입니다.
- 본 글에서는 RLCD 아키텍처와 비자율 모델의 수학적 원리를 상세히 다룰 예정입니다.
2025년 3월의 RL 변환 궤적에 관한 arXiv 논문부터, RLCD를 사용한 40ms 미만의 오픈 웨이트 System 1 의사결정 엔진 구축까지.
지금 AI 분야의 모든 사람들이 이야기하는 새로운 종류의 모델이 있습니다. 이는 자율(auto-regressive) 방식이 아니며, 텍스트를 생성하지 않고, 구조화된 JSON 스키마에 걸쳐 번개처럼 빠른 확률 예측을 제공하는 아키텍처입니다.
온라인에서 이러한 과대광고(hype)를 보는 것은 인정받는 느낌과 깊은 좌절감을 동시에 느끼게 합니다.
저는 이 작업을 정확히 1년 전인 2025년 3월에 했습니다. 저는 몇 달 동안의 노력, 땀, 그리고 잠 못 이루던 밤을 보내며 이를 구축했고, arXiv 논문(arXiv:2503.23303)을 발표했으며, Hugging Face에 모델 가중치(sales-conversion-model-reinf-learning)를 공개하고, 오픈 데이터셋(saas-sales-conversations)을 발표했으며, PyPi 패키지를 구축했고, 전체 접근 방식을 Reddit(r/LocalLLaMA 게시물)에 올렸습니다.
그리고 2025년 9월에는 강화학습(reinforcement learning)으로 안내되는 스키마 기반 의사결정의 정확한 프레임워크를 제시하는 두 번째 논문(arXiv:2510.01237)을 발표했습니다. 궁금해하시는 분들을 위해 말씀드리자면, 제 시스템에서 안내 역할을 한 핵심은 항상 임베딩 모델이나 자율 LLM이 아니라 강화학습 그 자체였습니다.
그리고 2026년 9월에, TypeSafe AI라는 자금력이 풍부한 최첨단 연구소(OpenAI의 ChatGPT 공동 개발자인 Diogo Almeida가 설립)가 Jev를 출시했습니다. 그들은 우리가 제시했던 것과 정확히 동일한 비자율 의사결정 개념을 마치 완전히 새로운 과학적 돌파구인 것처럼 제안했습니다. 다만, 그들은 기술 논문이나 오픈 웨이트, 그리고 공개된 학습 데이터셋 없이 이를 출시했다는 점이 달랐습니다.
제가 이전에 사용했던 모델은 순차적인 표현(sequence representations)에 대한 PPO를 사용하여 수직적 영업 대화에서 턴별 변환 궤적(0.0에서 1.0까지의 확률)을 출력했습니다. Jev는 RLCD(Reinforcement Learning for Calibrated Decisions)라고 부르는 것을 사용해 병렬 샘플링을 일반화하여, 신뢰도 분포와 스키마 선택을 수평적으로 출력하며, 입력 토큰 백만 개당 $0.042를 청구하고 일반적인 응답 시간은 약 150ms였습니다.
오픈소스 연구자로서 몇 달 동안 공들인 작업이 수직적(vertical) 사용 사례를 위해 구축되었다는 이유로 간과되고, 자금이 지원된 연구소에서 동일한 핵심 아이디어를 수평적으로(horizontally) 패키징하여 모든 영광을 차지하는 상황은 정말 좌절스럽습니다. 하지만 이것이 일반적인 오픈소스 이야기입니다 🙂.
씁쓸함에 머무는 대신, 저는 2025년 3월과 2025년 9월 논문에서 배운 모든 것을 활용하고, 이전 접근 방식의 모든 아키텍처적 한계를 수정하여 완전히 개방적이고 수평적인 System 1 의사결정 모델인 RL Agent를 구축하기로 결정했습니다.
그리고 저희가 양방향 인코더(bidirectional encoder) 위에 제대로 구축했기 때문에, 저희 모델은 GPU에서 33ms에서 38ms에 작동하여, Jev가 발표한 150ms 지연 시간보다 약 4배 빠르며, 100% 오픈소스입니다.
작동 방식 전체 이야기, 엄격하게 올바른 점수화 규칙(strictly proper scoring rules)을 사용한 RLCD의 아키텍처와 수학적 원리, 그리고 왜 비자율(non-autoregressive) 의사결정 모델이 미래인지에 대해 알려드리겠습니다.
현대의 모든 AI 파이프라인에는 거대한 병목 현상이 있습니다. 우리는 간단한 반사 신경 결정(reflex decisions)을 위해 생성형 LLM(Large Language Model)을 사용합니다.
고객 지원 티켓이 도착하거나, 이메일이 받은 편지함에 들어오거나, 사용자가 API로 프롬프트를 제출할 때, 여러분은 보통 몇 가지 간단한 질문에만 답하면 됩니다:
- 이것은 어느 부서로 보내야 하나요?
- 이 이메일은 피싱 공격인가요?
- 이 프롬프트가 시스템을 탈옥(jailbreak)하려고 하는 건가요?
- 이 문제는 0부터 3까지의 척도로 얼마나 긴급한가요?
이런 용도로 8B 또는 70B 생성형 LLM을 호출하는 것은 지나친 과잉입니다. 토큰 스트리밍을 위해 500ms에서 2,000ms를 기다리고, 추론(inference)에 실제 돈을 쓰고, 그런 다음 비정형 텍스트에서 깨끗한 레이블을 추출하기 위해 정규 표현식(regex)이나 JSON 파서를 작성해야 합니다. 최악의 경우, LLM은 환각(hallucinate)을 일으키고 가짜 신뢰도를 생성합니다. LLM이 `
우리는 인간의 뇌 시스템 1(System 1)처럼 작동하는 모델이 필요했습니다. 즉, 빠르고 반사적인 결정에 대해 정직하고 보정된 확률을 제공하며, 표준 하드웨어에서 단지 30~40밀리초 만에 처리할 수 있어야 합니다.
시스템 1의 철학을 따라, RL Agent는 상태(state) (원시 텍스트, 이메일, 티켓 또는 JSON 문서)와 하나 이상의 **유형화된 질문(typed questions)**을 받아 단일한 병렬 순전파(forward pass)를 통해 이들을 모두 평가합니다.
이 모델은 세 가지 기본 요소(primitives)를 사용합니다:
- choice: 기준 사전(dictionary of criteria)에서 하나의 옵션을 선택합니다. 선택된 레이블, 각 후보 옵션에 대한 확률, 그리고 신뢰도 점수를 반환합니다. (부서 라우팅, 의도 감지, 주제 분류 등에 유용합니다.)
- score: 상태를 0, 1, 2, 3과 같은 순위별 루브릭(ordinal rubric)에 배치합니다. 예상 점수 값, 레벨 전반의 확률, 그리고 신뢰도를 반환합니다. (고객 좌절도, 긴급성, 프롬프트 피해 심각도 등에 유용합니다.)
- noul: 0.0에서 1.0 사이로 보정된 확률 P(true)를 반환하는 직접적인 부울 질문입니다. (피싱, 스팸, 탈옥(jailbreaks) 또는 이탈 위험 감지 등에 유용합니다.)
출력 공간이 엄격하게 확률과 숫자로만 구성되기 때문에, 모델은 텍스트를 생성할 수 없으며, 환각을 일으킬 수 없고, 깨진 JSON도 물리적으로 불가능합니다.
제가 2025년 3월에 작업했던 방식에서는 고정된 시퀀스 임베딩(frozen sequence embeddings)과 별도의 PPO 값 네트워크(value network)를 결합했습니다. 이는 턴별 판매 예측에는 작동했지만, 엔드투엔드 방식이 아니었고 실행 시간에 동적인 새로운 질문을 처리할 수 없었습니다.
RL Agent의 경우, 우리는 두 개의 긴밀하게 연결된 구성 요소로 421M 파라미터의 엔드투엔드 아키텍처를 구축했습니다:
State (Text or JSON) + Typed Questions & Options
│
▼
...
우리는 기본 인코더로 ModernBERT-large(395M 파라미터)를 사용합니다. ModernBERT는 28개의 레이어, 히든 차원 1024, 어텐션 헤드 16개, GeGLU 중간 레이어(차원 2624)를 가지고 있으며, 회전 위치 임베딩(RoPE)을 통해 8,192 토큰까지 지원합니다. 완전 양방향(fully bidirectional)이기 때문에 모든 토큰이 상태와 옵션의 모든 부분에 동시에 주의를 기울입니다.
모든 질문에 대해 우리의 build_sequence
함수는 프롬프트를 패킹합니다:
[CLS] choice question: Which team should handle `body`? [SEP]
[MASK] billing: payments [MASK] tech: bugs [MASK] other: general [SEP]
{"subject": "Refund request", "body": "I was billed twice..."} [SEP]
각 옵션은 [MASK] 토큰을 받습니다. ModernBERT를 거쳐 2개 레이어의 의사결정 헤드 트랜스포머(decision head transformer)를 통과한 후, 우리는 torch.gather를 사용하여 해당 마커 위치에 있는 은닉 상태(hidden states)만을 추출합니다.
옵션 스코러 MLP(Option Scorer MLP)는 각 1024차원 마커 상태를 스칼라 로짓(logit)으로 투영합니다. 이 질문에 속한 옵션들에 대한 소프트맥스(softmax)가 후보 확률 분포(candidate probability distribution)를 산출합니다:
p = softmax(z / T)
여기서 T는 질문 유형별 및 옵션 개수별로 조정된 온도(temperature)입니다.
실제 자동화 시스템에서는 모델을 언제 신뢰하고 언제 사람에게 인계해야 하는지 알아야 합니다. 우리는 풀링된 [CLS] 토큰 (1024차원)에 4가지 분포 특징이 연결된 Act/Escalate 헤드를 추가했습니다:
- 최고 확률(Top probability): max(p)
- Top-2 마진(Top-2 margin): p_top1 - p_top2
- 정규화 엔트로피(Normalized entropy): H(p) / log(K)
- 옵션 예산 비율(Option budget ratio): K / 255
이 1028차원 벡터는 2개 레이어 MLP를 통과하여 [P(act), P(escalate)]을 출력합니다.
만약 이메일 하나에 대해 질문 5개를 한다면, 모든 5개의 시퀀스가 하나의 배치로 모입니다. ModernBERT는 GPU에서 약 35밀리초 만에 이들을 모두 단일 순방향 전달(single forward pass)로 처리합니다.
확률이 진정으로 보정(calibrated)되도록 이를 강화학습(RL)으로 어떻게 학습시킬까요?
만약 교차 엔트로피(cross entropy)를 사용하여 분류기(classifier)를 훈련시킨다면:
Loss_CE = -sum(y_k * log(p_k))
손실은 승자 로짓이 무한대에 가까워질 때만 최소화될 수 있습니다. 모델은 과신하게 됩니다.
그리고 표준 강화학습을 이진 보상(+1이면 정답, 0이면 오답)으로 시도한다면, 기대 보상은 다음과 같습니다:
E[R] = sum(y_k * p_k)
정책 경사(policy gradient)는 가장 높은 확률을 1.0 쪽으로, 나머지 모든 것을 0.0 쪽으로 강제합니다. 즉, 순진한 RL은 보정을 파괴함으로써 정확도를 최대화합니다. 모델을 자신감 있게 틀리는 기계로 만듭니다.
RLCD (Calibrated Decisions을 위한 강화학습)의 기반은 엄격하게 적절한 점수 함수(strictly proper scoring rule)를 보상으로 사용하는 것입니다.
결정 이론에서, 점수 함수 S(q, y)는 모델이 분포 q를 보고하고 실제 결과가 y일 때 점수를 할당합니다. 이 점수 함수가 엄격하게 적절하다는 것은 기대 점수가 q가 실제 분포 p와 같을 때만 유일하게 최대화된다는 것을 의미합니다:
E_{y ~ p}[S(q, y)] <= E_{y ~ p}[S(p, y)], with equality if and only if q = p
이는 모델이 정직한 확률을 보고할 때만 가능한 가장 높은 보상을 받는다는 것을 보장합니다.
저희의 복합 보상(composite reward)은 세 가지 적절한 점수 함수를 결합합니다:
Reward(q, y) = S_log(q, y) + 0.5 * S_sph(q, y) - 1.0 * S_rps(q, y)
S_log(q, y) = sum(y_k * log(max(q_k, 1e-12)))
이것은 모델이 실제 결과에 낮은 확률을 할당할 경우 크게 페널티를 부여합니다. 수치적 안정성을 위해 하한선을 -9.21로 제한합니다.
S_sph(q, y) = sum(y_k * q_k) / sqrt(sum(q_k^2))
이는 [0, 1] 범위의 유계 점수 함수로, 순수한 log-loss가 가지는 극단적인 기울기 급증 없이도 정답 클래스에 확률 질량을 할당하는 것을 보상합니다.
순서형 점수 질문(ordinal score questions) (예: 0, 1, 2, 3과 같은 루브릭)에 사용됩니다. 만약 실제 긴급도가 레벨 3이라면, 레벨 0을 추측하는 것보다 레벨 2를 추측하는 것이 훨씬 낫다는 것을 의미합니다. RPS는 누적 분포 함수(CDF) 사이의 제곱 거리를 측정합니다:
S_rps(q, y) = (1 / (K - 1)) * sum((CDF_q(i) - CDF_y(i))^2)
RPS를 보상에서 빼주는 것은 모델에게 루브릭을 따라 거리를 학습시키는 효과를 줍니다.
저희는 순수 정책 경사(pure policy gradient) (0의 지도 교차 엔트로피 손실)로 학습합니다:
- 가우시안 탐색(Gaussian Exploration): 각 질문에 대해 G = 8개의 노이즈 후보 로짓을 샘플링합니다:
z_noisy = z + epsilon, where epsilon ~ Normal(0, sigma^2)
소프트맥스에서 상수에 모든 로짓에 더하는 것은 상쇄되므로, 우리는 노이즈 벡터를 옵션 전반의 합이 0이 되도록 투영합니다 (epsilon - mean(epsilon)). 탐색 표준 편차 $ ext{sigma}$는 1.0에서 0.3까지 감소합니다.
- 노이즈 분포(Noisy Distribution):
q_noisy = softmax(z_noisy)
- 보상 평가(Reward Evaluation):
r_noisy = Reward(q_noisy, y)
- 그룹 평균 우위 (Group Mean Advantage, GRPO 스타일): 8개의 샘플에 걸쳐 그룹 평균을 기준으로 우위를 계산합니다:
Advantage = (r_noisy - mean(r)) / (std(r) + 1e-6)
- 정책 손실 (Policy Loss): 가우시안 로그 확률을 사용합니다:
Loss_policy = -mean(Advantage * log_prob(z_noisy | z))
- 비용 민감 액션 헤드 (Cost-Sensitive Act Head): 액션 헤드는 {act, escalate}에서 행동을 샘플링하고 비용 행렬로부터 보상을 받습니다:
- 정확한 액션: +1.0
- 부정확한 액션: -3.0
- 에스컬레이션(Escalated): -0.5
자동으로 행동하는 것이 수익성이 있는 경우는 다음을 만족할 때입니다:
P(correct) * (+1.0) + (1 - P(correct)) * (-3.0) > -0.5 => P(correct) > 2.5 / 4.0 = 0.625
정책은 자신감도가 62.5% 이상일 때만 자동으로 행동하도록 학습합니다.
제가 2025년 3월에 발표한 논문에서는 PPO를 사용하여 대화 턴(turn) 전반에 걸친 판매 전환을 예측했습니다. 그때 우리가 발견한 큰 문제는 누수(leakage)였습니다. 즉, 1번째 턴 전체 대화 임베딩을 입력하면 모델이 미래의 신호를 보게 된다는 것이었습니다.
RL 에이전트에서는 이를 깔끔하게 해결했습니다:
- 대화를 턴별로 접두사(prefix)로 분할합니다 (1번째 턴, 2번째 턴, 3번째 턴...). 모델은 해당 턴까지의 컨텍스트만 받습니다.
- Monte Carlo 리턴 타겟을 사용한 시간차 학습(Temporal Difference learning)을 적용합니다 (TD($ ext{lambda} = 1.0$)):
G_T = y (최종 결과)
G_t = (1 - lambda) * V(s_{t+1}) + lambda * G_{t+1}
$ ext{lambda} = 1.0$을 사용함으로써, 초반 턴들은 대화의 실제 최종 결과에 직접적으로 학습되어 모델 자체의 추측으로부터 부트스트래핑하지 않고도 초기 대화 패턴이 실제로 전환이나 이탈로 이어지는 것을 학습합니다.
모든 질문에 대해 모델은 0.0과 1.0 사이의 자신감 점수를 반환합니다. 우리는 이를 정규화된 샤논 엔트로피(Shannon entropy)를 사용하여 계산합니다:
Confidence = 1 - (Entropy(p) / log(K))
= 1 + sum(p_k * log(max(p_k, 1e-12))) / log(K)
여기서 K는 옵션의 개수입니다:
만약 모델이 완전히 확신하지 못한다면(unsure), 모든 옵션의 확률은 1/K가 됩니다. 엔트로피는 log(K)와 같으므로 신뢰도는 정확히 0.00입니다. 반대로, 모델이 완전히 확신한다면(certain), 하나의 옵션만 확률이 1.0이고 엔트로피는 0이 되므로 신뢰도는 1.00입니다.
많은 팀들이 LLM에게 합성(synthetic) 학습 질문과 레이블을 생성하도록 요청하여 이러한 모델들을 구축하려고 합니다. 이것은 실수입니다. 합성 레이블로 보정(calibrate) 모델을 훈련시키면, 단순히 모델을 LLM 자체의 실수와 환각에 맞춰 보정하게 됩니다.
저희는 다음 분야에서 100% 사람이 라벨링한 실제 공개 데이터셋을 사용하여 학습 파이프라인을 구축했습니다:
AI 자동 생성 콘텐츠
본 콘텐츠는 Lobste.rs AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기