Context Window
컨텍스트 윈도우
LLM이 한 번에 처리할 수 있는 토큰 수. Claude 200K, GPT-4 128K 등.
컨텍스트 윈도우
LLM이 한 번에 처리할 수 있는 토큰 수. Claude 200K, GPT-4 128K 등.
Context Window(컨텍스트 윈도우)는 LLM(대규모 언어 모델)이 한 번의 추론에서 처리할 수 있는 최대 토큰 수를 의미합니다. 입력 프롬프트와 출력 응답을 합친 총 길이가 이 제한 내에 있어야 하며, 토큰은 단어, 서브워드, 문자 단위로 텍스트를 분할한 기본 단위입니다.
2020년 GPT-3의 2K 토큰에서 시작해, GPT-4 128K, Claude 3 200K, Gemini 1.5 1M까지 컨텍스트 윈도우는 급격히 확장되었습니다. 이 발전은 Attention 메커니즘 최적화(Flash Attention, Sparse Attention), 메모리 효율화 기법(KV Cache 압축), 위치 인코딩 개선(RoPE, ALiBi)에 힘입은 것입니다.
컨텍스트 윈도우가 커지면 긴 문서 전체를 한 번에 분석하거나, 긴 대화 히스토리를 유지하거나, 여러 파일을 동시에 참조하는 작업이 가능해집니다. 그러나 컨텍스트가 길어질수록 연산 비용이 O(n^2)으로 증가하고, "Lost in the Middle" 현상으로 중간 부분 정보 검색 성능이 저하될 수 있습니다.
실무에서 컨텍스트 윈도우는 RAG 아키텍처 설계, 청킹(chunking) 전략, 프롬프트 엔지니어링, 비용 최적화에 직접 영향을 미칩니다. 무작정 큰 컨텍스트를 사용하기보다, 태스크에 맞는 최적 길이를 찾고 필요한 정보만 선별적으로 포함시키는 것이 성능과 비용 모두에 유리합니다.
import tiktoken
from anthropic import Anthropic
# 토큰 수 계산 (OpenAI 모델용 tiktoken 예시)
def count_tokens_openai(text: str, model: str = "gpt-4") -> int:
encoding = tiktoken.encoding_for_model(model)
return len(encoding.encode(text))
# Claude 토큰 수 계산 (Anthropic API 사용)
def count_tokens_claude(text: str) -> int:
client = Anthropic()
# count_tokens API는 Claude 모델의 정확한 토큰 수 반환
result = client.count_tokens(text)
return result.tokens
# 컨텍스트 윈도우 관리 예시
class ContextManager:
def __init__(self, max_tokens: int = 128000, reserve_output: int = 4096):
self.max_tokens = max_tokens
self.reserve_output = reserve_output # 출력용 토큰 예약
self.available = max_tokens - reserve_output
def fit_messages(self, messages: list[dict], system_prompt: str = "") -> list[dict]:
"""컨텍스트 윈도우에 맞게 메시지 자르기 (최근 메시지 우선)"""
system_tokens = count_tokens_openai(system_prompt) if system_prompt else 0
available = self.available - system_tokens
fitted = []
current_tokens = 0
# 최신 메시지부터 역순으로 추가
for msg in reversed(messages):
msg_tokens = count_tokens_openai(msg["content"])
if current_tokens + msg_tokens <= available:
fitted.insert(0, msg)
current_tokens += msg_tokens
else:
break
print(f"사용 토큰: {current_tokens + system_tokens}/{self.max_tokens}")
print(f"포함된 메시지: {len(fitted)}/{len(messages)}")
return fitted
# 사용 예시
manager = ContextManager(max_tokens=128000)
chat_history = [{"role": "user", "content": "..." }] * 100 # 긴 대화
fitted_messages = manager.fit_messages(chat_history, system_prompt="You are helpful.")
# 결과: 컨텍스트에 맞게 오래된 메시지가 제거됨
"Claude 200K 컨텍스트면 책 한 권을 통째로 넣을 수 있어요. 근데 실제로 그렇게 하면 비용도 비용이고, Lost in the Middle 현상으로 중간 내용 검색이 떨어질 수 있습니다. RAG로 관련 청크만 뽑아서 20K 정도로 쓰는 게 현실적이에요."
"컨텍스트 윈도우가 커지면 Attention 연산이 O(n^2)으로 증가해서 비용과 지연이 급증합니다. 그래서 Flash Attention, Sliding Window Attention 같은 최적화 기법이 중요하고, 모델 선택 시 단순히 최대 토큰 수만 볼 게 아니라 실제 활용 가능 범위를 따져봐야 해요."
"토큰 아끼려고 프롬프트를 너무 줄이면 품질이 떨어지고, 너무 길면 비용이 폭발해요. 시스템 프롬프트는 500토큰 이내, 예시는 2-3개로 제한하고, 동적으로 필요한 컨텍스트만 추가하는 전략을 권장합니다."
| 모델 | 컨텍스트 | 약 글자 수 | 특징 |
|---|---|---|---|
| Gemini 1.5 Pro | 1M | ~75만 자 | 🏆 최대 (책 1권 전체) |
| Claude 3.5 Sonnet | 200K | ~15만 자 | 📄 긴 문서 분석에 최적 |
| GPT-4o / o1 | 128K | ~10만 자 | ⚡ 빠른 응답 속도 |
| Llama 3.1 405B | 128K | ~10만 자 | 🔓 오픈소스 |
| BERT | 512 | ~400자 | ⚠️ 짧음 (청킹 필수) |
💡 환산 기준: 영어 1토큰 ≈ 4글자, 한국어 1토큰 ≈ 1.5글자. 128K 토큰 = 약 300페이지 영문 문서 = 약 8만 자 한글.
컨텍스트 윈도우는 입력과 출력의 합입니다. 128K 모델에 100K 토큰 입력하면 출력은 28K로 제한됩니다. max_tokens 설정 시 이를 고려하세요.
토큰 수에 비례해 API 비용이 증가합니다. 100K 토큰 프롬프트는 1K 토큰의 100배 비용입니다. 불필요한 컨텍스트 낭비를 피하세요.
"Lost in the Middle" 연구에 따르면, 모델은 시작과 끝 부분 정보는 잘 기억하지만 중간 부분은 놓치기 쉽습니다. 중요 정보는 앞뒤에 배치하세요.