명령 알아듣기 런타임 — 통합의미→의미코드 자동 인코더
개요
쌓은 4레이어 유형 DB(20 표준 명령유형·2,130 실례)를 실제로 쓰는
런타임. 새 문장을 표준 명령유형으로 라우팅하고 의미코드를 방출한다.
- 라이브 데모: ai.crowny.org/hansuner/route (문장 입력→유형·코드·4상 판정)
- 정본: crowny-butler/libs/의미어라우터.한선 (한선씨 엔진)
알고리즘 (실측으로 선택)
- kNN 어휘중첩: 홀드아웃 44% — 같은 화행끼리 혼동(고장-요청↔이유-요청). 기각.
- 나이브베이즈(유형별 특징 자동학습): 홀드아웃 68%. 특징=단어토큰(조사제거)+화행단서(§)+종결어미(¶). 채택.
- 4상 신뢰도 게이트(margin=top1−top2): margin≥2.0 → 커버 49%·정확 90%, ≥4 → 30%·97%.
크라우니 원칙 적용:
삼진=결정론 코어(NB, 확신분 토큰0) +
퍼지경계=LLM(저마진 위임→학습 래칫).
구현
- 학습: 2,130 실례 → NB 모델(유형별 prior·top90 특징 logp·fallback). 정수 logp×100 →
libs/의미어라우터_모델.psv (1,820줄).
- 라우터 정본
libs/의미어라우터.한선: 모델로드 + 특징추출(조사제거 최장우선·화행단서·종결어미) + 유형별 NB점수(정수합) + 마진·4상판정. 컴파일·실행 검증.
- 파리티 20/20: 한선씨 엔진 출력이 파이썬 모델과 완전 일치(홀드아웃 20문장). 정확 16/20.
- 데모 페이지: 모델 임베드 + JS 미러(한선씨와 동일 로직), 입력→유형·코드·4상·top5 후보·특징.
4상 런타임 (닫힌 루프 실배선 2026-07-16)
- 티(margin≥2.0): 결정론 확신 라우팅, LLM 미호출·토큰0. 커버 49%·정확 90%.
- 옴(저마진): 런타임이 실제로 LLM 호출(claude -p haiku)해 20유형 중 분류+의미코드 → 래칫학습.psv append → 재학습(라우터학습.py) → 다음부터 결정론이 커버.
- 오케스트레이터:
의미어라우터_런타임.js(spawn만) — route(한선씨 CLI) → 티 즉시반환 / 옴 → llmClassify(claude -p) → ratchet(append+재학습).
- 실증: "계획을 세웠으니까‖성공할 가능성이 높아" 학습전 margin 4(옴) → LLM 라벨 → 래칫 재학습 → margin 225(티). 옴→토큰0 결정론으로 전환 확인. 티 케이스는 LLM 미호출 즉시반환(llmTokens 0) 확인.
관련 파일
- 정본: crowny-butler/libs/의미어라우터.한선
- 모델: crowny-butler/libs/의미어라우터_모델.psv
- 코퍼스: data/문장조합저장소.psv(표준20유형 2,130) + data/명령유형_표준.json
- 데모: crowny-ai/public/hansuner/route/index.html
래칫 오라벨 정제 — 다판정관 투표 (2026-07-16)
단일 LLM 오분류가 DB를 오염("저품질 학습=오염 전파")시키는 것을 다판정관 투표로 차단.
- 실측(옴 25케이스, haiku 5판정관): 단일판정관 평균 74% — 그중 1명이 0/25(포맷 실패). 단일 사용 시 25건 오염 위험.
- 다수결이 깨진 판정관 무력화: 3/5→채택 96% · 4/5→채택 100%(기권 20%) · 3인 2/3→채택 94%·정확 97%·기권 6%. 깨진 판정관 포함 조합도 97%(2 good이 흡수).
- 런타임 정책: 옴 → 3판정관(claude -p haiku) → 2/3 합의만 학습, 무합의는
data/래칫보류.psv로 기권(미학습). 오염 0.
- 실증: "물가가 올랐어‖저축을 늘려야 해" 결정론 가정-귀결(옴 오답) → 투표 [관찰-판단-행동, 원인-결과, 원인-결과] → 2/3=원인-결과 학습(반대표 흡수). 1건 학습은 유형 교정, 신뢰도는 유사예 누적 시 상승.
밀도·구조 재측정 — 68% 천장의 원인 규명 (2026-07-16)
"유형당 100→300 심화가 정확도를 올리나?" 검증.
태우기 전 학습곡선 선측정.
- 밀도 학습곡선: 유형당 10→85개로 늘려도 전체정확 56→67%에서 평탄(60→85는 +1%p). 확신커버는 21→50% 성장(둔화). → 100→300(+4,000 생성)은 정확도 저수율 예측 → 미실행.
- 화행×상황 2단분해: 화행 69%·상황 40%(첫문장 이유/원인/문제/근거 표면상 구분난)·결합 65%. 평면 68%보다 하락 → 기각.
- 유형 병합 20→13(인과서술=원인결과+문제해결+계획실행결과+관찰판단행동 / 정서3단=감정원인대처+목표전략실행+사건반응다짐 / 요청=이유요청+고장요청 / 지시=상황지시+조건지시): 전체정확 68→80%, 확신커버 49→61%, 확신정확 90→93%.
- 결론: 68% 천장은 데이터·분류기가 아니라 동의어급 유형쌍 겹침. 밀도·2단분해 아닌 유형체계 정리(계층화)가 진짜 레버. 런타임은 이미 4상 게이트(티 90%+옴 다판정관 97%)로 이 천장을 우회 중.
계층 라우팅 구축 (2026-07-16)
병합 이득(80%)을 살리되 20유형 코드 보존. 결정론 coarse(13클러스터) → 싱글턴/내부확신 완결 / 다중불확실만 LLM 세분(클러스터 2~4개 중).
- 설계: 20유형 NB 점수 → 클러스터별 max 집계 → coarse argmax(항상 결정론). 싱글턴 or 내부마진≥2 → 티(토큰0). 다중·내부불확실 → 세분(후보 2~4 방출).
- 정본
libs/의미어라우터_계층.한선: 클러스터맵 로드(C라인)+coarse집계+내부결정. 컴파일 통과, 파이썬 캐스케이드와 로직 파리티 8/8(동일모델).
- 측정(홀드아웃 305): coarse 클러스터 정확 80% · 토큰0 완결 49→72% · LLM 세분 50→27%, 그것도 평균 3.2지선다(20 아님).
- 런타임: 티→즉시반환(토큰0) / 세분→클러스터 확정 후 후보 2~4개서만 다판정관(claude -p 3, 2/3 합의)→래칫 / 옴→전체 폴백. 실증: "약을 먹었으니까‖나아졌어"→클러스터 인과서술 확정→4지선다 3/3 원인-결과 학습.
- 트레이너 수정: 라우터학습.py가 C(클러스터)라인 방출→재학습 시 계층맵 유지(누락 버그 수정).
- 클러스터: 인과서술(원인결과·문제해결·계획실행결과·관찰판단행동)·정서3단(감정원인대처·목표전략실행·사건반응다짐)·요청(이유·고장)·지시(상황·조건)·나머지9 싱글턴.
- 데모: /hansuner/route — coarse 클러스터 배지 + 티/세분 티어 + 후보 표시.
클러스터 자동 도출 — 혼동행렬 기반 (2026-07-17)
수동 4쌍 대신 혼동행렬에서 알고리즘 도출. 도구
클러스터도출.py(유니온-파인드).
- 혼동 상위: 감정원인대처↔목표전략실행(11)·문제해결↔원인결과(7)·계획실행결과↔원인결과(7)·고장요청↔이유요청(6)·가정귀결↔조건지시(6)·대조역접↔인과서술(4+4)·관찰판단행동↔근거주장(3). 수동이 놓친 교차혼동(가정귀결↔조건지시 등) 포착.
- 임계값 스윕: T=4(14클러스터·coarse83%·토큰0 67%·3.1지선다)·T=5(15클러스터·coarse80%·토큰0 72%·2.5지선다)·T=7(17·77%·84%·2.8). T=5 채택 — 수동(80%/72%)과 동률이되 LLM 2.5지선다(수동 3.2보다 타이트)·데이터기반.
- T=5 자동 클러스터(4다중): {문제해결·원인결과·계획실행결과}·{이유요청·고장요청}·{조건지시·가정귀결}(신규)·{감정원인대처·목표전략실행}. 수동보다 정밀(관찰판단행동·사건반응다짐 오군집 제외, 가정귀결↔조건지시 신규).
- 설치: 클러스터도출.py→data/클러스터.psv→라우터학습.py 재학습(C라인)→계층 CLI 라이브. 데모 재임베드(군(조건·가정) 표시).
래칫보류 재검토 루틴 (2026-07-17)
1차(haiku 3판정관 2/3)서 무합의로 보류된 기권분을
상급 판정관(sonnet)이 주기 검토. 도구
래칫보류검토.js.
- 에스컬레이션 사다리: haiku 3판정관(런타임) → 무합의 → data/래칫보류.psv 적재(미학습) → sonnet 3판정관(클러스터 후보 내) 2/3 → 합의=학습(래칫)·재학습 / 무합의=data/인간검토.psv(사람 최종).
- 후보 범위: 보류 line의 클러스터가 군(...)이면 그 멤버, 아니면 1차 경쟁 후보(votes). 상급도 좁은 후보서만 판정.
- 실증: 보류 2건(날씨흐리네→우산챙길까 / 성적떨어졌어→공부법바꿔야겠어) → sonnet 3판정관 → 둘 다 상급 2/3 합의(관찰-제안·원인-결과)→학습·재학습(2134실례). 인간큐 0. 보류 비움. C라인 유지.
- 한계(정직): 1건 학습은 유형 방향 교정이되 확신 라우팅을 항상 뒤집진 않음(유사예 누적 시 신뢰도 상승). 진짜 애매한 경계는 인간큐로.
- 주기화: 수동/호출형 도구(node 래칫보류검토.js). 자율 데몬은 미생성(폭주방지 원칙) — 필요 시 LaunchAgent/cron 등록.
잔여
- ✅ 저마진 LLM 위임+래칫 / ✅ 다판정관 정제 / ✅ 밀도·구조 재측정 / ✅ 계층 라우팅 / ✅ 클러스터 자동도출 / ✅ 래칫보류 재검토 — 완료
- 인간검토(data/인간검토.psv) UI/큐 (최종 티어)
- 래칫 누적 시 클러스터 주기적 재도출(클러스터도출.py 재실행)
- 유형별 실례 100→300 심화 시 NB 정확도 재측정(밀도↑→경계↑ 기대)
- 화행/상황 2단 분해 분류로 인접유형 혼동(감정-원인-대처↔목표-전략-실행) 저감 실험
파일(런타임)
- 오케스트레이터: crowny-butler/의미어라우터_런타임.js (spawn 글루, 결정 정본=한선씨)
- 재학습: crowny-butler/라우터학습.py (base 코퍼스+래칫학습.psv → 모델)
- 래칫 학습분: crowny-butler/data/래칫학습.psv (LLM 라벨링 누적)
- stdin CLI: crowny-butler/libs/의미어라우터_CLI.한선(.toau)
인간검토 UI + 전체 현황 (2026-07-17)
- 인간검토 UI(
인간검토서버.js, :9868 crowny-인간검토): 설문식 1건씩 — 애매 경계(sonnet도 무합의) 문장 + 후보(클러스터 멤버) 제시 → 사람 택1 → 래칫학습.psv 즉시 학습 + 인간검토_완료.psv 로그, 큐 자동 감소. 검증: 결정→학습반영·큐감소 확인. 호출형(node 인간검토서버.js), 상주 안 함. 디자인 미통일(추후 크라우니디자인 일괄).
- 전체 정량 현황(대시보드 /hansuner/status): L1 64,955단어·L2 147,290연결·L3 3,576표현·L4 5,956조합(표준유형 2,130)·의미어코어 2,820·라우터 coarse80%/토큰0 72%/LLM세분27%(2.5지선다)/파리티8/8·라이브 8페이지 전부 200.
- 태스크 보드: 완료 9(코드체계~인간검토 UI) / 진행·대기 3(인간큐 실운영·클러스터 자동재도출·L1 저연결) / 보류·기각 3(밀도300 평탄·2단분해 하락·색공간 불필요).
이해 라우터 68% 천장 — 재프레이밍·클러스터 개선 (2026-07-17)
감사 UI로 오라우팅 가시화 후 근본 분석.
"68% 천장"은 flat 모델 아티팩트.
- 동작(동사 기본형) 특징 주입 실험: 69→68%(-1%p). 원토큰(만들어)이 이미 판별, 기본형 중복 → 기각(정직).
- 혼동 구조: 오류의 25%가 단일쌍 감정-원인-대처→목표-전략-실행(11회) — 그런데 둘은 이미 같은 클러스터 군(감정·목표)!
- 진짜 지표 = coarse 클러스터 정확 81%(flat 69% 아님). flat 오류 97건 중 40% 클러스터내 흡수(→LLM세분 97%)·59% 교차오류.
- T 스윕(21유형): T3=coarse89%·토큰0 62%·4.9지선다 / T4=84%·68%·3.1 / T5=81%·73%·2.5. T=4 채택(교차오류 흡수↑, 토큰0 유지). 대조-역접이 인과서술로 흡수.
- 결과: 런타임 coarse 81→84%. 남은 교차오류는 소규모 클러스터내 LLM 세분(다판정관 97%). 잔여=OOD 단일절 명령("파일 열어줘"→목적-제작) = 담화 taxonomy(2절)와 별개 이슈.
OOD 단일절 명령 대응 (2026-07-17)
라우터가 2절 담화(상황-화행)로 학습돼 단독 명령("파일 열어줘")이 오라우팅되던 OOD 문제.
- 베이스라인: 단일절 12케이스 8/12(67%). 오라우팅: 파일열어줘→목적-제작·계란구워줄래→완료-보고·됐어→문제-해결·끝났어→원인-결과(~어줘 종결어미 공유).
- 대응: 실행유형 6종(이유-요청·상황-지시·목적-제작·궁금-질문·위험-금지·완료-보고)에 단일절 예시 90개(‖없이 한 문장) 생성·L4 편입(6057→6147)·재학습.
- 결과: 단일절 8/12→10/12(83%, +16%p). 계란구워줄래→이유-요청·끝났어→완료-보고 정정. 2절 회귀 없음(클러스터 정확 유지).
- 남은 2건(정직): "파일 열어줘"(열어줘의 줘가 제작-요청처럼 보임)·"다 됐어"(bare 됐어 모호) — 진짜 경계, 런타임 세분/다판정관에 위임.
크라우니디자인 통일 (2026-07-17)
그동안 미룬 디자인을 중앙 크라우니디자인 CSS로 일괄 통일(폰트 통일, 색·레이아웃 보존·멱등).
- 중앙 CSS=studio.crowny.org/font/크라우니디자인.css(2.4KB, 크라우니 변수폰트 3종+토큰). html[data-crowny]에 크라우니 폰트만 적용(색·레이아웃 보존).
- 정적 8페이지(hansuner index·graph·status·route·gate·discourse·report·semcode): crowny-design.sh apply→링크+data-crowny 주입(멱등). 라이브 200·CSS링크 서빙 확인.
- 서버 3페이지(인간검토:9868·승인큐:9801·감사:9802): page() 템플릿에 링크+data-crowny 주입. 렌더 200 확인.
- 이후 중앙 CSS 한 파일 수정→data-crowny 단 전 페이지 일괄 반영. 디자인 통일 대상 레지스트리 등록.