dev.to

I Built Non-Autoregressive Decision Models a Year Ago. Then a Frontier Lab Called It a "Breakthrough".

비자기회귀 의사결정 모델을 1년 전에 만들었습니다 — 한 프런티어 연구소는 이를 ‘획기적 성과’라고 불렀습니다

Laya는 텍스트를 생성하지 않고 선택·점수·불리언 질문에 확률을 반환하는 4억 2,100만 파라미터 의사결정 모델입니다. 작성자는 RLCD와 bidirectional encoder를 조합해 GPU에서 33~38ms 지연 시간과 보정된 확률을 구현했다고 설명합니다.

AI 요약

작성자는 2025년 3월부터 판매 대화의 전환 가능성을 예측하는 비자기회귀(non-autoregressive) 의사결정 모델을 개발하고 논문, 모델 가중치, 데이터셋, PyPI 패키지를 공개했다고 설명합니다. 이후 TypeSafe AI가 Jev라는 유사한 수평형 의사결정 서비스를 출시하자, 기존 연구의 한계를 고쳐 완전한 오픈소스 모델 Laya를 만들었다고 소개합니다. 글의 초점은 생성형 LLM 대신 빠른 분류·라우팅·안전 판정 전용 모델을 구성하는 방법과, 강화학습으로 확률 보정(calibration)을 학습하는 RLCD(Reinforcement Learning for Calibrated Decisions) 설계입니다.

■ 생성형 LLM 대신 반사형 의사결정 모델

고객 지원 티켓의 담당 부서, 이메일의 피싱 여부, 프롬프트의 jailbreak 여부, 문제의 긴급도처럼 결과가 정해진 업무에는 8B 또는 70B 규모 생성형 LLM이 과하다고 설명합니다. 토큰을 생성하는 방식은 500~2,000ms 지연 시간과 추론 비용을 만들고, 자유 형식 텍스트에서 라벨과 JSON을 다시 추출해야 합니다. 모델이 출력하는 confidence 값도 실제 확률 보정 없이 확신하는 문장을 생성한 결과일 수 있습니다.

Laya는 원문 텍스트·이메일·티켓·JSON 상태와 타입이 지정된 질문을 입력으로 받습니다. 여러 질문을 한 번에 배치로 처리하고 텍스트를 생성하지 않은 채 숫자와 확률만 반환합니다. 질문 타입은 세 가지입니다.

  • choice: 기준 사전에서 하나의 항목을 선택합니다. 선택된 라벨, 각 후보의 확률, confidence를 반환하며 부서 라우팅과 의도 분류에 사용합니다.
  • score: 0, 1, 2, 3 같은 순서형 척도에서 값을 예측합니다. 기대 점수, 각 단계의 확률, confidence를 반환하며 긴급도나 불만 정도를 평가합니다.
  • noul: 불리언 질문에 대해 P(true)를 0.0~1.0으로 반환합니다. 피싱, 스팸, jailbreak, 이탈 위험 판정에 사용합니다.

작성자는 출력 공간이 확률과 숫자로 제한되므로 텍스트 환각이 발생하지 않고 잘못된 JSON도 물리적으로 생성되지 않는다고 설명합니다.

■ 421M 파라미터 아키텍처

Laya는 395M 파라미터의 ModernBERT-large를 기반으로 하며 전체 크기는 421M 파라미터입니다. ModernBERT-large는 28개 레이어, 1,024차원 hidden state, 16개 attention head, GeGLU MLP를 사용하고 RoPE 기반으로 최대 8,192 토큰을 처리합니다. 양방향 attention이 상태와 선택지를 동시에 바라보므로, 자기회귀 모델처럼 토큰을 순서대로 생성하지 않습니다.

입력은 다음과 같은 형태로 구성합니다.

[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] 토큰을 배치하고, encoder 출력에서 해당 위치의 hidden state를 torch.gather로 가져옵니다. 이후 두 개의 TransformerEncoder layer로 구성된 약 25.2M 파라미터 decision head가 상태를 처리합니다. Option Scorer는 각 [MASK] 상태를 하나의 logit으로 바꾸고, 선택지 전체에 softmax를 적용합니다.

p = softmax(z / T)

여기서 T는 질문 타입과 선택지 수마다 맞춘 temperature입니다. Act/Escalate head는 [CLS] 상태에 네 가지 분포 특징을 붙입니다. 네 가지 값은 가장 높은 확률, 1위와 2위 확률의 차이, 정규화 entropy, 선택지 수를 255로 나눈 비율입니다. 1,028차원 입력을 두 층 MLP에 넣어 자동 처리할지 사람에게 넘길지 나타내는 P(act)와 P(escalate)를 출력합니다.

질문 10개를 하나의 배치로 묶으면 GPU에서 약 35ms에 단일 forward pass로 처리한다고 설명합니다. 모델 전체 실행 시간은 GPU 기준 33~38ms이며, 글에서는 이를 Jev가 공개한 약 150ms보다 약 4배 빠른 수치로 제시합니다.

■ RLCD와 proper scoring rule

일반적인 cross-entropy는 정답 클래스의 logit을 계속 키우는 방향으로 학습하므로 과도한 확신을 만들 수 있습니다. 정답이면 +1, 오답이면 0을 주는 단순 강화학습 보상도 최고 확률을 1.0으로 밀어 확률 보정을 망가뜨립니다. 작성자는 이를 방지하기 위해 strictly proper scoring rule을 보상으로 사용합니다.

strictly proper scoring rule은 실제 분포를 p, 모델이 보고한 분포를 q라고 할 때 q가 p와 같을 때 기대 보상이 유일하게 최대가 되는 규칙입니다. Laya의 보상은 다음 세 항을 조합합니다.

Reward(q, y) = S_log(q, y) + 0.5 × S_sph(q, y) - 1.0 × S_rps(q, y)

로그 점수는 정답에 낮은 확률을 배정했을 때 큰 불이익을 줍니다. 수치 안정성을 위해 확률 하한을 1e-12로 두며, 로그 보상 하한은 -9.21입니다. spherical score는 정답에 확률 질량을 배정하도록 유도하면서 순수 log-loss보다 완만한 gradient를 제공합니다. RPS( ranked probability score)는 누적분포 사이의 제곱 거리를 계산합니다. 0~3 같은 순서형 척도에서 실제 값이 3일 때 2를 고른 오답이 0을 고른 오답보다 가깝다는 점을 반영합니다.

학습에는 supervised cross-entropy를 사용하지 않는 순수 policy gradient를 적용합니다. 질문마다 logit에 정규분포 잡음을 더한 후보 8개를 만들고, softmax 결과별로 보상을 계산합니다. 모든 logit에 같은 상수를 더해도 softmax 결과가 변하지 않으므로 잡음 벡터의 평균을 빼 합이 0이 되게 합니다. 탐색 표준편차 sigma는 1.0에서 0.3까지 줄어듭니다. 8개 샘플의 평균 보상과 비교해 advantage를 계산하고, Gaussian log-probability를 사용해 정책 손실을 구합니다. 이 방식은 GRPO 스타일의 group mean advantage 계산입니다.

Act/Escalate head에는 비용 민감 보상을 적용합니다. 올바르게 자동 처리하면 +1.0, 잘못 처리하면 -3.0, 사람에게 넘기면 -0.5를 줍니다. 따라서 자동 처리의 기대 보상이 사람에게 넘기는 경우보다 높아지는 조건은 다음과 같습니다.

P(correct) × 1.0 + (1 - P(correct)) × (-3.0) > -0.5

이 식에서 P(correct)가 0.625보다 커야 하므로, 모델은 confidence가 약 62.5% 이상일 때 자동 처리하는 정책을 학습합니다.

■ 시계열 누수 방지와 confidence

초기 판매 전환 모델은 한 대화의 전체 embedding을 초기 턴에 넣을 때 미래의 전환 신호가 섞이는 문제가 있었습니다. Laya는 대화를 턴별 prefix로 잘라 현재 시점까지의 내용만 입력합니다. 최종 전환 결과를 terminal outcome으로 사용하고 TD(lambda=1.0) 방식의 Monte Carlo return target을 적용합니다. lambda가 1.0이므로 초기 턴의 학습 대상은 모델의 중간 예측이 아니라 실제 대화 종료 결과에 직접 연결됩니다.

confidence는 정규화 Shannon entropy로 계산합니다.

Confidence = 1 - Entropy(p) / log(K)

선택지 K개가 모두 1/K 확률이면 entropy가 log(K)가 되어 confidence는 0.00입니다. 하나의 선택지 확률이 1.0이면 entropy가 0이 되어 confidence는 1.00이 됩니다. 작성자는 이 값을 자동화 조건으로 직접 사용합니다. 예를 들어 confidence가 0.85 이상이면 자동 라우팅하고, 그보다 낮으면 사람 검토로 보냅니다.

■ 데이터와 평가 결과

작성자는 LLM이 만든 합성 질문과 라벨을 사용하면 LLM의 오류와 환각을 다시 학습하게 된다고 보고, 실제 공개 데이터셋과 사람 라벨만 사용했다고 설명합니다. 데이터 범위는 고객 지원과 은행 의도 분류, 사실 검증과 모순 판정, 독성·괴롭힘·심각한 학대 탐지, jailbreak·prompt injection, 도움성·복잡성·정확성 평가, SaaS 판매·지원 대화의 최종 결과입니다.

옵션 순서를 동적으로 섞고 질문을 바꿔 쓰며, 원문과 중첩 JSON 상태를 번갈아 사용합니다. 무관한 질문도 섞어 지름길 학습을 줄입니다. 전체 평가 규모는 25,424개 질문이며, 학습에 포함된 작업군 23,024개와 학습에서 보지 않은 작업군의 zero-shot 질문 2,400개로 구성됩니다.

Fine-tuned checkpoint의 전체 in-task macro accuracy는 83.8%, ECE는 0.060입니다. 작업별 결과는 intent·routing 1,475개에서 정확도 99.1%, ECE 0.009, moderation·safety 2,708개에서 96.7%, ECE 0.061, fact checking 3,022개에서 88.3%, ECE 0.054, email triage·phishing 2,691개에서 73.2%, ECE 0.017입니다. response quality scoring은 3,146개에서 58.1%, search relevance는 733개에서 62.8%입니다.

Zero-shot 결과는 instruction-following 86.3%, moderation·safety 79.7%, emotion·tone 58.3%, sentiment·rating 36.2%이며 전체 평균은 65.1%, ECE는 0.207입니다. confidence가 높은 답만 선택하면 전체 답변 기준 정확도 83.8%에서 상위 80% 선택 시 89.4%, 상위 50% 선택 시 92.2%로 올라간다고 보고합니다.

글은 TypeSafe Jev의 공개 수치와도 비교합니다. Jev의 공개 수치는 4개 production workflow에서 67.8% agreement, 입력 토큰 100만 개당 0.042달러, 약 150ms 수준의 응답 시간으로 제시합니다. Laya는 한 질문의 38.4ms 지연 시간과 p95 42.1ms, 질문 10개 배치에서 156.0ms, 질문 50개 배치에서 721.4ms를 기록했다고 주장합니다. 다만 두 제품의 데이터셋과 평가 조건이 동일한지는 글에서 제시하지 않습니다.

■ 실행 예시와 공개 범위

사용자는 다음과 같이 PyPI 패키지를 설치하고 Hugging Face에서 모델을 불러올 수 있습니다.

pip install laya agent = laya.load("convaiinnovations/laya") result = agent.predict(state, questions)

예시 입력은 이중 청구된 청구서 이메일입니다. Laya는 billing 부서를 confidence 0.94로 선택하고, 긴급도 1.84/2.0, churn risk 0.892, phishing 확률 0.008을 반환합니다. 이후 confidence가 0.85 이상이면 자동 라우팅하고, 미만이면 사람 검토로 보내는 조건문을 적용합니다.

모델은 Hugging Face의 convaiinnovations/laya, PyPI의 laya, GitHub 저장소 github.com/NandhaKishorM/laya, 대화형 데모 convaiinnovations/laya-demo에서 공개한다고 안내합니다. 라이선스는 Apache 2.0이며, 작성자는 자체 GPU·Mac MPS·CPU 환경과 air-gapped 배포를 지원해 외부 데이터 전송 없이 사용할 수 있다고 설명합니다.

■ dev.to 반응

  • @jdbar — 정말 대단합니다. 더 많은 사람이 이 이야기를 해야 합니다.
  • @sirgio03 — 정말 멋진 작업입니다!!!! 공유하기 쉽도록 로고도 만들었습니다 🙂 정말 멋진 작업입니다, Nandakishor.
  • @neilblaze — 좋은 글입니다!
  • @cgint_2024 — 정말 대단한 내용 같습니다. 열심히 작업했고 오픈소스 방식으로 더 나아가 준 점에 감사드립니다!
  • @hu_lu_85453049f5b45c51dfe — 훌륭한 작업입니다!
  • @ranjancse — 정말 훌륭한 작업입니다. ‘noul’에 관해 궁금한 점이 있습니다. 불리언 타입인데 왜 noul이라고 부르나요?
  • @ranjancse — 혹시 시간 여행자였나요 😆 dev.to에 2026년 9월 18일 가입한 것으로 보입니다. Jev 때문에 이 블로그 글을 게시한 건가요?
  • @pranav_raj_dae81effb8b57d — 정말 잘했습니다. voice agent를 만들 때, 특히 LLM이 의사결정을 맡는 부분에서 환각을 겪었습니다. Laya 같은 모델이 의사결정을 처리하는 데 큰 도움이 됐을 것 같습니다. 더 일찍 알았더라면 좋았을 텐데요 🥲

원문: dev.to / 번역·요약: Trawling