OpenAI 프롬프트 접두사 캐싱
반복되는 긴 시스템 프롬프트 접두사에 50% 할인 혜택을 제공하는 OpenAI의 자동 프롬프트 캐싱을 활용하고, 캐시 적중률을 극대화하도록 프롬프트를 구성합니다.
OpenAI 프롬프트 접두사 캐싱은(는) CoddyKit의 무료 AI Engineering Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 AI Engineering Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. AI Engineering Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
프롬프트 접두사 캐싱이란 무엇인가요?
프롬프트 접두사 캐싱은 OpenAI API에 내장된 서버 측 최적화 기능으로, 최근 이전 요청에서 사용된 프롬프트 접두사의 토큰을 자동으로 할인합니다. 저장된 응답을 반환하는 애플리케이션 수준 캐싱과 달리, 프롬프트 접두사 캐싱은 여전히 모델을 호출하지만 캐시된 접두사 부분의 입력 토큰 가격을 50퍼센트 절감합니다. 따라서 새로 생성된 응답을 유지하면서 비용을 줄일 수 있습니다.
접두사 캐싱의 내부 작동 방식
최신 LLM은 프롬프트를 GPU 메모리의 KV(키-값) 캐시로 표현합니다. 프롬프트를 처리하려면 모든 토큰에 대한 어텐션 키와 값을 계산해야 합니다. 연속된 두 요청의 처음 N개 토큰이 동일하면 OpenAI는 첫 번째 요청의 KV 캐시를 재사용하여 해당 토큰에 필요한 비용이 큰 계산을 건너뛸 수 있습니다. API가 이 작업을 자동으로 투명하게 처리하므로, 적용될 때 더 저렴한 캐시 토큰 요금만 지불하면 됩니다.
# No code changes needed to enable prefix caching!
# It is automatic on supported models.
# The API response shows you how many tokens were cached:
# response.usage.prompt_tokens_details.cached_tokens
# Example response usage:
# ChatCompletionUsage(
# prompt_tokens=2048,
# completion_tokens=256,
# total_tokens=2304,
# prompt_tokens_details=PromptTokensDetails(
# cached_tokens=1984, # these tokens were served from KV cache
# audio_tokens=0,
# )
# )응답에서 캐시 적중 확인
각 API 호출 후 response.usage.prompt_tokens_details.cached_tokens를 확인하여 KV 캐시에서 제공된 입력 토큰 수를 확인하십시오. cached_tokens > 0이면 해당 토큰에 대해 50퍼센트 할인 요금을 지불한 것입니다. 이 값을 기록하면 실제 캐시 효율을 추적하고 시간에 따른 접두사 캐싱 비용 절감액을 계산할 수 있습니다.
from openai import OpenAI
client = OpenAI()
SYSTEM_PROMPT = 'You are an expert AI engineer assistant. ' * 100 # long system prompt
def call_with_cache_check(user_message: str):
response = client.chat.completions.create(
model='gpt-4o-mini',
messages=[
{'role': 'system', 'content': SYSTEM_PROMPT},
{'role': 'user', 'content': user_message},
],
)
usage = response.usage
cached = usage.prompt_tokens_details.cached_tokens if usage.prompt_tokens_details else 0
print(f'Total prompt tokens: {usage.prompt_tokens}')
print(f'Cached tokens: {cached} ({100*cached//usage.prompt_tokens}%)')
return response.choices[0].message.content접두사는 완전히 동일해야 합니다
접두사 캐싱은 처음 N개 토큰이 최근 이전 요청과 바이트 단위로 완전히 동일할 때만 적용됩니다. 시스템 프롬프트의 문자 하나만 바뀌어도 캐시가 무효화됩니다. OpenAI는 128토큰 단위로 캐시하므로, 정확히 일치하는 완전한 청크에 캐시가 적용됩니다. 따라서 요청마다 달라지는 프롬프트 부분은 캐시되는 토큰 수를 최대화할 수 있도록 길고 안정적인 접두사 뒤에 배치해야 합니다.
# Optimal structure for prefix caching:
# [LONG STABLE SYSTEM PROMPT] [CACHED DOCUMENTS] [USER QUERY]
# ↑ ↑ ↑
# always same always same varies per request
# → cached at 50% → cached at 50% → not cached, full price
# BAD structure (defeats prefix caching):
# [USER QUERY] [CACHED DOCUMENTS] [LONG STABLE SYSTEM PROMPT]
# ↑ ↑
# changes every request never cached because
# so prefix never matches it comes after the query캐시 효율을 극대화하는 프롬프트 구성
캐시 적중률을 최대화하려면 안정적인 부분이 먼저 오도록 프롬프트를 구성하십시오. RAG 시스템에서는 다음 순서를 사용합니다. (1) 지침과 페르소나를 포함한 시스템 프롬프트, (2) 쿼리가 크게 바뀔 때만 변경되는 검색된 문서, (3) 대화 기록, (4) 맨 마지막의 사용자 쿼리입니다. 시스템 프롬프트만 해도 보통 500~2000토큰이므로 일반적으로 캐시되어 입력 토큰 비용을 25~50퍼센트 절감할 수 있습니다.
def build_rag_prompt_for_caching(
system_prompt: str,
retrieved_docs: list[str],
conversation_history: list[dict],
user_query: str,
) -> list[dict]:
# Order: stable → semi-stable → variable
context_block = '\n\n'.join(
f'[Document {i+1}]\n{doc}' for i, doc in enumerate(retrieved_docs)
)
return [
# 1. Stable system prompt (always cached after first request)
{'role': 'system', 'content': system_prompt},
# 2. Context injection as a user message (cached when same docs retrieved)
{'role': 'user', 'content': f'Context documents:\n{context_block}'},
{'role': 'assistant', 'content': 'I have read the documents.'},
# 3. Conversation history (semi-stable)
*conversation_history,
# 4. Current user query (always different → never cached prefix)
{'role': 'user', 'content': user_query},
]캐시 유지 기간과 제거
OpenAI의 KV 캐시는 GPU 메모리에 유지되며 제거 정책이 적용됩니다. 약 5~10분 동안 재사용되지 않은 접두사는 다른 요청이 GPU 메모리를 차지함에 따라 제거됩니다. 따라서 접두사 캐싱의 이점은 동일한 접두사를 공유하는 요청이 자주 발생하는 고처리량 애플리케이션에서 가장 큽니다. 트래픽이 적은 애플리케이션에서는 요청 간 간격이 길어 접두사가 제거되므로 캐시 적중이 거의 발생하지 않을 수 있습니다.
지원 모델 및 가격
2025년 기준으로 프롬프트 접두사 캐싱은 GPT-4o, GPT-4o-mini, o1, o3-mini 모델에서 사용할 수 있습니다. 대부분의 모델에서 캐시된 토큰 가격은 표준 입력 토큰 가격의 50퍼센트입니다. 캐시할 수 있는 접두사의 최소 길이는 1024토큰이며, 이보다 짧은 접두사에는 할인이 적용되지 않습니다. 기능이 발전함에 따라 가격이 변경되므로 현재 요금은 항상 OpenAI 가격 페이지에서 확인하십시오.
# Rough pricing reference (verify at platform.openai.com/pricing)
PRICING = {
'gpt-4o': {
'input_per_1M': 2.50,
'cached_input_per_1M': 1.25, # 50% off
'output_per_1M': 10.00,
},
'gpt-4o-mini': {
'input_per_1M': 0.15,
'cached_input_per_1M': 0.075, # 50% off
'output_per_1M': 0.60,
},
}
def estimate_cost_with_caching(prompt_tokens, cached_tokens, output_tokens, model):
p = PRICING[model]
uncached = (prompt_tokens - cached_tokens) * p['input_per_1M'] / 1_000_000
cached_cost = cached_tokens * p['cached_input_per_1M'] / 1_000_000
output_cost = output_tokens * p['output_per_1M'] / 1_000_000
return uncached + cached_cost + output_costAnthropic 프롬프트 캐싱
Anthropic은 Claude 모델에 프롬프트 캐싱이라는 유사한 기능을 제공하지만, 프롬프트에서 캐시 중단점을 cache_control 필드로 표시하여 명시적으로 사용하도록 설정해야 합니다. OpenAI의 자동 캐싱과 달리 캐시할 프롬프트 부분을 직접 표시해야 하며, 요청당 캐시 중단점은 최대 4개입니다. 캐시된 토큰의 비용은 표준 입력 가격의 10퍼센트이며 5분 동안 저장됩니다.
import anthropic
client = anthropic.Anthropic()
LONG_DOCUMENT = 'This is a very long reference document...' * 500 # 2000+ tokens
response = client.messages.create(
model='claude-sonnet-4-5',
max_tokens=1024,
system=[
{
'type': 'text',
'text': 'You are a helpful assistant.',
},
{
'type': 'text',
'text': LONG_DOCUMENT,
'cache_control': {'type': 'ephemeral'}, # mark for caching
}
],
messages=[{'role': 'user', 'content': 'Summarize the document.'}],
)
print(response.usage.cache_read_input_tokens) # tokens served from cache
print(response.usage.cache_creation_input_tokens) # tokens written to cache접두사 캐싱과 애플리케이션 캐싱 결합
접두사 캐싱과 애플리케이션 수준 캐싱은 상호 보완적입니다. 접두사 캐싱은 각 API 호출 비용을 줄이지만 LLM은 여전히 호출합니다. 애플리케이션 수준의 정확한 캐시와 시맨틱 캐시는 반복 쿼리에 대한 API 호출을 완전히 없앱니다. 모든 요청에 접두사 캐싱을 사용하여 호출당 입력 비용을 줄이고, 그 위에 애플리케이션 수준 캐싱을 추가하여 자주 반복되는 쿼리의 호출을 완전히 제거하십시오. 두 방식을 함께 사용하면 AI 인프라 비용을 60~80퍼센트 줄일 수 있습니다.
# Three-layer cost optimization stack
#
# Layer 1: Exact cache (Redis, hash-based)
# → Eliminates 100% of API cost for identical requests
# → Miss rate: ~60-80% (most queries are unique)
#
# Layer 2: Semantic cache (vector similarity)
# → Eliminates 100% of API cost for semantically similar requests
# → Miss rate: ~40-60% of remaining queries
#
# Layer 3: OpenAI prefix caching (automatic)
# → Reduces input token cost by 50% for long stable prefixes
# → Applies to ALL remaining API calls that escape layers 1 and 2
#
# Combined effect: 60-80% cost reduction in FAQ/support applications캐시 효율 측정
캐시 효율 비율을 종합 지표로 추적하십시오. 이는 전체 토큰을 정가로 계산한 값에서 실제 청구된 전체 토큰을 나눈 값입니다. 이 지표는 모든 캐싱 계층을 반영합니다. 모든 API 응답에서 cached_tokens를 기록하고 매주 합산하십시오. 모든 API 호출에서 토큰의 50퍼센트가 캐시되는 시스템은 애플리케이션 코드를 변경하지 않고도 접두사 캐싱을 통해 입력 토큰 비용을 사실상 절반으로 줄이는 셈입니다.
from dataclasses import dataclass, field
from typing import ClassVar
@dataclass
class CachingMetrics:
total_prompt_tokens: int = 0
total_cached_tokens: int = 0
app_cache_hits: int = 0
app_cache_misses: int = 0
@property
def prefix_cache_ratio(self) -> float:
if self.total_prompt_tokens == 0:
return 0
return self.total_cached_tokens / self.total_prompt_tokens
@property
def app_cache_hit_rate(self) -> float:
total = self.app_cache_hits + self.app_cache_misses
return self.app_cache_hits / total if total > 0 else 0
def report(self):
print(f'App cache hit rate: {self.app_cache_hit_rate:.1%}')
print(f'Prefix cache ratio: {self.prefix_cache_ratio:.1%}')
savings_multiplier = (1 - self.app_cache_hit_rate) * (1 - 0.5 * self.prefix_cache_ratio)
print(f'Effective cost vs no-cache: {savings_multiplier:.1%}')접두사 캐싱이 도움이 되지 않는 경우
다음과 같은 경우 접두사 캐싱의 이점이 없습니다. (1) 캐시할 수 있는 최소 길이인 1024토큰보다 짧은 짧은 프롬프트, (2) 사용자나 요청마다 시스템 프롬프트가 바뀌는 변경이 매우 잦은 접두사, (3) 요청 사이에 KV 캐시가 제거되는 트래픽이 적은 애플리케이션, (4) 이미 최저 토큰 요금을 지불하고 있는 경우입니다. 이러한 경우에는 애플리케이션 수준의 시맨틱 캐싱에 최적화 노력을 집중하십시오.
빠른 확인
이 강의에서 배운 OpenAI 프롬프트 접두사 캐싱에 대한 이해도를 확인하십시오.
강의 요약
이 강의에서는 다음을 배웠습니다. OpenAI 프롬프트 접두사 캐싱은 프롬프트 접두사가 최근 이전 요청과 일치할 때 캐시된 입력 토큰에 자동으로 50퍼센트 할인을 적용합니다. 캐시되는 토큰을 최대화하려면 메시지 구조에서 안정적인 콘텐츠를 먼저 배치해야 하며(시스템 프롬프트, 문서, 사용자 쿼리 순서), Claude의 유사한 기능을 사용하려면 Anthropic에서 명시적인 cache_control 표시가 필요합니다. 비용을 최대한 줄이려면 애플리케이션 수준 캐싱과 결합하십시오. 다음으로는 최적화 도구 모음을 완성하기 위해 일괄 처리, 모델 라우팅, 비용 대시보드를 살펴봅니다.
자주 묻는 질문
“OpenAI 프롬프트 접두사 캐싱” 강의는 무료인가요?
네 — “OpenAI 프롬프트 접두사 캐싱” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 AI Engineering Academy 강의 전체를 잠금 해제할 수 있습니다. AI Engineering Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“OpenAI 프롬프트 접두사 캐싱”에서 뭘 배우나요?
반복되는 긴 시스템 프롬프트 접두사에 50% 할인 혜택을 제공하는 OpenAI의 자동 프롬프트 캐싱을 활용하고, 캐시 적중률을 극대화하도록 프롬프트를 구성합니다. 브라우저에서 직접 실행하는 실습 코드로 AI Engineering Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
AI Engineering Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 AI Engineering Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“OpenAI 프롬프트 접두사 캐싱” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 AI Engineering Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 AI Engineering Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- Redis를 활용한 정확한 캐싱
- 임베딩을 활용한 의미 기반 캐싱
- OpenAI 프롬프트 접두사 캐싱
- 일괄 처리, 모델 라우팅, 비용 대시보드