개발자가 Jev를 사용하여 AI 코딩을 더 스마트하게 만드는 방법
요약
본 기사는 개발자가 Jev라는 TypeSafe AI의 도구를 사용하여 AI 코딩 과정을 개선하는 방법을 다룹니다. Jev는 단순히 코드를 생성하는 것이 아니라, 제공된 정보를 평가하고 제약된 의사결정(constrained decisions)을 반환하여 에이전트가 잘못된 가정을 하는 것을 방지합니다. 이를 통해 개발 워크플로우에 구조화된 판단 로직을 통합할 수 있습니다.
핵심 포인트
- Jev는 코드 생성 대신, 정보 평가 및 제약된 의사결정 API를 제공합니다.
- 코딩 에이전트에게 Jev의 공식 TypeSafe 스킬을 제공하거나 오케스트레이션 서비스를 구축하여 활용할 수 있습니다.
- Jev는 원시 결과 예시, 확률 기반 분류, 루브릭 점수 등 세 가지 유형의 질문을 지원합니다.
- Noul은 요구사항의 관찰 가능성을 0과 1 사이의 확률로 측정하는 기능입니다.
더 나은 컨텍스트 선택, 작업 라우팅 및 검토에 대한 실용적인 가이드로, 설정 명령어와 JavaScript 예제를 포함합니다. 2026년 9월 27일에 연구됨.
AI 코딩 세션은 모델이 첫 줄의 코드를 작성하기 전에 잘못될 수 있습니다. 에이전트가 잘못된 파일을 열거나, 프로젝트 컨벤션을 놓치거나, 부적절한 도구를 선택하거나, 아무도 실제로 정의하지 않은 요구사항을 구현하기 시작할 수 있습니다. 그 결과로 생성된 코드는 설득력 있게 보일지라도 잘못된 문제를 해결할 수 있습니다.
개발자들은 종종 더 긴 프롬프트를 작성하거나 더 강력한 모델로 전환하여 대응합니다. 또 다른 접근 방식은 코드 생성 주변의 의사결정(decisions)을 개선하는 것입니다: 에이전트에게 어떤 증거가 도달해야 하는지, 어떤 워크플로우가 작업을 처리해야 하는지, 그리고 시스템이 언제 더 많은 정보를 수집해야 하는지입니다.
TypeSafe AI의 Jev는 이러한 의사결정을 소프트웨어에 구축할 수 있는 방법을 제공합니다. AI 코딩에서의 유용성은 구조화된 판단(structured judgments)을 기존의 코딩 모델 및 개발 도구와 결합하는 데서 나옵니다.
먼저 Jev의 역할을 이해해야 합니다. Jev는 제공된 정보를 평가하고 제약된 결정(constrained decisions)을 반환합니다. 이는 소스 코드를 생성하거나, 리포지토리를 수정하거나, Cursor 또는 Claude Code 내부에서 대체 모델로 작동하지 않습니다. TypeSafe의 문서는 그 의사결정 API를 코딩 에이전트를 구동하는 LLM과 명시적으로 분리하고 있습니다. 출처: Jev with coding agents.
이를 사용하는 두 가지 실용적인 방법이 있습니다. 코딩 에이전트에게 공식 TypeSafe 스킬을 제공하여 더 나은 Jev 통합(integrations)을 작성하게 할 수 있습니다. 또는 개발 워크플로우 중에 Jev를 호출하는 헬퍼(helper)나 오케스트레이션 서비스(orchestration service)를 구축할 수도 있습니다. 스킬을 설치하는 것은 통합 지식을 제공하며, 두 번째 접근 방식은 결정 로직(decision logic)을 구현하고 연결해야 합니다.
아래 워크플로우는 Jev의 문서화된 역량에 기반한 제안된 엔지니어링 패턴입니다. 이는 Cursor의 내장 기능이 아니며, 귀하의 리포지토리에 대한 측정된 개선 사항을 주장하는 것도 아닙니다.
Jev는 세 가지 종류의 질문을 지원합니다:
- 코딩 워크플로우 내에서의 원시 결과 예시 (Primitive Result Example)
- 옵션 하나를 제공하고, 해당 옵션들의 확률과 신뢰도를 기반으로 분류하기. 변경 사항을 프레젠테이션(presentation), 애플리케이션 동작(application behavior) 또는 불분명한 것(unclear) 중 하나로 분류합니다.
- 순서가 지정된 루브릭(rubric)에서 A 값을 부여하고, 확률과 신뢰도를 함께 제시하기. 검색된 코드 발췌본이 관련성 없는지(irrelevant), 맥락적인지(contextual), 아니면 직접적으로 유용한지(directly useful)를 평가합니다.
- Noul: 예/아니오 진술이 참일 것으로 추정되는 확률입니다. 요구사항이 관찰 가능한 결과를 명시하는지 확인합니다.
Noul은 부울 값이나 서술적 설명이 아닌, 0과 1 사이의 숫자를 반환합니다. 점수 값은 루브릭 레벨 사이에 떨어질 수 있습니다. 이러한 구분은 응답을 애플리케이션 동작으로 전환할 때 중요합니다. 출처: question primitives.
코딩 에이전트에게 정확한 통합 지식을 제공하세요. 공식 TypeSafe 스킬로 시작하는 것이 좋습니다. 이 스킬은 에이전트가 필요로 하는 API 규칙과 디자인 패턴을 제공하여, 통합 내용을 처음부터 설명해야 할 필요성을 줄여줍니다.
Claude Code의 경우, 문서화된 설치 명령어는 다음과 같습니다:
claude plugin marketplace add typesafe-ai/skills
claude plugin install typesafe@typesafe-ai
다른 지원되는 에이전트 환경에서는 다음을 사용합니다:
npx skills add typesafe-ai/skills --skill typesafe-ai
프롬프트가 나타날 때 사용할 에이전트를 선택하세요. 문서화된 기본값은 프로젝트 내에 설치하는 것입니다. 하나의 설치 방법을 사용한 후, 에이전트에게 TypeSafe 스킬을 사용하도록 명시적으로 요청하십시오. 수동으로 설치할 경우, 스킬의 참조 파일을 포함해야 합니다. 출처: official agent skill.
유용한 첫 번째 요청은 다음과 같습니다:
'TypeSafe 스킬을 사용하여 이 저장소를 검사해 주세요. 우리의 AI 개발 워크플로우에서 독립적으로 평가할 수 있는 반복되는 의미적 결정(semantic decision) 하나를 찾아주세요. 구현하기 전에 입력 필드, 답변 옵션, 폴백(fallback), 그리고 작은 평가 데이터셋을 제안해 주세요.'
이는 에이전트에게 경계가 있는 엔지니어링 작업(bounded engineering task)을 제공합니다. 유용한 문서 구절을 선택하는 것과 같이 측정 가능한 결과가 있는 특정 결정을 원한다면 이 방법이 효과적입니다. Jev를 모든 곳에 추가하도록 요청하면 결과를 평가하기 훨씬 어려워집니다.
모델에게 코드를 작성해 달라고 요청하기 전에 컨텍스트를 개선하세요. 개발자가 중복 웹훅 처리(duplicate webhook processing)를 수정하도록 에이전트에게 요청하는 Laravel 애플리케이션을 가정해 봅시다. 리포지토리 검색은 웹훅 컨트롤러, 큐 설정, 오래된 통합 코드, 결제 문서, 그리고 여러 관련 없는 이벤트 핸들러 등을 반환할 수 있습니다.
사용자의 검색 코드는 후보 발췌문(candidate excerpts)들을 수집할 수 있습니다. 그러면 Jev는 다음과 같은 질문을 사용하여 각 발췌문을 작업에 비추어 판단할 수 있습니다:
- 이 발췌문은 보고된 동작과 관련된 핸들러를 설명합니까?
- 애플리케이션의 기존 중복 이벤트 처리(duplicate-event handling)에 대한 증거를 제공합니까?
- 작업 설명서의 가정에 모순됩니까?
사용자의 애플리케이션은 유용한 증거를 보존하고 코딩 모델에게 더 작고 잘 정리된 입력을 제공합니다. 제안된 수정이 잘못된 가정에 근거할 수 있으므로, 관련 있는 모순 정보를 보이게 유지하는 것이 중요합니다. TypeSafe는 생성형 모델에 도달하기 전에 검색된 구절을 분류하는 것과 관련된 워크플로우를 문서화합니다. 이 패턴을 리포지토리 발췌문에 적용하는 것은 사용자가 평가해야 할 구현 선택 사항입니다. 공개된 예시는 코딩 벤치마크를 확립하지 않습니다. 출처: classifying RAG passages. Jev는 자신에게 제공된 정보만을 평가합니다. 사용자의 통합은 여전히 리포지토리를 검색하고, 후보 파일을 읽고, 파일 경로를 보존하며, 필요할 때 추가 컨텍스트를 가져와야 합니다. 관련성 필터(relevance filter)는 검색 단계에서 찾지 못한 파일을 복구할 수 없습니다. 이러한 이유로, 필터가 실제로 개발자가 필요했던 증거를 얼마나 자주 제거하는지 측정해야 합니다. 에이전트가 버그를 설명하는 단 하나의 기능을 잃게 된다면 토큰을 절약하는 것은 좋지 않은 거래입니다. 요구 사항에 따라 작업을 분배하세요.
단순한 문구 수정, 데이터베이스 마이그레이션(database migration), 그리고 동시성 버그(concurrency bug)는 각기 다른 워크플로우를 필요로 합니다. Jev의 문서화된 의도 라우팅 패턴(intent-routing pattern)을 개발 큐에 적용하여, 자체 코드를 통해 카테고리를 핸들러에 매핑할 수 있습니다. 출처: intent routing. 예를 들어, 발표 전용 작업은 비용이 적게 드는 코딩 모델로 시작할 수 있습니다. 애플리케이션 동작의 변경은 더 넓은 컨텍스트를 가진 강력한 모델을 사용할 수 있습니다. 모호한 작업은 명확화를 위해 개발자에게 반환될 수 있습니다. 카테고리는 관찰 가능한 속성(observable properties) 측면에서 정의해야 합니다. '쉬움'과 '어려움'은 일관되게 평가하기 어려운 레이블입니다. 대신, '정적 문구 또는 레이아웃만 변경하는 경우'와 '런타임 동작 또는 데이터 처리를 변경하는 경우'가 검토자에게 분류를 확인하는 더 명확한 기반을 제공합니다. 라우팅 정책은 애플리케이션에 포함되어야 합니다. 만약 변경된 경로가 이미 권한 부여 정책(authorization policy)을 포함한다는 것이 알려져 있다면, 결정론적 규칙(deterministic rule)이 적절한 검토를 직접 요구할 수 있습니다. Jev는 작업 해석에 의미론적 판단(semantic judgment)이 필요한 곳에서 유용합니다. 또한 알 수 없는 결과(unknown outcome)도 허용해야 합니다. 두 가지 부적합한 카테고리 사이에서 선택하도록 강요된 분류기(classifier)라도 무언가를 선택할 것입니다. 명시적인 '불분명' 옵션은 워크플로우에 실질적인 대체 경로를 제공합니다. 이 아이디어를 구체화하기 위해 작은 통합을 사용해 보세요. 다음 예시는 어떤 코딩 워크플로우가 작업을 받아야 하는지 권장합니다. 파일 편집이나 코딩 모델 실행은 수행하지 않습니다. 그러한 동작들은 오케스트레이션 코드(orchestration code)에서 별도로 연결되어야 합니다. 공식 JavaScript SDK는 Node.js 20 이상을 요구합니다. 이를 설치하고, TypeSafe 콘솔에서 API 키를 얻어 TYPESAFE_API_KEY를 통해 서버 측 프로세스에 해당 키를 사용할 수 있도록 설정하세요. 출처: JavaScript SDK. npm install @typesafe-ai/sdk 이 예시를 route-coding-task.mjs로 저장하세요: import { TypeSafeClient, choice, noul } from "@typesafe-ai/sdk";
const client = new TypeSafeClient();
// 설명용 임계값(Illustrative thresholds). 검토된 작업을 기반으로 조정하세요.
const MIN_SCOPE_CONFIDENCE = 0.85;
const MIN_OUTCOME_PROBABILITY = 0.85;
const state = {
task: "청구 링크 레이블을 'Manage subscription'으로 변경하세요." +
"대상과 동작은 변경하지 마세요.",
component_excerpt: 'Billing',
};
let nextStep = "manual_review";
try {
const result = await client.systemOne({
model: "jev-1.13.0",
state,
questions: {
scope: choice(
"task와 component_excerpt를 사용하여 요청된 변경 사항을 분류하세요.",
{
presentation: "정적 텍스트 또는 시각적 레이아웃만 변경됩니다.",
behavior: "런타임 동작, 데이터 처리 또는 인터페이스가 변경됩니다.",
unclear: "제공된 증거로는 변경 범주를 확립할 수 없습니다.",
},
),
outcome_stated: noul(
"task는 요청된 편집에 대한 관찰 가능한 결과를 명시하나요?",
),
},
});
const { scope, outcome_stated } = result.answers;
if (outcome_stated.noul < MIN_OUTCOME_PROBABILITY) {
nextStep = "clarify_requirement";
} else if (
scope.confidence >= MIN_SCOPE_CONFIDENCE &&
scope.choice !== "unclear"
) {
nextStep = scope.choice === "presentation"
? "lightweight_coding_workflow"
: "full_coding_workflow";
}
console.log({ model: result.model, scope, outcome_stated });
} catch {
console.error("분류를 사용할 수 없습니다; 수동 검토를 유지합니다.");
process.exitCode = 1;
}
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기