숏폼 파이프라인엔 자기개선 루프가 있습니다: 게시된 영상의 조회·완주·참여를 보상으로 환산해, 다음 로테이션의 앱 순서와 카테고리 가중치, 유지곡선 힌트를 자동으로 조정합니다. 잘 도는 줄 알았습니다.
노이즈를 신호로 착각
게이트 발화 조건이 "점수 파일이 존재하는가"였습니다. 그래서 조회 두 자릿수짜리 앱의 점수도 그대로 순위에 반영됐습니다. 조회 12번짜리 영상이 우연히 완주율이 높으면, 루프는 그 앱을 "잘 되는 앱"으로 보고 순서 1위로 올려 더 밀어줍니다. 실제로 한국어 app_perf에서 조회 30 미만인 ddi가 1위를 먹고 있었고, zodiac도 마찬가지였습니다.
이건 개선이 아니라 과적합입니다. 표본이 작을수록 분산이 크고, 루프는 그 분산을 실력으로 오해합니다. OOS 샤프로 전략을 죽인 이야기와 같은 병입니다 — 표본 밖에서 검증하지 않으면 우연을 강화하게 됩니다.
해결: 최소 표본이라는 브레이크
MIN_APP_VIEWS = 30 문턱을 걸었습니다. 수명 조회가 이 미만인 앱은 순서 점수로 채택하지 않고 탐색 꼬리로 강등합니다 — 버리는 게 아니라 "아직 판단 보류, 계속 노출해 표본을 모으는" 자리로 보냅니다.
문턱 로직은 순수 헬퍼 _qualified(buckets, vsum, min) 하나로 만들어 세 생산자(순서·카테고리·유지곡선)가 공유합니다. 게이트 발화도 "파일 존재"에서 "표본 통과 점수 존재(_has_scores)"로 바꿔 정직화했습니다. 적용하니 ddi·zodiac이 순위에서 내려갔습니다.
솔직한 부분
자동 되먹임 루프의 가장 위험한 실패는 멈추는 게 아니라 틀린 방향으로 자신 있게 도는 것입니다. 표본 문턱이 없으면 루프는 우연을 학습하고, 우연을 강화하고, 그걸 데이터라 부릅니다. 통계적 유의성은 대시보드가 대신 판단해 주지 않습니다 — 파이프라인 안에, 코드로, "이 숫자를 믿어도 되는 최소 표본"을 명시해야 합니다. n이 작으면 그건 성과가 아니라 소음입니다.