Vercel의 Python AI SDK로 Jev를 살펴봅니다. 빠르고 구조화된 의사결정이 어떻게 이뤄지는지 알아보고, 실험적 기능인 evaluate() API도 직접 써 보세요. 텍스트 분류와 Python 코드 생성, 두 가지 실험도 함께 다룹니다.
요즘 Jev 이야기를 안 들어 본 사람은 없을 겁니다. 트레이딩 판단에 활용하는 사람도 있고 (과연 괜찮을까요?), UI 생성에 써 보는 사람도 있습니다 (어쩌면 뭔가 될지도 모르겠네요!). 저마다 다양한 방식으로 만져 보고 있죠.
Jev는 새로운 유형의 AI 모델입니다. 데이터를 넣고 객관식 질문을 던지면, 각 질문에 대한 답과 그 답에 대한 확신도를 함께 돌려줍니다. 다른 모델처럼 Jev도 틀릴 수 있고 실제로 틀립니다. 다만 아주 빠르게 틀립니다.
핵심은 이렇습니다. Jev는 좁은 범위의 판단을 내리도록 만들어진 모델입니다. 여러분의 사용 사례에 충분할 만큼 정확한지는 직접 테스트해 봐야 합니다.
Vercel의 Python 팀은 여러 일 중에서도 Python 개발자가 Jev를 손쉽게 써 볼 수 있게 만드는 일을 맡고 있습니다. 그래서 AI SDK for Python의 최신 버전을 소개합니다.
uv add ai로 설치하면 Jev의 신경계와 직접 통신하는 실험적 API인 evaluate()를 사용할 수 있습니다. 그다음 AI Gateway 키를 만들고 AI_GATEWAY_API_KEY를 설정한 뒤, 아래 예제를 그대로 실행해 보세요.
이제 Jev가 무엇이고 어떻게 활용할 수 있는지, 예제 두 가지로 설명해 보겠습니다. 하나는 쓸 만한 예제고, 하나는 엉뚱한 예제입니다. 어느 쪽이 어느 쪽인지는 Jev에게 물어보세요. 재미있게 해 봅시다!
Jev는 범용 분류기입니다.
분류기는 전통적인 머신러닝의 기본 구성 요소입니다. 스팸 필터를 만든다고 해 봅시다. 스팸인지 아닌지 라벨이 붙은 수많은 이메일로 분류기를 학습시키면, 새로 들어온 이메일이 스팸처럼 보이는지 판별할 수 있게 됩니다.
문제는 분류 작업이 새로 생길 때마다 데이터를 모아 라벨을 붙이고, 그 작업에 맞게 가중치를 조정하는 새 분류기를 학습시켜야 한다는 점입니다. 그런데 가중치를 가진 게 또 있죠. 바로 대규모 언어 모델(LLM)입니다. Jev를 만든 팀은 LLM을 분류기로 바꾸는 방법을 찾아냈습니다. LLM은 이미 방대한 인간의 지식을 학습했기 때문에, 특정 도메인에 맞춰 따로 학습시킬 필요가 없습니다.
LLM에서 출발했지만 Jev는 여전히 분류기처럼 동작합니다. 저렴하고 빠르며, 텍스트를 생성하는 대신 구조화된 JSON을 반환합니다. 답변은 질문에서 정의한 타입과 선택지를 따릅니다.
Jev의 공식 API는 더없이 단순합니다. 이 단순함을 그대로 살리기 위해 Python AI SDK에도 거의 그대로 구현했습니다.
함수는 evaluate() 하나뿐이고, 여기에 보조 타입 몇 개가 더해집니다. 이 함수는 모델, 상태(단순한 문자열이나 복잡한 JSON), 그리고 질문 매핑을 받습니다. 질문은 ChoiceQuestion(답 하나 고르기), ScoreQuestion(직접 정한 척도로 상태 평가하기), NoulQuestion(진술이 참일 확률 추정하기) 중 하나의 인스턴스입니다.
전체 API 레퍼런스는 에이전트에게 문서를 보여 주세요. 이제 Jev가 무엇이고 어떻게 쓰는지 감이 오셨을 겁니다. 그럼 Jev로 무엇을 만들 수 있는지 살펴보죠!
Jev를 제대로 활용한 예제입니다. 말 그대로 분류기로 쓰는 경우죠.
1년쯤 전, Python REPL을 에이전트형으로 만들어 보면 어떨까 하는 생각이 들었습니다. UX를 훌륭하게 만들고 싶었고, 채팅과 코드를 직접 전환하지 않아도 REPL이 지금 입력하는 게 영어인지 Python인지 알아채면 꽤 멋지겠다고 생각했습니다.
분류기가 필요했기 때문에, 무작위로 고른 Python 코드와 영어 텍스트로 직접 분류기를 학습시키는 데 이틀을 썼습니다.
온갖 고생을 하고 Opus 4.1 토큰도 헛되이 쓴 끝에, Python과 영어를 안정적으로 구분하는 분류기를 만들기에는 제 실력이 부족하다는 결론을 내렸습니다. UI가 계속 깜빡였거든요. if i를 입력하면 Python으로 강조되다가, if i i에서는 영어로 바뀌고, if i is에서는 다시 Python으로 돌아갔습니다. 아주 간단해 보였던 문제가 알고 보니 정말 어려운 문제였습니다.
Jev는 어떨까요?
"이건 영어처럼 보여, Python처럼 보여?"라는 질문에 Jev가 응답한 실제 트레이스입니다. 코드 자체는 특별할 게 없습니다. 이 글 첫머리의 코드 스니펫에서 질문만 바꾼 정도입니다.
더 중요한 건 Jev가 제 REPL 문제를 풀 수 있느냐입니다. 제가 직접 만든 분류기보다는 훨씬 잘하는 듯하지만, 여전히 빈틈이 있습니다. 예를 들어 "what's" + " up는 제 눈에는 입력하다 만 Python 표현식이 분명한데, Jev에게는 영어로 보입니다.
거꾸로 가서 Jev에게 LLM처럼 텍스트를 생성하게 해 보면 어떨까요? Jev는 글을 쓰지 못하니, 글자를 하나씩 고르게 하는 방법이 있습니다. 매 단계마다 글자, 문장 부호, 공백 중에서 다음 문자를 고르는 거죠. 다른 방법으로는 영어 단어 N개 정도의 어휘 목록에서 한 번에 한 단어씩 고르게 할 수도 있습니다.
이 방법을 보자마자 Jev의 Python 코드 작성 실력을 꼭 시험해 봐야겠다고 생각했습니다.
처음에는 "글자 + Python 키워드 + 공백" 방식을 썼는데, 이 방식으로는 Jev가 if 문 하나도 제대로 못 쓴다는 걸 금방 알게 됐습니다. 쓸 만한 결과를 얻으려면 프로그램의 추상 구문 트리(AST)를 대신 생성하게 하는 수밖에 없었습니다.
접근 방식은 이렇습니다.
사용자의 프롬프트를 받아 LLM(여기서는 GPT-5.6)으로 Jev에게 줄 구체적인 지시문으로 확장합니다. 상세한 "계획"이 없으면 Jev는 기초적인 작업조차 구현하기 어려워했습니다.
Jev가 일련의 선택으로 Python AST를 만들게 합니다. 매 단계마다 현재 프로그램을 보여 주고, 채워야 할 필드를 표시한 뒤, 함수 호출, 산술 연산, 변수처럼 다음에 올 수 있는 노드를 선택지로 제시합니다. 각 선택지에는 해당 노드가 만들어 낼 코드 미리보기가 붙습니다.
선택한 결과를 트리에 반영하고 다시 Python 코드로 렌더링합니다. 구두점과 들여쓰기는 호스트 코드가 처리하고, Jev는 프로그램의 전체 구조와 내용을 결정합니다. Jev가 트리를 완성할 때까지 이 과정을 반복합니다.
이 방식으로 문법적으로는 유효한 Python 코드를 Jev가 생성하게 하는 데는 성공했지만, 내용은 대부분 틀렸습니다. 보시다시피 분류기에 LLM의 일을 시키는 건 꽤 어렵습니다. 더 잘할 자신이 있다면 소스 코드는 GitHub에 있습니다.
두 실험 모두 기대한 만큼 잘 풀리진 않았지만, 저는 여전히 Jev가 기대됩니다. 이 새로운 유형의 모델이 무엇을 할 수 있는지, 이제 막 탐색을 시작한 단계니까요!
지금 바로 AI SDK for Python으로 써 보고, 무엇을 만들었는지 알려 주세요. 필요한 것은 uv add ai와 AI Gateway 키뿐입니다. 코딩 에이전트에 그대로 복사해 붙여 넣을 수 있는 프롬프트도 준비했습니다.