JEV - 분포만 돌려주는 두 demo
두 예는 닫힌 선택만 묻습니다. 지원을 사람에게 넘길지, 그리고 병합을 통과시킬지입니다. 돌아오는 것은 분포입니다. 공개된 지연은 약 70에서 500밀리초이며, 어느 한 데모의 밀리초 수치가 아닙니다.

공동 작성자: folkbench.com (Folkbench는 AI API, 모델 서비스, 관련 사이트를 위한 검증 가능한 평가·선택 플랫폼입니다. 공개된 서비스 정보, 가격, 가용성, 지연, 증거 구간을 바탕으로 사용자가 경로를 비교하고 고를 수 있게 합니다.)
이 시리즈는 열 편입니다:
- JEV - 관절에는 뇌가 필요 없습니다
- JEV - 제어 노드의 윤활제
- JEV - BERT에서 하나의 분포로
- JEV - 주문 대신 닫힌 질문을 설계한다
- JEV - 반토큰 장부는 이것을 먼저 내지 않는다
- JEV - 분포만 돌려주는 두 demo
- JEV - 루프에서 나가기: 확신도를 코드에 쓴다
- JEV - 선을 넘으면 더 똑똑함은 상품이 아니다
- JEV - 직관과 이성: 관절에 묻지 말 말
- JEV - 화면 조작에서 확률만으로
두 demo는 같은 일입니다. 자유 텍스트는 없고, 닫힌 질문만 있으며, 분기는 분포에서 취합니다. 아래의 JSON과 코드는 호출의 모양이지, 시간 보고가 아닙니다. 공개된 끝에서 끝까지는 약 70에서 500밀리초입니다. 어느 18밀리초 실행을 제품 수치로 적지 마십시오. 볼 만한 것은, 응답에 token마다의 문장이 없다는 점입니다.
지원: 의도와 차단
장면
지원이 두려워하는 것은, 시스템이 아직 치는 동안 이미 화난 사용자입니다. 의도에 생성 모델을 쓰면, 정확하다는 이름으로 첫 token과 생성된 JSON 덩어리를 기다리는 일이 많습니다. 꾸미지 않은 정규식은 요점을 둘러 말하는 화를 놓칩니다. 원하는 것은 닫힌 분류이고, 그다음 즉시 사람에게 넘길지의 결정입니다.
상태와 선택지
이것은 Choice이고, Noul이 아닙니다. Noul은 예 또는 아니오로 답합니다. 여기 선택지는 셋입니다.
[State]
scene: live support entry
rule: assign probability across the given options from the message text
[user]
I have waited three days. The shipment has not moved. Are you even alive? Refund me now, or I escalate.
{
"question": "choice",
"options": [
{"id": "GENERAL", "description": "ordinary question or tracking, no strong emotion"},
{"id": "REFUND", "description": "a clear return or refund, stated flatly"},
{"id": "BREAKER", "description": "insult, threat, or a complaint that should break to a person"}
]
}
돌아오는 것은 분포입니다
글자를 뱉는 커서는 없습니다. 모양은 표이고, 평이 아닙니다.
{
"top": "BREAKER",
"scores": [
{"choice": "BREAKER", "score": 0.9241},
{"choice": "REFUND", "score": 0.0715},
{"choice": "GENERAL", "score": 0.0044}
]
}
숫자는 이 예 안의 분포이며, 분기를 쓰기 위한 것입니다. 공개된 기준이 아닙니다. 모델은 주어진 선택지 위에 확률을 할당합니다. 다음 글자를 예측하는 것이 아닙니다.
코드가 어떻게 받는가
async function handleIncomingCustomerMessage(userMessage: string) {
const res = await jev.choice("cs_intent_v1", { input: userMessage });
const breaker = scoreOf(res, "BREAKER");
if (breaker > 0.85) {
return triggerHumanOverride({ priority: "CRITICAL", queue: "RETENTION" });
}
if (scoreOf(res, "REFUND") > 0.70) {
return launchWorkflow("AUTOMATED_REFUND_FLOW");
}
return launchWorkflow("DEFAULT_FAQ_BOT");
}
Markdown을 해석하는 것만이 일인 추가 재시도는 없습니다. 문턱은 코드 안에 있습니다. 0.85와 0.70은 이 흐름 자신의 정책입니다. 모델이 주는 보장이 아닙니다.
병합 전의 검토
장면
정적 검사는 구문 트리와 죽은 규칙에 기댑니다. 변종은 빠져나가고, 오탐도 흔합니다. 대화 모델에게 500줄 diff를 읽고 평을 쓰게 하면, 종종 여러 초가 걸립니다. 관로는 기다릴 수 없고, 프로그램은 산문에서 “통과”나 “실패”를 읽을 수 없습니다. diff를 상태로 두고, Choice 하나를 물으십시오. 통과, 사람이 봄, 또는 막음입니다.
상태와 선택지
[Git diff]
PR #1042
file: src/auth/session.ts
+ // skip expiry outside production, or when the token starts with test_admin_
+ if (process.env.NODE_ENV !== 'production' || token.startsWith('test_admin_')) {
+ return session;
+ }
{
"question": "choice",
"options": [
{"id": "PASS", "description": "harmless refactor, docs, or ordinary logic"},
{"id": "WARN", "description": "config, dependency, or a non-sensitive refactor; a person should look"},
{"id": "BLOCK", "description": "backdoor, hardcoded secret, privilege jump, auth bypass, injection"}
]
}
운영에서 만료를 건너뛰는 test_admin_ 접두사는 인증 우회입니다. 예에서 분포는 BLOCK을 0.98 근처에 둡니다. 그 절을 지우고 “운영 밖에서만 건너뛴다”만 남기면, 같은 질문은 차단에서 사람의 눈으로 옮아갑니다. 질문은 그렇게 쓰입니다. 약속된 밀리초의 묶음이 아닙니다.
관로가 어떻게 받는가
def audit_pr_diff(diff_text: str) -> int:
result = jev.choice(
question="pr_security_v2",
state=diff_text,
options=["PASS", "WARN", "BLOCK"],
)
scores = result.scores
if result.top == "BLOCK" and scores["BLOCK"] > 0.80:
print("high-risk auth change")
return 1
if result.top == "WARN":
mark_review_required()
return 0
return 0
내부 서비스 주소면 됩니다. 이것을, 공개 사이트가 이미 당신을 대신해 Jev를 제공하는 것으로 읽지 마십시오. 관로가 읽는 것은 맨 위 선택지와 점수입니다. 사람이 아직 글로 된 평이 필요하면, 쓸 수 있는 모델에게 물으십시오. 그 산문을 이 질문으로 밀어 넣지 마십시오.
수를 돌려주는 인터페이스를 부르듯이
두 번의 실행은 한 사실을 구체로 만듭니다. 복잡한 판단은 모델 안에 남고, 밖에 남는 것은 확률뿐입니다. Noul, Choice, Score는 세 개의 격자이며, 세 가지 잡담 방식이 아닙니다.
경로, 위험, 병합 전 검사, 정책 기계, Agent의 분기. 먼저 그 단계가 닫힌 질문으로 써지는지 물으십시오. 써지면, 생성을 기다리지 마십시오. 써지지 않으면, 이런 호출로 꾸미지 마십시오.