ELI5 · 쉬운 설명
ppi-issue-classifier — 신고 한 줄이
"어디서 × 무엇이" 상위 3개가 되기까지
마지막 업데이트 2026-09-23
"진행자 측에서 아동 소리 안 들림" 같은 신고 한 건과 그 수업의 로그 4종을 넣으면, 원인이 어디(아동·진행자·서버·네트워크)에서 무엇(마이크·권한·오디오…)인지 확률 순으로 3개를 냅니다. 데이터가 흘러가는 길을 그림 8장으로 설명합니다.
2026-09-23저장소 Dobraindev/ppi-issue-classifier (1cbd1ac)하루치 일괄 트리아지는 lesson-log-triage 계열
한 장 요약. 로그 수만 줄을 그대로 모델에 주지 않습니다. 코드가 먼저 세고, 줄이고, 단어로 바꾼 뒤 모델(TypeSafe Jev)에게는 "이건 마이크 문제야? 예/아니오 확률만 줘" 식의 짧은 질문 19개를 한 번에 던집니다. 둘을 합쳐 순위를 매깁니다.
그림 1전체 그림 — 왼쪽에서 오른쪽으로 한 번
다섯 단계. 파란 칸은 코드, 보라 칸은 모델, 초록 칸은 결과물입니다.
모델은 가운데 한 칸뿐입니다. 나머지는 전부 코드라 같은 입력이면 같은 결과가 나옵니다.
그림 2정리 — 네 가지 모양을 한 줄 모양으로
로그마다 생김새가 다릅니다. Grafana에서 받으면 한 번 더 포장돼 있기도 합니다. 포장을 벗기고 같은 모양으로 맞춥니다.
파일 확장자는 믿지 않습니다. 안을 열어 모양을 보고 판별하고, 애매하면 파일명(guest·monitor·아동·진행자…)을 봅니다.
그림 3압축 — 모델이 읽을 만큼만 남기기
Jev가 한 번에 읽는 양은 32k 토큰까지입니다. 게다가 상관없는 줄이 많을수록 틀립니다. 네 번 거릅니다.
③이 핵심입니다. Jev는 개수 세기와 시간 비교가 약해서 "25번"보다 "very many"를 더 정확히 읽습니다. 셈은 코드가 합니다.
이름 가리기. --child 홍길동으로 준 실명은 모델에 보내기 전에 <name>으로 바뀌고, 문서 제목·파일명에는 --label 아동070 같은 표시 이름만 씁니다. 이메일·전화번호·토큰도 자동으로 가립니다.
그림 4규칙 채점 — 이 줄은 무슨 문제의 흔적인가
로그 문구마다 "이 문구가 보이면 이 유형일 가능성이 이만큼"을 적어 둔 표(rules.json)가 있습니다. 약 40개.
🔒 권한
NotAllowedError · Permission denied
가중치 0.9
🎙️ 마이크
Failed to produce mic audio · 트랙 muted
가중치 0.85
🔇 오디오(수신)
Consumer suspected silent
22번 넘어야 만점
🌐 연결
Send transport failed · 외부 연결 경고 합계 5+
양쪽이면 네트워크
🎬 자동전환
영상 끝 → 다음 스텝 체인이 끊김 → 진행자 수동 전환
체인 판정 이식
🚪 입장
Guest force kicked
3번 넘어야 만점
왜 "몇 번 넘어야"가 있나. Guest force kicked는 이름은 무섭지만 정상 종료 때도 나옵니다(206세션 중 139세션). 이름만 보면 모든 수업이 이슈가 되므로, lesson-log-triage가 실측한 p99 횟수를 넘어야 만점을 줍니다.
그림 5두 축 — "어디서"와 "무엇이"를 따로 묻는다
결과는 4 × 11 격자의 한 칸입니다. 짙을수록 확률이 높습니다. 아래는 합성 예시 "아동 권한 거부 → 마이크 안 나감".
아동측
진행자측
서버
네트워크
권한
1위
마이크
2위
오디오(수신)
3위
카메라
연결
… 6개 더
유형 11개: 오디오(수신) · 볼륨·출력 · 마이크 · 카메라 · 권한 · 브라우저 · 연결 · 영상 재생 · 자동전환 · STT·전사 · 입장
신고한 쪽 ≠ 원인 쪽. "진행자 측에서 아동 소리 안 들림"을 신고한 사람은 진행자지만, 원인은 아동의 마이크 권한일 수 있습니다. 그래서 "누가 신고했나(reported_by)"와 "어디가 원인인가"를 분리해서 모델에 넘깁니다.
그림 6Jev에게 묻기 — 편지 한 통에 질문 19개
Jev는 글을 써 주는 모델이 아니라 정해진 보기 중 확률을 돌려주는 모델입니다. 한 요청에 질문을 여러 개 실으면 한꺼번에 평가합니다.
조각이 여러 개면 조각마다 요청을 동시에 보냅니다. 이것이 "병렬 분류"입니다. 과금은 입력 토큰만(100만 토큰당 $0.042), 답은 무료.
그림 7합치기 — 규칙과 모델을 섞어 순위를
규칙은 확실하지만 문구가 있어야만 잡고, 모델은 문구가 달라도 뜻을 읽습니다. 둘을 섞습니다.
0.35 / 0.65 비율은 첫 값입니다. 원인이 확정된 과거 이슈 30~50건으로 맞춰 볼 예정입니다.
그림 8결과물 — 터미널 한 화면 + ppi-docs 한 장
같은 결과를 두 가지로 남깁니다.
🖥️ 터미널
상위 3개 · 위치 분포 · 호출 시간·토큰
바로 보기
🧾 JSON
점수 전부 · 근거 신호 · 근거 줄 — 나중에 평가용
out/
📄 ppi-docs HTML
확률 막대 · 근거 로그 · 관련 기존 문서 자동 링크
--ppi-docs → issues/
지금어디까지 왔나 — 2026-09-23
4읽을 수 있는 로그 종류
4 × 11위치 × 유형
19요청당 질문
17테스트 통과
0실제 Jev 호출
0실제 로그로 검증
✅ 만든 것
정리 · 규칙 채점 · 압축 · Jev 클라이언트(재시도·캐시·동시 호출) · 합치기 · HTML
커밋 1cbd1ac
⏳ 기다리는 것
TypeSafe API 키 · 원인 확정된 이슈 1건의 실제 Grafana 로그 4개
다음 단계
🎯 그다음
과거 이슈 30~50건으로 정답률 측정 · 비율 보정 · 볼륨·권한·브라우저 문구 보강
평가
지금의 그림 속 숫자는 합성 로그와 가짜 응답으로 만든 예시입니다. 실제 정확도는 아직 모릅니다.