프롬프트 캐싱은 프롬프트의 특정 접두사에서 재개할 수 있도록 하여 API 사용을 최적화하는 강력한 기능입니다. 이 접근 방식은 반복적인 작업이나 일관된 요소가 있는 프롬프트의 처리 시간과 비용을 크게 줄여줍니다.
다음은 cache_control 블록을 사용하여 Messages API에서 프롬프트 캐싱을 구현하는 방법의 예시입니다:
curl https://api.anthropic.com/v1/messages \
-H "content-type: application/json" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-d '{
"model": "claude-opus-4-6",
"max_tokens": 1024,
"system": [
{
"type": "text",
"text": "You are an AI assistant tasked with analyzing literary works. Your goal is to provide insightful commentary on themes, characters, and writing style.\n"
},
{
"type": "text",
"text": "<the entire contents of Pride and Prejudice>",
"cache_control": {"type": "ephemeral"}
}
],
"messages": [
{
"role": "user",
"content": "Analyze the major themes in Pride and Prejudice."
}
]
}'
# 캐시 체크포인트까지 동일한 입력으로 모델을 다시 호출
curl https://api.anthropic.com/v1/messages # rest of input{"cache_creation_input_tokens":188086,"cache_read_input_tokens":0,"input_tokens":21,"output_tokens":393}
{"cache_creation_input_tokens":0,"cache_read_input_tokens":188086,"input_tokens":21,"output_tokens":393}이 예시에서는 "오만과 편견"의 전체 텍스트가 cache_control 매개변수를 사용하여 캐싱됩니다. 이를 통해 매번 재처리하지 않고도 여러 API 호출에서 이 대용량 텍스트를 재사용할 수 있습니다. 사용자 메시지만 변경하면 캐싱된 콘텐츠를 활용하면서 책에 대한 다양한 질문을 할 수 있어 더 빠른 응답과 향상된 효율성을 얻을 수 있습니다.
프롬프트 캐싱이 활성화된 요청을 보내면:
이는 특히 다음과 같은 경우에 유용합니다:
기본적으로 캐시의 수명은 5분입니다. 캐싱된 콘텐츠가 사용될 때마다 추가 비용 없이 캐시가 갱신됩니다.
5분이 너무 짧다고 느끼시면, Anthropic은 추가 비용으로 1시간 캐시 지속 시간도 제공합니다.
자세한 내용은 1시간 캐시 지속 시간을 참조하세요.
프롬프트 캐싱은 전체 접두사를 캐싱합니다
프롬프트 캐싱은 전체 프롬프트를 참조합니다 - tools, system, messages (이 순서대로) cache_control로 지정된 블록까지 포함합니다.
프롬프트 캐싱은 새로운 가격 구조를 도입합니다. 아래 표는 지원되는 각 모델의 백만 토큰당 가격을 보여줍니다:
| Model | Base Input Tokens | 5m Cache Writes | 1h Cache Writes | Cache Hits & Refreshes | Output Tokens |
|---|---|---|---|---|---|
| Claude Opus 4.6 | $5 / MTok | $6.25 / MTok | $10 / MTok | $0.50 / MTok | $25 / MTok |
| Claude Opus 4.5 | $5 / MTok | $6.25 / MTok | $10 / MTok | $0.50 / MTok | $25 / MTok |
| Claude Opus 4.1 | $15 / MTok | $18.75 / MTok | $30 / MTok | $1.50 / MTok | $75 / MTok |
| Claude Opus 4 | $15 / MTok | $18.75 / MTok | $30 / MTok | $1.50 / MTok | $75 / MTok |
| Claude Sonnet 4.5 | $3 / MTok | $3.75 / MTok | $6 / MTok | $0.30 / MTok | $15 / MTok |
| Claude Sonnet 4 | $3 / MTok | $3.75 / MTok | $6 / MTok | $0.30 / MTok | $15 / MTok |
| Claude Sonnet 3.7 (deprecated) | $3 / MTok | $3.75 / MTok | $6 / MTok | $0.30 / MTok | $15 / MTok |
| Claude Haiku 4.5 | $1 / MTok | $1.25 / MTok | $2 / MTok | $0.10 / MTok | $5 / MTok |
| Claude Haiku 3.5 | $0.80 / MTok | $1 / MTok | $1.6 / MTok | $0.08 / MTok | $4 / MTok |
| Claude Opus 3 (deprecated) | $15 / MTok | $18.75 / MTok | $30 / MTok | $1.50 / MTok | $75 / MTok |
| Claude Haiku 3 | $0.25 / MTok | $0.30 / MTok | $0.50 / MTok | $0.03 / MTok | $1.25 / MTok |
위 표는 프롬프트 캐싱에 대한 다음 가격 배수를 반영합니다:
이러한 배수는 Batch API 할인, 긴 컨텍스트 가격, 데이터 레지던시 등 다른 가격 수정자와 중첩됩니다. 전체 세부 사항은 가격을 참조하세요.
프롬프트 캐싱은 현재 다음 모델에서 지원됩니다:
정적 콘텐츠(도구 정의, 시스템 지침, 컨텍스트, 예시)를 프롬프트의 시작 부분에 배치하세요. cache_control 매개변수를 사용하여 캐싱할 재사용 가능한 콘텐츠의 끝을 표시하세요.
캐시 접두사는 다음 순서로 생성됩니다: tools, system, 그 다음 messages. 이 순서는 각 수준이 이전 수준 위에 구축되는 계층 구조를 형성합니다.
정적 콘텐츠의 끝에 하나의 캐시 중단점만 사용할 수 있으며, 시스템은 자동으로 캐싱된 블록의 가장 긴 일치 시퀀스를 찾습니다. 이 작동 방식을 이해하면 캐싱 전략을 최적화하는 데 도움이 됩니다.
세 가지 핵심 원칙:
캐시 키는 누적됩니다: cache_control로 블록을 명시적으로 캐싱하면, 캐시 해시 키는 대화의 모든 이전 블록을 순차적으로 해싱하여 생성됩니다. 이는 각 블록의 캐시가 그 이전의 모든 콘텐츠에 의존한다는 것을 의미합니다.
역방향 순차 확인: 시스템은 명시적 중단점에서 역방향으로 작업하며, 각 이전 블록을 역순으로 확인하여 캐시 히트를 검사합니다. 이를 통해 가능한 가장 긴 캐시 히트를 얻을 수 있습니다.
20블록 역방향 탐색 창: 시스템은 각 명시적 cache_control 중단점 이전의 최대 20개 블록만 확인합니다. 일치 항목 없이 20개 블록을 확인한 후에는 확인을 중단하고 다음 명시적 중단점(있는 경우)으로 이동합니다.
예시: 역방향 탐색 창 이해하기
블록 30에만 cache_control을 설정한 30개의 콘텐츠 블록이 있는 대화를 고려해 보세요:
이전 블록에 변경 없이 블록 31을 보내는 경우: 시스템은 블록 30을 확인합니다(일치!). 블록 30에서 캐시 히트를 얻고, 블록 31만 처리하면 됩니다.
블록 25를 수정하고 블록 31을 보내는 경우: 시스템은 블록 30 → 29 → 28... → 25(불일치) → 24(일치!)로 역방향 확인합니다. 블록 24가 변경되지 않았으므로 블록 24에서 캐시 히트를 얻고, 블록 25-30만 재처리하면 됩니다.
블록 5를 수정하고 블록 31을 보내는 경우: 시스템은 블록 30 → 29 → 28... → 11(확인 #20)로 역방향 확인합니다. 일치 항목을 찾지 못하고 20번 확인한 후 탐색을 중단합니다. 블록 5는 20블록 창을 벗어나므로 캐시 히트가 발생하지 않고 모든 블록을 재처리해야 합니다. 그러나 블록 5에 명시적 cache_control 중단점을 설정했다면, 시스템은 해당 중단점에서 계속 확인합니다: 블록 5(불일치) → 블록 4(일치!). 이를 통해 블록 4에서 캐시 히트가 가능하며, 편집 가능한 콘텐츠 앞에 중단점을 배치해야 하는 이유를 보여줍니다.
핵심 요점: 캐시 히트 가능성을 최대화하려면 항상 대화 끝에 명시적 캐시 중단점을 설정하세요. 또한 편집될 수 있는 콘텐츠 블록 바로 앞에 중단점을 설정하여 해당 섹션이 독립적으로 캐싱될 수 있도록 하세요.
다음과 같은 경우 최대 4개의 캐시 중단점을 정의할 수 있습니다:
중요한 제한 사항: 프롬프트에 캐시 중단점 이전에 20개 이상의 콘텐츠 블록이 있고, 해당 20개 블록보다 앞쪽의 콘텐츠를 수정하면, 해당 콘텐츠에 더 가까운 추가 명시적 중단점을 추가하지 않는 한 캐시 히트를 얻을 수 없습니다.
최소 캐싱 가능 프롬프트 길이는 다음과 같습니다:
더 짧은 프롬프트는 cache_control로 표시되어 있더라도 캐싱할 수 없습니다. 이 토큰 수보다 적은 양을 캐싱하려는 요청은 캐싱 없이 처리됩니다. 프롬프트가 캐싱되었는지 확인하려면 응답 사용량 필드를 참조하세요.
동시 요청의 경우, 캐시 항목은 첫 번째 응답이 시작된 후에만 사용 가능해집니다. 병렬 요청에 대한 캐시 히트가 필요한 경우, 후속 요청을 보내기 전에 첫 번째 응답을 기다리세요.
현재 "ephemeral"이 유일하게 지원되는 캐시 유형이며, 기본적으로 5분의 수명을 가집니다.
캐시 중단점 자체는 비용을 추가하지 않습니다. 다음에 대해서만 요금이 부과됩니다:
더 많은 cache_control 중단점을 추가해도 비용이 증가하지 않습니다 - 실제로 캐싱되고 읽히는 콘텐츠에 따라 동일한 금액을 지불합니다. 중단점은 단순히 어떤 섹션이 독립적으로 캐싱될 수 있는지에 대한 제어를 제공합니다.
요청의 대부분의 블록은 cache_control로 캐싱을 지정할 수 있습니다. 여기에는 다음이 포함됩니다:
tools 배열의 도구 정의system 배열의 콘텐츠 블록messages.content 배열의 콘텐츠 블록messages.content 배열의 콘텐츠 블록messages.content 배열의 콘텐츠 블록이러한 각 요소는 cache_control로 표시하여 요청의 해당 부분에 대한 캐싱을 활성화할 수 있습니다.
대부분의 요청 블록은 캐싱할 수 있지만, 몇 가지 예외가 있습니다:
사고 블록은 cache_control로 직접 캐싱할 수 없습니다. 그러나 사고 블록은 이전 어시스턴트 턴에 나타날 때 다른 콘텐츠와 함께 캐싱될 수 있습니다. 이렇게 캐싱되면 캐시에서 읽힐 때 입력 토큰으로 계산됩니다.
하위 콘텐츠 블록(예: 인용)은 직접 캐싱할 수 없습니다. 대신 최상위 블록을 캐싱하세요.
인용의 경우, 인용의 소스 자료 역할을 하는 최상위 문서 콘텐츠 블록을 캐싱할 수 있습니다. 이를 통해 인용이 참조할 문서를 캐싱하여 인용과 함께 프롬프트 캐싱을 효과적으로 사용할 수 있습니다.
빈 텍스트 블록은 캐싱할 수 없습니다.
캐싱된 콘텐츠의 수정은 캐시의 일부 또는 전체를 무효화할 수 있습니다.
프롬프트 구조화에서 설명한 대로, 캐시는 tools → system → messages 계층 구조를 따릅니다. 각 수준의 변경은 해당 수준과 모든 후속 수준을 무효화합니다.
다음 표는 다양한 유형의 변경에 의해 캐시의 어떤 부분이 무효화되는지 보여줍니다. ✘는 캐시가 무효화됨을 나타내고, ✓는 캐시가 유효하게 유지됨을 나타냅니다.
| 변경 사항 | 도구 캐시 | 시스템 캐시 | 메시지 캐시 | 영향 |
|---|---|---|---|---|
| 도구 정의 | ✘ | ✘ | ✘ | 도구 정의(이름, 설명, 매개변수) 수정은 전체 캐시를 무효화합니다 |
| 웹 검색 토글 | ✓ | ✘ | ✘ | 웹 검색 활성화/비활성화는 시스템 프롬프트를 수정합니다 |
| 인용 토글 | ✓ | ✘ | ✘ | 인용 활성화/비활성화는 시스템 프롬프트를 수정합니다 |
| 도구 선택 | ✓ | ✓ | ✘ | tool_choice 매개변수 변경은 메시지 블록에만 영향을 미칩니다 |
| 이미지 | ✓ | ✓ | ✘ | 프롬프트 어디에서든 이미지 추가/제거는 메시지 블록에 영향을 미칩니다 |
| 사고 매개변수 | ✓ | ✓ | ✘ | 확장 사고 설정 변경(활성화/비활성화, 예산)은 메시지 블록에 영향을 미칩니다 |
| 확장 사고 요청에 전달된 비도구 결과 | ✓ | ✓ | ✘ | 확장 사고가 활성화된 상태에서 비도구 결과가 요청에 전달되면, 이전에 캐싱된 모든 사고 블록이 컨텍스트에서 제거되고, 해당 사고 블록 뒤에 오는 컨텍스트의 모든 메시지가 캐시에서 제거됩니다. 자세한 내용은 사고 블록과 함께 캐싱을 참조하세요. |
응답의 usage 내 (또는 스트리밍 시 message_start 이벤트 내) 다음 API 응답 필드를 사용하여 캐시 성능을 모니터링하세요:
cache_creation_input_tokens: 새 항목을 생성할 때 캐시에 기록된 토큰 수.cache_read_input_tokens: 이 요청에 대해 캐시에서 검색된 토큰 수.input_tokens: 캐시에서 읽히거나 캐시를 생성하는 데 사용되지 않은 입력 토큰 수 (즉, 마지막 캐시 중단점 이후의 토큰).토큰 분류 이해하기
input_tokens 필드는 요청에서 마지막 캐시 중단점 이후에 오는 토큰만 나타냅니다 - 보낸 모든 입력 토큰이 아닙니다.
총 입력 토큰을 계산하려면:
total_input_tokens = cache_read_input_tokens + cache_creation_input_tokens + input_tokens공간적 설명:
cache_read_input_tokens = 이미 캐싱된 중단점 이전의 토큰 (읽기)cache_creation_input_tokens = 현재 캐싱 중인 중단점 이전의 토큰 (쓰기)input_tokens = 마지막 중단점 이후의 토큰 (캐시 대상이 아님)예시: 100,000 토큰의 캐싱된 콘텐츠(캐시에서 읽음), 0 토큰의 새로 캐싱되는 콘텐츠, 사용자 메시지의 50 토큰(캐시 중단점 이후)이 있는 요청의 경우:
cache_read_input_tokens: 100,000cache_creation_input_tokens: 0input_tokens: 50이는 비용과 속도 제한을 이해하는 데 중요합니다. 캐싱을 효과적으로 사용할 때 input_tokens는 일반적으로 총 입력보다 훨씬 작습니다.
프롬프트 캐싱 성능을 최적화하려면:
시나리오에 맞게 프롬프트 캐싱 전략을 조정하세요:
예상치 못한 동작이 발생하는 경우:
tool_choice 및 이미지 사용이 호출 간에 일관되게 유지되는지 확인하세요cache_control 매개변수가 필요할 수 있습니다tool_use 콘텐츠 블록의 키가 안정적인 순서를 가지고 있는지 확인하세요. 일부 언어(예: Swift, Go)는 JSON 변환 시 키 순서를 무작위화하여 캐시를 깨뜨릴 수 있습니다tool_choice 변경이나 프롬프트 어디에서든 이미지의 존재/부재는 캐시를 무효화하여 새 캐시 항목을 생성해야 합니다. 캐시 무효화에 대한 자세한 내용은 캐시를 무효화하는 요인을 참조하세요.
프롬프트 캐싱과 함께 확장 사고를 사용할 때, 사고 블록은 특별한 동작을 합니다:
다른 콘텐츠와 함께 자동 캐싱: 사고 블록은 cache_control로 명시적으로 표시할 수 없지만, 도구 결과와 함께 후속 API 호출을 할 때 요청 콘텐츠의 일부로 캐싱됩니다. 이는 도구 사용 중 사고 블록을 다시 전달하여 대화를 계속할 때 일반적으로 발생합니다.
입력 토큰 계산: 사고 블록이 캐시에서 읽힐 때, 사용량 메트릭에서 입력 토큰으로 계산됩니다. 이는 비용 계산과 토큰 예산 책정에 중요합니다.
캐시 무효화 패턴:
cache_control 마커 없이도 발생합니다캐시 무효화에 대한 자세한 내용은 캐시를 무효화하는 요인을 참조하세요.
도구 사용 예시:
Request 1: User: "What's the weather in Paris?"
Response: [thinking_block_1] + [tool_use block 1]
Request 2:
User: ["What's the weather in Paris?"],
Assistant: [thinking_block_1] + [tool_use block 1],
User: [tool_result_1, cache=True]
Response: [thinking_block_2] + [text block 2]
# Request 2는 요청 콘텐츠를 캐싱합니다 (응답이 아님)
# 캐시에는 다음이 포함됩니다: 사용자 메시지, thinking_block_1, tool_use block 1, tool_result_1
Request 3:
User: ["What's the weather in Paris?"],
Assistant: [thinking_block_1] + [tool_use block 1],
User: [tool_result_1, cache=True],
Assistant: [thinking_block_2] + [text block 2],
User: [Text response, cache=True]
# 비도구 결과 사용자 블록으로 인해 모든 사고 블록이 무시됩니다
# 이 요청은 사고 블록이 없었던 것처럼 처리됩니다비도구 결과 사용자 블록이 포함되면, 새로운 어시스턴트 루프를 지정하고 이전의 모든 사고 블록이 컨텍스트에서 제거됩니다.
자세한 내용은 확장 사고 문서를 참조하세요.
2026년 2월 5일부터 프롬프트 캐싱은 조직 수준 격리 대신 워크스페이스 수준 격리를 사용합니다. 캐시는 워크스페이스별로 격리되어 동일 조직 내 워크스페이스 간 데이터 분리를 보장합니다. 이 변경 사항은 Claude API 및 Azure에 적용됩니다. Amazon Bedrock 및 Google Vertex AI는 조직 수준 캐시 격리를 유지합니다. 여러 워크스페이스를 사용하는 경우, 이 변경 사항을 고려하여 캐싱 전략을 검토하세요.
조직 격리: 캐시는 조직 간에 격리됩니다. 동일한 프롬프트를 사용하더라도 서로 다른 조직은 캐시를 공유하지 않습니다.
정확한 일치: 캐시 히트는 캐시 제어로 표시된 블록까지의 모든 텍스트와 이미지를 포함하여 100% 동일한 프롬프트 세그먼트가 필요합니다.
출력 토큰 생성: 프롬프트 캐싱은 출력 토큰 생성에 영향을 미치지 않습니다. 받는 응답은 프롬프트 캐싱을 사용하지 않았을 때 받는 것과 동일합니다.
5분이 너무 짧다고 느끼시면, Anthropic은 추가 비용으로 1시간 캐시 지속 시간도 제공합니다.
확장 캐시를 사용하려면 cache_control 정의에 ttl을 다음과 같이 포함하세요:
"cache_control": {
"type": "ephemeral",
"ttl": "5m" | "1h"
}응답에는 다음과 같은 상세한 캐시 정보가 포함됩니다:
{
"usage": {
"input_tokens": ...,
"cache_read_input_tokens": ...,
"cache_creation_input_tokens": ...,
"output_tokens": ...,
"cache_creation": {
"ephemeral_5m_input_tokens": 456,
"ephemeral_1h_input_tokens": 100,
}
}
}현재 cache_creation_input_tokens 필드는 cache_creation 객체의 값의 합과 같습니다.
정기적인 주기로 사용되는 프롬프트(즉, 5분보다 더 자주 사용되는 시스템 프롬프트)가 있는 경우, 추가 비용 없이 계속 갱신되므로 5분 캐시를 계속 사용하세요.
1시간 캐시는 다음 시나리오에서 가장 잘 사용됩니다:
5분 캐시와 1시간 캐시는 지연 시간 측면에서 동일하게 동작합니다. 긴 문서의 경우 일반적으로 첫 번째 토큰까지의 시간이 개선됩니다.
동일한 요청에서 1시간과 5분 캐시 제어를 모두 사용할 수 있지만, 중요한 제약 조건이 있습니다: 더 긴 TTL의 캐시 항목이 더 짧은 TTL보다 먼저 나타나야 합니다 (즉, 1시간 캐시 항목은 5분 캐시 항목보다 앞에 나타나야 합니다).
TTL을 혼합할 때, 프롬프트에서 세 가지 청구 위치를 결정합니다:
A: 가장 높은 캐시 히트의 토큰 수 (히트가 없으면 0).B: A 이후의 가장 높은 1시간 cache_control 블록의 토큰 수 (없으면 A와 같음).C: 마지막 cache_control 블록의 토큰 수.B 및/또는 C가 A보다 크면, A가 가장 높은 캐시 히트이므로 반드시 캐시 미스가 됩니다.
다음에 대해 요금이 부과됩니다:
A에 대한 캐시 읽기 토큰.(B - A)에 대한 1시간 캐시 쓰기 토큰.(C - B)에 대한 5분 캐시 쓰기 토큰.다음은 3가지 예시입니다. 이는 3개의 요청의 입력 토큰을 나타내며, 각각 다른 캐시 히트와 캐시 미스를 가집니다. 결과적으로 색상 상자에 표시된 것처럼 각각 다른 계산된 가격이 적용됩니다.
프롬프트 캐싱을 시작하는 데 도움이 되도록, 자세한 예제와 모범 사례가 포함된 프롬프트 캐싱 쿡북을 준비했습니다.
아래에는 다양한 프롬프트 캐싱 패턴을 보여주는 여러 코드 스니펫을 포함했습니다. 이 예제들은 다양한 시나리오에서 캐싱을 구현하는 방법을 보여주며, 이 기능의 실용적인 활용 방법을 이해하는 데 도움이 됩니다:
Was this page helpful?