Laya로 로컬 에이전트의 의사결정 분리하기

TypeSafe Jev 규격과 호환되는 421M 로컬 의사결정 모델 Laya를 Ollama에 연결하고 하네스 정책과 결합하는 방법을 살펴봅니다.

무료 공개 · 최근 수정

클라우드 종속을 넘어선 로컬 의사결정의 필요성

반복적인 요청 분류와 도구 위험 검사를 무거운 생성형 언어 모델에서 분리하면 에이전트 실행 지연과 토큰 비용을 줄이면서 내부 데이터 프라이버시를 지킬 수 있습니다. Jev로 에이전트 하네스의 판단 분리하기에서 다루었듯이, 정해진 선택지 안에서 답을 내리는 닫힌 판단을 전용 분류기에 맡기면 전체 시스템 효율이 크게 향상됩니다. TypeSafe AI가 선보인 Jev는 소프트웨어가 즉시 소비할 수 있는 빠른 구조화 결정을 지원하는 System One 모델로 큰 주목을 받았습니다.

하지만 Jev는 독점 상용 클라우드 API(얼리 액세스) 형태로만 제공되어 엔터프라이즈 환경 도입에서 뚜렷한 제약이 있었습니다. 내부 시스템의 상태 정보나 사용자 데이터를 매 루프마다 외부 클라우드로 전송해야 하므로 엄격한 데이터 보안 규제를 충족하기 어려웠고, 네트워크 왕복 지연과 호출 비용도 누적되었습니다. 외부 인터넷 접근이 차단된 폐쇄망이나 엣지 디바이스 환경에서는 클라우드 기반 판단 런타임을 구동할 방법조차 없었습니다.

이러한 클라우드 종속 문제를 해결하기 위해 Convai Innovations가 오픈소스로 공개한 경량 의사결정 모델(Decision Model)이 바로 Laya입니다. Apache 2.0 라이선스로 배포된 Laya는 TypeSafe Jev API 규격을 호환하면서도 로컬 머신에서 독립적으로 실행됩니다. 특히 Ollama 0.40.0부터 공식 라이브러리에 편입되어, 개발자는 로컬 환경에서 단 한 줄의 명령으로 초저지연 System One 의사결정 런타임을 즉시 구축할 수 있습니다.

다음 아키텍처 다이어그램은 비구조화된 상태와 질문이 로컬 Laya 엔진을 거쳐 보정된 확률로 변환되고 하네스 정책 계층으로 이어지는 처리 흐름을 보여 줍니다.

상태와 질문 입력이 Laya의 단일 순방향 추론을 거쳐 보정된 확률로 변환되고 하네스 정책으로 분기하는 흐름

그림: Laya 로컬 의사결정 모델과 에이전트 하네스 정책의 연계 흐름

비구조화된 상태 텍스트와 질문 정의는 Laya 모델의 단일 순방향 추론을 거쳐 정량 점수와 신뢰도로 변환되며, 하네스 정책은 이 확률을 바탕으로 자동 승인 또는 사람 검토 경로를 결정합니다.

Laya의 421M 인코더 구조와 타입 보장 의사결정

Laya는 텍스트를 순차 생성하는 디코더가 없어 JSON 파싱 오류와 형식 왜곡이 원천 차단되지만, 선택 자체는 작업 성격에 따라 틀릴 수 있습니다. 모델 아키텍처는 엔드투엔드로 파인튜닝된 ModernBERT-large 백본(395M) 위에 트랜스포머 2개 층, 선택지 마커 점수기, 행동·에스컬레이션 헤드로 구성된 결정 헤드를 처음부터 학습하여 결합한 총 421M 파라미터 크기입니다. 언어 모델 디코더와 텍스트 생성 모듈이 아예 없으므로 파싱할 대상도 없고 문자열 환각도 발생하지 않습니다.

일반 생성형 LLM에 구조화된 JSON 출력을 지시하면 프롬프트가 길어지거나 복잡해질수록 스키마 형식이 깨지거나 존재하지 않는 선택지를 날조하는 환각이 발생하기 쉽습니다. 반면 Laya는 한 번의 단일 순전파(Single Forward Pass)로 모든 선택지를 점수화하여 타입이 정의된 답을 즉시 계산합니다. TypeSafe가 언급하는 "0% 환각"은 소프트웨어가 즉시 소비할 수 있는 타입과 형식이 보장된다는 뜻이지, 모델의 판단이 항상 참이라는 의미가 아닙니다.

Laya가 반환하는 확률값은 엄격한 적합 채점 규칙을 적용하여 학습되었습니다. 모델이 예측한 신뢰도와 실제 정답률이 일치하는 보정된 확률(Calibrated Probabilities)을 제공하며, 학습 범위 과제(in-task)에서 macro 정확도 83.8%와 기대 보정 오차(ECE) 0.060을 기록합니다. 그러나 학습하지 않은 새로운 과제(held-out)에서는 정확도가 65.1%로 낮아지므로, 새로운 유형의 작업에는 오분류 가능성을 반드시 고려해야 합니다.

속도 면에서 Laya의 단일 질문 지연 시간(p50)은 GPU 기준 38.4ms입니다. 개발사(Convai Innovations) 발표 기준에 따르면, Jev 공개 벤치마크 대비 단일 질문 지연이 약 10배 낮고 정확도는 16포인트 높습니다. 한 번의 순전파 연산으로 1개부터 최대 64개의 질문을 동시에 평가할 수 있어 배치 처리 효율도 우수합니다.

[참고] ModernBERT 백본과 마스크 토큰 스코어링

Laya는 사전 학습된 ModernBERT-large 인코더의 풍부한 문맥 이해력을 이어받았습니다. 의사결정 헤드는 질문으로 주어진 후보 라벨들을 고정된 토큰 예산 안에서 배치하고, 각 후보 위치의 마스크 표식에서 로짓(Logit)을 추출한 뒤 소프트맥스를 적용합니다. 모델 가중치를 다시 학습하지 않아도 요청 시점에 임의의 선택지 라벨과 판정 기준을 동적으로 정의할 수 있는 비결이 여기에 있습니다.

System One과 System Two 모델의 역할 분담

에이전트 시스템에서 정형화된 상태 평가와 빠른 조건 분기는 Laya에 맡기고, 유연한 자연어 생성과 심층 추론은 생성형 LLM에 위임해야 시스템 효율이 극대화됩니다. TypeSafe가 정의하듯 System One 모델은 소프트웨어가 바로 쓸 수 있는 빠른 구조화 결정을 담당하며, System Two 모델인 LLM은 순차적인 텍스트 생성과 복합적 추론을 수행합니다.

구분Laya (System One)생성형 LLM (System Two)
모델 구조ModernBERT 기반 의사결정 모델 (421M)자기회귀형 텍스트 생성 모델 (수십억~수천억 파라미터)
출력 형태타입 보장 정량 점수 및 확률 (JSON 규격)비구조화 순차 텍스트 (JSON 스키마 파싱 필요)
응답 지연단일 질문 38.4ms (GPU 기준) 초저지연토큰 순차 생성으로 수백 ms~수 초 소요
실패 양상오분류 판정 (형식 깨짐이나 파싱 오류 없음)형식 깨짐, 없는 선택지 생성(환각), 프롬프트 일탈
적합한 작업요청 분류, 위험 검사, 긴급도 점수, 라우팅 분기개방형 문장 생성, 장문 요약, 코드 작성, 심층 추론

Ollama와 /v1/systemone 엔드포인트

Ollama 0.40.0 이상 환경은 기존 텍스트 생성 엔드포인트와 구분되는 시스템 1 엔드포인트(System One Endpoint)인 POST /v1/systemone을 공식 제공합니다. 터미널에서 모델 가중치를 내려받은 뒤 즉시 로컬 HTTP 호출로 연동할 수 있습니다.

ollama pull laya

Laya는 영어 텍스트만 지원하므로 한국어 입력은 공식 지원 범위 밖입니다. 다음 cURL 요청 예제처럼 상태(state)와 질문 지시문(instructions), 판정 기준(criteria)을 모두 영어로 작성해야 모델이 의도한 대로 동작합니다. 고객 서비스 인바운드 이메일을 분석하여 처리 부서(choice), 요청 긴급도(score), 이탈 위험 여부(noul)를 한 번에 판정하는 구성입니다.

curl http://localhost:11434/v1/systemone -d '{
  "model": "laya",
  "state": {
    "from": "customer@example.com",
    "subject": "Double billing inquiry for March invoice",
    "body": "I was charged twice for this month. If this is not refunded before Friday, I will cancel my subscription."
  },
  "questions": {
    "department": {
      "type": "choice",
      "instructions": "Which department should handle this customer request?",
      "criteria": {
        "billing": "Invoice, charge, payment, and refund inquiries",
        "technical": "System errors, bugs, and integration problems",
        "sales": "Product purchase, quotes, and contract negotiations"
      }
    },
    "urgency": {
      "type": "score",
      "instructions": "What is the urgency level of this request?",
      "criteria": ["Standard inquiry", "Requires prompt attention", "Critical deadline or immediate churn risk"]
    },
    "churn_risk": {
      "type": "noul",
      "instructions": "Is the customer threatening subscription cancellation or switching to a competitor?"
    }
  }
}'

다음 응답 데이터는 실행 결과가 아니라 반환 형식을 보여 주는 예시입니다. Laya는 텍스트 디코딩 없이 점수화 헤드의 연산 결과를 타입이 정의된 JSON 구조로 즉시 반환합니다.

{
  "model": "laya",
  "answers": {
    "department": {
      "type": "choice",
      "choice": "billing",
      "probabilities": { "billing": 0.94, "technical": 0.04, "sales": 0.02 },
      "confidence": 0.88
    },
    "urgency": {
      "type": "score",
      "score": 1.82,
      "legend": { "0": "Standard inquiry", "1": "Requires prompt attention", "2": "Critical deadline or immediate churn risk" },
      "probabilities": { "0": 0.02, "1": 0.14, "2": 0.84 },
      "confidence": 0.68
    },
    "churn_risk": {
      "type": "noul",
      "noul": 0.89
    }
  },
  "usage": { "input_tokens": 412, "output_tokens": 4 }
}

반환값에서 department는 94%의 확률로 billing 부서로 분류되었고, urgency는 0에서 2까지의 단계 중 1.82라는 높은 기대 점수를 받았습니다. 참과 거짓의 가능성을 확률로 나타내는 noul 질문에서 churn_risk는 0.89로 측정되어 즉각적인 대응이 필요함을 명확히 보여 줍니다.

Laya 런타임의 입력 사양과 제약 사항은 다음 표와 같습니다.

항목공식 제한 및 사양
입력 언어텍스트 전용 및 영어 전용 (Text only, and English only)
동시 질문 수요청 1건당 1~64개 (questions)
선택지 범위choice 및 score 질문당 2~26개
입력 토큰 예산질문당 최대 512 토큰
요청 본문 크기HTTP 요청 본문 최대 64 KiB
지원 런타임Ollama 0.40.0 이상 필요

[참고] TypeSafe Jev 규격과 로컬 런타임 호환성

Laya는 TypeSafe AI의 공식 SDK(typesafe-sdk)와 규격이 일치합니다. 기존에 Jev 클라우드를 사용하던 애플리케이션이라도 환경 변수 TYPESAFE_BASE_URL을 로컬 Ollama 주소(http://localhost:11434)로 변경하기만 하면 기존의 Python 코드를 수정하지 않고 그대로 로컬 환경으로 전환할 수 있습니다. SDK가 내부적으로 POST /v1/systemone 엔드포인트를 호출하므로 동일한 인터페이스가 유지됩니다.

Python 환경에서 하네스 정책과 결합하기

Python 환경에서는 typesafe-sdk를 통해 로컬 Laya 인스턴스를 호출하고 반환된 확률을 하네스 제어 정책의 조건식으로 직접 연결할 수 있습니다. 공식 typesafe-sdk를 사용하면 파이썬 코드 안에서 타입 안전성을 유지하며 의사결정 모델을 다룰 수 있습니다. Laya는 영어 텍스트만 지원하므로 도구 상태와 질문 지시문은 영어로 작성합니다.

pip install typesafe-sdk

다음 코드는 에이전트가 위험한 도구를 실행하기 전에 Laya를 호출하여 도구 실행의 유해성을 검사하고, 하네스 정책에 따라 차단하거나 실행을 승인하는 가드레일 예제입니다.

import os
from typesafe_sdk import Noul, TypeSafeClient
 
os.environ["TYPESAFE_BASE_URL"] = "http://localhost:11434"  # 로컬 Ollama 인스턴스
os.environ["TYPESAFE_API_KEY"] = "local-ollama"
 
tool_call_state = {
    "action": "execute_shell_command",
    "command": "rm -rf /var/log/app/* && systemctl restart nginx",
}
 
questions = {
    "is_destructive": Noul(
        instructions="Does this command pose a high risk of deleting system files or causing service disruption?",
    ),
    "requires_admin": Noul(
        instructions="Does this operation require root privileges or service administrator rights?",
    ),
}
 
with TypeSafeClient(timeout=30) as client:
    decision = client.system_one(
        model="laya",
        state=tool_call_state,
        questions=questions,
    )
 
destructive_prob = decision.nouls["is_destructive"].noul
admin_prob = decision.nouls["requires_admin"].noul
 
 
def evaluate_harness_policy(p_destruct: float, p_admin: float) -> str:
    # 파괴적 위험 확률이 기준치 이상이면 즉시 차단
    if p_destruct >= 0.70:
        return "BLOCKED: 파괴적 명령어 실행이 감지되었습니다."
 
    # 관리자 권한 필요성이 기준치 이상이면 사람 승인 대기
    if p_admin >= 0.80:
        return "REQUIRE_HUMAN_APPROVAL: 관리자 권한 변경 작업 승인이 필요합니다."
 
    return "EXECUTE_APPROVED"
 
 
status = evaluate_harness_policy(destructive_prob, admin_prob)
print(f"위험 확률: {destructive_prob:.2f}, 판정: {status}")

이 구조에서 에이전트 하네스는 무거운 생성형 LLM을 다시 불러 문맥을 장황하게 재평가하지 않고도, 단일 질문 기준 38.4ms(GPU) 수준의 빠른 지연 시간으로 로컬에서 위험 검사를 완결합니다. 결과에 따라 도구 실행을 즉각 차단하거나 사람 개입(Human-in-the-loop) 큐로 안전하게 격리합니다.

예제 코드에 설정된 확률 임계값(0.70, 0.80)은 정책 예시일 뿐이며 고정된 표준 규격이 아닙니다. 실제 프로덕션 서비스에 적용할 때는 조직의 위험 허용 수준, 오탐과 미탐 비용, 그리고 자체 도메인 데이터셋의 검증 결과를 바탕으로 최적의 임계값을 직접 설정해야 합니다.

적용 범위와 엔지니어링 한계

Laya는 정형화된 규칙과 분류 작업에서 탁월한 처리 효율을 발휘하지만, 언어 지원과 입력 크기, 미학습 과제의 정확도 면에서 뚜렷한 엔지니어링 한계를 가집니다.

첫째, 영어 텍스트 전용 지원과 한국어 서비스 연동의 제약입니다. Laya는 공식적으로 영어 텍스트만 지원하므로 한국어 입력은 공식 지원 범위 밖입니다. 한국어 문장을 그대로 입력하면 판정 정확도가 크게 떨어질 수 있습니다. 한국어 기반 서비스에서 Laya를 활용하려면 사용자 입력이나 상태를 앞단에서 영어로 번역·요약하는 전처리 파이프라인을 거치거나, 다국어를 지원하는 별도의 로컬 분류 모델을 채택해야 합니다.

둘째, 질문당 512 토큰 예산과 64 KiB 요청 크기 제한입니다. 질문마다 512 토큰의 고정 예산이 주어지며 상태 텍스트(state), 질문 지시문(instructions), 선택지 기준(criteria)이 이 예산 안에 모두 포함되어야 합니다. 수천 토큰 이상의 긴 문서를 처리해야 한다면 핵심 요약 섹션만 추출하여 state로 전달해야 하며, 전체 HTTP 요청 본문 크기도 64 KiB를 초과할 수 없습니다.

셋째, 언어 모델 디코더 부재로 인한 텍스트 생성 불가입니다. Laya에는 자연어 문장을 생성하거나 코드를 리팩토링하는 능력이 전혀 없습니다. 닫힌 질문에 대한 정량적 확률 판단은 Laya에 맡기고, 열린 텍스트 작성이나 복합 추론은 Ollama에 적재된 생성형 LLM에 위임하는 하네스 분리 원칙을 준수해야 합니다.

넷째, 미학습 과제의 정확도 저하와 고위험 결정의 사람 개입입니다. Laya는 학습 범위 과제(in-task)에서 83.8%의 macro 정확도와 0.060 수준의 우수한 보정 오차(ECE)를 기록하지만, 사전 학습에서 다루지 않은 새로운 과제(held-out)에서는 정확도가 65.1%로 하락합니다. 도메인 데이터의 분포 차이에 따라 오판 위험이 커질 수 있으므로, 금융 결제 승인이나 시스템 파일 영구 삭제 같은 고위험 액션에는 Laya의 확률을 1차 필터로 사용하되 반드시 사람의 최종 검토를 병행해야 합니다.

다섯째, 산술 및 결정론적 로직의 분리입니다. 날짜 계산, 숫자 대소 비교, 정규표현식 매칭 같은 명확한 규칙 연산은 모델에 묻지 말고 일반 애플리케이션 코드로 처리해야 합니다.

참고 문서

설명이 어렵거나 잘못된 부분을 발견하셨나요?

문서 수정 의견 보내기