← 목록으로
AI2026.09.29 09:34

Prompt Caching으로 LLM API 비용 줄이기 — Anthropic·OpenAI 캐싱 전략 비교

상보다 빠르게 청구 비용이 치솟습니다. RAG(Retrieval-Augmented Generation) 파이프라인이나 복잡한 시스템 프롬프트를 사용하는 에이전트 워크플로우에서는 매 요청마다 수천 토큰짜리 컨텍스트를 반복적으로 모델에…

상보다 빠르게 청구 비용이 치솟습니다. RAG(Retrieval-Augmented Generation) 파이프라인이나 복잡한 시스템 프롬프트를 사용하는 에이전트 워크플로우에서는 매 요청마다 수천 토큰짜리 컨텍스트를 반복적으로 모델에 전달하게 됩니다. Prompt Caching은 이 반복 비용을 획기적으로 줄여 주는 기술로, Anthropic과 OpenAI 모두 자체적인 캐싱 메커니즘을 제공합니다. 두 플랫폼의 접근 방식은 구조적으로 상당히 다르며, 어떤 방식을 어떤 맥락에서 선택하느냐에 따라 실제 절감 효과가 크게 달라집니다.

LLM API 비용은 입력 토큰과 출력 토큰의 합산으로 결정됩니다. 출력 토큰은 요청마다 다르지만, 입력 토큰 중 시스템 프롬프트나 문서 컨텍스트처럼 고정된 부분은 매번 동일하게 반복됩니다. 예를 들어 2000토큰짜리 시스템 프롬프트를 하루 1000번 호출하면, 시스템 프롬프트만으로 하루 200만 토큰이 소비됩니다. Prompt Caching이 적용되면 이 반복 비용을 90%(Anthropic 기준) 또는 50%(OpenAI 기준)까지 줄일 수 있습니다.

Prompt Caching 비용 구조 API 요청이 시스템 프롬프트·RAG 문서·유저 메시지 세 흐름으로 분기되며, 반복되는 고정 구간이 전체 토큰 과금으로 이어지는 비용 문제를 보여주는 흐름도 INPUT API 요청 매번 발생 FIXED 시스템 프롬프트 고정 · 반복 PART RAG 문서 부분 반복 USER 유저 메시지 매번 변경 COST 비용 과다 전체 토큰 과금 OK 정상 범위 캐싱 불필요 LEGEND 고정·반복 (캐싱 대상) 부분 반복 매번 변경 정상 범위 비용 과다

고정된 시스템 프롬프트와 문서 컨텍스트가 반복 비용의 주범이며, 이 부분이 캐싱의 주요 대상입니다.

기존 방식의 한계

프롬프트 캐싱이 없던 시절의 비용 절감 방법은 두 가지뿐이었습니다. 첫째, 시스템 프롬프트를 억지로 줄여 품질을 희생하는 방식이고, 둘째, 완전히 동일한 입력에 대한 응답을 저장하는 응답 캐시(response cache) 방식입니다. 응답 캐시는 입력이 한 글자라도 바뀌면 무용지물이 되는 정확 일치(exact-match) 방식이라, 유저 메시지가 다양한 현업 서비스에서는 거의 효과가 없습니다.

Prompt Caching은 이 문제를 모델 레벨에서 해결합니다. 입력 전체가 동일하지 않더라도, 앞부분 prefix가 일치하는 한 재처리 비용을 절감할 수 있습니다. 시스템 프롬프트 2000토큰 + 유저 메시지 200토큰으로 구성된 요청에서, 시스템 프롬프트 2000토큰이 캐시에 있다면 유저 메시지만 실제로 처리하면 됩니다. 유저 메시지가 매번 달라도 앞쪽 prefix가 동일하므로 캐시가 재사용됩니다. 이것이 응답 캐시와 근본적으로 다른 점입니다.


Prompt Caching 동작 원리

프리필과 KV Cache의 관계

LLM의 추론 과정은 크게 두 단계로 나뉩니다. 첫 번째는 프리필(Prefill) 단계로, 입력 프롬프트 전체를 처리하여 어텐션 메커니즘에 필요한 KV(Key-Value) 캐시를 구성하는 과정입니다. 두 번째는 디코딩(Decoding) 단계로, 구성된 KV 캐시를 바탕으로 출력 토큰을 하나씩 생성합니다. 프리필 단계가 전체 처리 비용의 대부분을 차지하며, 입력 토큰 수에 거의 비례하여 증가합니다.

Prompt Caching은 이 프리필 단계에서 이미 계산된 KV 캐시를 저장해 두었다가, 동일한 prefix가 들어오면 재사용하는 방식으로 동작합니다. 새로운 요청이 들어왔을 때 prefix가 캐시에 존재한다면, 그 부분의 어텐션 연산을 다시 수행하지 않고 곧바로 나머지 부분으로 넘어갑니다. 이는 단순히 비용 절감에 그치지 않고, 첫 토큰 응답 시간(TTFT, Time To First Token)도 단축시켜 줍니다. 특히 컨텍스트가 수만 토큰에 달하는 긴 문서 처리 시나리오에서 응답 지연 개선 효과가 두드러집니다.

Prompt Caching 처리 흐름 요청 도착 후 KV 캐시 히트 여부에 따라 캐시 로드(프리필 생략) 또는 프리필 전체 수행 후 KV 캐시 저장을 거쳐 디코딩(토큰 생성)으로 이어지는 LLM API 캐싱 흐름. 예 아니오 요청 도착 캐시 히트인가 HIT KV 캐시 로드 프리필 생략 MISS 프리필 전체 수행 KV KV 캐시 저장 DECODE 디코딩 토큰 생성 LEGEND 캐시 히트 경로 캐시 미스 경로 의사결정 KV 저장/생성

캐시 히트가 발생하면 프리필을 건너뛰고 바로 디코딩 단계로 진입하여 연산 비용과 응답 지연이 동시에 줄어듭니다.

캐시가 효과적인 시나리오

Prompt Caching이 실질적인 효과를 발휘하는 시나리오는 비교적 명확합니다. 가장 이상적인 경우는 긴 시스템 프롬프트가 고정되어 있고 유저 메시지만 매 요청마다 바뀌는 패턴입니다. 예를 들어 법률 문서 검토 서비스에서 "당신은 계약서 분석 전문가입니다. 다음 지침을 따르십시오…" 형태의 2000토큰짜리 시스템 프롬프트가 모든 유저에게 동일하게 적용된다면, 이 부분은 캐싱의 이상적인 대상입니다. RAG 파이프라인에서도 검색된 문서 세트가 동일한 쿼리로 여러 번 재사용될 때 효과적입니다.

시나리오 캐시 가능 비율 기대 절감률
시스템 프롬프트 고정 + 유저 메시지 변경 70~90% 60~85%
RAG 문서 컨텍스트 재사용 50~80% 40~70%
Few-shot 예제 고정 80~95% 70~90%
멀티턴 대화 히스토리 누적 40~60% 30~55%
완전히 동적인 프롬프트 0~10% 5% 미만

캐시 키와 Prefix 일치 원리

Prompt Caching은 prefix 일치(prefix-match) 방식으로 동작합니다. 프롬프트의 앞부분이 이전 요청과 동일하면 캐시가 재사용되며, 캐시 키는 모델 버전, 생성 파라미터(temperature 등), 그리고 프롬프트의 prefix 내용으로 결정됩니다. 여기서 핵심적인 설계 원칙이 도출됩니다. 고정된 내용은 항상 프롬프트의 앞쪽에, 동적인 내용은 뒤쪽에 배치해야 한다는 것입니다. "오늘 날짜는 2025년 9월 29일입니다. 당신은 법률 전문가입니다…"처럼 날짜가 맨 앞에 오면, 날짜가 바뀔 때마다 전체 prefix가 캐시 미스가 됩니다.

또한 temperature나 top_p 같은 생성 파라미터가 달라져도 캐시 키가 달라지므로, 캐싱 효과를 기대하는 경우에는 이 파라미터를 일관되게 고정해야 합니다. 두 플랫폼 모두 최소 1024 토큰 이상의 prefix가 있어야 캐싱이 활성화됩니다. 이보다 짧은 프롬프트에서는 캐싱이 동작하지 않으므로, 소규모 프롬프트 최적화에는 다른 방법을 병행해야 합니다.


Anthropic Claude의 캐싱 전략

명시적 캐시 컨트롤과 비용 구조

Anthropic의 Prompt Caching은 개발자가 명시적으로 캐시할 위치를 지정하는 방식을 채택하고 있습니다. cache_control 파라미터를 각 콘텐츠 블록에 추가함으로써 어느 지점까지를 캐시할지 직접 제어합니다. 이 방식의 가장 큰 장점은 예측 가능성입니다. 어떤 부분이 캐시되고 있는지 개발자가 정확히 알기 때문에, 캐시 히트율을 설계 단계에서부터 의도적으로 높일 수 있습니다. 현재 Claude 3.5 Sonnet, Claude 3.5 Haiku, Claude 3 Opus, Claude 3 Haiku 모델에서 지원되며, 캐시가 동작하려면 최소 1024 토큰 이상이어야 합니다.

비용 구조는 다소 독특합니다. 캐시를 처음 생성할 때는 일반 입력 토큰 비용보다 25% 더 비싸게 과금됩니다. 반면 캐시 히트 시에는 일반 입력 토큰 비용의 10%만 과금됩니다. 동일한 prefix로 10회 이상 요청이 들어오면 손익분기점을 넘어 누적 비용이 절감됩니다. 캐시 TTL은 기본 5분이며, 별도 설정으로 1시간까지 늘릴 수 있습니다. 트래픽이 꾸준히 발생하는 서비스에서 가장 효과적이고, 반대로 요청 간 간격이 길거나 저트래픽 환경에서는 캐시 생성 비용만 반복 발생하는 역효과가 날 수 있습니다.

Prompt Caching 흐름도 API 요청이 들어왔을 때 cache_control 설정과 최소 토큰 조건(1024토큰) 충족 여부에 따라 캐시 생성, 캐시 히트(-90% 비용), 캐시 만료, 또는 캐싱 불가(일반 과금)로 분기되는 결정 흐름을 보여 줍니다. 예 아니오 예 아니오 API 요청 cache_control 지정 최소 길이 1024 토큰 이상? SKIP 캐싱 불가 일반 과금 CACHE 캐시 생성 +25% 비용 TTL 내 재요청인가? HIT 캐시 히트 -90% 비용 MISS 캐시 만료 재생성 필요 주 경로 조건 미충족 만료/대기

캐시 생성 시 일시적으로 비용이 증가하지만, TTL 내에 히트가 반복될수록 누적 절감폭이 빠르게 커집니다.

다층 캐시 포인트 배치

Anthropic 캐싱에서는 요청당 최대 4개의 캐시 포인트를 동시에 활성화할 수 있습니다. 이를 전략적으로 활용하면 컨텍스트의 성격에 따라 다층적인 캐시 구조를 설계할 수 있습니다. 예를 들어 시스템 프롬프트 전체에 첫 번째 캐시 포인트를, 공통 Few-shot 예제 뒤에 두 번째 캐시 포인트를, 세션별 고정 문서 컨텍스트 뒤에 세 번째 캐시 포인트를 배치하는 식입니다. 이렇게 하면 요청의 성격에 따라 하나 이상의 캐시 포인트에서 히트가 발생하여 비용이 단계적으로 절감됩니다.

캐시 포인트는 해당 위치까지의 모든 토큰을 캐시하는 누적(cumulative) 방식으로 작동합니다. 뒤쪽 캐시 포인트가 히트되면 그 앞의 모든 토큰도 함께 캐시에서 재사용됩니다. 이 특성을 이해해야 캐시 포인트를 낭비 없이 배치할 수 있습니다. 앞쪽 내용이 완전히 고정이라면 굳이 중간 포인트를 여러 개 나눌 필요 없이, 변경 가능성이 있는 경계마다 포인트를 하나씩 놓는 것이 효율적입니다.

다음은 시스템 프롬프트와 RAG 문서 컨텍스트를 각각 별도 캐시 포인트로 지정하는 구현입니다.

python
import anthropic

client = anthropic.Anthropic()

response = client.messages.create(
    model="claude-sonnet-4-5",
    max_tokens=1024,
    system=[
        {
            "type": "text",
            # 고정 시스템 역할 정의 — 3000+ 토큰
            "text": "당신은 법률 문서 분석 전문가입니다. " + LONG_LEGAL_CONTEXT,
            "cache_control": {"type": "ephemeral"}  # 첫 번째 캐시 포인트
        }
    ],
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "text",
                    "text": RETRIEVED_DOCUMENTS,  # 검색된 문서 2000+ 토큰
                    "cache_control": {"type": "ephemeral"}  # 두 번째 캐시 포인트
                },
                {
                    "type": "text",
                    "text": user_question  # 동적 유저 질문 — 캐시 대상 아님
                }
            ]
        }
    ]
)

usage = response.usage
# 첫 번째 요청: cache_creation_input_tokens=5120, cache_read_input_tokens=0
# 두 번째 요청: cache_creation_input_tokens=0,    cache_read_input_tokens=5000
print(f"캐시 생성 토큰: {usage.cache_creation_input_tokens}")
print(f"캐시 히트 토큰: {usage.cache_read_input_tokens}")
print(f"일반 입력 토큰: {usage.input_tokens}")

cache_read_input_tokens가 0이면 캐시 미스, 0보다 크면 해당 토큰만큼 90% 할인이 적용된 것으로, 두 값을 로깅하는 것이 비용 모니터링의 출발점입니다.

멀티턴 대화에서의 적용

멀티턴 대화에서 Anthropic 캐싱을 효과적으로 사용하려면 히스토리 관리 방식을 조정해야 합니다. 대화가 길어질수록 히스토리 토큰 수가 증가하는데, 이 누적된 히스토리가 캐시의 좋은 대상이 됩니다. 일반적으로 추천하는 패턴은 현재 턴 직전의 assistant 메시지 마지막 블록에 cache_control을 지정하는 것입니다. 이렇게 하면 대화가 진행될수록 히스토리가 쌓이고, 다음 요청 때는 쌓인 히스토리 전체가 캐시에서 재사용됩니다.

주의해야 할 것은 cache_control을 가장 최근의 메시지에만 붙여야 한다는 점입니다. 이전 턴에서 이미 캐시된 포인트보다 앞에 있는 내용은 자동으로 재사용되므로, 중복으로 지정하면 예상치 못한 캐시 재생성 비용이 발생할 수 있습니다. 또한 cache_control이 있는 위치보다 뒤에 오는 내용은 캐시되지 않으므로, 동적 유저 메시지는 항상 캐시 포인트 이후에 배치해야 합니다.


OpenAI GPT의 캐싱 전략

자동 캐싱의 동작 방식

OpenAI의 Prompt Caching은 Anthropic과 철학적으로 다른 접근을 택합니다. 개발자가 별도로 cache_control을 지정할 필요 없이 완전 자동으로 캐시가 적용됩니다. OpenAI 인프라가 요청의 prefix를 분석하여 캐시 가능 여부를 판단하고, 히트 시에는 자동으로 할인된 비용을 청구합니다. GPT-4o, GPT-4o mini, o1, o1-mini, o3 계열 모델에서 지원되며, 최소 1024 토큰 이상의 prefix가 필요합니다.

비용 구조는 캐시 히트 시 입력 토큰 비용의 50%만 과금합니다. Anthropic의 10%보다 높지만, 캐시 생성에 별도 비용이 없다는 점이 다릅니다. 트래픽이 불규칙하거나 캐시 히트율을 예측하기 어려운 서비스에서는 OpenAI의 자동 방식이 재정적 리스크 없이 일정한 절감 효과를 보장합니다. 기존 코드를 한 줄도 바꾸지 않고 프롬프트 구조만 조정해도 자동으로 할인이 적용되므로, 캐싱 도입의 진입 장벽이 매우 낮습니다.

OpenAI Prompt Caching 흐름도 요청이 OpenAI 인프라에 도달한 뒤 Prefix 1024+ 토큰 일치 여부에 따라 캐시 히트(50% 과금) 또는 캐시 미스(100% 과금)로 분기되어 응답을 반환하는 흐름. 예 아니오 INPUT 요청 전송 별도 설정 없음 API OpenAI 인프라 자동 판단 Prefix 1024+ 토큰 일치? HIT 캐시 히트 50% 과금 MISS 캐시 미스 100% 과금 OUT 응답 반환 LEGEND 캐시 히트 (50%) 캐시 미스 (100%) 입력 단계 처리 단계 (Focal)

OpenAI 캐싱은 인프라 레벨에서 투명하게 동작하므로 기존 코드 변경 없이 즉시 혜택을 받을 수 있습니다.

캐시 동작의 구조적 특성

OpenAI의 캐싱은 128토큰 단위로 prefix를 분할하여 저장합니다. 이는 프롬프트 앞부분의 일치 여부를 매우 엄격하게 판단한다는 의미입니다. 프롬프트 앞쪽에 타임스탬프, 사용자 이름, 세션 ID 등의 동적 내용이 포함되어 있으면 매 요청이 캐시 미스로 처리됩니다. OpenAI의 캐시는 동일한 Organization 내의 요청들 사이에서 공유됩니다. 팀 내 여러 서비스 인스턴스가 동일한 시스템 프롬프트를 사용한다면, 첫 요청 이후에는 조직 전체가 캐시 혜택을 받을 수 있습니다.

캐시 TTL은 공식적으로 공개되지 않았지만, 비활성 상태에서 일반적으로 5~10분으로 알려져 있습니다. 실제 운영 환경에서 캐시 히트율을 모니터링하려면 응답의 usage.prompt_tokens_details.cached_tokens 값을 확인해야 합니다. 이 값이 꾸준히 높게 유지된다면 프롬프트 구조가 캐싱에 적합하게 설계되어 있다는 신호입니다.

다음은 OpenAI에서 캐시 히트 여부를 확인하는 방법입니다.

python
from openai import OpenAI

client = OpenAI()

response = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {
            "role": "system",
            "content": LONG_SYSTEM_PROMPT  # 1024+ 토큰의 고정 시스템 프롬프트
        },
        {
            "role": "user",
            "content": user_message
        }
    ]
)

usage = response.usage
prompt_details = usage.prompt_tokens_details

# 첫 번째 요청: cached_tokens = 0 (워밍업)
# 두 번째 요청: cached_tokens = 1024 (prefix 캐시 히트)
print(f"전체 입력 토큰: {usage.prompt_tokens}")              # 결과: 1200
print(f"캐시 히트 토큰: {prompt_details.cached_tokens}")     # 결과: 1024
print(f"비캐시 토큰:   {usage.prompt_tokens - prompt_details.cached_tokens}")  # 결과: 176

cached_tokens가 전체 prompt_tokens의 80% 이상이라면 캐싱이 효과적으로 동작하고 있는 것입니다.

툴과 멀티모달 캐싱 지원

OpenAI 캐싱의 차별점 중 하나는 이미지 토큰과 툴 정의에도 캐싱이 적용된다는 점입니다. 에이전트 워크플로우에서 동일한 툴 목록을 매 요청마다 포함시키는 패턴이 일반적인데, 툴 정의가 캐시되면 이 부분의 비용도 절감됩니다. 예를 들어 100개의 툴 정의가 포함된 에이전트 시스템에서는 툴 목록만으로도 수천 토큰이 소비됩니다. OpenAI에서는 이 부분도 자동으로 캐시되므로, 복잡한 에이전트 시스템을 운영하는 팀에게 실질적인 비용 절감이 됩니다.

Anthropic도 툴 캐싱을 지원하지만, cache_control을 툴 배열의 마지막 항목에 명시적으로 추가해야 합니다. 또한 멀티모달 관점에서 OpenAI는 동일한 이미지를 반복 전송할 때도 자동 캐싱이 적용되어, 이미지를 포함하는 배치 처리 파이프라인에서 유의미한 절감이 발생합니다.


두 플랫폼 비교와 선택 기준

비용 구조의 철학적 차이

두 플랫폼의 캐싱 비용 구조는 근본적으로 다른 설계 철학을 반영합니다. Anthropic은 "더 많이 사용할수록 더 아낄 수 있다"는 구조입니다. 캐시 생성 비용이 높은 대신 히트 비용이 극도로 낮아, 동일한 prefix가 반복될수록 ROI가 빠르게 높아집니다. 일일 수천 건 이상의 요청이 동일한 시스템 프롬프트를 사용하는 서비스라면 Anthropic 캐싱의 90% 할인이 장기적으로 훨씬 경제적입니다. OpenAI는 "손해 보지 않는 안전한 구조"에 가깝습니다. 캐시 생성 비용이 없고 히트 시 50% 할인만 적용되어, 저트래픽이거나 캐시 히트율이 불확실한 상황에서도 예상치 못한 초과 비용이 발생하지 않습니다.

Prompt Caching 비용 비교 — Anthropic vs OpenAI 동일 Prefix 100회 요청 시 Anthropic 명시적 캐싱과 OpenAI 자동 캐싱의 비용 구조 및 누적 절감률을 비교한 흐름도. Anthropic은 약 87%, OpenAI는 약 50% 절감. 입력 동일 Prefix 100회 요청 Anthropic 명시적 캐싱 cache_control 마킹 OpenAI 자동 캐싱 설정 불필요 · 자동 적용 비용 1회 +25% / 99회 −90% 첫 요청에 캐시 write 비용 발생 비용 100회 모두 −50% 추가 비용 없이 균일 할인 누적 절감 약 87% 반복 요청일수록 유리 누적 절감 약 50% 예측 가능·설정 불필요 명시적 캐싱 (Anthropic) 자동 캐싱 (OpenAI) 비용 구조 (주의) 비용 구조 (양호) 절감 결과

Anthropic은 고트래픽 환경에서 더 큰 절감을 제공하고, OpenAI는 예측 가능한 고정 절감을 제공합니다.

항목 Anthropic OpenAI
캐시 제어 방식 명시적 (cache_control) 완전 자동
캐시 생성 비용 +25% 없음
캐시 히트 비용 입력 비용의 10% 입력 비용의 50%
최소 캐시 길이 1024 토큰 1024 토큰
캐시 TTL 5분 (최대 1시간) 비공개 (~5~10분)
최대 캐시 포인트 4개 단일 prefix
멀티모달 캐싱 텍스트 중심 텍스트 + 이미지 + 툴
캐시 공유 범위 계정 내 Organization 내
적합한 트래픽 유형 고트래픽 · 규칙적 저트래픽 · 불규칙

아키텍처 선택 기준

플랫폼을 선택하기 전에 서비스의 트래픽 패턴과 비용 구조를 먼저 파악해야 합니다. 트래픽이 높고 동일한 시스템 프롬프트를 일관되게 재사용하는 서비스라면 Anthropic 캐싱이 장기적으로 훨씬 경제적입니다. 반대로 요청 패턴이 불규칙하거나, 테스트·배치 처리가 주를 이루는 파이프라인이라면 OpenAI의 자동 캐싱이 관리 부담 없이 50%의 안정적인 절감을 제공합니다.

Prompt Caching 전략 선택 흐름도 서비스 패턴 분석에서 시작해 트래픽 안정성, Prefix 토큰 수, 일일 호출 횟수를 순서대로 확인하여 Anthropic 명시적 캐싱 또는 OpenAI 자동 캐싱을 권장하는 의사결정 흐름도. 아니오 예 아니오 예 예 아니오 START 서비스 패턴 분석 트래픽이 일정한가 Prefix 1024+ 토큰인가 일 100회 이상 호출 PICK Anthropic 명시적 캐싱 PICK OpenAI 자동 캐싱 LEGEND 판단 조건 Anthropic 명시적 캐싱 권장 OpenAI 자동 캐싱 권장 조건 미충족 경로

트래픽 규칙성과 일일 호출량을 기준으로 플랫폼을 선택하면 비용 최적화의 방향이 명확해집니다.

두 플랫폼을 병행할 때의 고려사항

모델을 한 가지로 고정하지 않고 용도에 따라 여러 모델을 혼용하는 구조에서는 각 플랫폼의 캐싱 특성을 별도로 관리해야 합니다. 빠른 분류 작업에는 GPT-4o mini를, 복잡한 추론에는 Claude Sonnet을 사용하는 아키텍처라면, 두 모델에 보내는 프롬프트 각각에 대해 캐싱이 적절히 동작하는지 별도로 확인해야 합니다. 이때 LLM 게이트웨이 레이어를 두어 cached_tokens와 cache_read_input_tokens를 중앙에서 수집하고 모니터링하는 방식이 운영 측면에서 유리합니다. 플랫폼마다 캐시 히트를 의미하는 필드명과 계산 방식이 다르므로, 추상화 레이어에서 통일된 메트릭으로 변환하는 것이 좋습니다.


운영 환경 적용 시 고려사항

흔한 실수와 함정

캐싱을 처음 도입할 때 가장 빈번한 실수는 동적인 내용을 프롬프트 앞쪽에 배치하는 것입니다. 타임스탬프, 사용자 ID, 세션 ID, 현재 날짜, 랜덤 UUID 등이 시스템 프롬프트 앞에 포함되어 있으면 매 요청이 캐시 미스가 됩니다. 이런 요소들은 프롬프트의 가장 마지막, 즉 유저 메시지 바로 앞에 배치해야 합니다.

핵심 원칙: 프롬프트는 "고정 → 반고정 → 동적" 순서로 배치해야 캐시 히트율이 극대화됩니다. 동적인 내용이 앞에 오면 캐시 전략 전체가 무효화됩니다.

두 번째 함정은 Anthropic에서 캐시 TTL을 고려하지 않는 것입니다. 기본 TTL이 5분이므로, 요청 간 간격이 5분을 초과하면 캐시가 만료됩니다. 저트래픽 서비스에서 이 상황이 반복되면, 캐시 생성 비용(+25%)만 계속 발생하고 히트 없이 만료되는 역효과가 생깁니다. 이런 경우에는 TTL을 1시간으로 늘리거나, Anthropic 캐싱 대신 OpenAI의 자동 캐싱으로 전환을 고려해야 합니다. 세 번째로, Anthropic의 cache_control은 type: "ephemeral" 한 가지 타입만 존재합니다. 영구 캐시를 기대하고 사용하면 안 되며, 모든 캐시는 TTL 기반으로 만료됩니다.

프롬프트 캐싱 구조 프롬프트 설계에서 고정·반고정·동적 구성 요소로 이어지는 흐름과, 고정·반고정 구성 요소에 각각 연결된 캐시 포인트 1·2를 보여주는 순서도. START 프롬프트 설계 FIXED 고정 구성 요소 시스템 역할 · 규칙 SEMI 반고정 구성 요소 Few-shot · 검색 문서 DYNAMIC 동적 구성 요소 유저 메시지 캐시 포인트 1 cache checkpoint 캐시 포인트 2 cache checkpoint LEGEND 고정/반고정 구성 핵심 노드 캐시 포인트 캐시 연결

프롬프트를 고정 → 반고정 → 동적 순으로 설계하고 각 경계에 캐시 포인트를 배치하면 히트율이 자연스럽게 높아집니다.

모니터링과 비용 추적

캐싱 도입 후 효과를 정량적으로 측정하려면 캐시 히트율을 지속적으로 추적해야 합니다. Anthropic API 응답의 usage.cache_read_input_tokens와 usage.cache_creation_input_tokens를, OpenAI는 usage.prompt_tokens_details.cached_tokens를 로깅 시스템에 기록하는 것이 기본입니다. 히트율이 지속적으로 낮다면 프롬프트 구조를 재검토해야 합니다. 특히 **캐시 키 오염(cache key pollution)**이 발생하고 있는지 확인이 필요합니다. 이는 프롬프트 앞부분에 세션마다 달라지는 내용이 섞여 있을 때 발생하며, 표면적으로는 캐시가 활성화되어 있어 보이지만 실제로는 히트가 전혀 발생하지 않는 상태입니다.

지표 측정 방법 목표 경고 기준
캐시 히트율 cached_tokens / total_input_tokens 70% 이상 30% 미만
캐시 생성 비율 creation_tokens / total_input_tokens 5% 이하 20% 초과
평균 비용 절감률 (기준 비용 - 실 비용) / 기준 비용 50% 이상 10% 미만
TTL 만료율 생성 후 히트 없이 만료된 비율 10% 이하 40% 초과

규모 확장과 마이그레이션 전략

서비스가 성장하면서 LLM 호출량이 늘어나면 캐싱 전략도 함께 진화시켜야 합니다. 초기에는 단일 캐시 포인트로 충분하지만, 사용 패턴이 다양해지면 다층 캐시 구조가 필요해집니다. 동일 서비스에서 일반 사용자 흐름과 프리미엄 사용자 흐름이 분리된다면, 각각에 맞는 시스템 프롬프트를 별도로 캐시하는 것이 효과적입니다. 프리미엄 사용자에게는 더 긴 컨텍스트와 더 많은 Few-shot 예제를 포함하더라도, 그 부분이 캐시된다면 비용 부담이 크게 줄어듭니다.

Anthropic에서 OpenAI로, 또는 그 반대로 마이그레이션할 때는 프롬프트 구조 변경이 수반됩니다. Anthropic의 cache_control 어노테이션을 단순히 제거하면 OpenAI 자동 캐싱으로 전환되지만, 프롬프트 내 고정 prefix가 충분히 길고 앞에 배치되어 있는지 반드시 검증해야 합니다. 마이그레이션 직후에는 캐시가 아직 워밍업되지 않아 히트율이 일시적으로 낮아지는 기간이 있습니다.

Prompt Caching 마이그레이션 플로우 마이그레이션 계획 수립 후 Prefix 길이 검증, 1024 토큰 임계값 분기, 섀도 배포를 통한 히트율 측정, 50% 미만 시 프롬프트 재배치 루프를 거쳐 전환 완료에 이르는 의사결정 흐름을 보여준다. 아니오 예 예 아니오 PLAN 마이그레이션 계획 CHECK Prefix 길이 검증 1024 토큰 이상인가? DEPLOY 섀도 배포 히트율 측정 히트율 50% 이상? REVISE 프롬프트 구조 재설계 REORDER 프롬프트 재배치 전환 완료 LEGEND 핵심 단계 처리 단계 대안 경로 분기 조건 루프 / 재시도

마이그레이션은 섀도 배포로 히트율을 먼저 검증한 뒤 전환을 완료하는 순서로 진행합니다.


맺음말

핵심 요약

Prompt Caching은 LLM API 비용을 줄이는 가장 직접적이고 효과적인 방법입니다. Anthropic은 cache_control로 캐시 위치를 명시적으로 지정하며 캐시 히트 시 90% 할인이라는 강력한 절감 효과를 제공합니다. OpenAI는 자동으로 캐시가 적용되어 별도 설정 없이 50% 할인을 받을 수 있습니다. 두 방식 모두 최소 1024 토큰의 고정 prefix가 필요하며, "고정 → 반고정 → 동적" 순서로 프롬프트를 배치하는 구조적 원칙이 성공의 핵심입니다. 캐시 히트율은 반드시 모니터링해야 하며, 히트율이 낮다면 프롬프트 앞부분에 동적 요소가 섞여 있지 않은지 점검하는 것이 첫 번째 단계입니다.

Prompt Caching 전략 선택 플로우차트 일 호출 횟수, Prefix 길이, 히트율 예상치를 순서대로 확인해 OpenAI 자동 캐싱 또는 Anthropic 명시적 캐싱 중 적합한 전략을 안내하는 의사결정 흐름도. 아니오 예 아니오 예 아니오 예 START 캐싱 도입 결정 일 호출 100회 이상? Prefix 1024+ 토큰? 히트율 70%+ 예상? ANTHROPIC 명시적 캐싱 cache_control OPENAI 자동 캐싱 자동 적용 (설정 불필요) 의사결정 Anthropic 명시적 캐싱 OpenAI 자동 캐싱

캐싱 전략 선택은 호출량, prefix 길이, 예상 히트율 세 가지 기준으로 결정할 수 있습니다.

적용 판단 기준

다음 조건 중 하나라도 해당된다면 Prompt Caching 도입이 즉시 유효합니다. 시스템 프롬프트가 1000토큰 이상이고 하루 50회 이상 동일한 프롬프트로 요청을 보내는 경우, RAG 파이프라인에서 동일한 문서 청크가 여러 요청에 반복적으로 포함되는 경우, 또는 품질 향상을 위해 긴 Few-shot 예제를 고정으로 유지하는 경우가 대표적입니다.

반대로 프롬프트의 대부분이 매 요청마다 달라지거나, 요청 빈도가 낮은 배치 작업이라면 캐싱의 이점이 제한적입니다. 특히 Anthropic 캐싱은 캐시 생성 비용이 발생하므로, TTL 내에 히트 횟수가 10회 미만이 예상된다면 OpenAI의 자동 캐싱을 먼저 적용하고 히트율을 측정한 뒤 Anthropic 전환 여부를 검토하는 순서가 실용적입니다. 어느 플랫폼을 선택하든, 프롬프트 구조 설계 단계에서부터 캐싱을 고려하는 것이 사후 최적화보다 훨씬 효과적입니다.