Tech Wiki

TypeSafe AI Jev 시작하기: 텍스트 생성 없이 타입 안전한 결정을 받는 API

정형화되지 않은 텍스트가 Choice, Score, 확률 출력으로 변환되는 흐름

TypeSafe AI의 Jev는 답변 문장을 생성하는 모델이 아닙니다. 애플리케이션이 미리 정한 질문과 선택지 안에서 분류, 점수, 예·아니오 확률을 반환합니다. 고객 문의 라우팅이나 위험도 판정처럼 결과를 곧바로 코드의 분기에 써야 할 때 맞는 형태입니다.

핵심은 모델에 워크플로 전체를 맡기지 않는다는 점입니다. 제어 흐름과 부수 효과는 코드가 담당하고 자연어 판단이 필요한 좁은 구간만 Jev에 넘깁니다. 자유로운 생성 능력을 포기한 대신 출력 파싱과 스키마 이탈 문제를 줄이는 접근입니다.

Jev가 일반 LLM과 다른 점

일반 LLM에 고객 문의를 전달하고 JSON으로 답하라고 요청할 수도 있습니다. 하지만 모델은 본질적으로 문자열을 생성하며 애플리케이션은 그 문자열을 다시 파싱하고 검증해야 합니다.

Jev의 입력은 statequestions로 나뉩니다.

  • state: 판단할 본문과 참고 데이터
  • questions: 본문에 대해 내릴 좁고 구체적인 판단
  • 응답: 미리 정의한 타입에 맞는 값, 확률 분포, confidence

같은 state를 사용하는 여러 질문은 한 요청에 함께 보낼 수 있습니다. 각 질문은 독립적으로 평가됩니다. 한 질문의 답이 다음 질문의 숨은 문맥으로 들어가지 않으므로, 복잡한 판단은 작은 질문으로 나눈 뒤 코드에서 조합하는 편이 맞습니다.

Choice, Score, Noul 세 가지 질문

타입 용도 주요 반환값
Choice 정해진 선택지 중 하나를 고를 때 선택값, 선택지별 확률, confidence
Score 순서가 있는 기준표에서 위치를 매길 때 점수, 기준표, 단계별 확률, confidence
Noul 예·아니오 판단의 확률이 필요할 때 참일 확률인 noul

Noul의 0.5는 ‘중간 수준’을 뜻하지 않습니다. 예와 아니오의 가능성을 비슷하게 본다는 의미입니다. 숙련도처럼 연속적인 정도를 재고 싶다면 단계별 설명을 붙인 Score가 더 적절합니다.

Python SDK로 문의 분류 요청 만들기

Python SDK는 Python 3.10 이상이 필요합니다. API 키를 발급한 뒤 환경 변수에 저장합니다.

uv add typesafe-sdk
export TYPESAFE_API_KEY="your-api-key"

다음 예제는 고객 문의 하나를 부서, 불만 정도, 긴급성으로 나눠 판단합니다. 세 질문이 같은 문의를 사용하므로 한 번의 system_one 호출에 묶었습니다.

from typesafe_sdk import Choice, Noul, Score, TypeSafeClient

state = {
    "ticket": (
        "결제가 두 번 처리됐습니다. 주문을 진행할 수 없으니 "
        "중복 결제를 환불해 주세요."
    )
}

questions = {
    "department": Choice(
        instructions="어느 부서가 `ticket`을 처리해야 합니까?",
        criteria={
            "billing": "결제, 청구서, 환불 문제",
            "technical": "버그 또는 서비스 장애",
            "other": "어느 항목에도 해당하지 않음",
        },
    ),
    "frustration": Score(
        instructions="`ticket`에 나타난 고객 불만의 정도는 어떻습니까?",
        criteria=[
            "사실만 차분하게 설명함",
            "불만이 있지만 정중함",
            "업무가 막혔거나 강한 표현을 사용함",
        ],
    ),
    "is_urgent": Noul(
        instructions="`ticket`에 긴급하거나 시간에 민감한 요청이 있습니까?",
    ),
}

with TypeSafeClient() as client:
    response = client.system_one(state=state, questions=questions)

print(response.answers["department"].choice)
print(response.answers["department"].probabilities)
print(response.answers["frustration"].score)
print(response.answers["is_urgent"].noul)

이 코드는 TypeSafe 공식 SDK 0.7.0의 객체 생성과 타입 구성을 기준으로 작성했습니다. 실제 추론에는 계정과 API 키가 필요하며 입력과 모델 버전에 따라 반환값이 달라집니다.

확률을 바로 자동 실행으로 연결하지 않기

타입이 맞는 출력과 판단이 맞는 출력은 같은 말이 아닙니다. Jev는 정의하지 않은 문자열을 새로 만들어 내지 않지만 주어진 선택지 중 잘못된 항목을 고를 수는 있습니다. 그래서 confidence와 확률은 자동화 수준을 정하는 입력으로 써야 합니다.

answer = response.answers["department"]

if answer.confidence < 0.70:
    queue_for_human_review(state)
elif answer.choice == "billing":
    route_to_billing(state)
else:
    route_to_general_queue(state)

임계값 0.70은 예시일 뿐입니다. 운영 환경에서는 라벨이 있는 자체 데이터로 오탐과 미탐 비용을 측정한 뒤 정해야 합니다. 환불, 계정 잠금, 외부 메시지 전송처럼 되돌리기 어려운 동작은 모델의 분류 결과만으로 실행하지 말고 권한 검사와 승인 절차를 별도로 두는 편이 안전합니다.

현재 모델과 비용

2026년 9월 기준 문서에 표시된 안정 버전은 jev-1.13.0이며 jev-latest 별칭도 이 버전을 가리킵니다. 입력 100만 토큰당 가격은 0.042달러이고 출력 토큰은 과금하지 않습니다.

문서에 나온 기본 한도는 초당 25만 토큰과 분당 1,200요청입니다. 요청 하나의 전체 문맥은 64k 토큰이며 state와 가장 긴 질문의 합에는 32k 토큰 한도가 따로 적용됩니다. 한도는 얼리 액세스 기간에 바뀔 수 있으므로 배포 전에 모델 목록과 최신 문서를 다시 확인해야 합니다.

입력은 텍스트만 지원합니다. 이미지, 오디오, 영상은 먼저 텍스트나 구조화 데이터로 변환해야 합니다. 영어가 주 학습 언어이며 CJK를 포함한 다른 언어는 같은 수준을 보장하지 않으므로, 한국어 업무에 적용할 때는 별도 평가 세트가 필요합니다.

어떤 작업에 맞고, 어디에는 맞지 않나

Jev는 가능한 답의 범위를 미리 정할 수 있는 작업에 잘 맞습니다.

  • 고객 문의 부서 분류와 우선순위 산정
  • 정책 문서와 요청 내용의 일치 여부 판단
  • 문서 유형 분류와 위험 신호 선별
  • 여러 평가 항목을 점수화한 뒤 코드에서 가중 합산

반대로 이메일 작성, 보고서 요약, 코드 생성처럼 새로운 문자열이 필요한 작업은 Jev만으로 처리할 수 없습니다. 긴 추론 과정이 필요한 문제도 한 질문으로 밀어 넣기보다 작은 판단으로 분해하거나 일반 LLM과 조합해야 합니다.

TypeSafe AI의 장점은 ‘더 자유로운 에이전트’가 아니라 정반대에 있습니다. 모델이 할 수 있는 일을 좁히고 결과의 타입과 선택 범위를 코드가 먼저 정합니다. 자동화 워크플로에서 생성형 모델의 유연성보다 예측 가능한 인터페이스가 더 중요하다면 검토할 만합니다. 다만 초기 접근 단계인 만큼, 벤더가 제시한 속도·비용 수치보다 자체 데이터에서의 정확도와 임계값 안정성을 먼저 확인하는 편이 좋습니다.

관련 글

출처


답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

Tech Wiki

Built with WordPress · Learn in public.