백만 토큰 문맥에서의 장편 비디오 이해
24 FPS의 1시간짜리 4K 비디오를 패치로 나누고 임베딩하면 대략 6천만 토큰 규모가 됩니다. 2시간짜리 팟캐스트(podcast) 에피소드를 텍스트로 변환(transcribe)하면 약 30,000토큰입니다. Blu-ray 장편 영화 전체는 공격적인 풀링(pooling)으로 압축하더라도 수십만 토큰이 됩니다. Google의 Gemini 1.5(2024년 3월)는 1천만 토큰 문맥(context)으로 이 시대를 열었고, 한 시간 길이의 비디오에서 바늘 찾기(needle-in-a-haystack) 회상을 안정적으로 수행했습니다. LWM(Liu et al., 2024년 2월)은 링 어텐션(ring attention)이 확장될 수 있는 경로를 보여주었습니다. LongVILA와 Video-XL은 비디오 입력 처리(ingestion) 규모를 더 키웠습니다. VideoAgent는 원시 문맥(raw context)을 그대로 넣는 대신 에이전트식 검색(agentic retrieval)을 사용했습니다. 각 접근은 계산량, 회상률(recall), 엔지니어링 복잡도 사이에서 서로 다른 절충을 합니다. 이 lesson에서는 이 접근들을 나란히 비교해 읽습니다.
유형: Build
언어: Python (표준 라이브러리, 바늘 찾기 시뮬레이터 + 에이전트식 검색 라우터)
선수 지식: Phase 12 · 17 (비디오 시간 토큰)
예상 시간: 약 180분
학습 목표
- 다양한 FPS와 풀링 설정에서 장편 비디오의 전체 비주얼 토큰(visual-token) 수를 계산합니다.
- 세 가지 확장 경로인 강행 문맥(brute context, Gemini 1.5), 링 어텐션(LWM), 토큰 압축(token compression, LongVILA / Video-XL)을 설명합니다.
- 원시 문맥 비디오 VLM과 에이전트식 검색 비디오 VLM(VideoAgent)을 정확도와 지연 시간(latency) 관점에서 비교합니다.
- 30분짜리 비디오에 대한 바늘 찾기 테스트를 설계하고 특정 분(minute)에서의 회상률을 측정합니다.
문제
Qwen2.5-VL 크기의 패치를 384 네이티브 해상도(native resolution)에서 만들면 한 프레임은 약 729토큰입니다. 여기에 3x3 풀링을 적용하면 프레임당 81토큰이 됩니다. 1 FPS로 30분짜리 클립을 처리하면 1,800프레임, 즉 145,800토큰입니다. 2025년 공개 VLM으로도 가능하지만 빡빡합니다. 2 FPS가 되면 291,600토큰입니다. 이 정도는 가장 큰 문맥을 가진 모델만 감당할 수 있습니다.
2시간짜리 영화는 1 FPS만 사용해도 583,000토큰입니다. 대부분의 2026년 공개 모델 범위를 넘어섭니다. Gemini 2.5 Pro를 쓰거나, 더 공격적으로 풀링해야 합니다.
이 문제를 풀기 위해 세 가지 확장 경로가 등장했습니다.
개념
경로 1: 강행 문맥(Gemini 1.5, Claude Opus)
문제에 하드웨어를 던지는 방식입니다. 문맥을 수백만 토큰까지 키우고, 모든 것을 한 번의 순전파(forward pass)로 처리합니다.
Gemini 1.5 Pro는 1M 토큰으로 출시되었고, Gemini 1.5 Ultra는 10M까지 확장되었습니다. 2026년의 Gemini 2.5 Pro는 몇 시간짜리 비디오도 안정적으로 처리합니다. Gemini 1.5 논문(arXiv:2403.05530)은 약 9.5M 토큰까지 바늘 찾기 회상률 99.7%를 기록했다고 설명합니다.
엔지니어링 측면에서는 메모리 계층(local + global + sparse)을 갖춘 커스텀 어텐션 구현과, 긴 문맥 효율을 위한 MoE 전문가 라우팅(expert routing)이 필요합니다. 전체 상세는 공개되어 있지 않습니다. 오픈소스도 아닙니다.
경로 2: 링 어텐션(LWM, LongVILA)
링 어텐션은 긴 시퀀스(sequence)를 여러 장치에 "링(ring)" 형태로 분산합니다. 각 장치는 하나의 청크(chunk)를 가지고 있고, 전체 시퀀스에 대한 어텐션은 각 장치가 자기 청크를 다음 장치로 보내는 링 패턴으로 수행됩니다. 장치들은 부분 어텐션(partial attention)을 계산하고 그 결과를 합칩니다.
LWM(Liu et al., 2024)은 이 방식으로 1M 토큰 문맥 모델을 학습했습니다. 학습 계산량은 문맥 길이에 대해 선형으로 증가합니다. 어텐션 자체의 이차 비용(quadratic hit)은 링에 있는 장치들로 분산되어 상쇄됩니다.
LongVILA(arXiv:2408.10188)는 이 패턴을 VLM에 맞게 적용했습니다. 1,400프레임 비디오를 프레임당 192토큰으로 처리하면 268k 문맥이 되며, 이를 8-way 병렬성(parallelism)의 링 어텐션으로 학습했습니다.
경로 3: 토큰 압축(Video-XL, LongVA)
강행 문맥보다 저렴한 방식은 LLM이 시퀀스를 보기 전에 강하게 압축하는 것입니다.
Video-XL(arXiv:2409.14485)은 비주얼 요약 토큰(visual summary token)을 사용합니다. N프레임으로 구성된 각 클립은 N프레임 전체를 어텐션하는 하나의 "요약" 토큰을 만듭니다. 추론 시 LLM은 클립마다 요약 토큰 하나만 보므로 문맥이 크게 줄어듭니다.
LongVA는 "긴 문맥 전이(long context transfer)" 기법으로 LLM 문맥을 200k에서 2M까지 확장합니다. 긴 문맥 텍스트로 학습한 뒤, 공유 표현(shared representation)을 통해 긴 문맥 비디오로 전이합니다.
토큰 압축은 특정 타임스탬프(timestamp)의 회상률을 희생하는 대신 확장성을 얻습니다. 모델은 대체로 무슨 일이 있었는지는 알지만, 정확한 프레임은 때때로 놓칩니다.
경로 4: 에이전트식 검색(VideoAgent)
전체 비디오를 LLM에 넣지 않습니다. 대신 비디오를 데이터베이스(database)처럼 다루고, LLM이 그 데이터베이스를 질의(query)하게 합니다.
VideoAgent(arXiv:2403.10517)의 흐름은 다음과 같습니다.
- LLM이 질문을 읽습니다.
- LLM이 검색 도구(retrieval tool)에 관련 클립을 요청합니다. 예를 들어 "고양이가 나온 구간을 보여줘"라고 묻습니다.
- 도구가 일치하는 클립 타임스탬프를 반환합니다.
- LLM이 그 클립들을 VLM으로 읽습니다.
- LLM이 답을 구성하거나 후속 질의를 요청합니다.
이는 긴 비디오에 LLM-as-agent 패턴을 적용한 것입니다. 추론 비용은 더 저렴합니다. 관련 클립만 인코딩하기 때문입니다. 대신 엔지니어링은 더 어렵습니다. 검색 품질(retrieval quality)이 병목이 됩니다.
바늘 찾기 벤치마크
표준 긴 문맥 테스트는 비디오의 무작위 지점에 고유한 비주얼 또는 텍스트 마커(marker)를 삽입한 뒤, 그것을 회상해야만 답할 수 있는 질문을 던지는 방식입니다.
지표는 비디오 길이와 마커 위치에 따른 Recall@k입니다.
Gemini 2.5 Pro는 최대 90분짜리 비디오에서 99% 이상의 회상률을 보입니다. 공개 72B 모델(Qwen2.5-VL-72B, InternVL3-78B)은 30분에서 약 85-90%를 기록하고, 60분을 넘기면 성능이 떨어집니다.
VideoAgent는 2시간 이상에서 원시 문맥 모델과 비슷하거나 더 나은 성능을 낼 수 있습니다. 검색 도구가 바늘을 잘 찾아낸다면, 전체 문맥을 모두 넣지 않아도 되기 때문입니다.
어떤 경로를 고를 것인가
15분짜리 클립에서 최전선 정확도(frontier accuracy)가 필요하다면 공개 72B + 네이티브 문맥(native context)이 보통 충분합니다. Qwen2.5-VL-72B를 고릅니다.
30분에서 1시간 콘텐츠라면 공개 모델에서는 LongVILA나 Video-XL을, 폐쇄형 모델에서는 Gemini 2.5 Pro를 고려합니다. 품질 기준이 최전선이면 폐쇄형 모델로 갈 가능성이 큽니다.
2시간 이상 콘텐츠라면 VideoAgent 또는 유사한 검색 패턴을 사용합니다. 대안으로는 더 작은 청크로 요약한 뒤 계층적 요약(hierarchical summaries)을 입력하는 방법이 있습니다.
2026년 프로덕션 패턴
실제 프로덕션 장편 비디오 파이프라인은 보통 하이브리드(hybrid)입니다.
- 전체 비디오에 동적 FPS 샘플링 + 공격적 풀링을 적용합니다. 예를 들어 100k 토큰짜리 전역 표현(global representation)을 얻습니다.
- 72B VLM에 전달해 전역 요약(global summary)을 만듭니다.
- 사용자가 세부 질문을 하면 그 요약을 인덱스(index)로 삼아 에이전트식 검색을 실행합니다.
이 방식은 전체 이해에는 강행 문맥을, 지역적 세부 정보에는 검색을 결합합니다.
사용해보기
code/main.py는 다음을 포함합니다.
- 1분부터 3시간까지 다양한 길이의 비디오에 대해 FPS와 풀링을 바꿔 토큰 예산을 계산합니다.
- 바늘 찾기 실행을 시뮬레이션합니다. 무작위 타임스탬프에 마커를 삽입하고 질문을 던진 뒤, 회상률을 점수화합니다.
- 특정 클립을 선택해 하위 VLM에 넘기는 에이전트식 검색 라우터 시뮬레이터를 포함합니다.
예산 표를 실행해 보면 규모 차이가 바로 느껴질 것입니다.
산출물 만들기
이 lesson은 outputs/skill-long-video-strategy-planner.md를 만듭니다. 비디오 길이와 질의 복잡도(query complexity)가 주어지면 강행 문맥, 압축, 에이전트식 검색 중 무엇을 쓸지 고르고, 지연 시간과 품질 기대치를 계산합니다.
연습문제
-
45분짜리 강의를 1 FPS, 프레임당 81토큰으로 처리합니다. 전체 토큰 수는 얼마입니까? 어떤 모델의 문맥에 들어갑니까?
-
바늘 찾기 테스트를 설계합니다. 몇 분 지점에 마커를 삽입하겠습니까? 정확한 질의 형식은 무엇입니까?
-
1시간짜리 비디오에서 강행 문맥 Qwen2.5-VL-72B(80k 문맥)와 VideoAgent(Claude 3.5 + 검색)를 비교합니다. 회상률은 어느 쪽이 더 낫습니까? 지연 시간은 어느 쪽이 더 낫습니까?
-
링 어텐션의 메모리 비용은 시퀀스 길이에 대해서도 선형이고 장치 수에 대해서도 선형으로 증가합니다. 왜 그런지, 그리고 링 회전(ring-rotation) 단계를 제거하면 무엇이 실패하는지 설명합니다.
-
Gemini 1.5 논문의 Section 5에서 바늘 찾기 결과를 읽습니다. 논문은 1M 토큰과 10M 토큰 경계에서의 회상률에 대해 무엇을 발견했습니까?
핵심 용어
| 용어 | 흔한 설명 | 실제 의미 |
|---|
| 강행 문맥(Brute context) | "그냥 토큰을 더 많이 넣기" | LLM 문맥을 수백만 토큰까지 확장하고 모든 것을 한 번에 처리하는 방식 |
| 링 어텐션(Ring attention) | "LWM 방식 병렬 처리" | 각 장치가 청크를 들고 링처럼 회전시키며 전체 시퀀스 어텐션을 분산 계산하는 패턴 |
| 토큰 압축(Token compression) | "요약 토큰" | LLM 전에 학습된 압축기로 클립별 토큰 수를 줄이는 방식 |
| 바늘 찾기(Needle-in-haystack) | "NIH 테스트" | 무작위 지점에 고유 마커를 넣고 테스트 시 모델이 그것을 회상하는지 확인하는 평가 |
| 에이전트식 검색(Agentic retrieval) | "LLM이 질의 계획자가 되는 방식" | LLM이 관련 클립을 검색 도구에 요청하고, VLM으로 읽은 뒤 답을 구성하는 방식 |
| VideoAgent | "비디오 검색 패턴" | 질문 -> 도구 -> 클립 -> 답변으로 이어지는 대표적인 에이전트식 검색 설계 |
더 읽을거리