Jev(TypeSafe AI) 사용법 AI에게 긴 답변 대신 ‘판단’만 받는 법
고객 문의를 어느 팀에 보낼지 AI에게 물었더니 세 문단짜리 답이 돌아왔다고 해 봅시다. 이제 코드는 그 문단을 뒤져 팀 이름을 다시 찾아내야 합니다. Jev(TypeSafe AI)는 아예 문장을 쓰지 않습니다. “결제·환불”처럼 타입이 정해진 판단과 확률만 돌려줍니다. 어디에 넣고, 질문을 어떻게 짜고, 확신도(confidence)로 무엇을 정할지 공식 문서를 기준으로 정리했습니다.
공개 자료 해설·분석 · 편집: 단단한 아빠 · 작성 기준
- TypeSafe Jev
- Jev는 글을 쓰지 않는 AI입니다. 질문을 받으면 문장 대신 미리 정해 둔 형식의 답을 돌려줍니다.
- 물어볼 수 있는 건 분류·점수·예/아니오 세 가지뿐이고, 답은 늘 코드가 바로 쓸 수 있는 모양으로 옵니다. 다만 형식이 맞는다고 판단까지 맞는 건 아닙니다.
- 답과 함께 얼마나 확신하는지도 숫자로 알려 줍니다(예/아니오 질문인 Noul은 ‘예’일 확률만 돌려줍니다). 이 값을 참고 신호로 삼으면, 애매한 판단은 사람에게 넘기는 규칙을 짤 수 있습니다.
Jev는 무엇을 하는 모델인가
Jev(TypeSafe AI)는 글을 쓰지 않습니다. 대신 미리 정해 둔 선택지 중 하나를 고르거나, 정도를 점수로 매기거나, 조건이 참일 확률을 돌려줍니다. 응답은 언제나 코드가 바로 받아 쓸 수 있는 타입이라, 형식이 어긋나는 일은 구조적으로 생기지 않습니다.
다만 형식이 맞는 답과 내용이 맞는 판단은 다른 이야기입니다. Jev가 목록 안의 선택지를 정확한 형식으로 돌려줘도, 고른 답 자체는 틀릴 수 있습니다. 그래서 결과를 실제 데이터로 채점해 보는 과정은 여전히 필요합니다.
Jev는 챗봇이나 코딩 어시스턴트의 자리를 넘보지 않습니다. 대신 프로그램이 갈림길에서 방향을 정해야 하는 지점에 들어갑니다.
요리사와 자판기의 차이
ChatGPT 같은 AI는 요리사입니다. 뭘 달라고 하든 그때그때 만들어 줍니다. 자유로운 대신 결과가 매번 조금씩 다르고, 시간도 걸립니다.
Jev는 자판기입니다. 버튼이 미리 정해져 있고, 누르면 딱 그 버튼에 해당하는 것만 나옵니다. 메뉴에 없는 건 절대 나오지 않는 대신, 빠르고 늘 같은 모양으로 나옵니다.
자판기에 대고 “맛있는 거 아무거나 만들어 줘”라고 할 수 없듯, Jev에게 글을 써 달라고 할 수는 없습니다. 대신 “이 중에 뭐야?”라고 물을 때는 자판기가 훨씬 낫습니다.
이럴 때 Jev가 맞습니다
- 정해진 카테고리 중 하나로 분류해야 할 때
- 우선순위나 심각도를 매겨 임계값으로 분기해야 할 때
- “이 조건이 참인가”를 확률로 판단해야 할 때
- 같은 판단을 대량으로, 빠르게 반복해야 할 때
이럴 때는 맞지 않습니다
- 문장·요약·코드를 생성해야 할 때 → 생성형 모델
- 날짜 계산, 금액 합산 같은 정확한 연산 → 일반 코드
- 정규식이나 DB 조회로 끝나는 일 → 모델이 아예 필요 없음
이제 이런 ‘판단 전용’ AI가 Jev 하나만은 아닙니다. OpenAI는 9월 29일 GPT-6 Luna를 바탕으로 한 Decisions API를 한정 프리뷰로 내놓았고, 10월 6일에는 모든 개발자에게 공개 베타로 열었습니다. AWS는 10월 1일 직접 내려받아 돌릴 수 있는 오픈소스 모델 Strands Decider 2B를 공개했습니다. 세 회사의 차이는 ‘말하지 않는 AI가 뜬다’ 글에서 비교했고, 이 글은 Jev 공식 문서를 기준으로 사용법만 다룹니다.
Choice · Score · Noul
한 번에 평가
분기 설계
세 가지 질문 타입
질문 타입마다 돌려받는 값의 모양이 다릅니다.
| 타입 | 묻는 것 | 반환값 | 쓰는 곳 |
|---|---|---|---|
| Choice | 이 중 어느 것? | choice, probabilities, confidence | 분류, 라우팅 |
| Score | 어느 수준? | score, legend, probabilities, confidence | 심각도, 품질 평가 |
| Noul | 이것이 참인가? | noul (0~1) | 조건 판정, 게이트 |
Choice: 정해진 후보 중 하나
순서 없는 선택지 중 하나를 고를 때 씁니다. 티켓을 담당 부서로 보내거나, 문서 종류를 가려내거나, 어떤 프로그래밍 언어인지 알아내는 일이 여기에 해당합니다.
어느 후보에도 들어맞지 않는 경우가 있을 수 있다면 반드시 ‘기타’나 ‘해당 없음’을 넣으세요. Jev는 목록에 없는 답을 지어낼 수 없습니다.
Score: 정도를 재는 눈금
버그 심각도, 고객 불만 정도, 숙련도처럼 ‘얼마나’를 잴 때 씁니다. 단계는 직접 정하고, 모델은 그 눈금 위 어디쯤인지를 돌려줍니다. 그래서 1.43처럼 두 단계 사이의 소수가 나오기도 합니다.
N단계를 정의하면 결과는 0부터 N-1 사이로 나옵니다. 0~1로 정규화하려면 코드에서 score / (N - 1)을 계산하세요.
Noul: 예/아니오의 확률
0에 가까우면 아니오, 1에 가까우면 예입니다. 0.5는 ‘중간 정도’가 아니라 ‘판단하기 어렵다’는 뜻입니다. 정도를 재고 싶다면 Noul이 아니라 Score를 써야 합니다.
“이 후보자가 파이썬을 잘하는가?”는 ‘잘한다’의 기준이 모호해서 Noul에 맞지 않습니다. “이력서에 업무에서 파이썬을 썼다고 적혀 있는가?”처럼 조건을 분명히 하거나, 숙련도 단계를 정한 Score 질문으로 바꾸세요.
state와 questions 나누기
요청은 두 부분으로 나뉩니다. state에는 판단할 재료를, questions에는 물어볼 내용을 넣습니다.
state 작성 원칙
- 단순한 텍스트 하나면 문자열로 충분합니다.
- 여러 정보가 얽히면 이름 붙인 JSON 객체를 쓰세요. 대화, 주문 기록, 정책을 함께 넣어도 하나의 state입니다.
- 질문에서 특정 부분을 가리킬 때는
ticket.messages[0].text처럼 경로를 백틱으로 감싸 분명히 적어 줍니다. - 텍스트만 받습니다. 이미지·오디오·영상은 따로 전처리해야 합니다.
질문 ID는 모델에게 전달되지 않습니다
많이들 하는 실수입니다. refund_requested라는 ID를 붙였다고 모델이 그 뜻을 알아듣지는 않습니다. ID는 응답을 찾을 때 쓰는 키일 뿐이고, 질문 내용은 instructions에 빠짐없이 적어야 합니다.
질문을 쪼개야 하는 이유
“이 고객이 이탈할 위험이 높으며 어느 팀이 응대해야 하는가?”는 나쁜 질문입니다. 이탈 위험과 담당 팀, 두 가지 판단이 한 질문에 뒤섞여 있어 어느 쪽 답도 믿기 어렵습니다.
이렇게 나누세요.
- Score: 이탈 위험은 어느 정도인가?
- Choice: 어느 팀으로 보내야 하는가?
두 답은 코드에서 조합합니다. 나중에 우선순위 가중치를 바꾸고 싶어도 프롬프트를 다시 쓸 필요 없이 코드의 숫자만 고치면 됩니다.
같은 state를 보는 질문은 한 번에 묶어 보내세요
같은 state를 보는 질문은 한 요청에 모두 묶는 것이 기본입니다. Jev는 한 요청 안의 질문들을 병렬로 평가하기 때문입니다. 공식 문서는 질문을 더해도 응답 시간이 거의 늘지 않고, 늘어나는 비용도 추가한 질문의 토큰값뿐이라고 설명합니다. 실제 지연 시간과 비용은 내 입력과 질문 구성으로 직접 재 보세요.
특정한 경우에만 쓰일 답이라도 미리 함께 물어 두는 편이 낫습니다. 공식 문서는 이를 speculative fan-out(일단 함께 물어보기) 패턴이라고 부릅니다. 예를 들어 문의가 버그 신고가 아니면, 함께 받은 심각도 답은 코드에서 버리면 그만입니다.
confidence로 분기 설계하기
Choice와 Score는 답과 함께 confidence도 돌려줍니다. 확률 분포가 얼마나 한쪽으로 쏠려 있는지를 0~1 사이 숫자 하나로 요약한 값입니다. 분포가 고르게 퍼져 있으면 낮고, 한 후보에 몰려 있으면 높습니다. (Noul에는 별도 confidence가 없습니다.)
세 구간 설계
- 높음: 자동 처리 후보. 되돌리기 쉬운 저위험 작업이라면 자동으로 처리할 수 있습니다. 금전·계정·개인정보가 걸린 결정은 확신도가 높아도 승인 절차를 거칩니다.
- 중간: 조심스럽게 진행. 사용자 확인을 받거나, 검토 대기로 보내거나, 정보를 더 모읍니다.
- 낮음: 실행하지 않음. 사람에게 넘기거나 다른 시스템으로 폴백합니다.
임계값은 하나가 아닙니다
같은 시스템 안에서도 행동의 위험도에 따라 기준을 다르게 잡아야 합니다. 잔액 조회 화면을 잘못 띄우는 실수와 이체를 잘못 승인하는 실수는 무게가 전혀 다릅니다.
- 읽기 전용 작업 → 오류의 영향과 검증 결과에 따라 임계값을 낮출 수 있습니다
- 되돌릴 수 없는 작업(전송, 결제, 삭제) → 높은 임계값 + 사용자 확인
- 어느 쪽이든 confidence가 바닥이면 → 사람에게
“0.8이면 자동 처리” 같은 만능 기준은 없습니다. 실제 데이터로 시험한 뒤 오탐과 미탐의 비용을 따져 정해야 합니다.
처음부터 끝까지: 고객 문의 하나를 분류해 보기
지금까지 본 개념을 한 줄로 꿰어 보겠습니다. 쇼핑몰 고객센터에 들어온 문의 하나를 Jev로 분류하고, 어디까지 자동으로 처리할지 정하는 과정입니다. 아래 숫자는 흐름을 보여 주려고 만든 예시 값이며, 실제 API 호출 결과가 아닙니다.
① 입력(state): 문의 원문
“지난주 결제한 연간 요금제를 해지하고 남은 금액을 환불받고 싶어요. 그런데 로그인이 안 돼서 해지 버튼을 못 찾겠어요.”
② 고를 수 있는 결과를 정합니다
담당 팀을 고르는 Choice 질문에 결제·환불, 로그인·계정, 제품 사용 문의, 기타·해당 없음 네 가지 선택지를 둡니다. 문의 하나에 요청이 여러 개 섞여 있을 수 있으니, “환불을 요청하는가?”와 “로그인 문제를 말하는가?”는 각각 Noul 질문으로 따로 묻습니다.
③ Jev의 판단(예시 값)
Choice는 결제·환불을 골랐지만 확신도는 0.61에 그칩니다. 두 요청이 섞여 있다 보니 로그인·계정에도 확률이 꽤 갈렸기 때문입니다. Noul은 환불 요청 0.96, 로그인 문제 0.91을 돌려줍니다. Noul에는 확신도 값이 따로 없고, 이 숫자 자체가 “예”일 확률입니다.
④ 보류 규칙을 적용합니다
이 팀이 검증 세트로 시험해 본 뒤 “담당 팀 자동 배정은 확신도 0.8 이상일 때만”이라는 기준을 정해 두었다고 해 봅시다. 0.61은 기준에 못 미치니 자동 배정 대신 검토 대기로 보냅니다. 두 Noul 값은 모두 높으니 결제팀과 계정팀 태그를 함께 붙여 둡니다.
⑤ 사람이 검토하는 조건을 코드에 적어 둡니다
환불은 돈이 오가는 일이라, 확신도가 아무리 높아도 Jev의 판단만으로 실행하지 않습니다. 자동으로 하는 일은 태그를 붙이고 대기열에 넣는 데서 끝납니다. 실제 환불과 로그인 본인 확인은 담당자가 승인합니다. 문의 원문처럼 개인정보가 담긴 내용은 기본 로그에 남기지 않습니다.
정리하면 Jev는 ②~③의 판단만 맡고, ④~⑤의 기준과 권한은 코드와 사람이 쥡니다. 기준 숫자 0.8은 예시일 뿐이고, 실제 값은 내 데이터에서 오탐과 미탐의 비용을 따져 정해야 합니다.
한국어로 쓸 때 반드시 확인할 것
공식 문서는 Jev의 주 학습 언어가 영어라고 밝힙니다. 한국어를 포함한 CJK 문자 언어도 입력은 받지만, 지금은 정확도가 더 낮다고 합니다.
그러니 한국어 서비스에 넣기 전에 아래 순서로 직접 검증해 보세요.
처음 점검용으로 실제 한국어 글을 20~50개 모읍니다
짧은 글, 긴 글, 오타가 있는 글, 정보가 부족한 글을 골고루 섞으세요. 잘될 것 같은 글만 모으면 시험하는 의미가 없습니다.
정답을 직접 붙여 둡니다
사람이 보기에 어떤 답이 맞는지 미리 적어 둡니다. 이게 곧 채점 기준입니다.
Jev의 답과 대조합니다
몇 개나 맞혔는지, 어떤 종류의 글에서 자주 틀리는지 확인합니다.
확신도 구간별로 나눠 봅니다
핵심은 확신도가 높은 것만 골라 봤을 때 정확도가 올라가느냐입니다. 올라간다면 그 구간을 자동 처리 후보로 삼습니다.
더 큰 데이터로 다시 확인합니다
20~50개는 문제를 찾아내는 초기 점검용입니다. 자동화 품질이 안정적이라고 말하기에는 너무 적습니다. 운영에 쓰기 전에는 기준값을 정할 데이터와 최종 평가용 데이터를 따로 나눠 더 많이 모으고, 분류별 오탐·미탐과 자동 처리 비율을 기록합니다.
자주 걸리는 함정
| 함정 | 왜 문제인가 | 어떻게 할까 |
|---|---|---|
| 계산을 시킴 | 숫자 세기, 날짜 비교에 취약 | 코드로 처리 |
| 다중 라벨을 Choice로 | Choice는 하나만 고름 | 라벨별 Noul 질문 |
| state에 전부 넣기 | 핵심 정보가 희석됨 | 판단에 필요한 것만 |
| Noul 0.5를 ‘중간’으로 해석 | 불확실을 정도로 오해 | 정도는 Score로 |
| API 실패를 false로 처리 | 장애와 판단을 혼동 | 오류는 오류로 구분 |
| 모호한 라벨 | ‘높음/중간/낮음’만으론 부족 | 상황을 문장으로 설명 |
라벨은 구체적으로
Score 단계를 이렇게 쓰면 안 됩니다.
낮음 / 중간 / 높음
이렇게 바꾸세요.
활동이 기존 계정 기록과 일치함 / 평소와 다른 접속이 한 건 확인됨 / 계정 도용 지표가 여러 건 확인됨
단계마다 어떤 상황인지 문장으로 적어 줘야 모델이 덜 헷갈립니다.
운영에서 지킬 것
- 서버에서만 호출합니다. API 키는 환경 변수나 시크릿 저장소에 두고, 브라우저 번들이나 소스에 넣지 않습니다.
- 질문과 임계값은 설정 파일로 모읍니다. 코드 곳곳에 흩어져 있으면 숫자 하나 바꿀 때마다 코드 전체를 뒤져야 합니다.
- 모델 버전을 기록합니다. 탐색 단계에서는 최신 별칭(
jev-latest)을 쓰되, 임계값을 검증한 뒤에는 버전(10월 6일 현재jev-1.13.0)을 고정하고 응답에 담긴 실제 모델명을 로그에 남깁니다. - 재시도는 SDK 기본값을 씁니다. 직접 구현한다면 429·529에만 제한적 백오프를 적용하고, 401·422는 재시도하지 않습니다.
- 개인정보는 최소한만 보냅니다. 원문과 키를 기본 로그에 남기지 않습니다.
- 외부 작업은 별도로 보호합니다. 허용 목록, 인자 검증, 권한 검사를 거치고, 필요하면 사용자 승인까지 받습니다. 모델의 판단과 실행 권한은 따로 떼어 둬야 합니다.
Jev를 잘 쓰는 방법은 결국 판단과 실행을 분리하는 것입니다.
본문 중에서이 글에 나온 용어
정리
Jev를 잘 쓰는 방법은 결국 판단과 실행을 분리하는 것입니다. 모델은 좁은 질문에 타입이 정해진 답을 내놓고, 흐름 제어와 정확한 계산, 권한은 코드가 책임집니다.
시작은 작게 하세요. 지금 생성형 AI에게 프롬프트로 분류를 시키고 그 답을 다시 파싱하고 있는 곳, 딱 한 군데만 찾아 Jev로 바꿔 보면 충분합니다.
출처
- TypeSafe Docs · Primitives (Choice, Score, Noul)
- TypeSafe Docs · State
- TypeSafe Docs · Confidence
- TypeSafe Docs · Speculative fan-out
- TypeSafe Docs · Models (Jev 1.13)
- TypeSafe · Introducing System One Models & Jev
- OpenAI · DevDay 2026 발표 정리 (Decisions API)
- Strands Agents · Introducing Strands Decider 2B (2026.10.01)


