🤖 AI/ML

Context Window

컨텍스트 윈도우

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.")
# 결과: 컨텍스트에 맞게 오래된 메시지가 제거됨

🗣️ 실무 대화 예시

LLM 서비스 설계 미팅에서

"Claude 200K 컨텍스트면 책 한 권을 통째로 넣을 수 있어요. 근데 실제로 그렇게 하면 비용도 비용이고, Lost in the Middle 현상으로 중간 내용 검색이 떨어질 수 있습니다. RAG로 관련 청크만 뽑아서 20K 정도로 쓰는 게 현실적이에요."

기술 면접에서

"컨텍스트 윈도우가 커지면 Attention 연산이 O(n^2)으로 증가해서 비용과 지연이 급증합니다. 그래서 Flash Attention, Sliding Window Attention 같은 최적화 기법이 중요하고, 모델 선택 시 단순히 최대 토큰 수만 볼 게 아니라 실제 활용 가능 범위를 따져봐야 해요."

프롬프트 최적화 논의에서

"토큰 아끼려고 프롬프트를 너무 줄이면 품질이 떨어지고, 너무 길면 비용이 폭발해요. 시스템 프롬프트는 500토큰 이내, 예시는 2-3개로 제한하고, 동적으로 필요한 컨텍스트만 추가하는 전략을 권장합니다."

📊 모델별 컨텍스트 윈도우 비교 (2025년 1월)

모델 컨텍스트 약 글자 수 특징
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만 자 한글.

⚠️ 주의사항

1
입력 + 출력 합산

컨텍스트 윈도우는 입력과 출력의 합입니다. 128K 모델에 100K 토큰 입력하면 출력은 28K로 제한됩니다. max_tokens 설정 시 이를 고려하세요.

2
비용 폭증 주의

토큰 수에 비례해 API 비용이 증가합니다. 100K 토큰 프롬프트는 1K 토큰의 100배 비용입니다. 불필요한 컨텍스트 낭비를 피하세요.

3
긴 컨텍스트 성능 저하

"Lost in the Middle" 연구에 따르면, 모델은 시작과 끝 부분 정보는 잘 기억하지만 중간 부분은 놓치기 쉽습니다. 중요 정보는 앞뒤에 배치하세요.

🔗 관련 용어

📚 더 배우기