확률이 아니라 결정을 준다
어떤 확률이든 넣으면 티·옴·타·음 네 가지 결정으로 돌려줍니다. 로컬에서, 토큰 없이, 규칙을 전부 보여주면서.
이 엔진은 답을 쓰지 않습니다. 소프트웨어가 곧바로 분기에 쓸 수 있는 결정과 그 결정의 근거를 돌려줍니다. 확률 하나를 받아 "실행할까 보류할까 버릴까 넘길까"를 매 제품마다 다시 정하던 임계 로직을, 규칙이 공개된 부품 하나로 대체하는 것이 목적입니다.
실행. 근거가 충분히 한쪽으로 기울었다.
noul|90검색. 모르지만 근거를 더 모으면 풀린다.
noul|52폐기. 반대 방향으로 충분히 기울었다.
noul|10이관. 이 엔진의 일이 아니다.
noul|-1모른다와 잴 수 없다는 다릅니다. 옴은 근거를 더 모으면 풀리고, 음은 이 엔진의 일이 아닙니다.
c = p - 50
c > d → 티 (실행)
c < -d → 타 (폐기)
|c| <= d → 옴 (검색)
p ∉ [0,100] → 음 (이관)
데드존 d 기본값 = 10
임계값이 어디인지 물어보세요. /v1/rules가 식을 그대로 돌려줍니다.
판정 뒤에 실제 결과를 /v1/feedback으로 알려주면 장부에 쌓이고, 데드존이 AIMD로 움직입니다.
티/타 적중률 < 80% → d + 2
둘 다 ≥ 90% → d - 2
d 범위 [2, 40] · 표본 3 미만 → "미측정"
맞았는지 틀렸는지 알려주면, 자신감을 스스로 낮춥니다. 표본이 셋 미만이면 '미측정'이라고 말합니다.
| 유형 | 줄 | 의미 |
|---|---|---|
| noul | noul|p[|d] | 예/아니오 확률 p(0..100) |
| choice | choice|a,b,c[|d] | N지선다 분포. 항목 2..255, 합 100 정규화 |
| score | score|등급|등급수|p[|d] | 순서형 등급. 등급수 2..10 |
| slm | slm|점수|스케일|U합[|d] | 소형 언어모델 점수. U합>0이면 음 |
| 극성 | 극성|긍|부[|d] | 긍정·부정 근거 개수. 합 0이면 음 |
| 메서드 | 경로 | 내용 |
|---|---|---|
| GET | /health | 상태·버전·장부행수·데드존·사전행수 (인증 면제) |
| GET | /v1/decide?q=<줄> | 퍼센트인코딩 줄 1개 → 결정 응답 |
| POST | /v1/decide | 줄 1개(text/plain) 또는 배치 JSON(application/json) |
| POST | /v1/feedback | 상|실제(1/0) 기록 → 데드존 보정 |
| GET | /v1/calibration | 티/타 표본·적중률, 옴·음 수, 권고 데드존 |
| GET | /v1/rules | 판정식·타입별 규칙·보정식 전문 |
{"ok":true,"engine":"crowny-decide/0.1.0","type":"noul",
"phase":"티","code":"T","trit":1,"action":"실행","p":70,"detail":"-"}
phase ∈ 티/옴/타/음 · code ∈ T/O/A/U · action ∈ 실행/검색/폐기/이관 · p 0..100 또는 −1(측정불가). 기존 6키는 동결(추가만 허용).
숫자 필드 없이 최상위 state(자유 텍스트)와 질문별 instructions만 주면 규칙기반 텍스트 경로가 돕니다. 외부 모델 호출 0회, 토큰 0.
POST /v1/decide Content-Type: application/json
{"state":"카드가 이중결제되었습니다 과금 오류입니다",
"questions":{"pay":{"type":"noul","instructions":"결제 문제인가?"}}}
{"ok":true,"dict_rows":366,"engine":"crowny-decide/0.1.0","deadzone":10,
"answers":{"pay":{"type":"noul","phase":"티","code":"T","trit":1,"action":"실행","p":100,
"evidence":[{"word":"이중결제","polarity":1,"weight":3},{"word":"오류","polarity":1,"weight":3}],
"matched":2,"domain":"결제","unknown_ratio":0,"reason":"ok"}},
"summary":{"티":1,"옴":0,"타":0,"음":0}}
질문 ≤32 · state ≤8,000자 · instructions ≤512자 · evidence ≤32건(초과분은 evidence_more). reason은 ok·no_polarity_match·polarity_balanced·instruction_unmapped·unknown_ratio_high 등 10종.
입력이 규격 밖이면 4xx invalid_line, 입력은 규격 안인데 판단 근거가 없으면 200 phase:"음"입니다. 전자는 호출자 버그, 후자는 정직한 판정입니다.
curl "http://127.0.0.1:9562/v1/decide?q=noul%7C70"
{"mcpServers":{"crowny-decide":{"command":"/bin/bash",
"args":["~/.crowny/도구/tiomta-judge/현재/mcp/mcp도구.sh"]}}}
도구 decide_json은 서버와 같은 라이브러리(libs/텍스트경로.한선)를 쓰므로 텍스트 판정 결과가 HTTP와 동일합니다.
가져오기 "sdk/결정클라이언트.한선" // 한선씨
const decide = require('./sdk/decide.js') // JS
bin/decide 'noul|70' // CLI
bin/decide-server // 서버 상주
요건: crownyc 바이너리(peer, 미동봉). bin/설치검증.toau가 부팅 게이트로 확인합니다.
측정 조건: 2026-09-29, 격리 포트 9583, dict_rows=366, 로컬 루프백 왕복 포함. 비교군은 TypeSafe AI의 Jev(jev-1.13.0)이며, Jev 실 API 왕복은 0건(키 미보유)이라 Jev 값은 전부 공표값입니다. 우위는 4상 — 티=우리 우위, 옴=조건부, 타=Jev 우위, 음=비교불가.
| 지표 | 크라우니결정 실측 | Jev 값(공표) | 우위 |
|---|---|---|---|
| 한국어 판정 정확도 | 53/60 = 88.3% (D2101 수리 후, 갱신일 2026-09-30) | 한국어 표본 공표 없음 | 음 |
| 커버리지(음 제외 정확도) | 41/49 = 83.7% (음 18.3%) | '판정 없음' 상태 자체가 없음 | 음 |
| 반대 방향 오답(티↔타) | 0/60 (D2101 수리 후) | 미확인 | 음 |
| 지시문 어투 민감도 | 0/60 불일치(지시문 8종 변형) | 모델이 자연어 해석 — 무관 추정 | 옴 |
| 지연 p50/p95 — 숫자 단건 | 1.06 / 1.20 ms (n=200) | 70~500 ms | 티 |
| 지연 p50/p95 — 텍스트 3질문 | 16.12 / 17.13 ms (n=100) | 70~500 ms | 티 |
| 지연 p50/p95 — 2,000자 1질문 | 92.74 / 98.20 ms (n=20) | 70~500 ms | 옴 |
| 병렬 처리율 | 59.6 req/s (10동시×100). 동시 10에서 p50 148.50 ms — 단일 프로세스 직렬화 | 1,200 req/분 = 20 req/s · 250k tok/s, 초과 429 | 옴 |
| 비용 / 연 100만 요청(400자+질문3) | 0원 + 서버 CPU 4.39시간 | 약 16.8달러 | 티 |
| 비용 / 연 1,000만 요청(2,000자) | 0원 + 서버 CPU 258시간 | 약 651달러 | 티 |
| 결정론 | 60문장 3회 응답 해시 동일 | 재현 보장 공표 없음 | 티 |
| 오프라인 · 데이터 유출 | 소켓 LISTEN 1개뿐, 아웃바운드 0, 유출 0바이트 | SaaS 전송. 무학습 공표 + ZDR 옵션(보존 안 함 ≠ 안 보냄) | 티 |
| 설명가능성 | 규칙 전문 공개 1 · 근거 필드 5/5 존재(evidence·reason·matched·domain·unknown_ratio) | confidence 1개, 규칙 비공개 | 티 |
| 질문 타입 수 | 5종(noul·choice·score·slm·극성) | 3종(noul·choice·score) | 티 |
| 텍스트 이해 범위 | 8도메인 · 극성사전 366행 | 자유 텍스트 약 32,000토큰(15만 자) | 타 |
| 다국어 | 0 — 비한국어 표제어 0행, 전량 음 | 영문 예시 공개, 그 외 미확인 | 타 |
| 보정 방식 | 장부 AIMD(19행, 식 전문 공개, 표본<3은 미측정) | RLCD 학습(절차·데이터 비공개) | 옴 |
| 행동 지시 | action 4종 내장(실행/검색/폐기/이관) | 없음 — 임계 로직 자작 | 티 |
우위 계수 — 티 8 · 옴 5 · 타 2 · 음 3 (총 18지표).
100.0%. 한 문장에 사실 하나면 놓치지 않습니다.
61.1% (D2101 수리 후, 갱신일 2026-09-30). 조건절(-면)은 판정하지 않고 conditional_detected·옴으로 이관하며, 양보절(-지만)은 여전히 해석하지 않습니다 — 남은 오답 7건 중 5건.
정확도를 가르는 것은 어휘가 아니라 문장 구조입니다. 도메인 사전 행수와 도메인별 정확도 사이에 상관은 보이지 않았습니다(행수 최다인 긴급 50행이 70.0%, 만족 44행이 100%).
-지만은 주절을 가중하지 않고, -면은 가정을 사실로 셉니다. 복문 정확도 40.0%의 직접 원인입니다.안전하며 이상 없습니다가 위험=티로 뒤집힙니다. 60문장 중 유일한 반대 방향 오답이며, reason:"ok"·p=100으로 확신을 갖고 틀리므로 하류에서 걸러낼 신호가 없습니다. 수리 전까지 위험 도메인 부정문 판정에 쓰지 마십시오.| 용도 | 권고 |
|---|---|
| 숫자 확률·점수를 실행/보류/거부로 바꾸는 임계 판정 | 바로 쓴다 (티) |
| 짧은 한국어 알림·상태·티켓 제목(홑문장) 분류 | 바로 쓴다 (티) |
| 고객 메시지·리뷰 등 복문이 섞인 한국어 | 1차 게이트로만. 음·옴만 상위 모델로 이관 (옴) |
| 안전 판정(위험 없음 확인) | 지금은 쓰지 않는다 — 부정 결속 결함 수리 전까지 (타) |
| 풍자·반어가 흔한 입력, 다국어 유입 | 쓰지 않는다 (타) |
하이브리드로 쓰면 이렇게 됩니다. 1차로 이 엔진을 통과시키고, reason이 no_polarity_match·polarity_balanced·instruction_unmapped인 답만 상위 모델로 넘깁니다. 60문장 실측에서 유료 경로로 넘어가는 비율은 18.3%였습니다. 반대로, 상위 모델이 낸 confidence를 noul|<confidence×100> 줄로 다시 이 엔진에 넣으면 임계 판정과 행동 지시를 한 곳에서 받을 수 있습니다.
표본 단서 — 정확도 수치의 근거인 60문장은 내부에서 직접 작성한 표본이며 실서비스 로그가 아닙니다. 사전 어휘를 알고 쓴 문장이 섞여 낙관 편향이 있을 수 있습니다. 실서비스 로그 300문장 재측정 전까지 이 수치를 대외 단독 근거로 쓰지 마십시오.