[3편] 추론 파라미터 조합 Qwen3-Omni 6초 클립 분석 (최적 구성 확정)
1. 들어가며
SceneMaker 의 6초 클립 분석은 시청각 정보를 {summary, ocr, actions, sounds} 4필드 JSON 으로 안정적으로 생성 하는 것을 목표로 한다. 2편(OFAT 스윕)은 추론 파라미터를 한 번에 하나씩 흔들어, 출력만으로 판정 가능한 순응(adherence) 기준에서 각 축의 단독 효과를 규명했다.
2편이 객관적으로 좁힌 결과는 다음과 같다.
| 파라미터 | 2편 결론 |
|---|---|
| temperature | 0.7 확정 (greedy 폭주·1.0 이종문자 동시 회피) |
| top_p / top_k | 1.0 / -1 유지 · top_k 10 완주 후보 |
| frequency penalty | 0~0.5 구간 (완주·반복 개선, 단 sounds 감소) |
| repetition penalty | 제외 (이종문자 유발) |
OFAT 는 한 축만 본다. 그러나 실제 운영값은 여러 축을 동시에 적용한다. 본 편은 2편이 좁힌 후보들을 조합 해, 단독 효과가 겹칠 때의 거동을 확인하고 최적 구성을 확정한다.
단, 프롬프트와 샘플링을 동시에 바꾸면 효과가 교란 된다. 그래서 한 번에 하나씩, 두 단계로 분리 한다.
- 샘플링 조합 : 2편과 같은 프롬프트 를 고정하고 샘플링 파라미터만 조합해 최선 샘플링을 찾는다.
- 프롬프트 조합 : 1단계 최선 샘플링 위에 프롬프트를 손봐 최종 구성을 확정한다.
조합 평가는 2편과 동일하게 출력만으로 판정 가능한 축 으로 한다. 완주율·degeneration(이종문자·미완·반복)·커버리지·추론 비용.
2. 실험 설계
2.1. 두 단계 구성
| 단계 | 고정 | 변동 | 목적 |
|---|---|---|---|
| 1단계(샘플링 조합) | 2편 프롬프트 · temp 0.7 · top_p 1.0 · rep off · fps 0.5 | frequency penalty {0, 0.3, 0.5} × top_k {-1, 10} | 최선 샘플링 도출 |
| 2단계( 프롬프트 조합) | 1단계 최적 샘플링 | 프롬프트 (구조·개수 한도 등) | 최종 구성 확정 |
공통 고정: max_tokens 512 · 오디오 on · 동일 70클립(7장르 × 10) · 4필드 strict 스키마.
2.2. 출력 스키마 (4필드)
응답은 정확히 {summary, ocr, actions, sounds} 필드로 고정한다 (vLLM response_format=json_schema(strict) + pydantic extra="forbid" 이중 강제).
| 필드 | 정의 |
|---|---|
summary (string) | 시각·청각을 종합한 한국어 한 문장 요약 |
ocr (array) | 화면 텍스트 (자막·로고) |
actions (array) | 행동·움직임·장면 전환 |
sounds (array) | 대사를 제외한 배경음·효과음 |
2.3. 측정 지표
2편과 동일한 출력 기반 지표로 평가한다.
| 지표 | 정의 |
|---|---|
ok / fail | 스키마 통과 / 실패 레코드 수 (완주율) |
infer_ms | 클립당 추론 시간 (비용·20분 예산) |
penalty | (repeat + finish_length + foreign + replacement ) ÷ 4 |
field | (summary + ocr + actions + sounds ) ÷ 4 |
3. 샘플링 조합
3.0. 테스트 데이터 및 실행
표본·프롬프트·준비 절차 모두 2편과 동일 하다. 7장르 × 카테고리당 10클립 = 고정 70클립(make_sample.py 가 원본 mp4 를 재인코딩 없이 symlink 로만 data/sample70/ 에 모은다), 프롬프트는 2편 것을 그대로 쓴다. 6 조합 모두 같은 입력을 본다.
실행은 experiments/03_param_combo/ 에서 bash sweep.sh 3 (6 조합 C1~C6 × 3회차 누적 → N=3) 후 python analyze.py (회차평균 표 집계) 한 줄로 돌린다. sweep_out/ 다음 회차는 자동 누적.
3.1. 조합
2편이 객관적으로 좁힌 값만 교차한다 (frequency 0~0.5 구간, top_k -1/10). frequency penalty 3수준 × top_k 2수준 = 6 조합.
| top_k -1 | top_k 10 | |
|---|---|---|
| freq 0 | C1 (2편 baseline) | C4 |
| freq 0.3 | C2 | C5 |
| freq 0.5 | C3 | C6 |
3.2. 결과
6 조합 회차 평균(N=3 · 각 조합 70클립). 2편과 같은 프롬프트·표본에서 freq 가 완주 레버 임을 재현. freq 0→0.3 에서 완주 90.5→99.5%, finish_length 9.5→0.5%. 1단계 최선 = C2 (freq 0.3 · top_k -1) .
| 조합 | freq | top_k | 완주(ok) | infer_ms | penalty | field |
|---|---|---|---|---|---|---|
| C1 | 0 | -1 | 90.5% | 2719 | 6.2% | 95.6% |
| C2 (최선) | 0.3 | -1 | 99.5% | 2080 | 3.2% | 93.7% |
| C3 | 0.5 | -1 | 99.0% | 1936 | 2.6% | 90.6% |
| C4 | 0 | 10 | 89.5% | 2695 | 8.0% | 94.9% |
| C5 | 0.3 | 10 | 100% | 2022 | 2.7% | 93.3% |
| C6 | 0.5 | 10 | 100% | 1966 | 2.9% | 91.8% |
📊 회차별 히스토리 (N=3 · 조합별 1·2·3회)
| 회차 | 조합 | ok/fail | infer_ms | repeat | finish_len | foreign | penalty | field |
|---|---|---|---|---|---|---|---|---|
| 1 | C1 (f0·k-1) | 65/5 | 2743 | 20.0% | 7.1% | 1.4% | 7.1% | 94.6% |
| 2 | C1 (f0·k-1) | 64/6 | 2528 | 12.9% | 8.6% | 0.0% | 5.4% | 94.9% |
| 3 | C1 (f0·k-1) | 61/9 | 2887 | 11.4% | 12.9% | 0.0% | 6.1% | 97.1% |
| 1 | C2 (f0.3·k-1) | 69/1 | 2110 | 14.3% | 1.4% | 1.4% | 4.3% | 93.1% |
| 2 | C2 (f0.3·k-1) | 70/0 | 2110 | 8.6% | 0.0% | 1.4% | 2.5% | 94.7% |
| 3 | C2 (f0.3·k-1) | 70/0 | 2021 | 11.4% | 0.0% | 0.0% | 2.9% | 93.2% |
| 1 | C3 (f0.5·k-1) | 69/1 | 1986 | 5.7% | 1.4% | 0.0% | 1.8% | 91.0% |
| 2 | C3 (f0.5·k-1) | 70/0 | 1889 | 11.4% | 0.0% | 0.0% | 2.9% | 90.0% |
| 3 | C3 (f0.5·k-1) | 69/1 | 1932 | 11.4% | 1.4% | 0.0% | 3.2% | 91.0% |
| 1 | C4 (f0·k10) | 61/9 | 2721 | 18.6% | 12.9% | 0.0% | 7.9% | 94.2% |
| 2 | C4 (f0·k10) | 66/4 | 2539 | 15.7% | 5.7% | 0.0% | 5.3% | 95.5% |
| 3 | C4 (f0·k10) | 61/9 | 2825 | 27.1% | 12.9% | 2.9% | 10.7% | 95.1% |
| 1 | C5 (f0.3·k10) | 70/0 | 2053 | 12.9% | 0.0% | 1.4% | 3.6% | 93.2% |
| 2 | C5 (f0.3·k10) | 70/0 | 2075 | 7.1% | 0.0% | 0.0% | 1.8% | 93.2% |
| 3 | C5 (f0.3·k10) | 70/0 | 1938 | 11.4% | 0.0% | 0.0% | 2.9% | 93.6% |
| 1 | C6 (f0.5·k10) | 70/0 | 1929 | 8.6% | 0.0% | 0.0% | 2.1% | 91.0% |
| 2 | C6 (f0.5·k10) | 70/0 | 1959 | 12.9% | 0.0% | 0.0% | 3.2% | 93.2% |
| 3 | C6 (f0.5·k10) | 70/0 | 2009 | 11.4% | 0.0% | 1.4% | 3.2% | 91.1% |
3.3. 분석
1. frequency 가 완주 레버
freq 0→0.3 에서 완주 90.5→99.5%, finish_length 9.5→0.5%, penalty 6.2→3.2%. 2편의 단일축 결론이 같은 프롬프트·표본에서 그대로 확인됐다. top_k 10 단독(C4)은 완주를 못 살린다(89.5%). 완주는 freq 의 몫이다.
2. top_k 는 무승부
freq≥0.3 에서 top_k -1 vs 10 차이(C2 vs C5)는 완주 99.5 vs 100%(1클립)·penalty 뒤섞임·커버리지 동일로 전부 회차 jitter 범위다. 기본값 -1 유지 .
3. 필드 커버리지 유일하게 일관된 trade, 판정 불가
freq 를 올리면 커버리지가 단조 감소한다(95.6→93.7→90.6%, 매 회차 재현). 이 감소가 잉여 제거(좋음)인지 정보 삭제(나쁨)인지는 정답지 없이 가릴 수 없다.
샘플링 조합 결론
완주·penalty 가 포화된 freq≥0.3 구간에서 조합을 가르는 건 필커버리지뿐이고, freq 0.3 이 0.5 보다 일관되게 우세하다. 1단계 최선은 temp 0.7 · frequency 0.3 · top_p 1.0 · top_k -1 · rep off 이며, 이 위에서 다음 프롬프트 조합을 진행한다.
4. 프롬프트 조합
4.0. 데이터 및 실행
1단계 최선 샘플링(temp 0.7 · freq 0.3 · top_p 1.0 · top_k -1 · rep off)을 고정 하고 프롬프트만 조정한다. 데이터·회차는 1단계와 동일(고정 70클립 · N=3). 실행은 bash sweep_p2.sh 3 (두 프롬프트 × 3회차) 후 python analyze_p2.py . 비용은 서버 부하에 흔들리는 infer_ms 외에 생성 토큰 수(completion_tokens) 를 불변 비용축으로 함께 잰다.
두 프롬프트(arm):
- 망라형 : 1단계와 같은 프롬프트. "정밀하게 분석", 개수 한도 없음.
- 핵심우선 : "핵심만 압축", 개수 한도(ocr 5 · actions 5 · sounds 3), 조각 결합 규칙, 동사구 강제, 확정 사실만(추측 금지).
4.1. 왜 프롬프트를 건드리는가. 망라형 출력의 구조적 잡음
1단계에서 완주·degeneration·비용은 샘플링 파라미터로 안정화됐다. 그러나 같은 출력의 내용 을 들여다보면, 망라형 프롬프트는 샘플링으로는 못 고치는 잡음을 남긴다.
| 망라형 결함 | 데이터 근거 | 핵심우선이 거는 규칙 |
|---|---|---|
| OCR 과다·조각화 | ocr 평균 5.0항목, 최대 28항목, ≥8항목 20.6%, 조각(빈문자열·단일 숫자 등) 18.0% | 조각 결합 규칙 + 개수 한도 5 |
| actions 문장화 | 동사구 아닌 문장체 12.9% | 동사구(1~5단어) 강제 · 문장 금지 |
| 약한 중복(padding) | 한 항목이 다른 항목의 부분문자열인 클립 18.2% | 핵심만·과감히 생략 + 개수 한도 |
대표 사례로 한 e스포츠 클립은 ocr 을 28항목까지 긁어 HUD 숫자·경기 시계·KDA 조각(GEN , 1 , 25.7K , 4:53 , 4:52 , 4:51 …)을 통째로 나열했다. 이는 샘플링 축(완주·degen)이 아니라 프롬프트 차원의 문제 다. → 핵심우선 프롬프트가 이 잡음을 억제하는지 동일 샘플링(C2) 위에서 검증한다.
4.2. 결과
동일 샘플링 C2 고정, 프롬프트만 변인 (N=3 평균 · arm별 70클립). 완주는 동률, 비용·반복잡음은 핵심우선이 우위, 필드 커버리지는 설계상 좁아진다.
| arm | 완주율 | penalty | 생성토큰 | infer_ms | 필드 커버리지 |
|---|---|---|---|---|---|
| 망라형 | 99.5% | 3.7% | 141 | 2058 | 93.8% |
| 핵심우선 (최종) | 100% | 0.8% | 103 | 1662 | 82.1% |
degeneration 상세 분석, penalty 를 가르는 건 거의 repeat 한 축이다.
| arm | repeat | finish_length | foreign |
|---|---|---|---|
| 망라형 | 13.3% | 0.5% | 1.0% |
| 핵심우선 | 1.4% | 0.0% | 1.9% |
필드별 커버리지, 핵심 우선의 개수 한도·"의심시 비움"이 만든 by-design 차이.
| arm | ocr | actions | sounds |
|---|---|---|---|
| 망라형 | 89.5% | 99.5% | 86.1% |
| 핵심우선 | 65.7% | 100% | 62.9% |
📊 회차별 히스토리 (N=3 · arm별 1·2·3회)
| 회차 | arm | 완주(ok/fail) | penalty | 생성토큰 | infer_ms | 커버리지 |
|---|---|---|---|---|---|---|
| 1 | 망라형 | 100% (70/0) | 5.00% | 135 | 1922 | 94.30% |
| 2 | 망라형 | 100% (70/0) | 2.90% | 141 | 2080 | 93.20% |
| 3 | 망라형 | 98.6% (69/1) | 3.20% | 147 | 2171 | 93.80% |
| 1 | 핵심우선 | 100% (70/0) | 0.40% | 102 | 1655 | 82.20% |
| 2 | 핵심우선 | 100% (70/0) | 1.40% | 105 | 1688 | 82.50% |
| 3 | 핵심우선 | 100% (70/0) | 0.70% | 103 | 1642 | 81.80% |
4.3. 분석
1. 완주는 동률
망라형 99.5% vs 핵심우선 100%, 1클립 차이로 jitter 범위다. 1단계에서 freq 0.3 이 이미 완주를 포화시켜, 프롬프트로는 더 가를 게 없다. 완주는 변별축이 아니다.
2. 비용은 핵심우선이 싸다
생성 토큰 141→103 (-27%), infer_ms 2058→1662 (-19%). "핵심만·개수 한도"가 출력 길이를 직접 줄인 결과로, 20분/영상 예산에 곧바로 유리하다. 비용이야말로 두 프롬프트의 실질 변별축이다.
3. degeneration 도 핵심우선 우위, 커버리지를 깎아서가 아니다
penalty 3.7→0.8%. 분해하면 거의 전부 repeat 한 축이며(13.3→1.4%), 회차별로도 일관(망라형 5.0/2.9/3.2 vs 핵심우선 0.4/1.4/0.7). 핵심우선의 이득은 정보를 덜 써서가 아니라 같은 말 반복·과다나열을 억제 한 데서 나온다.
5. 결론
5.1. 최적 구성 확정
두 단계를 종합한 6초 클립 분석 최종 구성:
| 항목 | 값 |
|---|---|
| temperature | 0.7 |
| frequency penalty | 0.3 |
| top_p | 1.0 |
| top_k | -1 (비활성) |
| repetition penalty | off (1.0) |
| 프롬프트 | 핵심우선 (개수 한도 · 조각 결합 규칙 · 동사구 · 확정 사실) |
| 공통 | fps 0.5 · max_tokens 512 · 오디오 on · 4필드 strict 스키마 |
5.2. 종합
- 1단계 : frequency 가 완주 레버다(2편 OFAT 재현). top_k 는 무승부, freq≥0.3 에서 완주·degen 이 포화. 최선 샘플링 = C2.
- 2단계 : 같은 샘플링에서 핵심우선 프롬프트가 비용(생성토큰 -27%)과 반복 잡음(repeat 13→1%)을 동시에 낮추고 완주는 동률. 커버리지만 설계상 좁아진다.
- 20분/영상 예산 : 핵심우선의 토큰 -27% 가 예산 여유를 직접 키운다(동시성·fps 상향 여력).
5.3. 한계와 남은 과제
- C2 샘플링은 망라형 기준 최적이라, 핵심우선 자체의 샘플링 최적과 다를 수 있다. 2단계는 프롬프트 효과만 분리하려고 샘플링을 의도적으로 고정했다.
- 좁아진 커버리지가 잉여 제거인지 정보 누락인지는 출력 측정만으로는 단정할 수 없다. 이 고리는 사람 품질 검증(§6)으로 닫는다.
6. 사람 품질 검증 (최종 구성)
최종 구성(핵심우선 프롬프트 + C2 샘플링) 출력을 사람이 직접 채점했다. §3·§4 의 출력 측정만으로는 못 닫은 고리, 좁아진 커버리지가 잉여 제거인지 정보 누락인지 — 를 사람 판단으로 확인한다. 대상은 1·2단계의 70클립 표본과 별개인 더 넓은 세트로, 6 카테고리 × 100클립 = 600클립. 필드별 -2~2 5점 척도로 매겼다.
| 점수 | 의미 |
|---|---|
| 2 | 정확 (거의 다 맞음) |
| 1 | 유사 (얼추 맞음 / 일부 누락) |
| 0 | 빈약 (핵심 정보 없음 / 거의 미출력) |
| -1 | 오정보 (실제와 다른 내용 출력) |
| -2 | 환각 (완전 오류 / 미존재 정보 출력) |
6.1. 카테고리별 평균
점수는 -2~2 척도. 맨 오른쪽 열·맨 아래 행은 0~1 로 정규화한 값((원점수+2)÷4).
| 카테고리 | summary | ocr | sound | action | 종합(0~1) |
|---|---|---|---|---|---|
| 야구 | 1.70 | 1.76 | 1.37 | 1.73 | 0.91 |
| 다큐 | 1.67 | 1.94 | 1.12 | 1.75 | 0.91 |
| 드라마 | 1.47 | 1.87 | 1.45 | 1.69 | 0.91 |
| 예능 | 1.74 | 1.65 | 1.68 | 1.81 | 0.93 |
| 사극 드라마 | 1.78 | 1.83 | 1.82 | 1.92 | 0.96 |
| 뉴스 | 1.82 | 2.00 | 1.93 | 1.97 | 0.98 |
| 필드 종합(0~1) | 0.92 | 0.96 | 0.89 | 0.95 | 0.93 |
6.2. 점수 분포
| 점수 | summary | ocr | sound | action | 평균 |
|---|---|---|---|---|---|
| 2 (정확) | 81.3% | 87.2% | 79.8% | 89.8% | 84.5% |
| 1 (유사) | 12.8% | 11.5% | 9.2% | 5.8% | 9.8% |
| 0 (빈약) | 0.8% | 0.2% | 1.3% | 0.5% | 0.7% |
| -1 (오정보) | 4.2% | 0.7% | 6.7% | 3.3% | 3.7% |
| -2 (환각) | 0.8% | 0.5% | 3.0% | 0.5% | 1.2% |
6.3. 결론
- 전체 정규화 품질 0.93 . 2점 비율 84.5% , 부정(-1·-2) 합계 4.9% .
- 핵심우선의 좁은 출력은 사람 기준 고품질 이다. 커버리지 축소는 대체로 잉여 제거 이며 정보 누락이 아니다(오정보·환각 비율이 5% 미만). 출력 측정만으로 못 가렸던 고리가 여기서 닫힌다.
- 필드별로는 ocr 가장 높고(0.96), sound 가장 낮다(0.89 · 부정 9.7%).비-발화 청각이 상대적 약점. 장르는 뉴스·사극이 최고(0.98·0.96), 드라마가 최저(0.91)다.