제한사항 (Limitations)

LLM API들은 안정적인 서비스와 공정한 사용을 위해 다양한 제한사항을 두고 있습니다. 이 페이지에서는 Claude, GPT, Gemini 등 주요 프로바이더의 제한사항과 대응 방법을 비교합니다.

업데이트 안내: 모델/요금/버전/정책 등 시점에 민감한 정보는 변동될 수 있습니다. 최신 내용은 공식 문서를 확인하세요.
LLM API 제한사항 구조 API 요청 Rate Limit RPM / TPM / TPD 429 Too Many Requests Context Window 128K ~ 2M 토큰 입력 + 출력 합산 Content Policy 금지 콘텐츠 필터링 계정 정지 가능 Knowledge Cutoff 학습 데이터 시점 최신 정보 미반영 지수 백오프 재시도 티어 업그레이드 청크 분할 / RAG 프롬프트 압축 정책 준수 설계 입력 사전 검증 Tool Use / RAG 실시간 데이터 통합

Rate Limits (사용량 제한)

모든 주요 LLM API는 다음 단위로 사용량을 제한합니다:

  • RPM (Requests Per Minute): 분당 요청 수
  • TPM (Tokens Per Minute): 분당 토큰 수
  • TPD (Tokens Per Day): 일일 토큰 수 (프로바이더에 따라 RPD로 표기)

프로바이더별 Rate Limit 비교 (유료 기본 티어 기준)

프로바이더 대표 모델 RPM TPM 비고
Anthropic Claude Sonnet 4.6 50 50,000 Tier 1 기준, TPD 1M
OpenAI GPT-4o 500 30,000 Tier 1 기준, 조직 단위 적용
Google Gemini 2.5 Pro 150 1,000,000 유료 플랜 기준, RPD 1,500
프로바이더별 티어 체계

각 프로바이더마다 사용량 기반 티어 체계가 다릅니다. Anthropic은 결제 금액 기준(Tier 1~4), OpenAI는 결제 및 사용 이력 기준(Tier 1~5), Google은 유료/무료 플랜으로 구분합니다. 정확한 한도는 각 프로바이더의 공식 문서를 참조하세요.

Anthropic 티어별 제한 (2026년 2월 기준)

티어 승격 조건 RPM TPM (Sonnet) TPD
Free API 키 발급 직후 5 25,000 300,000
Tier 1 유효 신용카드 등록 50 50,000 1,000,000
Tier 2 $50 이상 결제 후 7일 1,000 100,000 2,500,000
Tier 3 $500 이상 결제 후 7일 2,000 200,000 5,000,000
Tier 4 $5,000 이상 결제 후 7일 4,000 400,000 10,000,000

Anthropic 모델별 세부 Rate Limit (Tier 1 기준)

모델 RPM TPM TPD
claude-opus-4-6 50 20,000 300,000
claude-sonnet-4-6 50 50,000 1,000,000
claude-haiku-4-5-20251001 50 50,000 1,000,000
💡 티어 승격

사용 실적과 결제 이력에 따라 자동으로 티어가 승격됩니다. 정확한 한도는 각 프로바이더의 공식 문서에서 확인하세요: Anthropic Rate Limits, OpenAI Rate Limits, Google Gemini Rate Limits.

Rate Limit 확인

Anthropic SDK - 응답 헤더 확인
import anthropic

client = anthropic.Anthropic()

response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=100,
    messages=[{"role": "user", "content": "Hi"}]
)

# 응답 헤더에 rate limit 정보 포함
# anthropic-ratelimit-requests-limit: 1000
# anthropic-ratelimit-requests-remaining: 999
# anthropic-ratelimit-tokens-limit: 80000
# anthropic-ratelimit-tokens-remaining: 79900
OpenAI SDK - 응답 헤더 확인
from openai import OpenAI

client = OpenAI()

response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "Hi"}]
)

# 응답 헤더에 rate limit 정보 포함
# x-ratelimit-limit-requests: 500
# x-ratelimit-remaining-requests: 499
# x-ratelimit-limit-tokens: 30000
# x-ratelimit-remaining-tokens: 29900

429 오류 처리

모든 LLM API는 Rate Limit 초과 시 HTTP 429 상태 코드를 반환합니다. 지수 백오프(Exponential Backoff)와 지터(Jitter)를 조합한 재시도 로직이 표준 대응 방법입니다.

Anthropic SDK - 재시도 로직
import time
import random
import anthropic

def call_anthropic_with_retry(client, max_retries=5, **kwargs):
    for attempt in range(max_retries):
        try:
            return client.messages.create(**kwargs)

        except anthropic.RateLimitError as e:
            if attempt == max_retries - 1:
                raise

            # 지수 백오프 + 지터
            wait_time = (2 ** attempt) + random.uniform(0, 1)
            print(f"Rate limit 도달. {wait_time:.1f}초 대기...")
            time.sleep(wait_time)
OpenAI SDK - 재시도 로직
import time
import random
from openai import OpenAI, RateLimitError

def call_openai_with_retry(client, max_retries=5, **kwargs):
    for attempt in range(max_retries):
        try:
            return client.chat.completions.create(**kwargs)

        except RateLimitError as e:
            if attempt == max_retries - 1:
                raise

            # Retry-After 헤더가 있으면 활용
            retry_after = getattr(e, "headers", {}).get("Retry-After")
            if retry_after:
                wait_time = float(retry_after)
            else:
                wait_time = (2 ** attempt) + random.uniform(0, 1)
            print(f"Rate limit 도달. {wait_time:.1f}초 대기...")
            time.sleep(wait_time)

컨텍스트 윈도우 제한

프로바이더별 컨텍스트 윈도우 비교 입력 토큰 최대 출력 토큰 Gemini 2.5 Pro Claude Sonnet 4.6 GPT-4o o3 1M (65K out) 200K (64K out) 128K (16K out) 200K (100K out)

프로바이더별 컨텍스트 윈도우

컨텍스트 윈도우는 한 번의 요청에서 처리할 수 있는 최대 토큰 수(입력 + 출력)입니다. 프로바이더마다 크기가 크게 다릅니다.

프로바이더 모델 컨텍스트 윈도우 최대 출력 토큰
Anthropic claude-opus-4-6 200K 32,000
claude-sonnet-4-6 200K 64,000 (Extended Thinking 시)
claude-haiku-4-5-20251001 200K 16,000
OpenAI GPT-4o 128K 16,384
o3 200K 100,000
Google Gemini 2.5 Pro 1,000K (1M) 65,536
토큰 계산 예시 (Claude 200K 기준)
입력 토큰: 150,000
출력 요청: max_tokens=60000

합계: 150,000 + 60,000 = 210,000 > 200,000 ❌

해결: max_tokens=50000으로 줄이기 ✅
⚠️ max_tokens 필수 (Anthropic)

Anthropic API에서 max_tokens는 필수 파라미터입니다. 생략하면 오류가 발생합니다. OpenAI API에서는 선택 사항이지만, 비용 절감을 위해 명시적으로 설정하는 것이 좋습니다.

콘텐츠 정책

공통 금지 사항

모든 주요 LLM 프로바이더(Anthropic, OpenAI, Google)는 유사한 콘텐츠 정책을 적용합니다. 다음 용도는 공통적으로 금지됩니다:

  • 불법 활동 촉진 또는 지원
  • 유해하거나 폭력적인 콘텐츠 생성
  • 아동 착취 콘텐츠
  • 개인정보 무단 수집 또는 처리
  • 스팸 또는 사기
  • 허위 정보 대량 유포
⚠️ 위반 시 조치

콘텐츠 정책 위반 시 API 접근이 정지되거나 계정이 해지될 수 있습니다. 각 프로바이더의 정책을 확인하세요: Anthropic AUP, OpenAI Usage Policy, Google Gemini Terms.

지식 기준일 (Knowledge Cutoff)

LLM은 학습 데이터의 시점까지만 정보를 알고 있으며, 그 이후의 사건이나 변경사항은 반영되지 않습니다.

프로바이더 모델 지식 기준일
Anthropic Claude Opus/Sonnet 4.6 2025년 8월
OpenAI GPT-4o 2024년 6월
OpenAI o3 2025년 6월
Google Gemini 2.5 Pro 2025년 1월

인터넷 접근 불가

대부분의 LLM API는 기본적으로 인터넷에 접근할 수 없습니다. 실시간 정보가 필요하면:

  • Tool Use로 외부 API 호출
  • 사용자가 직접 정보를 입력
  • RAG (Retrieval-Augmented Generation) 구축
Tool Use로 실시간 정보 가져오기
tools = [
    {
        "name": "get_current_weather",
        "description": "현재 날씨 정보를 가져옵니다",
        "input_schema": {
            "type": "object",
            "properties": {
                "location": {"type": "string"}
            }
        }
    }
]

# Claude가 날씨 API를 호출하도록 지시
message = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    tools=tools,
    messages=[{"role": "user", "content": "서울 날씨 어때?"}]
)

기술적 제한사항

Stateless API

대부분의 LLM API는 상태를 저장하지 않습니다. 대화 이력은 클라이언트가 관리해야 합니다.

Python 대화 관리
# ❌ 서버가 대화를 기억하지 않음
client.messages.create(messages=[{"role": "user", "content": "안녕"}])
client.messages.create(messages=[{"role": "user", "content": "내 이름 뭐야?"}])
# Claude는 이전 대화를 모름

# ✅ 클라이언트가 히스토리 관리
history = []
history.append({"role": "user", "content": "내 이름은 철수야"})
msg1 = client.messages.create(messages=history)
history.append({"role": "assistant", "content": msg1.content[0].text})

history.append({"role": "user", "content": "내 이름 뭐야?"})
msg2 = client.messages.create(messages=history)
# 이제 Claude가 "철수"라고 답함

파일 크기 제한

  • 이미지: 개당 최대 5MB (Vision)
  • PDF: 최대 32MB (claude.ai 웹에서는 10MB)
  • 토큰 제한: 문서 크기와 무관하게 200K 토큰 이내

출력 제한

대부분의 LLM API는 텍스트만 출력합니다. 이미지 생성이 필요하면 DALL-E, Imagen 등 별도 모델을 사용하세요.

제한사항 우회 방법

각 제한사항에는 검증된 우회 전략이 존재합니다. 중요한 것은 단일 전략에 의존하지 않고, 상황에 맞는 복합적인 접근법을 사용하는 것입니다. 아래에서 제한사항별 핵심 우회 방법을 정리합니다.

1. Rate Limit 우회

  • 요청 속도 조절: 토큰 버킷(Token Bucket) 또는 리키 버킷(Leaky Bucket) 알고리즘으로 요청을 일정한 속도로 제어합니다. 이를 통해 갑작스러운 버스트 요청을 방지할 수 있습니다.
  • 지수 백오프로 재시도: 429 응답 시 2^n + 랜덤 지터 초만큼 대기 후 재시도합니다. 최대 재시도 횟수를 설정하여 무한 루프를 방지하세요.
  • 여러 API 키 분산: 조직 내 여러 프로젝트에 독립 API 키를 부여하면 각각 별도 한도가 적용됩니다. 단, 프로바이더 정책을 반드시 확인하세요.
  • 배치 처리: 여러 입력을 하나의 요청으로 통합하여 RPM을 절약합니다. Anthropic의 Batch API를 활용하면 비용도 절감됩니다.

2. 컨텍스트 윈도우 초과

  • 문서 청킹: 긴 문서를 의미 단위(섹션, 문단)로 분할하고 각 청크를 독립적으로 처리합니다. 결과를 통합하는 후처리 단계가 필요합니다.
  • 요약 체인: 대규모 문서를 단계적으로 요약하여 컨텍스트를 압축합니다. Map-Reduce 패턴이 대표적입니다.
  • RAG (Retrieval-Augmented Generation): 벡터 DB에 문서를 임베딩으로 저장하고, 질문과 관련된 청크만 검색하여 프롬프트에 포함합니다.
  • 프롬프트 압축: 불필요한 지시사항, 중복 예시를 제거하고 핵심 정보만 남깁니다. 시스템 프롬프트 최적화도 효과적입니다.

3. 지식 기준일 초과 정보

  • Tool Use: 웹 검색, API 호출 등 외부 도구를 통해 실시간 정보를 가져와 LLM에 제공합니다.
  • 사용자 컨텍스트 주입: 최신 문서, 릴리스 노트 등을 직접 프롬프트에 포함시켜 LLM이 참조할 수 있게 합니다.
  • RAG 파이프라인: 최신 데이터를 주기적으로 수집하여 벡터 DB를 갱신하고, 검색 결과를 LLM 입력에 포함합니다.

제한사항 대응 베스트 프랙티스

1. 견고한 오류 처리

Python 종합 오류 처리
from anthropic import (
    Anthropic,
    APIError,
    RateLimitError,
    APIConnectionError,
    AuthenticationError
)

def safe_call(client, **kwargs):
    try:
        return client.messages.create(**kwargs)

    except RateLimitError:
        # 재시도 로직
        print("Rate limit 도달. 재시도 중...")
        return call_with_retry(client, **kwargs)

    except AuthenticationError:
        print("API 키 오류")
        return None

    except APIConnectionError:
        print("연결 오류. 네트워크 확인")
        return None

    except APIError as e:
        print(f"API 오류: {e}")
        return None

2. 토큰 사용량 모니터링

Python 사용량 추적
class TokenTracker:
    def __init__(self):
        self.total_input = 0
        self.total_output = 0

    def track(self, message):
        self.total_input += message.usage.input_tokens
        self.total_output += message.usage.output_tokens

    def report(self):
        print(f"총 입력: {self.total_input:,} 토큰")
        print(f"총 출력: {self.total_output:,} 토큰")

tracker = TokenTracker()
message = client.messages.create(...)
tracker.track(message)

3. 알림 설정

Console에서 사용량 임계값 알림을 설정하여 예상치 못한 과금 방지:

  • 일일 사용량 $X 초과 시 이메일
  • 월 사용량 한도 설정
  • API 키별 모니터링

다음 단계

  • FAQ - 자주 묻는 질문과 답변
  • 요금 - 비용 계산 및 최적화
  • API 개요 - API 기본 사용법

에이전트 사용 주의사항

Codex 같은 코딩 에이전트는 실행 권한과 파일 접근 범위를 갖기 때문에, 일반 채팅보다 안전 수칙이 더 중요합니다.

  • 작업 범위를 명확히 제한하고, 필요한 경로만 허용하세요.
  • 고위험 명령(네트워크 접근, 삭제/배포)은 승인 흐름을 거치세요.
  • 변경 사항은 반드시 리뷰 후 병합하세요.

관련 페이지: Codex 가이드, CLI 모범 사례

핵심 정리

  • 제한사항 (Limitations)의 핵심 개념과 흐름을 정리합니다.
  • Rate Limits (사용량 제한)를 단계별로 이해합니다.
  • 실전 적용 시 기준과 주의점을 확인합니다.

실무 팁

  • 입력/출력 예시를 고정해 재현성을 확보하세요.
  • 제한사항 (Limitations) 범위를 작게 잡고 단계적으로 확장하세요.
  • Rate Limits (사용량 제한) 조건을 문서화해 대응 시간을 줄이세요.