크라우니결정 설명서

확률이 아니라 결정을 준다

작성일 2026-09-29 · 버전 crowny-decide/0.1.0 · 이 문서는 제품 설명과 정량 비교를 함께 담습니다.

1. 무엇을 하는 부품인가

어떤 확률이든 넣으면 티·옴·타·음 네 가지 결정으로 돌려줍니다. 로컬에서, 토큰 없이, 규칙을 전부 보여주면서.

이 엔진은 답을 쓰지 않습니다. 소프트웨어가 곧바로 분기에 쓸 수 있는 결정과 그 결정의 근거를 돌려줍니다. 확률 하나를 받아 "실행할까 보류할까 버릴까 넘길까"를 매 제품마다 다시 정하던 임계 로직을, 규칙이 공개된 부품 하나로 대체하는 것이 목적입니다.

2. 4상 판정

티 · T · +1

실행. 근거가 충분히 한쪽으로 기울었다.

noul|90
옴 · O · 0

검색. 모르지만 근거를 더 모으면 풀린다.

noul|52
타 · A · −1

폐기. 반대 방향으로 충분히 기울었다.

noul|10
음 · U

이관. 이 엔진의 일이 아니다.

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 미만 → "미측정"
맞았는지 틀렸는지 알려주면, 자신감을 스스로 낮춥니다. 표본이 셋 미만이면 '미측정'이라고 말합니다.

3. 줄 형식 (5종)

유형줄의미
noulnoul|p[|d]예/아니오 확률 p(0..100)
choicechoice|a,b,c[|d]N지선다 분포. 항목 2..255, 합 100 정규화
scorescore|등급|등급수|p[|d]순서형 등급. 등급수 2..10
slmslm|점수|스케일|U합[|d]소형 언어모델 점수. U합>0이면 음
극성극성|긍|부[|d]긍정·부정 근거 개수. 합 0이면 음

4. HTTP API

메서드경로내용
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키는 동결(추가만 허용).

배치 JSON · 텍스트 경로

숫자 필드 없이 최상위 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:"음"입니다. 전자는 호출자 버그, 후자는 정직한 판정입니다.

5. 연결 방법

HTTP

curl "http://127.0.0.1:9562/v1/decide?q=noul%7C70"

MCP

{"mcpServers":{"crowny-decide":{"command":"/bin/bash",
 "args":["~/.crowny/도구/tiomta-judge/현재/mcp/mcp도구.sh"]}}}

도구 decide_json은 서버와 같은 라이브러리(libs/텍스트경로.한선)를 쓰므로 텍스트 판정 결과가 HTTP와 동일합니다.

SDK · CLI

가져오기 "sdk/결정클라이언트.한선"     // 한선씨
const decide = require('./sdk/decide.js') // JS
bin/decide 'noul|70'                      // CLI
bin/decide-server                         // 서버 상주

요건: crownyc 바이너리(peer, 미동봉). bin/설치검증.toau가 부팅 게이트로 확인합니다.

6. 외부 결정 모델(Jev) 대비 정량 비교

측정 조건: 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지표).

표본이 말해주는 것 한 줄

홑문장 40/40

100.0%. 한 문장에 사실 하나면 놓치지 않습니다.

복문 11/18

61.1% (D2101 수리 후, 갱신일 2026-09-30). 조건절(-면)은 판정하지 않고 conditional_detected·옴으로 이관하며, 양보절(-지만)은 여전히 해석하지 않습니다 — 남은 오답 7건 중 5건.

정확도를 가르는 것은 어휘가 아니라 문장 구조입니다. 도메인 사전 행수와 도메인별 정확도 사이에 상관은 보이지 않았습니다(행수 최다인 긴급 50행이 70.0%, 만족 44행이 100%).

7. 이 엔진이 못 하는 것

8. 권고

용도권고
숫자 확률·점수를 실행/보류/거부로 바꾸는 임계 판정바로 쓴다 (티)
짧은 한국어 알림·상태·티켓 제목(홑문장) 분류바로 쓴다 (티)
고객 메시지·리뷰 등 복문이 섞인 한국어1차 게이트로만. 음·옴만 상위 모델로 이관 (옴)
안전 판정(위험 없음 확인)지금은 쓰지 않는다 — 부정 결속 결함 수리 전까지 (타)
풍자·반어가 흔한 입력, 다국어 유입쓰지 않는다 (타)

하이브리드로 쓰면 이렇게 됩니다. 1차로 이 엔진을 통과시키고, reason이 no_polarity_match·polarity_balanced·instruction_unmapped인 답만 상위 모델로 넘깁니다. 60문장 실측에서 유료 경로로 넘어가는 비율은 18.3%였습니다. 반대로, 상위 모델이 낸 confidence를 noul|<confidence×100> 줄로 다시 이 엔진에 넣으면 임계 판정과 행동 지시를 한 곳에서 받을 수 있습니다.

표본 단서 — 정확도 수치의 근거인 60문장은 내부에서 직접 작성한 표본이며 실서비스 로그가 아닙니다. 사전 어휘를 알고 쓴 문장이 섞여 낙관 편향이 있을 수 있습니다. 실서비스 로그 300문장 재측정 전까지 이 수치를 대외 단독 근거로 쓰지 마십시오.