지난 글에서 PokéClip의 v3 아키텍처를 소개했다. 영상(YOLO)·음성(Whisper)·채팅 세 신호를 병렬로 분석하고, 둘 이상이 임계치를 넘으면 하이라이트로 판정하는 "E 하이브리드" 구조였다.

그 구조를 통째로 갈아엎었다. 이 글은 왜 갈아엎었는지, 어떤 고민을 거쳐서 어디에 도착했는지의 기록이다.


문제: 전 구간을 GPU에 넣는 구조

v3의 문제는 심사 피드백을 받고서야 또렷해졌다. 3신호 병렬 구조는 방송 전체를 영상·음성 분석에 넣어야 한다. 6~8시간짜리 방송이면 GPU가 6~8시간어치를 씹어야 한다는 뜻이다. "전처리로 후보 구간을 추리고 대표 화면만 분석해서 연산 비용을 줄이는 방식을 고려하라"는 지적을 받았고, 맞는 말이었다.

그런데 그 즈음 우리는 다른 걸 하나 발견한 상태였다. 세 신호 중에 채팅이 제일 정확하다는 것.

실험: 채팅 18,112건을 뜯어봤다

MSI T1 경기의 치지직 채팅을 수집해서 분석했다. 2세션 65분, 18,112건, 평균 동접 6.8~7.1만. 우리가 LoL e스포츠의 주 소비층이라 어디가 하이라이트인지는 몸으로 안다 — 경기를 실시간으로 보면서 실제 하이라이트에서 채팅이 튀는지 관찰했다.

실제 채팅 로그 — 5초 단위 채팅량 (LCK T1 vs TSD, 2세션 18,112건)

세 가지가 확인됐다.

  1. 채팅 치는 사람은 생각보다 훨씬 적다. 동접 대비 고유 채터 비율이 2.3~2.9%였다. 7만 명이 봐도 채팅 치는 건 2천 명 남짓.
  2. 진짜 큰 장면에서만 잠수 시청자가 깨어난다. 평소 채팅을 안 치던 사람(세션 5회 미만)의 비중이 평상시 24~30%인데, 최상위 피크에서는 37~47%까지 올라갔다. 작은 스파이크에서는 16~22%에 그쳤다. 스파이크 크기와 잠수 활성화가 비례한다 — "초하이라이트"와 "일반 하이라이트"를 나눌 수 있는 실측 근거다.
  3. 초하이라이트만으로는 롱폼을 못 만든다. 확실한 폭발 구간을 다 합쳐도 65분 중 4.7분. 하이라이트 영상이 보통 10~15분인 걸 생각하면 턱없이 부족하다.

재밌었던 건, 내가 "이 정도면 하이라이트 아닌가?" 싶었는데 채팅이 안 튄 구간이 있었다는 점이다. 처음엔 감지 실패인가 했는데, 뒤집어 생각하면 이게 핵심이었다 — 내 취향과 대중의 반응은 다르다. 그래서 우리는 하이라이트의 기준을 개인의 감이 아니라 시청자 반응으로 정의하기로 했다.

전환: 채팅 우선 캐스케이드

세 신호를 대등하게 놓고 투표시키는 대신, 제일 정확한 신호를 게이트로 세웠다.

  • 티어 1: 채팅 폭발 → 영상·음성 안 보고 즉시 하이라이트 확정. 시청자가 이미 투표를 끝낸 순간이다.
  • 티어 2: 채팅 상위 20~25% 구간만 → 영상+음성 분석이 "넣을 가치"를 판정.
  • 그 밖 → 분석 안 함.
캐스케이드 적용 후 GPU 분석 대상 비중 (65분 방송 기준)

이러면 GPU가 볼 분량이 방송 전체의 20~25%로 준다. 심사가 지적한 비용 문제에 대한 답이면서, 실험이 시킨 설계이기도 하다.

여기서 티어 2의 역할 정의가 중요하다. 티어 2는 "채팅이 놓친 하이라이트를 찾는 장치"가 아니다 — 채팅의 recall은 우리 도메인에서 사실상 완벽하다. 티어 2는 롱폼 분량을 공급하는 장치다. 초하이라이트 4.7분에 일반 하이라이트를 더해 10~15분을 채우는 건데, "치던 사람만 치는" 구간은 채팅만으로 서열화가 안 되니까 영상·음성이 판정하는 거다.

고찰 1: 기준선은 평균이 아니라 중앙값

캐스케이드의 트리거는 "평소 대비 몇 배 튀었나"라는 배율이다. 그럼 "평소"를 뭘로 잡느냐가 문제가 되는데, 여기서 팀 내 논쟁이 하나 있었다. 펜타킬이 터지고 1분 뒤에 트리플킬이 터지면?

숫자로 굴려보면 이렇다. 평소 5초당 12개, 펜타킬이 40초간 60~100개로 폭발했다고 하자.

  • 평균 기준선: 폭발 빈들이 평균을 12 → 31로 끌어올린다. 트리플킬이 45개를 만들어도 45÷31 = 1.45배. 폭발 판정 실패. 하이라이트를 놓친다.
  • 중앙값 기준선: 24개 빈을 줄 세우면 가운데는 여전히 평상 빈이다. 기준선 12 유지, 45÷12 = 3.75배. 정상 확정.
평균 vs 중앙값 기준선 — 트리플킬 배율 판정 결과

중앙값은 크기가 아니라 순서상 가운데 자리만 보기 때문에, 폭발이 몇 개 끼어도 안 끌려간다. 연속 하이라이트가 밥 먹듯 나오는 게임 방송에서 이건 취향 문제가 아니라 정확도 문제였다.

고찰 2: "평균 이상" 게이트의 함정

티어 2 게이트를 처음엔 "채팅량이 평균/중앙값 이상인 구간"으로 잡으려 했다. 실측을 돌려보니 함정이 있었다 — 중앙값 초과 구간은 정의상 방송의 절반이다. 실제로 49~50%가 나왔다. 평균 초과도 29~36%. 이러면 방송의 3분의 1에서 절반이 GPU로 가서 비용 절감이 유명무실해진다.

게이트 기준별 GPU 분석 대상 비중 (실측)

그래서 게이트를 고정 통계량이 아니라 백분위 노브로 바꿨다. 최종 클립 10~15분에서 역산하면 — 영상·음성 판정에서 탈락할 분량을 1.5~2배수로 감안 — 상위 20~25%가 스위트스팟이다. 실측에서 상위 15~20%가 9.6~12.9분이었으니 딱 들어맞는다.

같은 맥락에서 하한선도 하나 붙였다. 배율 트리거는 분모가 작을 때 착시를 만든다 — 새벽에 채팅이 5초당 1개 오다가 우연히 3명이 동시에 치면 "3배!"가 된다. 그래서 배율 조건에 "최소 세션 중앙값의 0.5~1배 이상"이라는 절대량 조건을 AND로 걸었다. 진짜 반응은 절대량도 같이 오르니까 다 통과하고, 숫자 장난만 걸러진다.

고찰 3: "정확도 100%"라고 쓰면 안 되는 이유

실험 직후엔 "채팅 기반 판별은 100% 정확하다"고 말하고 싶었다. 근데 이 문장은 두 개의 다른 주장을 뭉개고 있다.

  • "폭발한 순간을 놓치지 않는다" (recall) — 이건 우리 도메인에서 사실상 참이다. 주장해도 된다.
  • "폭발한 게 전부 편집 가치가 있다" (precision) — 이건 거짓이다. 유도된 폭발, 투표, 그리고 결정적으로 방송사고 — 채팅은 제일 크게 터지지만 편집자는 절대 클립하지 않는 순간들이 있다.

그래서 내부 문구를 이렇게 확정했다: "채팅은 recall 게이트다. precision은 편집자 판단과 거짓 양성 KPI가 담당한다." 100%라는 표현은 반례 하나에 무너지지만, 이 분리는 공격할 데가 없다.

고찰 4: 캐스케이드가 만든 선택지 — YOLO를 버리다

여기가 이번 개편에서 제일 마음에 드는 부분이다. 캐스케이드는 비용을 줄였는데, 그 절감분이 새로운 선택지를 열었다.

v3의 영상 분석은 게임별 YOLO 모델이었다. 게임 3종 × 이벤트 5종 × 1,000프레임 = 15,000프레임을 손으로 라벨링하고 게임마다 재학습해야 한다. 게임을 하나 추가할 때마다 이 비용이 반복된다.

VLM(Qwen-VL 계열)은 zero-shot으로 게임 화면을 이해한다. 라벨링이 필요 없고, 신규 게임 추가가 프롬프트 작업 수준이 된다. 문제는 프레임당 추론 비용이 YOLO보다 훨씬 크다는 것 — 그런데 캐스케이드가 분석 분량을 1/4~1/5로 줄여놨다. 전 구간을 분석하는 v3 구조에서는 비용상 불가능했던 VLM이, 캐스케이드 구조에서는 총비용 관점에서 성립한다.

두 결정은 한 세트다. 캐스케이드 없이는 VLM이 비용상 성립하지 않고, VLM 없이는 캐스케이드의 절감분이 품질로 전환되지 않는다.

구조는 이렇게 정리했다:

[베이스 모델: Qwen-VL 1개]   ← 모든 게임 공유, 고정
        │
[게임별 어댑터 (LoRA*)]       ← 성능 미달 게임에만 붙는 보정 레이어 (조건부)
        │
[게임별 이벤트 팩]            ← 프롬프트·이벤트 정의·사운드 패턴·임계치

*LoRA는 베이스 모델 전체를 재학습하지 않고 작은 저랭크 행렬만 학습해 붙이는 경량 파인튜닝 기법이다. 원본 모델은 고정한 채 게임별 보정만 갈아끼울 수 있다.

지원 게임(LoL·발로란트·오버워치·배그)마다 팩을 만들고, 학습은 조건부다. 대회 풀영상과 공식 하이라이트 편집본을 정렬하면 라벨이 공짜로 나오는데, 이걸 학습 데이터가 아니라 채점표로 먼저 쓴다. zero-shot이 채점표를 통과한 게임은 학습하지 않는다 — 관전 시점인 대회 영상에 과적합하면 1인칭 개인 방송에서 오히려 성능이 떨어질 수 있어서다. 미달한 게임만 어댑터를 붙인다.

배운 것

  1. 실험 하나가 아키텍처를 바꾼다. 채팅 18,112건 분석에 든 시간은 하루였는데, 그 하루가 병렬 구조를 캐스케이드로 뒤집었다. "주장"과 "실측"의 무게 차이를 체감했다.
  2. 통계량 선택이 기능이다. 평균이냐 중앙값이냐는 사소해 보이지만, 연속 하이라이트를 잡느냐 놓치느냐를 가른다. 알고리즘보다 기준선이 먼저다.
  3. 비용 최적화는 절약이 아니라 재투자다. 캐스케이드로 아낀 GPU가 더 좋은 모델(VLM)을 살 수 있게 했다. 최적화의 가치는 아낀 금액이 아니라 열리는 선택지에 있다.
  4. 단정적인 문장은 분해해서 검증하라. "100% 정확"을 recall과 precision으로 쪼개니, 지킬 수 있는 주장과 관리해야 할 지표가 분리됐다.

다음 글은 아마 Qwen-VL 벤치마크 결과가 될 것 같다. 대회 영상 정렬 데이터셋으로 4종 게임 zero-shot 채점을 돌려보고, 어댑터가 몇 개 필요한지 확인하는 것까지.