라스커
경력근거: 장시간의 원본 영상을 분석해 필요한 장면을 찾고, 불필요한 구간을 정리하며
※ 실제 산출물이 아닌 AI 예측 시안입니다.
라스커는 PREPIX 로 편집자의 반복적인 조연출 업무를 대신하고 있어서, 원본에서 반복을 걷어 내는 일이 곧 제품이 하는 일입니다. 접기 기준을 촬영본 길이와 구간 밀도에서 계산하는 방식은 장시간 원본을 다루는 라스커의 입력에서만 의미가 있고, 짧은 영상만 다루는 제품에서는 접을 것이 없습니다. 다만 이 포트폴리오는 구간 묶음 규칙과 화면을 보여줄 뿐, 영상 분석 모델 자체의 전문성은 주장하지 않습니다.
라스커는 편집자의 반복적인 조연출 업무를 대신하는 PREPIX 를 만들고 있습니다. 원본에서 불필요한 구간을 정리하는 것이 제품이 하는 일 자체입니다.
장시간의 원본 영상을 분석해 필요한 장면을 찾는 제품이라, 편집자가 넘겨봐야 할 분량을 줄이는 일이 첫 산출물로 자연스럽습니다.
2024년에 설립된 사원수 4명 규모라, 방어용 점검 도구보다 제품이 하는 일 자체를 먼저 만드는 편이 우선순위에 맞습니다.
PREPIX 가 쪼개 놓은 구간들을 서로 견줘, 같은 장면이 반복되는 것을 한 덩어리로 접어 편집자가 넘겨볼 분량을 줄여 주는 관리자 페이지입니다.
PREPIX 로 조연출 업무를 넘긴 영상 편집자입니다. 같은 장면이 몇 번씩 반복되는 원본을 처음부터 다 넘겨보다가, 한 벌만 보고 넘어가고 싶습니다.
원본을 훑는 데 하루가 가는 이유는 같은 장면을 다시 찍은 구간이 목록에 그대로 다 나와서입니다. 구간끼리 장면 지문을 견주면 첫 벌만 남기고 나머지를 접을 수 있습니다.
구간 분석 결과와 촬영본 정보를 올리면 구간 14개가 네 판정으로 나뉘어 덩어리로 접히고, 한 줄을 펼치면 어느 구간과 얼마나 겹쳤는지 보이는 관리자 페이지입니다. 장면 지문을 뽑는 영상 분석 자체는 PREPIX 가 이미 내준 값을 받는다고 가정하고 시작합니다.
편집자가 다시 펼친 덩어리 기록을 추가로 올려, 잘못 접은 덩어리를 판정별로 세어 보여줍니다.
접기 기준을 화면에서 올리고 내리면 덩어리 수가 즉시 다시 계산되고, 바꾸기 전후 분량이 나란히 뜹니다.
구간 분석 파일과 촬영본 정보를 올리면 구간 14개가 네 판정으로 나뉘어 덩어리로 접히고, 편집자가 한 줄을 펼쳐 겹친 정도와 접기 기준을 함께 읽습니다.
발화 비율이 비었거나 겹친 정도가 접기 기준과 정확히 같거나 촬영본 표기가 흔들린 구간을 섞은 입력 30종을 넣어도 출력 형식이 안 깨집니다.
촬영본 표기를 정리한 뒤 촬영본 정보에 붙는 구간 비율을 화면에 냅니다. 단, 정답과 데이터를 모두 작성자가 만든 합성 기준이라 성능 검증이 아니라 데모 조건에서의 동작입니다.
위 수치는 더미데이터 자가채점이며, 실제 접기 정확도는 라스커 실제 원본과 편집자가 되펼친 기록이 있어야 측정됩니다. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태까지 만듭니다.
수치는 합성 데이터 자가채점이라 성능 증명이 아닙니다. 면접에서는 데모가 도는 상태와 실검증 준비 상태로 솔직히 설명합니다.
정답을 작성자가 만들었으니 잘 맞는 것이 당연합니다. 그래서 발화 비율 결측, 접기 기준과 정확히 같은 경계, 촬영본 표기 흔들림을 더미에 일부러 섞었습니다.
접기 기준을 밀도에서 계산하는 계수 0.95 와 0.004 는 작성자가 정한 값입니다. 실제로는 편집자가 되펼친 기록을 모아 이 계수를 다시 잡아야 합니다.
같은 장면을 다시 찍었다고 뒤 테이크가 버릴 것은 아닙니다. 보통 마지막 테이크가 쓰이므로, 접는 것은 목록에서 접는 것이고 무엇을 남길지는 편집자가 펼쳐 정합니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
PREPIX 가 원본을 쪼개 내준 구간과 장면 지문입니다. 발화 비율 결측, 겹친 정도가 접기 기준과 정확히 같은 경계, 촬영본 표기 흔들림을 일부러 섞었습니다. clip_id 는 도구가 clip_id_raw 를 정리해 채우는 칸이라 비워 두었습니다.
| segment_key | clip_id_raw | start_ms | end_ms | scene_signature | speech_ratio |
|---|---|---|---|---|---|
| SEG-A-01 | CLIP-A | 0 | 300,000 | a1b2c3d4e5f60718 | 0.55 |
| SEG-A-02 | CLIP-A | 300,000 | 600,000 | a1b2c3d4e5f60718 | 0.58 |
| SEG-A-03 | CLIP-A | 4,000,000 | 4,300,000 | a1b2c3d4e5f6071f | 0.6 |
| SEG-A-04 | CLIP-A | 4,300,000 | 4,600,000 | 9f8e7d6c5b4a3928 | 0.52 |
| SEG-A-05 | clip-a | 8,000,000 | 8,300,000 | a1b2c3d4e5f6ffff | 0.2 |
다음 JSON Schema 에 맞는 구간 행을 더 만듭니다. {"type":"object","properties":{"segment_key":{"type":"string"},"clip_id_raw":{"type":"string"},"clip_id":{"type":["string","null"]},"start_ms":{"type":"integer"},"end_ms":{"type":"integer"},"scene_signature":{"type":"string"},"speech_ratio":{"type":["number","null"]}},"required":["segment_key","clip_id_raw","start_ms","end_ms","scene_signature"]} 쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라. 발화 분석이 실패해 speech_ratio 가 null 인 행 1~2건, 장면 지문이 앞선 구간과 겹치는 정도가 그 촬영본의 접기 기준과 정확히 같아지는 경계 행 1건, clip_id_raw 에 소문자나 앞뒤 공백이 섞여 정리가 필요한 행 1~2건. scene_signature 는 16자리로 쓰고, 같은 장면을 다시 찍은 구간끼리는 자리 대부분이 같게, 다른 장면끼리는 거의 다르게 만든다. 그리고 start_ms 에 문자열을 넣거나 scene_signature 를 비우는 형식 깨뜨리기 시도 3건을 따로 낸다. segment_key 는 행마다 다른 값으로 쓴다.{"type":"object","properties":{"segment_key":{"type":"string"},"clip_id_raw":{"type":"string"},"clip_id":{"type":["string","null"]},"start_ms":{"type":"integer"},"end_ms":{"type":"integer"},"scene_signature":{"type":"string"},"speech_ratio":{"type":["number","null"]}},"required":["segment_key","clip_id_raw","start_ms","end_ms","scene_signature"]}원본 촬영본 정보입니다. 접기 기준을 여기 담긴 길이와 구간 수에서 계산하므로, 촬영본마다 접히는 정도가 달라집니다.
| clip_id | duration_ms | frame_rate | segment_count |
|---|---|---|---|
| CLIP-A | 21,600,000 | 30 | 214 |
| CLIP-B | 3,600,000 | 30 | 40 |
| CLIP-C | 7,200,000 | 24 | 30 |
| CLIP-D | 1,800,000 | 30 | 12 |
| CLIP-E | 18,000,000 | 30 | 190 |
다음 JSON Schema 에 맞는 촬영본 행을 더 만듭니다. {"type":"object","properties":{"clip_id":{"type":"string"},"duration_ms":{"type":"integer"},"frame_rate":{"type":"integer"},"segment_count":{"type":"integer"}},"required":["clip_id","duration_ms","frame_rate","segment_count"]} 쉬운 데이터만 만들지 말 것. 촬영본마다 시간당 구간 밀도가 실제로 갈리게 만든다. 길게 찍고 잘게 쪼갠 촬영본은 밀도를 40 가까이, 짧게 찍고 크게 나눈 촬영본은 15 아래로 둔다. 밀도가 갈려야 접기 기준도 촬영본마다 달라진다. 그리고 duration_ms 에 문자열을 넣거나 clip_id 를 비우는 형식 깨뜨리기 시도 3건을 따로 낸다.{"type":"object","properties":{"clip_id":{"type":"string"},"duration_ms":{"type":"integer"},"frame_rate":{"type":"integer"},"segment_count":{"type":"integer"}},"required":["clip_id","duration_ms","frame_rate","segment_count"]}| TypeScript | 구간 묶음 규칙과 화면을 한 언어로 쓰고, 판정 결과 형식을 타입으로 고정합니다. |
| React | 덩어리 목록을 접힌 채로 그리고, 한 줄을 펼치면 접힌 구간과 겹친 정도를 보여줍니다. |
| Node.js | 올린 구간 분석 파일과 촬영본 정보를 읽어 접기 계산을 돌리는 서버입니다. |
| Electron | PREPIX 가 데스크톱 애플리케이션이라, 같은 화면을 데스크톱 창으로도 띄울 수 있게 구성합니다. |
| JSON Schema | 구간 분석 결과와 촬영본 정보의 모양을 고정해, 열이 빠진 파일을 올렸을 때 화면이 아니라 입력이 문제라고 알려 줍니다. |
| Claude Sonnet | 덩어리마다 어떤 장면이 반복됐는지 편집자가 읽을 한 줄로 줄여 적습니다. |
✓ pass → 여기서 멈춰도 완결입니다. 더 키우려면 편집자가 되펼친 기록을 받아 잘못 접은 덩어리를 셉니다.
✓ pass → 여기서 멈춰도 완결입니다. 더 키우려면 기준을 화면에서 바꿔 분량이 어떻게 달라지는지 비교합니다.
위 예측 UI 는 3주차까지 완주했을 때의 화면입니다. 1주차에 실제로 만드는 것은 아래 표시된 화면 하나입니다.
verdict사유 라벨 · segment_key + 한 줄 요약(근거 수치 포함)화면·코드·면접에서 이 단어를 그대로 씁니다. 키는 출력 스키마의 enum 과 같습니다.
solo단독으로 보여줌merge_prev앞 구간과 이어 붙임folded_repeat반복 구간으로 접음hold_merge묶기 보류구간 한 줄마다 어떤 판정이 나왔고 어느 구간과 얼마나 겹쳤는지 담습니다.
{"type":"object","properties":{"segment_key":{"type":"string"},"clip_id":{"type":"string"},"verdict":{"type":"string","enum":["solo","merge_prev","folded_repeat","hold_merge"]},"fold_threshold":{"type":"number","description":"clip_files.segment_count 를 duration_ms 의 시간 수로 나눈 시간당 구간 밀도에 0.004 를 곱해 0.95 에서 뺀 값이고 0.70 과 0.92 사이로 자릅니다"},"max_similarity":{"type":["number","null"],"description":"scene_signature 를 앞선 구간들과 자리마다 견줘 같은 자리 수를 전체 자리 수로 나눈 값 중 가장 큰 값입니다"},"matched_segment_key":{"type":["string","null"]},"reason":{"type":"string"},"evidence":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"agg":{"type":"string"},"value":{}},"required":["field","value"]}}},"required":["segment_key","clip_id","verdict","fold_threshold","max_similarity","evidence"]}[
{
"segment_key": "SEG-A-01",
"clip_id": "CLIP-A",
"verdict": "solo",
"fold_threshold": 0.81,
"max_similarity": null,
"matched_segment_key": null,
"reason": "이 촬영본에서 처음 나오는 장면이라 앞선 구간과 겹치는 것이 없어 그대로 보여줍니다.",
"evidence": [
{
"field": "scene_signature",
"value": "a1b2c3d4e5f60718"
},
{
"field": "segment_count",
"value": 214
},
{
"field": "duration_ms",
"value": 21600000
}
]
},
{
"segment_key": "SEG-C-03",
"clip_id": "CLIP-C",
"verdict": "solo",
"fold_threshold": 0.89,
"max_similarity": null,
"matched_segment_key": null,
"reason": "앞선 구간들과 장면 지문이 하나도 겹치지 않아 따로 보여줍니다.",
"evidence": [
{
"field": "scene_signature",
"value": "778899aabbccddee"
},
{
"field": "segment_count",
"value": 30
},
{
"field": "duration_ms",
"value": 7200000
}
]
},
{
"segment_key": "SEG-A-02",
"clip_id": "CLIP-A",
"verdict": "merge_prev",
"fold_threshold": 0.81,
"max_similarity": 1,
"matched_segment_key": "SEG-A-01",
"reason": "앞 구간이 끝나는 지점과 이어지고 장면 지문도 같아 한 덩어리로 붙입니다.",
"evidence": [
{
"field": "scene_signature",
"value": "a1b2c3d4e5f60718"
},
{
"field": "segment_count",
"value": 214
},
{
"field": "duration_ms",
"value": 21600000
}
]
},
{
"segment_key": "SEG-A-03",
"clip_id": "CLIP-A",
"verdict": "folded_repeat",
"fold_threshold": 0.81,
"max_similarity": 0.94,
"matched_segment_key": "SEG-A-01",
"reason": "앞서 나온 구간과 장면 지문이 접기 기준을 넘게 겹쳐 반복 구간으로 접습니다.",
"evidence": [
{
"field": "scene_signature",
"value": "a1b2c3d4e5f6071f"
},
{
"field": "segment_count",
"value": 214
},
{
"field": "duration_ms",
"value": 21600000
}
]
},
{
"segment_key": "SEG-A-05",
"clip_id": "CLIP-A",
"verdict": "hold_merge",
"fold_threshold": 0.81,
"max_similarity": 0.81,
"matched_segment_key": "SEG-A-03",
"reason": "촬영본 표기에 붙은 공백을 정리해 같은 촬영본으로 묶었습니다. 겹치는 정도가 접기 기준과 같은데 발화 비율이 크게 달라 편집자 확인까지 묶기를 미룹니다.",
"evidence": [
{
"field": "scene_signature",
"value": "a1b2c3d4e5f6ffff"
},
{
"field": "segment_count",
"value": 214
},
{
"field": "duration_ms",
"value": 21600000
}
]
},
{
"segment_key": "SEG-A-06",
"clip_id": "CLIP-A",
"verdict": "solo",
"fold_threshold": 0.81,
"max_similarity": 0.5,
"matched_segment_key": "SEG-A-03",
"reason": "발화 비율이 비어 있어 묶기 보류 판정에서 빠졌고, 앞선 구간과 겹치는 정도도 접기 기준에 못 미쳐 그대로 보여줍니다.",
"evidence": [
{
"field": "scene_signature",
"value": "112233445566778f"
},
{
"field": "segment_count",
"value": 214
},
{
"field": "duration_ms",
"value": 21600000
}
]
}
][자동 검증 · 형식과 재계산] 1. verdict 는 solo, merge_prev, folded_repeat, hold_merge 네 값 안에 있습니다. 2. segment_key, clip_id, verdict, fold_threshold, max_similarity, evidence 여섯 필드가 모두 있습니다. 3. clip_id 는 clip_id_raw 의 앞뒤 공백을 지우고 대문자로 바꾼 값입니다. 4. fold_threshold 는 segment_count 를 duration_ms 의 시간 수로 나눈 밀도에 0.004 를 곱해 0.95 에서 뺀 값이고 0.70 과 0.92 사이로 잘립니다. 5. max_similarity 는 scene_signature 를 앞선 구간들과 자리마다 견줘 얻은 값 중 가장 큰 값입니다. 6. speech_ratio 는 0 이상 1 이하이거나 비어 있습니다. 7. evidence 의 field 값은 shot_segments 또는 clip_files 에 실재하는 컬럼명입니다. 8. evidence 의 value 는 두 표의 수록된 행에 있는 값 그대로입니다. 9. verdict 가 merge_prev 이면 앞 구간이 끝난 뒤 1000 밀리초 안에 시작하고 지문이 접기 기준 이상 겹칩니다. 10. verdict 가 folded_repeat 이면 max_similarity 가 fold_threshold 를 넘습니다. 11. verdict 가 hold_merge 이면 max_similarity 가 fold_threshold 와 같고 짝이 된 구간과 speech_ratio 차가 0.1 을 넘습니다. 12. 모든 한국어 문장은 존댓말로 끝납니다. [정상으로 처리한 하드 케이스] 1. SEG-D-01 은 촬영본 표기가 소문자였지만 정리 후 CLIP-D 로 묶였고, 앞선 구간이 없어 그대로 보여줍니다. 2. SEG-A-04 는 앞 구간과 이어지지만 장면 지문이 전혀 겹치지 않아 붙이지 않습니다. [평가 러너 · 2주차] 1. 편집자가 실제로 접은 덩어리와 대조해 판정별 어긋남 수를 냅니다. 2. 접기 기준을 올리고 내려 가며 편집자가 되펼친 덩어리 수가 어떻게 달라지는지 견줍니다.