한 줄 요약: 프롬프트 캐싱(Prompt Caching)이란, LLM API 호출 시 반복되는 시스템 프롬프트나 대용량 문서를 서버 측에 캐시해 재처리 없이 재사용함으로써 비용과 지연시간을 크게 줄이는 최적화 기술이다.


1. 프롬프트 캐싱이란 무엇인가?

매번 회의가 시작될 때 “저는 홍길동이고, 우리 회사는 AI 서비스를 운영하고, 회의 규칙은 이렇습니다…“라고 처음부터 설명한다면 얼마나 비효율적일까요? 프롬프트 캐싱은 이 비효율을 해결합니다.

LLM 서비스에서는 모든 요청마다 시스템 프롬프트(역할 정의, 도메인 지식, 회사 규칙 등)를 함께 전송합니다. 이 내용이 수천 토큰에 달하면 매 호출마다 막대한 비용이 발생합니다. 프롬프트 캐싱은 이 반복 부분을 서버에 저장(캐시)해 두고 재사용합니다.

Anthropic의 프롬프트 캐싱 효과 (공식 발표):

  • 토큰 처리 비용: 최대 90% 절감
  • 응답 지연시간: 최대 85% 감소

2. 핵심 개념 이해하기

캐싱 동작 원리

[첫 번째 호출]
시스템 프롬프트 (5,000토큰) + 질문 (50토큰)
           ↓ 처리 + 캐시 저장
응답 생성 (5,050토큰 처리, 전체 비용 부과)

[두 번째 호출]  ← 5분 이내
시스템 프롬프트 (cache_read: 5,000토큰) + 질문 (50토큰)
           ↓ 캐시 히트
응답 생성 (50토큰만 신규 처리, 90% 비용 절감)

Claude의 캐시 구조

┌─────────────────────────────────────────┐
│              시스템 프롬프트              │
│  "당신은 법률 전문가입니다..."             │
│  [회사 규정 전문 2,000토큰...]             │  ← cache_control: ephemeral
│  [판례 데이터베이스 3,000토큰...]          │  ← 캐시 저장 포인트
├─────────────────────────────────────────┤
│              사용자 메시지                │
│  "이 계약서의 위험 조항을 분석해줘"         │  ← 매번 새로 처리
└─────────────────────────────────────────┘

캐시 유효 기간

제공업체 캐시 TTL
Anthropic (Claude) 5분 (활성 사용 시 갱신)
OpenAI 5~10분

캐시는 TTL 초과 시 자동 삭제되므로, 고정 시스템 프롬프트는 정기적으로 호출해 갱신해야 합니다.

3. 실무 적용 예시

Claude API 캐싱 구현

import anthropic

client = anthropic.Anthropic()

# 대용량 시스템 프롬프트 + 문서를 캐시
SYSTEM_PROMPT = """당신은 10년 경력의 법률 전문가입니다.
아래 회사 규정을 기반으로 질문에 답변해 주세요.

[회사 취업 규칙 전문]
제1조 (목적) 이 규칙은...
(이하 3,000토큰 분량의 규정)
"""

def ask_legal_question(question: str) -> str:
    response = client.messages.create(
        model="claude-3-5-sonnet-20241022",
        max_tokens=1024,
        system=[
            {
                "type": "text",
                "text": SYSTEM_PROMPT,
                "cache_control": {"type": "ephemeral"}  # 캐시 포인트 지정
            }
        ],
        messages=[
            {"role": "user", "content": question}
        ]
    )

    # 캐시 사용 여부 확인
    usage = response.usage
    print(f"입력 토큰: {usage.input_tokens}")
    print(f"캐시 생성: {usage.cache_creation_input_tokens}")
    print(f"캐시 읽기: {usage.cache_read_input_tokens}")

    return response.content[0].text

# 첫 호출: 캐시 생성 (전체 비용)
answer1 = ask_legal_question("연차 휴가는 며칠인가요?")

# 두 번째 호출: 캐시 히트 (90% 절감)
answer2 = ask_legal_question("육아휴직 신청 절차는?")

OpenAI 자동 캐싱

from openai import OpenAI

client = OpenAI()

# OpenAI는 자동으로 프롬프트 캐싱 적용 (별도 설정 불필요)
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {"role": "system", "content": SYSTEM_PROMPT},  # 자동 캐시
        {"role": "user", "content": "질문 내용"}
    ]
)

# 캐시 사용량 확인
usage = response.usage
print(f"캐시 읽기 토큰: {usage.prompt_tokens_details.cached_tokens}")

4. 프롬프트 캐싱 vs 유사 개념 비교

구분 프롬프트 캐싱 RAG 파인튜닝
목적 비용/속도 최적화 지식 확장 행동 특화
데이터 위치 서버 캐시 벡터 DB 모델 가중치
업데이트 즉시 반영 인덱싱 필요 재학습 필요
비용 효과 반복 호출 시 큰 절감 장문 검색 시 효율적 초기 비용 높음
적용 상황 고정 컨텍스트 반복 동적 정보 필요 특수 도메인

5. 마치며

프롬프트 캐싱은 LLM 서비스를 프로덕션에 배포할 때 비용 최적화의 가장 빠른 방법입니다. 특히 고정된 시스템 프롬프트(역할, 규칙, 문서)가 큰 서비스일수록 효과가 큽니다. 컨텍스트 윈도우(Context Window)와 함께 이해하면 토큰 비용을 전략적으로 관리하는 방법을 설계할 수 있습니다.

참고 자료

함께 읽으면 좋은 용어

이 개념과 함께 알아두면 이해가 깊어지는 관련 용어들입니다.

댓글 남기기