Context Window
컨텍스트 창은 한 번의 요청에서 모델이 참조할 수 있는 최대 토큰 수이며, 프롬프트, 기록, 문서, 답변이 이를 함께 사용합니다.
컨텍스트 윈도우는 모델이 단일 요청에서 고려할 수 있는 토큰의 최대 개수입니다. 대규모 언어 모델(LLM)의 경우 시스템 프롬프트, 도구 정의, 대화 기록, 검색된 문서, 사용자 질문, 모델이 생성하는 답변 등 읽고 쓰는 모든 내용이 이 한도를 공유합니다. 윈도우 밖의 텍스트는 모델에 전달되지 않으므로, 앞선 대화 차례가 잘려 나가면 챗봇이 매우 긴 대화의 시작 부분을 기억하지 못합니다. 윈도우 크기는 GPT-3의 2,048개 토큰에서 2023년 말 GPT-4 Turbo의 128K개 토큰, 2024년 Google Gemini 1.5 Pro의 100만 개 토큰으로 늘어났으며, Meta의 Llama 4 Scout는 1,000만 개를 지원한다고 홍보합니다.
컨텍스트 윈도우를 채우는 요소#
토큰화는 텍스트를 하위 단어 단위로 나누며, 영어에서는 평균 약 네 글자에 해당합니다. 따라서 128K 토큰 윈도우에는 대략 300페이지 분량의 텍스트가 들어갑니다. 비전-언어 모델(VLM)은 이미지에도 토큰을 사용하며, 보통 이미지 하나에 수백 개의 패치 토큰을 할당합니다. 따라서 긴 동영상은 대본보다 훨씬 빠르게 윈도우를 채웁니다. 생성된 토큰도 같은 한도에 포함되며, 공급자는 윈도우 안에서 출력 길이에 별도 상한을 설정합니다. 따라서 긴 대화나 AI 에이전트를 실행하는 애플리케이션은 매 대화 차례마다 프롬프트를 구성하고 유지할 내용을 결정합니다:
윈도우 크기의 제한 이유#
길이가 길어지면 두 가지 비용이 증가합니다. 셀프 어텐션은 모든 토큰을 다른 모든 토큰과 비교하므로 토큰 수가 늘어날수록 어텐션 연산량이 제곱에 비례해 증가합니다. 텍스트 생성 중에는 KV 캐시가 이전 토큰의 키와 값을 모두 보관합니다. 32개 레이어와 각각 128차원인 8개의 키-값 헤드를 갖춘 Llama 3.1 8B는 16비트 정밀도에서 토큰당 128KiB를 저장합니다. 윈도우 전체 크기인 131,072개 토큰에서는 16GiB가 필요하며, 이는 가중치가 차지하는 16GB보다 큰 용량입니다.
윈도우 크기는 학습 데이터에도 좌우됩니다. 8K 토큰 시퀀스로 학습한 모델은 그 이후의 위치를 본 적이 없으므로 윈도우를 확장하려면 회전 위치 임베딩(RoPE)을 YaRN과 같은 방법으로 재조정하고 더 긴 텍스트로 짧게 파인튜닝해야 합니다. 긴 윈도우를 서빙할 때는 메모리 절약 기법을 사용합니다. 플래시 어텐션은 전체 점수 행렬을 저장하지 않고 정확한 어텐션을 계산합니다. 그룹드 쿼리 어텐션(GQA)은 KV 캐시를 줄이고, 슬라이딩 윈도우 어텐션은 각 토큰이 최근의 인접 토큰에만 집중하도록 제한하며, 링 어텐션은 하나의 시퀀스를 여러 GPU에 나눕니다.
광고된 컨텍스트와 실제 컨텍스트#
100만 개의 토큰을 처리할 수 있는 모델도 모든 토큰을 똑같이 활용하지는 않습니다. 2023년 연구 Lost in the Middle에 따르면 관련 구절이 프롬프트의 시작이나 끝에 있을 때 모델의 답변 성능이 가장 높고 중간에 있을 때 가장 낮았습니다. 건초더미에서 바늘 찾기(NIAH) 테스트는 삽입한 하나의 사실을 다양한 깊이와 길이에서 회수하는 능력을 측정합니다. 더 어려운 RULER 벤치마크에서는 32K 이상의 토큰을 지원한다고 주장한 모델 17개 중 절반만이 32K에서 만족스러운 성능을 보였습니다. 입력이 길어질수록 성능이 점차 낮아지는 현상을 컨텍스트 로트라고 합니다. 검색 증강 생성(RAG)과 컨텍스트 엔지니어링은 관련 있는 내용만 윈도우에 넣어 이 문제를 완화합니다.
컨텍스트 윈도우와 관련 용어 비교#
- 수용 영역: 합성곱 신경망(CNN)의 한 출력에 영향을 미치는 입력 이미지 영역입니다. 수용 영역의 크기는 커널 크기와 깊이에 따라 고정되지만, 컨텍스트 윈도우는 토큰 수 한도입니다.
- 배치 크기: 함께 처리되는 독립 시퀀스의 개수입니다. 컨텍스트 윈도우는 각 시퀀스의 길이를 제한합니다.
- 메모리: 벡터 데이터베이스에 저장되는 일화 기억과 같은 에이전트 메모리는 윈도우 바깥에 유지되며, 관련성이 있을 때 윈도우로 복사됩니다.
오픈 어휘 탐지의 컨텍스트 윈도우#
비전 모델 내부의 텍스트 인코더에도 윈도우가 있습니다. Ultralytics YOLOE와 YOLO-World는 CLIP 계열 텍스트 인코더를 사용해 각 클래스 프롬프트를 인코딩하며, 이 인코더의 컨텍스트 윈도우는 77개 토큰입니다. Ultralytics 텍스트 인코더는 기본적으로 더 긴 프롬프트를 자릅니다. 같은 CLIP 토크나이저를 사용하면 잘리는 부분을 확인할 수 있습니다:
import clip
from clip.simple_tokenizer import SimpleTokenizer
prompt = (
"a warehouse worker wearing a yellow high-visibility vest, a white hard hat, blue gloves and clear safety "
"glasses, standing beside a red forklift that carries wooden pallets stacked with brown cardboard boxes, "
"under bright ceiling lights in a narrow aisle between tall metal shelves, next to a fire extinguisher "
"mounted on the wall, a green emergency exit sign, an open loading dock door and a black dog"
)
# CLIP's BPE tokenizer wraps the text in start and end tokens
tokenizer = SimpleTokenizer()
print(f"Prompt length: {len(tokenizer.encode(prompt)) + 2} tokens")
# The text encoder reads a fixed 77-token window, so truncation drops the tail
tokens = clip.tokenize(prompt, truncate=True)[0]
kept = tokenizer.decode(tokens[1:-1].tolist())
print(f"Window: {len(tokens)} tokens ending in '{' '.join(kept.split()[-4:])}'")
print(f"'black dog' kept: {'black dog' in kept}")프롬프트의 길이는 80개 토큰이므로 윈도우에는 처음 75개 텍스트 토큰과 시작 및 종료 마커가 유지됩니다. 윈도우는 "loading dock door and"에서 끝나며, "a black dog"는 인코더에 전달되기 전에 잘립니다.










