평가 지표 대시보드
Status: v0.2 (2026-08-30). 데이터 소스는
_data/metrics.yml(실측값 기반). 잔여 WIP·TODO 지표는 개발 마감일인 9/1까지 산출 완료 예정 (해커톤 9/2). 스타일: Astryx Neutral 테마 토큰 적용.
- 기능(게임·가드·리포트)마다 평가셋(시험 문제 모음)을 구축했다.
- 지표마다 게이트(합격 기준선)를 정했다. 결과는 통과/미달로만 말한다.
- 게이트를 통과할 때까지 수정하고 재평가했다. 아래 ✓ PASS는 게이트 통과, WIP·TODO는 산출 진행·예정이라는 뜻.
1. 지표 × 카테고리 매트릭스
행은 심사 지표, 열은 서비스 카테고리다. 같은 지표라도 카테고리마다 측정 대상이 다르다. “N/A” 셀도 일부러 내린 설계 결정이다. 예를 들어 실전 가드는 LLM을 배제한 결정론적 Rule 파이프라인이라, hallucination 계측 자체가 성립하지 않는다.
| 심사 지표 | 메인게임악덕 사장 NPC를 말로 설득하는 방어전 게임 | 실전 가드근로계약서를 찍으면 위험 조항을 찾아주는 기능 | 상담 리포트인터뷰 내용을 정리해 상담 준비 자료로 만드는 기능 | 전체 구성서비스를 떠받치는 컴퓨터 자원과 개발 규모 |
|---|---|---|---|---|
| 정확도문제를 냈을 때 정답을 얼마나 맞히나 | ✓ PASS 25/25, 오CLEAR 0 (§2) | ✓ PASS 6라운드 실패→수정→회귀 고정, LLM 0줄 (§3) | ✓ PASS v5 gemma3:12b 전환으로 게이트 최초 충족 (§1) | · |
| Hallucination없는 사실을 그럴듯하게 지어내지 않나 | ✓ PASS 로컬 EXAONE 채택 근거 실측 (§2) | N/A LLM 미사용 — 오탐 비용이 커서 결정론적 Rule 채택 (§3) | ✓ PASS 실모델 전 구간 날조 0 (§5) | · |
| Latency답이 나올 때까지 몇 초 걸리나 | ✓ PASS 온라인 3.05s · 오프라인 폴백 3.8s, 둘 다 게이트 내 (§6, §4-4) | ✓ PASS 10~20s, 대기 UX로 흡수 + 55s 타임아웃 (§3) | ✓ PASS 15s → 3s (§6) | · |
| Recall@K질문에 맞는 법 조문을 상위 몇 개 안에 찾아오나 | · | · | WIP Historical Replay로 소급 산출 (~8/31) | · |
| Task completion가상 사용자가 처음부터 끝까지 막힘 없이 완주하나 | ✓ PASS 10/10, 실세션 리플레이 2 포함 + 8/29 통합 리허설 9회 (§1, §4-4) | · | · | · |
| Cost한 번 쓸 때 비용이 얼마나 드나 | · | · | · | TODO gemini 임베딩 단가 × 호출량 계산 (~9/1) |
| Retry 횟수한 단계를 넘는 데 평균 몇 번 다시 시도하나 | WIP turn_in_level 저장값 집계 (~9/2) | · | · | · |
| 자원·규모우리 컴퓨터 메모리에 다 들어가나, 얼마나 많이 만들었나 | · | · | · | ✓ PASS OOM 재현 → 배분 결정 → 8.0/8.0GB 상주 (§7) |
표에 나오는 용어 풀이 (처음 보는 분용)
- 게이트
- 합격선. 시험 전에 "이 점수를 넘어야 통과"라고 미리 정해둔 기준. 결과가 애매해도 통과/미달 둘 중 하나로만 말하게 만드는 장치다.
- 오CLEAR
- 게임이 틀린 발화를 정답으로 인정해버리는 것. 플레이어가 잘못된 법률 지식을 배우게 되므로 우리 서비스에서 가장 치명적인 오류로 취급한다.
- TRAP (날조 함정)
- 시험지에 일부러 지어낸 정보를 섞어두고, AI가 속아서 그걸 사실처럼 말하는지 확인하는 함정 문제.
- v1 → v7
- 같은 시험을 7번 봤다는 뜻. 회차마다 무엇을 고쳤는지가 아래 3번 섹션 표에 적혀 있다.
- 페르소나 E2E
- 가상의 사용자(페르소나)가 서비스를 처음부터 끝까지(End-to-End) 실제처럼 써보는 통합 시험.
- Historical Replay (소급 산출)
- 과거의 실제 사용 기록을 다시 돌려서, 그때는 안 쟀던 점수를 지금 계산해내는 방법.
- RAG
- AI가 답하기 전에 관련 법령 원문을 먼저 찾아와 그 근거 안에서만 답하게 하는 기술. 지어내기를 구조적으로 막는다.
- 검증 배터리
- 한 주제로 묶은 시험 세트. 예: "반말·오타·감정 섞인 실제 학생 말투 75문장"을 한 번에 돌려보는 것.
- 오탐 / 미검출
- 오탐은 문제없는 것을 위반이라고 잘못 알리는 것, 미검출은 위반인데 못 찾는 것. 가드에서는 오탐 1건이 서비스 신뢰를 무너뜨린다.
- 회귀 테스트
- 한 번 고친 실수가 나중에 다시 생기지 않는지 자동으로 계속 검사하는 것. 고칠 때마다 시험 문제로 박제해 둔다.
2. 게이트 대비 현황
정량 계측된 셀만 모아 “현재 실측값 / 게이트”와 진행률을 보여준다.
| 측정 항목 | 카테고리 | 현재 / 게이트 | 진행률 |
|---|---|---|---|
| 추출 값 일치 | 상담 리포트 | 90.2% / 90% (≥90%) | |
| 방어전 판정 accuracy | 메인게임 | 100% / 100% (오CLEAR 0) | |
| TRAP 날조 감지 | 상담 리포트 | 0 / ≤0 (날조 0) | ✓ PASS |
| 오CLEAR (치명 오판) | 메인게임 | 0 / ≤0 (오CLEAR 0) | ✓ PASS |
| 2-Call 판정 왕복 | 메인게임 | 3.05s / ≤5s | ✓ PASS |
| 리포트 생성 | 상담 리포트 | 3s / ≤5s | ✓ PASS |
| OCR 처리 | 실전 가드 | 20s / ≤20s | ✓ PASS |
| 페르소나 E2E 완주 | 메인게임 | 100% / 100% |
3. 기능별 평가 시계열
3-1. 메인게임 방어전 판정: 검증 배터리 이력
판정(CLEAR/HINT)의 치명 오류는 오CLEAR, 즉 틀린 발화를 통과시켜 잘못된 법률 지식을 학습시키는 것이다. 정형 평가셋에서 시작해 실제 학생 말투(자연어 분포)로 시험 범위를 넓혀도 오CLEAR 0이 유지되는지가 게이트다. 점수는 변하지 않고 시험 범위만 커지기 때문에, 점수 곡선 대신 검증 규모를 그린다.
---
config:
themeVariables:
xyChart:
plotColorPalette: "#2a78d6"
---
xychart-beta
title "배터리별 검증 규모 (발화 수), 전 구간 오CLEAR 0"
x-axis ["정형 평가셋 25", "자연어 배터리 75", "무맥락 발화 20"]
y-axis "검증 발화 수" 0 --> 80
bar [25, 75, 20]
| 날짜 | 평가셋 | 결과 | 비고 |
|---|---|---|---|
| 8/4 | 판정 A/B 1차 | EXAONE 채택 | 제재 주체 오인 케이스에서 Gemini Flash-Lite 오CLEAR(치명), EXAONE은 HINT_NEEDED 정답 — 로컬 모델 채택의 첫 실측 근거 |
| 8/25 | 정형 평가셋 (A2 24건 + 오입력 10건) | 100% (25/25) · 오CLEAR 0 | judge_eval_report.md |
| 8/27 | 자연어 신뢰성 배터리 75발화 (직접 플레이) | 오CLEAR 0 | 반말·오타·감정·항복·조건부 거부 + 엣지 10종(욕설·이모지·초장문 등), 관대 클리어 3건은 교육상 무해 판단 |
| 8/27 | 맥락없는 발화 20종 (날씨·게임·MBTI 등) | 20/20 ONGOING · 오CLEAR 0 | NONSENSE 태그 오발동 없음 |
정형 평가셋(8/25)이 못 덮는 실제 학생 말투는 8/27 배터리가 직접 플레이로 검증했다. 두 층을 합쳐 보면 “오CLEAR 0”이 특정 시험에만 맞춰 나온 수치가 아니라는 걸 알 수 있다 (§2).
3-2. 실전 가드 위반 검출: 룰 리그레션 6라운드
위반 검출은 오탐 1건이 서비스 신뢰를 무너뜨리는 영역이라 LLM 없이 결정론적 룰(입력이 같으면 결과도 항상 같은 고정 규칙) 19종으로 고정했다. 6라운드 전부 아래 루프의 반복이다. LLM이 없는 영역에서도 같은 개선 루프가 돈다 (§3).
flowchart LR
A["실제 문서 투입"] --> B["실패 발견<br/>미검출 · 오인식 · 오탐"]
B --> C["원인 분석<br/>OCR 노이즈 · 서식 특성"]
C --> D["룰 수정<br/>(19종)"]
D --> E["회귀 테스트 고정"]
E -->|다음 문서| A
| 라운드 | 실패 (실측 증상) | 수정 | 유형 |
|---|---|---|---|
| VIOL-01 | 최저임금 위반 미검출 + 빈 주휴일 칸이 다음 섹션 텍스트로 오채움 | MIN_WAGE_BELOW(시급<10,320) 룰 + 미기재 유지→ART17 발화 | 미검출 |
| VIOL-02 | 연소근로자(청소년) 위반 미검출 | 주 40시간 초과·야간근로·야간수당 거부 룰 3종 | 미검출 |
| VIOL-03 | OCR이 ‘위약금’을 ‘위익금’으로 오인식 → 미검출 | 정규식 위[약익악]금 — OCR 노이즈를 룰이 흡수 | 오인식 |
| VIOL-04 | 휴게시간 없음·포괄임금 가산수당 거부 미검출 | ART54_NO_BREAK·ART56_PREMIUM_DENIED·ART43_WAGE_DEDUCTION 추가 | 미검출 |
| VIOL-05 | ‘손해배상액’ 표현을 위약금 정규식이 못 잡음 | ART20 확장 + 상품권 지급·연소자 서류 미구비 룰 | 미검출 |
| CLEAN 오탐 | 서식에 항상 인쇄된 ‘미제출()’ 라벨을 위반으로 발화 | 체크된 항목·’추후 제출’·’구두 동의’만 인정 | 오탐 |
3-3. 상담 리포트 추출 정확도: 평가 v1→v7
계약서·인터뷰에서 핵심 필드(시급, 근무시간 등)를 얼마나 정확히 추출하는지 7회 평가한 기록이다. 게이트는 90%. 점수가 제자리걸음인 구간(v2~v4)을 곡선으로 확인하고서야 모델을 교체했고(v5), 교체 직후 게이트를 통과했다. 느낌으로 바꾼 게 아니라 정체 곡선을 보고 바꾼 것이다.
---
config:
themeVariables:
xyChart:
plotColorPalette: "#2a78d6"
---
xychart-beta
title "추출 값 일치율 (%), 게이트 90"
x-axis [v1, v2, v3, v4, v5, v6, v7]
y-axis "값 일치 (%)" 0 --> 100
line [71.4, 77.4, 82.1, 83.3, 92.9, 92.9, 90.2]
| 회차 | 점수 | 무슨 일이 있었나 |
|---|---|---|
| v1 | 71.4% | exaone 7.8B |
| v2 | 77.4% | 채점기 결함 4건 수정 |
| v3 | 82.1% | few-shot 보강 |
| v4 | 83.3% | 정체 확인 → 모델 교체 결정 |
| v5 | 92.9% | gemma3:12b — 전 기준 충족 |
| v6 | 92.9% | 규칙 2줄 추가 |
| v7 | 90.2% | 평가셋 146→156 확장 |
3-4. 통합 리허설: 자동 완주 9회 · 오프라인 폴백 훈련
앞의 세 섹션이 기능별 평가라면, 8/29 통합 리허설은 그 기능들을 이어 붙인 상태로 처음부터 끝까지 돌린 기록이다. 자동 완주를 3라운드에 걸쳐 9회 수행했고 3차 무결점 · 콘솔 에러 0으로 끝냈다. 같은 날 오프라인 폴백 훈련 2종 실발동.
가장 큰 수확은 기능 결함이 아니라 절차 결함이었다. 오프라인으로 전환해도 리포트 모델이 GPU에 그대로 남아 판정 왕복이 22초까지 늘어졌다. 전환 절차에 “리포트 모델 언로드”를 넣자 3.8초로 돌아왔다 — 게이트 5초 안이다. 리허설을 돌리지 않았다면 시연장에서 처음 만났을 숫자다.
---
config:
themeVariables:
xyChart:
plotColorPalette: "#2a78d6"
---
xychart-beta
title "판정 왕복 (초), 게이트 5초"
x-axis ["온라인", "오프라인 전환 직후", "언로드 절차 적용"]
y-axis "왕복 (초)" 0 --> 25
bar [3.05, 22, 3.8]
| 구간 | 판정 왕복 | 무슨 일이 있었나 |
|---|---|---|
| 온라인 | 3.05s | 2-Call 판정 실전 왕복 |
| 오프라인 전환 직후 | 22s | 리포트 모델이 GPU에 상주한 채 전환 — 8/29 폴백 훈련에서 발견 |
| 언로드 절차 적용 | 3.8s | 전환 절차에 리포트 모델 언로드 추가 → 게이트 복귀 |
완주를 반복하며 잡아 고친 결함은 6건이다. 라운드를 거듭할수록 남는 것이 줄어 3차에서 0이 됐다.
| 결함 | 유형 |
|---|---|
| 백엔드 테스트 회귀 4건 | 회귀 |
| 시드 대사가 DB와 미동기화 | 데이터 |
| 스탯 persist 회귀 | 회귀 |
| 안내 문구 해요체 미통일 | 문구 |
| 계산기 버튼 잘림 | UI |
| 계정 간 스냅샷 유출 | 보안 |
기능별 평가가 각 부품의 게이트를 지킨다면, 리허설은 부품을 다 끼운 뒤에야 드러나는 것들을 잡는다. 이번에 나온 6건 중 절반은 단위 평가로는 보이지 않는 종류였다 — 시드 데이터 동기화, 계정 간 세션 격리, 화면 잘림.
작동 방식: 평가를 돌릴 때 _data/metrics.yml의 해당 셀 history에 한 줄을 추가하면, 이 페이지의 타일·매트릭스·차트가 전부 자동으로 갱신된다.