# 씬 세그먼테이션 v2 — 사전 정규식 + Gemini 분할

## 날짜: 2026-03-18

## 변경 요약

기존 방식(Gemini가 씬 목록을 직접 생성)에서 **정규식 사전 세그먼테이션 + Gemini 긴 씬 분할** 방식으로 변경.

## 기존 문제

- Turn 1에서 Gemini가 씬을 리스팅하면 일관성 없음 (실행마다 씬 수 변동)
- 씬 상세 분석 시 씬 텍스트를 직접 제공하지 않아 T2I 프롬프트 품질 불안정
- 37씬 중 8개가 빈 T2I로 생성됨 (Gemini가 씬을 놓침)

## 새 방식 (3단계)

### 1단계: 정규식 세그먼테이션
- `INT.`/`EXT.` 헤딩을 정규식으로 탐지
- 결정론적: 항상 동일한 결과
- EP1 기준: 37개 씬 감지

### 2단계: Gemini 긴 씬 분할
- 800자 이상 씬을 Gemini flash-lite에 보내 논리적 2분할 요청
- 분할점은 원문에서 정확히 찾을 수 있는 줄이어야 함
- 원문 매칭 실패 시 원본 유지 (안전)
- EP1 기준: 18개 분할 → 37→55씬

### 3단계: 멀티턴 상세 분석
- Turn 0: 컨텍스트 (스타일 + 요소 + 시나리오 전문)
- Turn 1~N: 각 씬 **텍스트를 직접 제공**하여 상세 분석
- Gemini가 원문을 직접 보므로 T2I 프롬프트 품질 대폭 향상

## 테스트 결과 (EP1)

| 항목 | 기존 | 변경 후 |
|------|------|---------|
| 총 씬 수 | 37 | 55 |
| T2I 빈 씬 | 8개 | **0개** |
| 평균 씬 길이 | 831자 | 557자 |
| 성공률 | 78% (29/37) | **100% (55/55)** |

## 파일 변경

- `backend/app/modules/pipeline/scene_extractor_v2.py` — 전면 재작성
- `backend/app/core/config.py` — `gemini_lite_model` 설정 추가
- `prompts/_base/scene_extractor_v2/2.202603181500/` — 새 프롬프트 버전
  - `system.md` — 기존과 동일
  - `turn0_context.md` — 기존과 동일
  - `turn1_split_long.md` — 긴 씬 분할 프롬프트 (신규)
  - `turn_scene_detail.md` — 씬 텍스트 직접 포함 (변경)
- `backend/app/services/analysis_service.py` — 변경 없음 (인터페이스 동일)

## 설정

```
LONG_SCENE_THRESHOLD = 800  # 분할 대상 최소 글자수
gemini_lite_model = "gemini-3.1-flash-lite-preview"  # 분할용 경량 모델
```
