Loading the catalog…
Loading the catalog…
2026년 9월 15일 TypeSafe AI는 Jev 라는 새로운 AI 모델을 공개했다. Jev는 ChatGPT나 Claude처럼 텍스트를 생성하는 LLM이 아니다. TypeSafe는 Jev를 첫 번째 System One Model 이라고 정의한다. 출처: TypeSafe AI Documentation - Introduction 핵심 아이디어는 간단하다. LLM이 자연어를 생성하는 모델이라면, Jev는 소프트웨어가 바로 사용할 수 있는 결정을 내리는 모델이다. TypeSafe는 Jev를 다음과 같이 표현한다. unstructured state in, typed probabilistic decisions out. 즉, 자연어나 구조화된 상태(state)를 입력하면 타입이 정의된 결정과 그 확률 을 반환한다. 이 글에서는 Jev가 기존 LLM과 무엇이 다른지 살펴보고, Python SDK를 사용해 실제로 호출하는 방법까지 정리한다. 1. 왜 Jev가 등장했을까? LLM은 기본적으로 text generation model 이다. 예를 들어 고객 문의를 분류한다고 해보자. 사용자: 결제가 두 번 됐어요. 환불해주세요. 질문: 이 문의를 담당해야 하는 부서를 JSON으로 반환해줘. 가능한 부서: billing technical sales LLM은 내부적으로 다음과 같이 토큰을 하나씩 생성한다. { "department": "billing" } 이 방식은 사람이 읽는 답변을 만들 때는 매우 유용하다. 하지만 소프트웨어의 의사결정 모듈로 사용하면 약간 어색한 부분이 생긴다. Text ↓ LLM ↓ Generated String ↓ JSON Parsing ↓ Schema Validation ↓ Application Logic 즉 우리가 실제로 원하는 것은 billing 이라는 결정 인데, 모델은 우선 문자열을 생성하고 우리는 다시 그 문자열을 프로그램이 사용할 수 있는 데이터로 변환해야 한다. TypeSafe는 이를 LLM과 software automation 사이의 interface mismatch 라고 본다. Jev는 이 과정을 다음처럼 바꾼다. State ↓ Jev ↓ Typed Decision ↓ Application Logic 텍스트를 생성한 뒤 파싱하는 것이 아니라 처음부터 구조화된 decision 을 반환하는 것이다. 2. Jev는 무엇인가? Jev는 TypeSafe AI가 개발한 첫 번째 System One Model 이다. System One이라는 이름은 Daniel Kahneman의 Thinking, Fast and Slow 에서 등장하는 System 1에서 가져왔다. 빠르고 직관적인 판단을 담당하는 인간의 사고 방식을 모델 설계 철학에 차용한 것이다. Jev가 목표로 하는 것은 다음과 같은 문제다. classification routing scoring ranking verification guardrail branching 예를 들어 고객 문의가 들어왔을 때 다음 질문을 동시에 판단할 수 있다. 어느 부서가 담당해야 하는가? → billing / technical / sales 고객은 얼마나 화가 났는가? → calm / frustrated / angry 긴급한 요청인가? → probability 0~1 여기서 중요한 점은 Jev가 답변을 문장으로 생성하지 않는다는 것 이다. 대신 개발자가 미리 정의한 output space에서 결과를 선택한다. 3. LLM과 Jev의 가장 큰 차이 두 모델의 차이를 간단히 정리하면 다음과 같다. LLM Jev 주요 목적 Text Generation Decision 출력 String / Tokens Typed Value 출력 방식 Autoregressive Parallel Parsing 필요할 수 있음 불필요 후보 공간 사실상 무제한 개발자가 정의 Probability 일반적으로 직접 노출하지 않음 기본 제공 Confidence 별도 추정 필요 Choice/Score에서 제공 적합한 작업 대화, 글쓰기, 코드 생성, reasoning classification, routing, scoring, verification LLM은 다음 토큰을 반복적으로 예측한다. P(x_t | x_1, ..., x_{t-1}) 따라서 문장이 길어질수록 여러 decoding step이 필요하다. 반면 TypeSafe에 따르면 Jev는 여러 decision을 parallel sampling 방식으로 처리하며, 여러 질문을 하나의 요청에 넣더라도 응답시간 증가가 상대적으로 작도록 설계됐다. TypeSafe가 공개한 자료에서는 System One task 기준으로 Jev의 응답 시간이 약 70–500ms 수준이라고 설명한다. 다만 이는 TypeSafe 측 측정값이며 네트워크 위치, 요청 구조, 모델 버전 등에 따라 실제 latency는 달라질 수 있다. 4. Jev의 핵심 구조: State + Questions Jev API를 이해하기 위해 가장 중요한 개념은 단 두 가지다. state questions State state 는 Jev가 판단해야 하는 대상이다. 예를 들어 고객 문의라면 다음 문장이 state가 된다. I've been trying to connect my Stripe account for 3 days. The integration keeps failing and I'm losing sales. Questions questions 는 이 state를 보고 Jev가 판단해야 하는 항목이다. 예를 들어: 어느 부서가 담당해야 하는가? 고객의 frustration 정도는? 긴급한 요청인가? Jev는 이 질문들을 각각 판단한다. 공식 문서에서는 각 question이 동일한 state를 기준으로 독립적으로 평가되며 병렬로 처리된다 고 설명한다. 따라서 하나의 복잡한 질문을 만드는 것보다 판단 기준을 여러 atomic question으로 분리하는 것을 권장한다. 5. Jev의 세 가지 Primitive 현재 TypeSafe API에는 세 가지 핵심 question type이 존재한다. Choice Score Noul 각각 역할이 명확하다. Type 목적 예 Choice 여러 후보 중 하나 선택 어떤 부서로 보낼까? Score 순서가 있는 단계 평가 고객은 얼마나 화났나? Noul Yes/No 명제의 확률 환불을 요청했는가? 6. Choice: 여러 후보 중 하나 선택하기 Choice 는 전형적인 classification 문제에 해당한다. 예를 들어 고객 문의를 세 부서 중 하나로 분류한다고 해보자. from typesafe_sdk import Choice, TypeSafeClient client = TypeSafeClient() response = client.system_one( state="My payment was charged twice. I want a refund.", questions={ "department": Choice( instructions="Which team should handle this request?", criteria={ "billing": "Payment, subscription, invoice, or refund issues", "technical": "Software bugs or technical problems", "sales": "Pricing or purchasing questions", }, ) }, ) answer = response.answers["department"] print(answer.choice) print(answer.probabilities) print(answer.confidence) 결과는 개념적으로 다음과 같다. choice = "billing" probabilities = { "billing": 0.91, "technical": 0.03, "sales": 0.06 } confidence = 0.87 Choice는 단순히 가장 높은 후보만 반환하는 것이 아니다. 전체 후보의 probability distribution 도 함께 받을 수 있다. choice 는 이들 중 가장 높은 확률을 가진 option이다. 따라서 다음과 같은 로직도 만들 수 있다. if answer.confidence < 0.5: send_to_human_review() elif answer.choice == "billing": send_to_billing() elif answer.choice == "technical": send_to_technical() 이 부분이 일반적인 LLM classification과 상당히 다른 지점이다. 모델의 판단을 바로 실행하는 것이 아니라 uncertainty를 application logic에 포함할 수 있다. 7. Noul: Yes / No를 확률로 판단하기 Noul 은 조금 독특한 이름의 primitive다. 역할 자체는 간단하다. 주어진 명제가 참일 확률을 0~1 사이 값으로 반환한다. 예를 들어 다음 고객 문의가 있다고 하자. I have asked three times already. Can I please talk to a real person? 다음과 같이 질문할 수 있다. from typesafe_sdk import Noul, TypeSafeClient client = TypeSafeClient() response = client.system_one( state=""" I have asked three times already. Can I please talk to a real person? """, questions={ "needs_human": Noul( instructions="Is the customer asking for a human agent?" ) }, ) probability = response.answers["needs_human"].noul print(probability) 예를 들어 결과가 0.99 라면 P(customer wants human | state) ≈ 0.99 와 같은 의미로 사용할 수 있다. 공식 문서 예시에서도 실제 해당 문장에 대해 0.99 가 반환된다. 따라서 application에서는 threshold만 설정하면 된다. if probability > 0.9: route_to_human() else: route_to_bot() 물론 실제 production 환경에서는 0.9라는 threshold를 임의로 정하기보다 validation set을 기반으로 조정해야 한다. 특히 false positive와 false negative의 비용이 다르다면 threshold 역시 달라져야 한다. 예를 들어 safety detection이라면 false negative의 비용이 크기 때문에 threshold를 낮추는 것이 합리적일 수 있다. TypeSafe 문서 역시 threshold는 decision error의 비용에 따라 설정해야 한다 고 권장한다. 8. Score: 순서가 있는 정도를 평가하기 Choice가 categorical classification이라면 Score는 ordinal prediction 에 가깝다. 예를 들어 고객의 frustration을 평가할 수 있다. from typesafe_sdk import Score frustration = Score( instructions="How frustrated does the customer appear?", criteria=[ "Calm, simply stating the issue", "Frustrated but still civil", "Very angry or aggressive", ], ) criteria 에는 낮은 수준부터 높은 수준 순서로 description을 작성한다. 공식 문서상 Score에는 최소 2개, 최대 10개의 level을 지정할 수 있다. 결과는 예를 들어 다음과 같이 나온다. score = 1.2 probabilities = { 0: 0.05, 1: 0.70, 2: 0.25 } 여기서 재미있는 점은 Score 값이 반드시 정수일 필요가 없다는 것이다. 두 level 사이의 확률 분포를 기반으로 중간값을 표현할 수도 있다. 9. 여러 질문을 한 번에 요청하기 Jev의 중요한 특징 중 하나는 여러 decision을 하나의 request에 넣을 수 있다는 것이다. 예를 들어 고객 문의 분석 시스템을 다음처럼 구성할 수 있다. from typesafe_sdk import Choice, Noul, Score, TypeSafeClient client = TypeSafeClient() ticket = """ I've been trying to connect my Stripe account for three days. The integration keeps failing and I'm losing sales. Please help ASAP. """ response = client.system_one( state=ticket, questions={ "department": Choice( instructions="Which team should handle this?", criteria={ "billing": "Payment or subscription issues", "technical": "Bugs or integration problems", "sales": "Pricing or purchasing questions", }, ), "frustration": Score( instructions="How frustrated does the customer appear?", criteria=[ "Calm", "Frustrated", "Very angry", ], ), "urgent": Noul( instructions="Does this message express urgency?" ), }, ) 이렇게 하면 department frustration urgent 세 가지 판단을 한 번의 요청으로 얻는다. 공식 문서는 여러 question을 한 request에 넣는 것을 권장한다. 각 question은 같은 state에 대해 독립적으로 평가되며 병렬 처리되기 때문에, question 수를 늘리더라도 latency가 크게 증가하지 않는 것이 Jev 설계의 특징이라고 설명한다. 다만 추가 question 역시 token cost에는 반영된다. 10. Jev 시작하기 Jev를 사용하는 방법은 크게 두 가지다. 가볍게 테스트만 해보고 싶다면 TypeSafe Playground 를 사용할 수 있고, 실제 코드에서 사용하려면 API Key를 발급받아 SDK 또는 REST API로 호출 해야 한다. 공식 문서 역시 먼저 Playground에서 Jev를 시험해본 뒤 API를 사용하는 흐름을 안내한다. Step 0. Playground에서 먼저 사용해보기 처음부터 Python 코드를 작성할 필요는 없다. TypeSafe Console의 Playground에 로그인하면 state 와 question 을 직접 입력해 Jev의 결과를 확인할 수 있다. 예를 들어 state에 다음 내용을 입력한다. Hi, I've been trying to connect my Stripe account for 3 days. The integration keeps failing. I'm losing sales. Please help ASAP. 그리고 Noul question을 하나 추가한다. Does this message express urgency? 그러면 Jev가 해당 명제가 참일 확률을 반환한다. 공식 Quick Start에서는 Jev를 처음 접한다면 이 Playground 방식으로 먼저 Noul , Choice , Score 를 시험해보는 방법을 제시한다. Step 1. TypeSafe 계정 생성 및 API Key 발급 Python SDK나 REST API를 사용하려면 TypeSafe API Key가 필요하다. TypeSafe Console에 로그인한 뒤 Dashboard에서 API Key를 발급한다. 발급받은 키는 다음처럼 생긴 인증 정보이며 외부에 공개하면 안 된다. your-typesafe-api-key 특히 GitHub에 코드를 올릴 때 다음처럼 API Key를 코드에 직접 작성하는 것은 피하는 것이 좋다. # 권장하지 않음 client = TypeSafeClient( api_key="your-api-key" ) 대신 환경 변수로 관리한다. Step 2. API Key를 환경 변수에 등록하기 macOS나 Linux에서는 터미널에서 다음과 같이 설정할 수 있다. export TYPESAFE_API_KEY="your-api-key" Windows PowerShell이라면 다음과 같이 설정할 수 있다. $env:TYPESAFE_API_KEY="your-api-key" Python에서 제대로 등록됐는지 확인하고 싶다면: import os print(os.getenv("TYPESAFE_API_KEY")) 값이 출력된다면 설정된 것이다. 단, 실제 개발 환경에서는 API Key 전체를 로그에 출력하지 않는 것이 좋다. TypeSafe Python SDK의 TypeSafeClient() 는 기본적으로 TYPESAFE_API_KEY 환경 변수를 자동으로 읽는다. 따라서 이후 코드에서 API Key를 매번 전달할 필요가 없다. Step 3. Python SDK 설치 현재 공식 SDK는 Python 3.10 이상을 요구한다. pip를 사용하는 경우: pip install typesafe-sdk uv를 사용한다면: uv add typesafe-sdk Step 4. 가장 간단한 Jev 호출 설치가 끝났다면 다음 코드만으로 Jev를 호출할 수 있다. from typesafe_sdk import Noul, TypeSafeClient client = TypeSafeClient() response = client.system_one( state="The customer wants a refund because they were charged twice.", questions={ "refund_request": Noul( instructions="Is the customer requesting a refund?" ) }, ) print(response.answers["refund_request"].noul) 여기서 client = TypeSafeClient() 에 API Key가 보이지 않는 이유는 SDK가 앞서 설정한 TYPESAFE_API_KEY 환경 변수를 자동으로 읽기 때문이다. 또한 모델을 별도로 지정하지 않으면 현재 공식 문서 기준으로 기본 모델인 jev-latest 가 사용된다. 전체 과정을 정리하면 처음 사용하는 경우 다음 순서만 따르면 된다. 1. TypeSafe Console 가입 및 로그인 ↓ 2. Playground에서 Jev 테스트 ↓ 3. Dashboard에서 API Key 발급 ↓ 4. TYPESAFE_API_KEY 환경 변수 등록 ↓ 5. pip install typesafe-sdk ↓ 6. TypeSafeClient() 생성 ↓ 7. client.system_one() 호출 Playground에서 테스트할 때는 별도의 Python 환경이나 SDK가 필요하지 않다. 반면 실제 애플리케이션에서 Jev를 호출하려면 API Key를 발급받아 인증해야 한다. 공식 REST API에서도 다음과 같이 Bearer 인증을 사용한다. Authorization: Bearer <API_KEY> 공식 API endpoint는 현재 다음과 같다. POST https://api.typesafe.ai/v1/systemone 이제 API Key 설정이 끝났다면 Choice , Score , Noul 을 실제 코드에서 사용할 수 있다. 11. HTTP API로 직접 호출하기 SDK를 사용하지 않고 REST API를 직접 호출하는 것도 가능하다. endpoint는 현재 다음과 같다. POST https://api.typesafe.ai/v1/systemone Authorization header에는 Bearer token을 사용한다. 예를 들어: curl -X POST https://api.typesafe.ai/v1/systemone \ -H "Authorization: Bearer $TYPESAFE_API_KEY" \ -H "Content-Type: application/json" \ -d '{
What RADAR observed and classified to build this opportunity. It is what the source published, not a verification that the offer is still active.
Jev 개념과 사용법 정리. 2026년 9월 15일 TypeSafe AI는 Jev 라는 새로운 AI 모델을 공개했다. Jev는 ChatGPT나 Claude처럼 텍스트를 생성하는 LLM이 아니다. TypeSafe는 Jev를 첫 번째 System One Model 이라고 정의한다. 출처: TypeSafe AI Documentation - Introduction 핵심 아이디어는 간단하다. LLM이 자연어를 생성하는 모델이라면, Jev는 소프트웨어가 바로 사용할 수 있는 결정을 내리는 모델이다. TypeSafe는 Jev를 다음과 같이 표현한다. unstructured state in, typed probabilistic decisions out. 즉, 자연어나 구조화된 상태(state)를 입력하면 타입이 정의된…
Open source