Diogo Almeida와 TypeSafe AI가 Jev를 소개
창업자 Diogo Almeida가 ‘System One’이라는 이름으로 빠른 구조화 판단을 전면에 내세웠습니다. RLCD라는 확률 보정 중심의 학습 방법도 소개했습니다. 속도·비용 우위는 발표사의 비교 주장으로 읽어야 하며, 모든 업무에 적용되는 배수는 아닙니다.
TypeSafe의 최초 발표 ↗배경 지식 & API 가이드 · 2026년 10월 기준
모델 이름, 학습 도구, API가 섞여 헷갈렸다면
여기서 관계부터 정리해 보세요.
Clef 외의 대안은 모델과 API 지도에서 한눈에 비교할 수 있습니다. 가격과 성능은 모델별 비교표, 실험 후보는 MNIST 추천에서 볼 수 있습니다. 먼저 등장 배경과 사례를 읽고, 뒤에서는 실제 요청과 응답을 살펴봅니다. 코드를 보고 싶다면 웹 API나 Unsloth Python API로 바로 넘어가도 됩니다.
01 / 큰 그림
| 이름 | 무엇인가요? | 이 튜토리얼과의 관계 |
|---|---|---|
| Jev TypeSafe AI | 상황과 질문을 받아 정해진 형식의 판단을 반환하는 모델. TypeSafe API로 사용합니다. | ‘문장을 생성하는 대신 행동을 고른다’는 접근의 출발점입니다. |
| Clef Cloudflare | 가중치와 구현을 공개한 decision model 계열. Jev와 호환되는 질문 형식을 제공합니다. | 기반 모델에 붙이는 판단부(head)의 방식을 참고합니다. |
| Unsloth | 모델을 불러오고, 추가 학습하고, 실행·배포하는 프레임워크와 앱입니다. | Qwen3.5-0.8B에 판단부와 LoRA를 붙여 학습하는 데 사용했습니다. |
근거: TypeSafe 소개 · Clef 모델 카드 · Unsloth 소개
이 사이트의 MNIST 실험은 Jev 서버를 부르지 않습니다. Unsloth로 직접 학습한 Qwen 기반 모델이 그림을 보고 행동을 고릅니다. Cloudflare가 배포한 완성된 Clef 모델을 그대로 평가한 것도 아닙니다. 실제 모델 코드
전통적인 분류기는 보통 학습할 때 정한 범주를 출력합니다. 여기서 다루는 decision model은 판단할 질문과 선택지의 뜻을 요청마다 함께 넣는 것이 특징입니다. 예를 들어 ‘어느 팀에 보낼까?’의 선택지를 ‘결제·기술·기타’로 주거나, 다른 요청에서는 ‘보관·검토·삭제 후보’로 바꿉니다. 새 선택지에서도 잘 판단하는지는 별도로 검증해야 합니다.
JSON을 출력하는 LLM과도 겉모습은 비슷할 수 있습니다. 차이는 JSON이라는 파일 형식 자체보다 내부에서 자유로운 문장을 순차 생성하는가, 허용된 답에 직접 점수를 매기는가에 있습니다. 타입이 맞는 답도 내용상 틀릴 수 있습니다. 개념 출처 ↗
02 / 등장과 확산
‘최초’는 범위를 나눠 말해야 합니다. 분류·점수화·정책 선택 자체는 오래된 머신러닝 문제입니다. 여기서는 2026년 가을, 범용적인 typed decision API를 둘러싼 공개 흐름을 다룹니다. 아래 연표만으로 decision model 전체의 발명자를 정할 수는 없습니다.
창업자 Diogo Almeida가 ‘System One’이라는 이름으로 빠른 구조화 판단을 전면에 내세웠습니다. RLCD라는 확률 보정 중심의 학습 방법도 소개했습니다. 속도·비용 우위는 발표사의 비교 주장으로 읽어야 하며, 모든 업무에 적용되는 배수는 아닙니다.
TypeSafe의 최초 발표 ↗에이전트의 기록을 읽고 개인정보 노출 여부나 응답 품질 등을 평가하는 용도로 연결했습니다. 채팅 밖에서 모델을 쓰는 방식이 구체적인 개발 도구에 들어간 사례입니다.
LangChain 발표 ↗호환 API뿐 아니라 직접 실행할 수 있는 가중치가 나왔습니다. Cloudflare는 앞선 DiffusionGemma 실험이 Matt Mastracci의 독립 연구에서 출발했다고 밝힙니다. 제품을 공개한 사람과 공개 구현에 기여한 사람을 함께 볼 필요가 있습니다.
Cloudflare 발표 ↗텍스트와 이미지를 판단하는 d1을 소개한 뒤, 공개 가중치와 엣지 장비 실행 결과를 발표했습니다. omni-600M은 초기 연구용 체크포인트로 소개되어, 큰 모델과 같은 완성도로 해석하면 안 됩니다.
d1 발표 · 공개 모델 발표 ↗위 자료를 종합하면, ① LLM 옆에서 분류·평가·분기를 맡기기, ② 텍스트를 넘어 이미지 등으로 입력 넓히기, ③ 공개 모델을 로컬에서 실행하고 업무별로 추가 학습하기로 확장되는 흐름입니다. 이는 자료를 종합한 해석이며 시장 전체를 집계한 통계는 아닙니다. Unsloth의 decision model 학습·서빙 지원도 세 번째 방향에 해당합니다. 학습 안내 ↗
빠른 판단과 느린 숙고를 구분하는 비유입니다. 이름만으로 인간처럼 직관을 갖췄다거나, 모든 추론 문제를 해결한다는 뜻은 아닙니다. Vercel의 개념 설명 ↗
03 / 보고된 활용과 한계
Jev를 평가자로 사용해 실행 기록에 구조화된 피드백을 붙입니다. 예를 들면 ‘민감정보가 노출됐나?’는 yes/no 확률로, ‘사용자 의도는 무엇인가?’는 선택지로 묻습니다.
확인 범위: 기능 공개와 사용 예시. 모든 평가 업무에서 사람과 같은 정확도를 보장한 결과는 아닙니다.
공식 보고 ↗2389 Research의 Michael Sugimura는 Jev를 매 이동의 길찾기에 쓰는 대신, 어떤 이동 정책을 쓸지 고르는 역할에 배치했습니다. 상위 목표는 다른 모델이 담당하고 실제 경로 계산은 코드가 맡았습니다.
확인 범위: 개발자 자신의 초기 실험 보고. ‘Jev가 혼자 화면만 보고 게임을 모두 풀었다’는 사례로 소개하면 부정확합니다.
개발자 원문 ↗Cloudflare는 위협 인텔리전스 팀에서 웹사이트를 읽고 범주를 판별하는 시험을 소개했습니다. 가져오기·렌더링·분류를 합쳐 Clef 2.2초, 비교 LLM 4.7초였다고 보고했습니다.
확인 범위: 회사가 측정한 특정 작업 흐름. 모델 자체의 순수 추론 시간이나 독립적인 보안 인증 수치가 아닙니다.
Cloudflare 원문 ↗Deußer·Sparrenberg·Sifa는 346,009개 요청으로 분류·라우팅·독해 등을 평가했습니다. 좋은 결과와 함께 저자원 언어, 세밀한 범주, 평가 척도에 따른 차이도 보고합니다. 이진 판단에서는 임계값 조정이 중요했습니다.
확인 범위: Jev 1.13.0과 논문의 고정 프롬프트·비교 모델 조건. arXiv 프리프린트입니다.
평가 논문 ↗Li 등은 같은 공격 입력을 Jev·LLM 평가자·전용 분류기에 적용했습니다. Jev는 일부 규칙 기반 검사에서 강했지만, 피싱 판단에서는 놓치는 사례와 공격 영향을 보고했습니다.
확인 범위: 네 과제와 해당 공격 구성에서의 결과. ‘문장을 생성하지 않으니 프롬프트 공격도 불가능하다’는 결론은 성립하지 않습니다. arXiv 프리프린트입니다.
비교 논문 ↗Liquid AI는 d1을 여섯 개 응용 과제로 평가했습니다. 시각 검사에서는 정상 부품과 검사 대상 이미지를 함께 제공했습니다. 질문을 좁게 정의해 이미지 판단에 사용하는 방향입니다.
확인 범위: 제조사 데모이며 모델마다 각 응용을 한 번 실행한 비교입니다. 반복 실험으로 확인한 현장 불량 검출 성능과는 다릅니다.
d1 데모와 측정 조건 ↗추가 가이드 / 모델과 API 지도
Jev·Clef만 있는 분야는 아닙니다. 상용 API, 공개 가중치, 학습·서빙 구현을 함께 보면 아래처럼 나뉩니다. 2026년 10월 30일에 1차 자료로 확인한 주요 계열을 모았으며, 모든 파생 체크포인트를 망라한 목록은 아닙니다.
누구나 키를 발급받아 호출하는 상용 API도 모델 내부는 비공개일 수 있습니다. 반대로 공개 가중치를 내려받아 나만의 비공개 서버에서 쓸 수도 있습니다. OpenAPI라는 말은 API 명세 형식을 뜻하기도 하므로 여기서는 ‘호스팅 API’와 ‘공개 가중치’로 나눕니다.
아래는 호스팅 API가 확인된 제품입니다. 공개 가중치를 별도로 확인하지 못한 제품을 영구적으로 비공개라고 단정하지는 않습니다.
| 모델·개발사 | 사용·공개 방식 | 쉽게 이해하면 |
|---|---|---|
| Jev · TypeSafe ↗ | API | 선택·참거짓·등급 판단. 이 튜토리얼에서 소개하는 System One 형식의 기준점. |
| OpenAI Decisions ↗ | API | predicate·choice·score를 지원합니다. 일반 채팅 API와 별도이며 Jev의 요청 JSON을 그대로 보내는 방식은 아닙니다. |
| Microsoft-Decision-1 ↗ | Foundry · OpenRouter | Qwen3.5-9B를 바탕으로 한 판단 모델. 분류·우선순위·검증 등에 쓰며 Foundry에서는 배포 설정이 필요합니다. |
| GLiDE · Fastino ↗ | API | 불확실한 질문에 추가 추론을 쓰는 접근. 아래의 공개 모델 GLiNER2.5-Decide와는 다른 제품입니다. |
| Mercury Decide · Inception ↗ | API | 상황과 타입이 정해진 질문을 받아 판단과 확률을 반환하는 제품입니다. |
| Nimble · Bespoke ↗ | API · 가입 대기 | 호스팅 판단 모델. 확인 당시 신규 가입이 일시 중단되어 대기 목록으로 안내되었습니다. |
| Parallel Decisions ↗ | API · 웹 근거 포함 | 웹에서 자료를 찾고 출처와 함께 판단합니다. 제공한 입력만 채점하는 모델과는 검색 시간·비용까지 비교해야 합니다. |
| Span-01 · Respan ↗ | API · 기록 평가 | 에이전트 실행 기록에 특정 행동이 있었는지 평가합니다. 범용 선택 모델보다 관측·평가 업무에 초점을 둡니다. |
같은 브랜드라도 서버에서 부르는 모델과 다운로드하는 모델의 크기·버전·성능이 같다는 뜻은 아닙니다.
| 모델·개발사 | 사용·공개 방식 | 쉽게 이해하면 |
|---|---|---|
| Clef · Cloudflare ↗ | Workers AI + 공개 가중치 | 호스팅으로 호출하거나 공개 모델을 직접 실행할 수 있습니다. 모델별 실행 코드와 라이선스를 확인합니다. |
| d1 · Liquid AI ↗ | 호스팅 + 일부 공개 모델 | 호스팅 d1 계열과 공개 d1-3B·d1-omni-600M을 구별합니다. omni는 초기 연구 모델이며 공개 모델은 Liquid의 라이선스를 따릅니다. |
| pplx-Decider · Perplexity ↗ | API + 공개 체크포인트 | API는 v1.2와 Flash v1.2를 안내합니다. 공개 v1.1-27b는 Apache-2.0이며 전용 판단부·attention 설정을 보존해야 합니다. 최신 API 모델의 가중치 공개까지 의미하지 않습니다. |
| Span-02 · Respan ↗ | API + 공개 모델 발표 | 타입이 정해진 판단과 추론 예산을 다룹니다. 제조사는 공개 가중치도 안내합니다. 실제 다운로드 버전의 모델 카드와 라이선스를 다시 확인하세요. |
공개 가중치는 파일을 받아 실행할 수 있다는 뜻입니다. 학습 데이터까지 전부 공개되었다는 뜻은 아니며, 호스팅 비용이 사라져도 장비와 운영 비용은 남습니다.
| 모델·개발사 | 사용·공개 방식 | 쉽게 이해하면 |
|---|---|---|
| Laya · Convai Innovations ↗ | Apache-2.0 | 작은 encoder 계열. 영어 ModernBERT와 다국어 mmBERT 변형을 구별합니다. 기본 모델과 typed-decisions 특화 모델의 성능도 다릅니다. |
| Kev · Jared Palmer ↗ | 공개 가중치 · 코드 | Qwen 계열에 판단부를 붙인 구현. 크기별 모델을 로컬에서 비교하고 실행 코드를 살펴보기 좋습니다. |
| GLiNER2.5-Decide · Fastino ↗ | Apache-2.0 · 340M | CPU 실행을 지원하는 소형 모델. 판단뿐 아니라 span·관계 추출과 출력 사이 제약, full·LoRA 학습을 다룹니다. |
| H2O-Lightning-4B ↗ | Apache-2.0 · 4B | Qwen3.5-4B 기반의 텍스트·이미지 판단 모델입니다. 일반 채팅 모델용 예제보다 모델 카드의 판단 실행 방식을 우선 확인합니다. |
| vLLM Semantic Router · Decision ↗ | 공개 모델 + 실행 프로젝트 | 라우팅 등에 쓸 판단 모델 계열과 실행 환경입니다. vLLM이라는 추론 엔진 자체와 개별 Decision 모델은 구별합니다. |
| Strands Decider ↗ | 공개 모델 + 학습·서빙 코드 | 판단부를 붙이는 학습 파이프라인부터 평가·로컬 서버까지 제공하는 프로젝트입니다. Perplexity의 Decider와는 별개입니다. |
추가 확인: Perplexity의 현재 API와 버전 안내 · Liquid의 호스팅 모델 목록 · Respan 변경 기록
항상 그렇지는 않습니다. Jev 계열의 state / questions / noul과 OpenAI의 input / questions / predicate는 의미가 비슷해도 JSON 구조가 다릅니다. Cloudflare는 바깥 응답 래퍼도 다릅니다. 요청 변환, 응답 변환, 오류 처리, 확률 임계값 재평가가 필요합니다. ‘호환’이라는 말만 보고 수치를 같은 의미로 취급하지 마세요.
특히 Perplexity는 API에서 옛 모델 이름을 보내도 새 버전으로 연결할 수 있다고 설명합니다. 재현 실험이라면 이름뿐 아니라 변경 기록과 실제 제공 버전을 확인해야 합니다. 버전·과금 규칙 ↗
네. GPT·Claude·Gemini 같은 일반 LLM에 구조화 출력을 요구하거나, Qwen·Llama 계열을 직접 학습하거나, BERT 분류기를 쓰는 방법도 대안입니다. 다만 모두가 이 표의 ‘전용 decision model’인 것은 아닙니다. 자유로운 설명이 필요한지, 고정 범주만 필요한지, 요청마다 선택지가 바뀌는지를 먼저 정하세요.
OpenRouter 같은 유통 API와 Unsloth 같은 학습 도구도 모델 자체와 구별합니다. 모델 목록이 많아 보여도 같은 가중치를 여러 서비스가 제공하는 경우가 있습니다.
비교 / 가격 · 속도 · 정확도 · 한국어
확인일 2026. 10. 30. · 18개 계열을 버전과 실행 방식별로 나누고 한국어 추가학습 모델을 더했습니다. 아래 수치는 공개 자료를 정리한 것이며, 여기서 새로 API를 호출하거나 모델을 벤치마크한 결과는 아닙니다.
좁은 화면에서는 표를 가로로 밀어 보세요. 모델별 출처는 첫 열에 있습니다.
| 모델 / 출처 | 가격 | 속도 / 측정 조건 | 정확도 / 평가 조건 | 한국어 지원 근거 | 이미지 직접 입력 |
|---|---|---|---|---|---|
| Jev 1.14 | $0.042 / 1M 입력 · OpenRouter | 100 ms p50 · OpenRouter 최근 1주 표시, 모든 지역·입력 혼합 | 1.14의 동일 조건 정확도 미확인. 이전 1.13 점수를 최신 버전에 옮기지 않음. | 한국어별 평가·지원 명세 미확인 | 지원 확인 |
| OpenAI Decisions · GPT-6 Luna | $0.10 / 1M 입력; 캐시 읽기 $0.01 · 쓰기·지역 할증 별도 | <280 ms p95 · Sierra 업무 사례, 전체 서비스 보장치 아님 | Box의 30개 보험증서 사례에서 Responses API와 같은 정확도 보고. 통일 벤치마크 수치 미확인. | 한국어별 평가·지원 명세 미확인 | 지원 확인 |
| Microsoft-Decision-1 | $0.042 / 1M 입력 · OpenRouter | 200 ms p50 · OpenRouter 최근 1주 표시 | Microsoft의 36개 벤치마크 비교에서 최고 성능 주장. 공통 정확도 %는 확인 자료에 없음. | 다국어 평가 언급 / 한국어별 수치 미확인 | 텍스트용 |
| GLiDE | $0.04 / 1M 입력 | 동일 조건 절대 지연시간 미확인 | DI 0.2.1: 64.81점 · Fastino 자체 실행, 9/30 발표 당시. 최신 배너 점수와 구분. | 한국어별 평가·지원 명세 미확인 | 지원 확인 |
| Mercury Decide | $0.02 / 1M 입력 · 50% 할인 표시 당시 | 공식 자료에서 비교 가능한 수치 미확인 | 공식 자료에서 공통 벤치마크 수치 미확인 | 한국어별 평가·지원 명세 미확인 | 이번 조사에서 미확인 |
| Nimble-v4 / v4-max | 공개 단가 미확인 · 신규 가입 대기 | 비교 가능한 수치 미확인 | DI public: 63.70 / 68.46점 · Bespoke 자체 실행 10/12, 미등재 결과 | 한국어별 평가 미확인 · 텍스트 모델 | 텍스트용 |
| Parallel Decisions | $1 / 1,000 호출 · 토큰 과금과 단위가 다름 | 웹 검색 포함. 동일 조건 p50/p95 미확인 | 웹 근거를 찾는 과제. 이미지 숫자 판단과 비교할 공통 수치 미확인 | 한국어별 평가·지원 명세 미확인 | 이번 조사에서 미확인 |
| Span-01 | $0.02 / 1M 입력; Lite 무료는 일일 한도 내 | 비교 가능한 수치 미확인 | 행동 평가 0.806 · Respan 자체 trace 벤치마크, 단순 정답률로 해석하지 않음 | 한국어별 평가·지원 명세 미확인 | 이번 조사에서 미확인 |
| Clef 27B | $0.24 / 1M 입력 · Workers AI; 로컬은 장비비 | 209.3 ms 중앙값 / 238.6 ms p95 · Cloudflare DI 0.2.1 내부 실행 | BANKING77 macro-F1 94.2% · 같은 내부 실행. MNIST 수치 아님. | 한국어별 평가·지원 명세 미확인 | 지원 확인 |
| Clef-flash 9B | $0.038 / 1M 입력 · Workers AI; 로컬은 장비비 | 38.8 ms 중앙값 / 122.4 ms p95 · Cloudflare DI 0.2.1 내부 실행 | BANKING77 macro-F1 90.9% · 같은 내부 실행. 공개 모델도 이미지 지원. | 한국어별 평가·지원 명세 미확인 | 지원 확인 |
| d1 · 호스팅 | $0.02 / 1M 입력 · Liquid 가격표의 d1 | API의 동일 조건 수치 미확인. 아래 로컬 3B 속도와 다름. | 공개 3B와 서버 모델을 동일시하지 않음. 정확 버전별 비교 필요. | 한국어별 평가·지원 명세 미확인 | 지원 확인 |
| d1-3B · 공개 모델 | 로컬 장비비 + Liquid 라이선스 조건 | RTX 4090: 텍스트 8 ms / 384px 이미지 17 ms · 단건, 개발사 측정 | DI 0.2.1 public: 48.57점 · Liquid 보고. 이미지 MNIST 성능은 미측정. | 다국어 벤치마크 있음 / 한국어별 결과 미확인 | 지원 확인 |
| d1-omni-600M | 로컬 장비비 + Liquid 라이선스 조건 | 초기 연구 모델. 같은 발표의 3B 속도를 적용하지 않음. | DI 0.2.1 public: 15.95점 · Liquid 보고 | 한국어별 평가·지원 명세 미확인 | 지원 확인 |
| pplx-Decider v1.2 / Flash v1.2 | $0.02 / $0.01 per 1M 입력 · 각각 27B / 4B | 현재 버전의 동일 조건 속도 미확인 | v1.2의 공통 평가 수치 미확인. 아래 공개 v1.1 점수와 구분. | 한국어별 평가·지원 명세 미확인 | 지원 확인 |
| pplx-Decider v1.1-27b · 공개 | 로컬 실행: 호출료 없음 / 장비·전력 별도 | 동일 조건 속도 미확인 | DI 61.56점 · Perplexity 모델 카드 자체 보고. 전용 attention·readout 설정 필요. | 한국어별 평가·지원 명세 미확인 | 지원 확인 |
| Span-02 | $0.01 / 1M 입력; 공개판은 장비비 | budget_ms로 추론 예산 설정. 그 값은 실측 왕복 지연시간이 아님. | DI 0.3: 61.2점(추론 끔) / 64.1점(시간 제한 없음) · Respan 실행 | 한국어별 평가·지원 명세 미확인 | 지원 확인 |
| Laya · 영어 기본판 | 로컬 실행: 호출료 없음 / 장비·전력 별도 | 39.5 ms · T4, 1질문, 개발사 측정 | MASSIVE 영어 intent: 78.3% · 개발사 비교. 모든 업무의 정확도 아님. | 영어용. 한국어에는 다국어판을 선택 | 텍스트용 |
| Laya Multilingual | 로컬 실행: 호출료 없음 / 장비·전력 별도 | 32.8 ms · T4, 1질문, 개발사 측정 | MASSIVE 51언어 평균 정확도 36.6% · 20선택지 실험 | 한국어 MASSIVE 49.0% · 같은 조건 영어판 11.0%, 개발사 보고 | 텍스트용 |
| laya-ko · 커뮤니티 추가학습 | 로컬 실행: 호출료 없음 / 장비·전력 별도 | 약 30 ms CPU라는 작성자 설명 · CPU 기종·분위수 불명 | KLUE-YNAT 83.4% (n=1,000), NLI 81.5% (n=1,000) · 작성자 평가 | 한국어 특화. KLUE train으로 학습, validation에서 평가한 결과 | 텍스트용 |
| Kev · 공개 계열 | 로컬 실행: 호출료 없음 / 장비·전력 별도 | 현재 버전·장비를 맞춘 수치 미확인 | 모델 크기와 체크포인트를 고정해야 비교 가능. 계열 전체의 단일 정확도 없음. | 한국어별 평가·지원 명세 미확인 | 이번 조사에서 미확인 |
| GLiNER2.5-Decide 340M | 로컬은 장비비; Fastino API $0.03 / 1M 입력 | 38.3 ms p50 V100 / 167.3 ms p50 48-vCPU Xeon · 짧은 문서 | Fast Decisions 17데이터셋 평균 60.1% · Fastino 자체 평가 | 공식 문서는 영어 분류용으로 안내. 다국어 GLiNER 추출 모델과 별개 | 텍스트용 |
| H2O-Lightning-4B | 로컬 실행: 호출료 없음 / 장비·전력 별도 | 28.2 ms p50 · L40S, two-way, 텍스트 100–300토큰·1질문 | DI 0.3 text 63.21 / vision 69.87점 · H2O 자체 실행. 앞의 속도는 짧은 텍스트 조건. | 한국어별 평가·지원 명세 미확인 | 지원 확인 |
| vLLM-SR Decision 1.0 · Lux-9B | 로컬 실행: 호출료 없음 / 장비·전력 별도 | 확인한 발표에서 비교 가능한 절대 수치 미확인 | 54과제·3,766결정의 가중 점수 76.94 · 개발팀 측정. DI와 다른 척도. | 한국어별 평가·지원 명세 미확인 | 텍스트용 |
| Strands Decider · 2B | 로컬 실행: 호출료 없음 / 장비·전력 별도 | 115 ms 중앙값 · RTX 3090, 프로젝트 설명; 이미지 속도로 일반화하지 않음 | JevBench 평가 제공. 릴리스별 모델 카드 확인, 다른 학습 실험의 점수를 대표값으로 사용하지 않음. | 한국어별 평가·지원 명세 미확인 | 지원 확인 |
검색 조건에 맞는 모델이 없습니다. 검색어를 지우거나 전체 모델을 선택해 주세요.
가정: 10,000회 요청 × 요청당 청구 입력 1,000토큰 = 1,000만 토큰. 이때 입력 요금만 계산하면 아래와 같습니다. 실측 견적이 아니라 단가를 이해하기 위한 계산이며, 이미지 토큰·재시도·캐시·세금·결제 수수료에 따라 달라집니다.
가격 출처는 위 표의 모델별 링크입니다. Perplexity Flash는 한 요청에 여러 질문을 넣으면 state를 질문마다 다시 과금합니다. 단일 질문 기준 계산을 다중 질문 요청에 그대로 적용하지 마세요. 공식 과금 규칙 ↗
또한 ‘1,000장 × 현재값 10개’의 정적 행동 평가는 10,000개 판단이지만, 매 이동을 API로 다시 호출하는 실시간 rollout은 호출이 더 많아질 수 있습니다. 그림이 작아도 서비스가 내부적으로 확대해 토큰화할 수 있습니다.
추천 / 이 MNIST 실험에 적용하기
추천 순서는 이 실험의 그림 + 현재 숫자 → −1 / 0 / +1이라는 목적에 맞춘 판단입니다. 아래 후보들의 MNIST 성능을 새로 측정한 것은 아닙니다.
저장된 Qwen3.5-0.8B + 판단부·LoRA 실험은 공식 MNIST test의 첫 1,000장, 현재값 10개로 만든 10,000개 판단에서 행동 정확도 97.70%, 에피소드 성공률 93.62%를 기록했습니다. RTX 5070 Ti Laptop 12GB에서 단건 p50 93.33 ms, p95 97.97 ms입니다. 이미지를 미리 읽고 리사이즈했으며 모델 로딩·디스크·네트워크는 제외한 수치입니다. 한국어 조건은 측정하지 않았습니다.
이미지를 직접 받고 공개 가중치가 있어, 현재 0.8B 모델과 ‘학습하지 않은 범용 판단 모델’을 비교하기 좋습니다. 개발사 자료에 이미지 입력 속도 조건까지 있어 측정 계획을 잡기 쉽습니다. 다만 4090의 17 ms를 현재 노트북의 예상 속도로 쓰면 안 됩니다.
먼저 공식 런타임으로 추론만 비교하고, 추가 학습은 별도 단계로 두세요. 기존 Unsloth 코드에서 이름만 바꿔 그대로 학습할 수 있다고 확인된 것은 아닙니다.
이미지 지원·공개 모델 자료 ↗Qwen 기반 멀티모달 판단 모델이라는 점에서 현재 실험과 비교할 가치가 있습니다. Apache-2.0이며 이미지 판단 평가도 공개되어 있습니다. 다만 권장 실행은 전용 vLLM 빌드·shim을 사용하므로 현재 환경보다 설치와 검증 작업이 큽니다.
Windows·12GB에서 실행 가능 여부는 정밀도와 런타임까지 확인해야 합니다. 파라미터 수만으로 메모리에 들어간다고 단정하지 않습니다.
실행 조건·이미지 평가 ↗둘 다 이미지 입력이 확인되어 있습니다. 요청당 행동 질문 하나라면 Flash v1.2의 입력 단가가 낮아 첫 API 비교 후보로 적합합니다. Clef-flash는 이 튜토리얼에서 다룬 계열과의 연결을 확인하는 비교군입니다.
복잡한 오답이 남으면 pplx 27B나 OpenAI Decisions를 추가해 보세요. 이것은 단가와 연결 편의에 따른 추천이며 정확도 우승 모델을 정한 것은 아닙니다.
Perplexity 이미지·요금 · Clef-flash 이미지·요금 ↗Strands는 vision 옵션과 학습 코드가 있어 ‘판단부를 어떻게 학습하는가’를 비교하는 후보입니다. 이미지로 학습하지 않은 체크포인트의 시각 능력을 사용하는 방식이므로 전용 MNIST 학습과 구분하세요.
숫자 인식 자체만 평가하려면 작은 CNN으로 숫자를 예측하고 코드로 sign(예측 숫자 − 현재값)을 계산하는 기준선도 넣으세요. 이미지 인식에서 틀렸는지, 행동 규칙을 적용하다 틀렸는지 나눠 볼 수 있습니다. CNN 성능은 아직 측정하지 않았습니다.
Laya·laya-ko·GLiNER2.5-Decide는 텍스트 판단용이어서 이미지를 직접 넣는 비교군으로 적합하지 않습니다. OCR이나 다른 숫자 인식기를 앞에 붙이면 ‘인식기 + 판단 모델’이라는 다른 실험이 됩니다. Parallel의 웹 검색도 MNIST에는 필요하지 않습니다. Clef 27B·공개 pplx 27B는 비교용 API로는 쓸 수 있지만 현재 12GB 노트북에서 첫 로컬 후보로 삼기에는 부담이 큽니다.
같은 이미지·현재값·선택지 ID를 두고 질문과 설명만 영어/한국어로 바꿉니다. 예: “현재 숫자는 3입니다. 그림의 숫자에 한 칸 가까워지도록 행동을 고르세요. 같을 때만 멈추세요.” 한국어로 보낸다고 정답 숫자를 state에 써 넣으면 안 됩니다.
저장된 1,000장과 현재값 0–9를 동일하게 쓰고, 추가학습은 test 그림과 분리합니다. 입력 리사이즈·선택지 순서·모델 버전을 기록합니다.
행동 정확도, rollout 성공률, 잘못 멈춤·순환 비율을 함께 봅니다. 0.1의 확률을 붙여 틀리는 것과 0.99로 자신 있게 틀리는 것도 구별해 NLL/Brier 등을 기록합니다.
API는 이미지 인코딩과 네트워크를 포함한 p50/p95, 로컬은 전처리 포함 단건과 배치 처리량을 따로 기록합니다. 오류·재시도를 제외한 예쁜 수치만 보고하지 않습니다.
한국어 정확도 − 영어 정확도의 %p 차이와 두 언어의 행동 불일치율을 구합니다. 차이를 해석할 때 같은 그림의 10개 상태는 서로 연관되어 있으므로 신뢰구간은 이미지 단위로 묶어 계산합니다.
지금 추가한 것은 자료 기반 비교와 실험 추천입니다. 유료 API 호출, 새 모델 다운로드·학습, 한국어 성능 측정은 실행하지 않았습니다.
04 / Clef 이해하기
Clef는 Qwen 기반 모델이 입력을 읽은 뒤, joint schema head라는 판단부가 질문과 허용된 선택지의 점수를 계산하는 구조입니다. 각 질문의 점수를 확률로 바꿉니다. 자유로운 설명 문장을 먼저 생성할 필요가 없습니다.
확인한 모델 카드에서 Clef는 Qwen3.8-27B 기반이며, 가중치와 판단부 구현을 Apache-2.0으로 공개합니다. 더 작은 변형이 Clef-flash입니다. 사용 시점의 정확한 모델 구성과 조건은 각 모델 카드를 기준으로 확인하면 됩니다. 모델 카드 ↗
우리 실험은 더 작은 Qwen3.5-0.8B에 새 판단부를 붙였습니다. 구조를 활용했다고 해서 Cloudflare 모델의 사전학습 결과·성능·보정 특성이 그대로 옮겨오는 것은 아닙니다.
또한 ‘Jev API 호환’은 질문과 응답을 비슷한 형식으로 주고받을 수 있다는 뜻입니다. 서버 주소, 인증, 응답을 감싸는 구조와 실제 확률값까지 동일하다는 뜻은 아닙니다. Workers AI 사용 안내 ↗
05 / Unsloth 기능 지도
Unsloth는 특정 모델 한 개의 이름이 아닙니다. Python 코드로 사용하는 학습 프레임워크가 있고, 화면에서 모델 실행과 학습을 다루는 Desktop 앱도 있습니다. 공식 소개 · Desktop 기능 ↗
| 기능 | 무엇을 할 수 있나요? | 이 실험에서는? |
|---|---|---|
| 모델 로딩·추론 | 지원하는 언어·비전 모델을 불러와 로컬에서 실행 | Qwen VLM과 processor 로딩 |
| LoRA / QLoRA | 일부 추가 가중치를 학습하고, 양자화 로딩으로 메모리 사용을 줄이는 방식 지원 | 4bit 기반 모델 + LoRA 학습 |
| 전체 미세조정·사전학습 | 지원 모델과 환경에서 더 넓은 범위의 가중치를 학습 | 사용하지 않음 |
| GRPO·DPO 등 | 보상이나 선호 데이터로 학습하는 절차 지원 | 사용하지 않음. 여기서는 정답 행동을 준 지도학습 |
| Decision model 학습 | 새 판단부 부착, 정답 데이터 변환, 학습, 평가와 확률 보정 | 핵심 기능. 다음 API 절에서 설명 |
| 저장·내보내기 | 어댑터 저장, 지원 경로에서 병합·GGUF 등의 배포 형식 활용 | LoRA와 판단부를 저장하고 다시 로딩 |
| 로컬 Decision API | Desktop에서 Laya·Clef 등으로 호환 HTTP API 제공 | 본 실험에서는 직접 Python 호출 |
기능 근거: 프로젝트 README · RL 안내 · GGUF 저장 · Decision API
‘Unsloth가 지원한다’와 ‘모든 모델에서 모든 조합이 된다’는 다릅니다. 예를 들어 이 저장소에 보존된 decision API 구현은 8bit 로딩을 거부합니다. Laya와 Clef 계열도 4bit 지원 경로가 다릅니다. 일반 LLM용 내보내기 설명만 보고, 사용자 정의 판단부까지 아무 추론 엔진에서나 실행된다고 가정하면 안 됩니다. 실험 당시 구현 확인 ↗
06 / API 공통 언어
예를 들어 ‘비밀번호 재설정 메일이 도착하지 않는다’는 문의가 들어왔다고 합시다. 이것이 state입니다. 어느 팀이 맡을지, 장애 가능성이 있는지, 업무 영향이 얼마나 큰지를 questions에 담습니다. 질문의 ID는 직접 정합니다.
| 질문 타입 | 질문의 모양 | 응답에서 읽을 값 |
|---|---|---|
choice | 여러 선택지 중 하나. criteria는 선택지 ID → 설명 | choice, 선택지별 probabilities, confidence |
noul | ‘이 문의는 계정 접근 문제인가?’ 같은 하나의 yes/no 질문 | noul: yes일 확률, 0~1 |
score | 낮음에서 높음 순으로 설명한 단계 목록 | score, 단계별 probabilities, legend, confidence |
세 단계가 있으면 단계 번호는 0·1·2입니다. 확률이 0.1·0.4·0.5라면 점수는 0 × 0.1 + 1 × 0.4 + 2 × 0.5 = 1.4입니다. 단계 위치의 가중 평균이므로 소수가 될 수 있습니다. 등급 설명이 달라지면 같은 1.4의 의미도 달라집니다.
‘기술팀’ 선택지의 확률과 응답 전체의 confidence는 구분해서 읽습니다. 특히 Unsloth의 Laya 서빙과 Jev는 confidence 계산이 달라 기존 임계값을 그대로 옮기면 안 됩니다. 동일한 업무 자료에서 다시 평가해야 합니다. 호환 API의 차이 ↗
07 / 원격 모델 호출
아래는 요청 형식을 설명하기 위해 새로 작성한 Python 예제입니다. requests 패키지와 해당 서비스의 API 키가 필요합니다. 이 페이지에서 실제 API를 실행하거나 키를 입력받지는 않습니다.
state = "I cannot sign in because the password reset email never arrives."
questions = {
"route": {
"type": "choice",
"instructions": "Select the team best suited to resolve this request.",
"criteria": {
"account": "Sign-in, account access and password recovery",
"payment": "Charges, receipts and payment methods",
"other": "Requests outside account access and payments"
}
},
"access_issue": {
"type": "noul",
"instructions": "The user is unable to access their account."
},
"impact": {
"type": "score",
"instructions": "Assess how much the issue blocks the user's work.",
"criteria": [
"Work can continue without any interruption",
"Some work is blocked but an alternative is available",
"The user cannot proceed and no alternative is stated"
]
}
}선택지 ID는 코드가 읽을 값이고, 설명은 모델이 의미를 판단할 기준입니다. ‘1, 2, 3’만 적기보다 각 단계가 어떤 상황인지 설명하는 편이 좋습니다. 위 영어는 예제 입력이며 한국어 설명문과는 별개입니다.
import os
import requests
response = requests.post(
"https://api.typesafe.ai/v1/systemone",
headers={"Authorization": "Bearer " + os.environ["TYPESAFE_API_KEY"]},
json={"model": "jev-latest", "state": state, "questions": questions},
timeout=30,
)
response.raise_for_status()
result = response.json()
route = result["answers"]["route"]
print(route["choice"], route["probabilities"])
print(result["answers"]["access_issue"]["noul"])
print(result["answers"]["impact"]["score"])requests.post(..., json=...)가 JSON 직렬화와 Content-Type 설정을 처리합니다. 결과는 answers 아래에 요청한 질문 ID로 돌아옵니다. jev-latest는 바뀔 수 있는 별칭이므로 실험 기록에는 응답의 model 값도 남기고, 재현이 필요하면 계정에서 제공되는 고정 버전을 선택하세요. HTTP 요청·응답 출처 ↗
# 설치: pip install typesafe-sdk
# 위에서 정의한 state, questions를 재사용합니다.
from typesafe_sdk import TypeSafeClient
with TypeSafeClient(timeout=30) as client:
result = client.system_one(
model="jev-latest", state=state, questions=questions
)
print(result.answers["route"].choice)SDK는 TYPESAFE_API_KEY 환경변수를 읽고 타입이 있는 응답 객체를 반환합니다. HTTP의 딕셔너리 접근과 SDK의 속성 접근을 섞지 마세요. 기본 재시도 정책도 제공합니다. 클라이언트 명세 ↗
import os
import requests
account_id = os.environ["CLOUDFLARE_ACCOUNT_ID"]
url = (
"https://api.cloudflare.com/client/v4/accounts/"
+ account_id + "/ai/run/@cf/cloudflare/clef"
)
response = requests.post(
url,
headers={"Authorization": "Bearer " + os.environ["CLOUDFLARE_AUTH_TOKEN"]},
json={"model": "clef", "state": state, "questions": questions},
timeout=60,
)
response.raise_for_status()
body = response.json()
if not body.get("success", False):
raise RuntimeError(body.get("errors"))
print(body["result"]["answers"]["route"]["choice"])Cloudflare REST API는 바깥쪽에 success·errors·result를 둡니다. Workers 내부의 env.AI.run() 예제와 응답 접근 경로가 다릅니다. 모델 식별자와 해당 계정의 Workers AI 권한도 필요합니다. Clef 사용법 · REST 응답 형식 ↗
TypeSafe에서 401은 인증, 422는 질문 형식 등의 검증 오류입니다. 429는 호출량 제한, 529는 일시적 과부하이므로 간격을 늘리며 재시도합니다. 위 REST 예제는 최소 형태라 자동 재시도를 구현하지 않았습니다. 오류 코드와 재시도 ↗
08 / 직접 모델 학습하기
여기부터는 웹 서버에 JSON을 보내는 API가 아닙니다. 내 컴퓨터 메모리에 모델을 올리고 학습하는 함수입니다. 아래 표와 코드는 최신 문서의 변화를 섞지 않도록, 이 저장소에 보존된 실험 당시 구현을 기준으로 설명합니다.
| 호출 | 중요한 인자 | 결과와 역할 |
|---|---|---|
FastDecisionModel.from_pretrained() | model_name, max_seq_length, load_in_4bit, dtype | (model, tokenizer 또는 processor). 로딩과 판단부 구성 |
get_peft_model() | model, r, lora_alpha, lora_dropout | LoRA 학습을 준비한 모델 |
build_dataset() | rows, processor, model | (items, report). 입력 변환 및 누락·잘림 보고 |
DecisionTrainer() | model, processing_class, train_dataset, args, head_learning_rate | 학습 관리자. train()으로 학습 시작 |
for_training() / for_inference() | model | 학습·추론에 맞게 모델 모드 전환 |
evaluate() | model, processor, items, batch_size | 현재 모델의 평가 지표 반환 |
calibrate() | model, processor, items, batch_size | 온도 보정 설정 갱신과 지표 반환 |
predict() | model, processor, state, questions, images | 질문 ID → 답. HTTP와 달리 바깥 answers가 없음 |
model.save_pretrained() | 저장 폴더 | 학습 결과 저장. 재로딩 후 같은 예제에서 확인 |
구현 근거: 보존된 decision.py · 실험의 모델 래퍼 · 전체 학습 코드
from PIL import Image
image = Image.open("digit.png").convert("RGB").resize((112, 112))
move_questions = {
"move": {
"type": "choice",
"instructions": "Move one step toward the handwritten digit. Stop only when equal.",
"criteria": {
"-1": "Decrease the current number by one",
"0": "Stop at the current number",
"+1": "Increase the current number by one"
}
}
}
row = {
"images": [image],
"state": "The current number is 3.",
"questions": move_questions,
"gold": {"move": "+1"} # 예: digit.png의 정답 숫자가 7일 때
}gold는 채점용 정답입니다. 실제 데이터에서는 이미지의 정답 숫자와 현재 숫자를 비교해 계산합니다. 위 한 줄만으로 일반화 성능을 학습할 수는 없습니다. 학습·검증·보정·테스트를 나눌 때는 같은 그림에서 만든 여러 현재 상태가 서로 다른 split으로 흩어지지 않도록 이미지 단위로 나눕니다.
다음은 흐름을 보여주는 코드입니다. train_rows와 calibration_rows는 앞 형식으로 준비된 서로 다른 이미지의 목록이라고 가정합니다. CUDA·BF16을 지원하는 이 실험의 환경을 전제로 하며, 완전한 실행 절차와 패키지 버전은 재현 안내를 따릅니다.
from unsloth import FastDecisionModel, DecisionTrainer
import torch
from transformers import TrainingArguments
model, processor = FastDecisionModel.from_pretrained(
model_name="unsloth/Qwen3.5-0.8B",
max_seq_length=1024,
load_in_4bit=True,
dtype=torch.bfloat16,
)
model = FastDecisionModel.get_peft_model(
model, r=16, lora_alpha=16, lora_dropout=0
)
items, report = FastDecisionModel.build_dataset(train_rows, processor, model)
cal_items, cal_report = FastDecisionModel.build_dataset(
calibration_rows, processor, model
)
for check in (report, cal_report):
if check["skipped"] or check["truncated"]:
raise ValueError(check)
if not items or not cal_items:
raise ValueError("학습·보정 자료가 비어 있습니다.")
FastDecisionModel.for_training(model)
trainer = DecisionTrainer(
model=model,
processing_class=processor,
train_dataset=items,
head_learning_rate=1e-3,
args=TrainingArguments(
output_dir="work/checkpoints",
per_device_train_batch_size=32,
gradient_accumulation_steps=1,
max_steps=600,
learning_rate=2e-4,
bf16=True,
report_to="none",
),
)
trainer.train()
FastDecisionModel.for_inference(model)
metrics = FastDecisionModel.calibrate(model, processor, cal_items, batch_size=1)
model.save_pretrained("work/mnist-adapter")학습률 두 개가 보이죠. learning_rate는 기반 모델 쪽 학습 대상에, head_learning_rate는 판단부에 사용됩니다. 위 골격은 원문의 스케줄러·콜백·중간 검증 설정을 모두 복제하지는 않았습니다. 원문 수치를 재현하려면 train.py와 저장 설정을 함께 사용해야 합니다.
loaded, processor = FastDecisionModel.from_pretrained(
model_name="work/mnist-adapter",
max_seq_length=1024,
load_in_4bit=True,
dtype=torch.bfloat16,
)
FastDecisionModel.for_inference(loaded)
answers = FastDecisionModel.predict(
loaded, processor,
state="The current number is 3.",
questions=move_questions,
images=[image],
)
move = answers["move"]
print(move["answer"], move["probabilities"])Jev REST: result["answers"]["route"]["choice"]
Jev Python SDK: result.answers["route"].choice
이 실험의 Unsloth: answers["move"]["answer"]
이미지 입력은 멀티모달 기반 모델과 processor가 지원해야 합니다. images 인자만 넣으면 텍스트 전용 모델도 그림을 읽는 것은 아닙니다. 보정 뒤 저장된 온도는 구현에 따라 가중치에 반영될 수 있으므로, 재로딩 후 같은 온도를 임의로 한 번 더 적용하지 않습니다.
09 / 로컬 서비스 연결
Desktop의 Settings → API → Decision API → Serve requests에서 로컬 서빙을 준비합니다. 문서의 기본 주소는 http://localhost:8888/v1/systemone이며, 키는 같은 설정의 Access tokens에서 확인합니다. 실제 포트는 본인의 설정을 따릅니다. 공식 실행 절차 ↗
import os
import requests
response = requests.post(
"http://localhost:8888/v1/systemone",
headers={"Authorization": "Bearer " + os.environ["UNSLOTH_API_KEY"]},
json={"model": "laya", "state": state, "questions": questions},
timeout=60,
)
response.raise_for_status()
print(response.json()["answers"]["route"]["choice"])UNSLOTH_API_KEY는 이 예제에서 정한 환경변수 이름입니다. 여기에 Desktop에서 만든 토큰을 설정합니다. 로컬의 jev-latest 별칭은 설정에서 선택한 모델로 연결될 수 있습니다. 주소가 로컬이라면 Jev라는 문자열을 넣었다고 TypeSafe의 Jev가 실행되는 것은 아닙니다.
이 사이트의 미리보기 주소인 127.0.0.1:18765는 HTML을 보여주는 서버입니다. 위 Decision API 서버와는 별개이며, 이 페이지를 열었다고 모델 서버가 자동으로 켜지지는 않습니다.
10 / 이해에서 실험으로
모델 계산 시간, 네트워크 왕복, 웹페이지 가져오기까지 포함한 시간은 서로 다릅니다. 제조사별 숫자를 그대로 줄 세우면 비교가 어긋날 수 있습니다.
항상 유효한 선택지가 나온다는 것은 연결하기 편하다는 장점입니다. 그 선택지가 맞는지, 틀렸을 때 확률도 낮은지는 별도로 확인합니다.
‘모든 문의를 처리하라’보다 ‘세 팀 중 어디에 보낼까?’처럼 범위가 분명한 질문부터 시작합니다. 그 다음 실제 정답과 혼동 사례, 확률, 응답 시간을 함께 기록합니다.
이번 MNIST 실험은 그 작은 결정을 눈으로 확인하는 예제입니다. 그림 한 장과 현재 상태를 주고, 한 번의 선택과 반복 실행 결과가 어떻게 달라지는지 살펴볼 수 있습니다.
숫자 이동 예제로 학습과 평가의 차이를 이해합니다.
실제 학습 기록 읽기 →이 사이트에 저장된 배치별 예측과 손실을 확인합니다.
이 가이드의 출처와 확인 범위 →공식 자료, 개발자 보고, 논문과 코드 기준을 모았습니다.
웹 자료 확인: 2026. 10. 30. / API 예제: 문서와 보존된 소스 대조, Python 문법 검사. 원격 유료 API 호출과 GPU 재학습은 실행하지 않았습니다. 모델·패키지 업데이트에 따라 사용 가능 기능과 인자가 달라질 수 있습니다.