프롬프트 캐싱은 프롬프트의 특정 접두사부터 재개할 수 있도록 하여 API 사용을 최적화합니다. 이를 통해 반복적인 작업이나 일관된 요소를 포함한 프롬프트의 처리 시간과 비용을 크게 줄일 수 있습니다.
이 기능은 Zero Data Retention (ZDR)의 적용 대상입니다. 조직에 ZDR 계약이 체결되어 있는 경우, 이 기능을 통해 전송된 데이터는 API 응답이 반환된 후 저장되지 않습니다.
프롬프트 캐싱을 활성화하는 방법은 두 가지입니다:
cache_control 필드를 추가합니다. 시스템이 자동으로 마지막 캐시 가능 블록에 캐시 중단점을 적용하고 대화가 진행됨에 따라 이를 앞으로 이동시킵니다. 증가하는 메시지 기록을 자동으로 캐시해야 하는 멀티턴 대화에 가장 적합합니다.cache_control을 배치하여 정확히 무엇이 캐시되는지 세밀하게 제어합니다.가장 간단한 시작 방법은 자동 캐싱입니다:
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=1024,
cache_control={"type": "ephemeral"},
system="You are an AI assistant tasked with analyzing literary works. Your goal is to provide insightful commentary on themes, characters, and writing style.",
messages=[
{
"role": "user",
"content": "Analyze the major themes in 'Pride and Prejudice'.",
}
],
)
print(response.usage.model_dump_json())자동 캐싱을 사용하면 시스템이 마지막 캐시 가능 블록까지의 모든 콘텐츠를 캐시합니다. 동일한 접두사를 가진 후속 요청에서는 캐시된 콘텐츠가 자동으로 재사용됩니다.
프롬프트 캐싱이 활성화된 요청을 보내면:
이는 특히 다음과 같은 경우에 유용합니다:
기본적으로 캐시의 수명은 5분입니다. 캐시된 콘텐츠가 사용될 때마다 추가 비용 없이 캐시가 갱신됩니다.
5분이 너무 짧다고 생각되면 Anthropic은 추가 비용으로 1시간 캐시 지속 시간도 제공합니다.
자세한 내용은 1시간 캐시 지속 시간을 참조하세요.
프롬프트 캐싱은 전체 접두사를 캐시합니다
프롬프트 캐싱은 cache_control로 지정된 블록까지 포함하여 전체 프롬프트(tools, system, messages 순서)를 참조합니다.
프롬프트 캐싱은 새로운 가격 구조를 도입합니다. 아래 표는 지원되는 각 모델의 백만 토큰당 가격을 보여줍니다:
| 모델 | 기본 입력 토큰 | 5분 캐시 쓰기 | 1시간 캐시 쓰기 | 캐시 적중 및 갱신 | 출력 토큰 |
|---|---|---|---|---|---|
| Claude Fable 5 | $10 / MTok | $12.50 / MTok | $20 / MTok | $1 / MTok | $50 / MTok |
| Claude Mythos 5 (제한된 가용성) | $10 / MTok | $12.50 / MTok | $20 / MTok | $1 / MTok | $50 / MTok |
| Claude Opus 4.8 | $5 / MTok | $6.25 / MTok | $10 / MTok | $0.50 / MTok | $25 / MTok |
| Claude Opus 4.7 | $5 / MTok | $6.25 / MTok | $10 / MTok | $0.50 / MTok | $25 / MTok |
| 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.6 | $3 / MTok | $3.75 / MTok | $6 / MTok | $0.30 / MTok | $15 / 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 Haiku 4.5 | $1 / MTok | $1.25 / MTok | $2 / MTok | $0.10 / MTok | $5 / MTok |
| Claude Haiku 3.5 (Bedrock 및 Vertex AI를 제외하고 종료됨) | $0.80 / MTok | $1 / MTok | $1.60 / MTok | $0.08 / MTok | $4 / MTok |
위 표는 프롬프트 캐싱에 대한 다음 가격 배수를 반영합니다:
이러한 배수는 Batch API 할인 및 데이터 레지던시와 같은 다른 가격 조정 요소와 중첩 적용됩니다. 자세한 내용은 가격을 참조하세요.
프롬프트 캐싱(자동 및 명시적 모두)은 모든 활성 Claude 모델에서 지원됩니다.
자동 캐싱은 프롬프트 캐싱을 활성화하는 가장 간단한 방법입니다. 개별 콘텐츠 블록에 cache_control을 배치하는 대신 요청 본문의 최상위 레벨에 단일 cache_control 필드를 추가합니다. 시스템이 자동으로 마지막 캐시 가능 블록에 캐시 중단점을 적용합니다.
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=1024,
cache_control={"type": "ephemeral"},
system="You are a helpful assistant that remembers our conversation.",
messages=[
{"role": "user", "content": "My name is Alex. I work on machine learning."},
{
"role": "assistant",
"content": "Nice to meet you, Alex! How can I help with your ML work today?",
},
{"role": "user", "content": "What did I say I work on?"},
],
)
print(response.usage.model_dump_json())자동 캐싱을 사용하면 대화가 진행됨에 따라 캐시 지점이 자동으로 앞으로 이동합니다. 각 새 요청은 마지막 캐시 가능 블록까지의 모든 내용을 캐시하고, 이전 콘텐츠는 캐시에서 읽습니다.
| 요청 | 콘텐츠 | 캐시 동작 |
|---|---|---|
| 요청 1 | System + User(1) + Asst(1) + User(2) ◀ 캐시 | 모든 내용이 캐시에 기록됨 |
| 요청 2 | System + User(1) + Asst(1) + User(2) + Asst(2) + User(3) ◀ 캐시 | System부터 User(2)까지 캐시에서 읽음; Asst(2) + User(3)이 캐시에 기록됨 |
| 요청 3 | System + User(1) + Asst(1) + User(2) + Asst(2) + User(3) + Asst(3) + User(4) ◀ 캐시 | System부터 User(3)까지 캐시에서 읽음; Asst(3) + User(4)가 캐시에 기록됨 |
캐시 중단점은 각 요청에서 마지막 캐시 가능 블록으로 자동 이동하므로 대화가 진행되어도 cache_control 마커를 업데이트할 필요가 없습니다.
기본적으로 자동 캐싱은 5분 TTL을 사용합니다. 기본 입력 토큰 가격의 2배로 1시간 TTL을 지정할 수 있습니다:
{ "cache_control": { "type": "ephemeral", "ttl": "1h" } }자동 캐싱은 명시적 캐시 중단점과 호환됩니다. 함께 사용할 경우 자동 캐시 중단점은 사용 가능한 4개의 중단점 슬롯 중 하나를 사용합니다.
이를 통해 두 접근 방식을 결합할 수 있습니다. 예를 들어, 명시적 중단점을 사용하여 시스템 프롬프트를 캐시하고 자동 캐싱이 대화를 처리하도록 할 수 있습니다:
{
"model": "claude-opus-4-8",
"max_tokens": 1024,
"cache_control": { "type": "ephemeral" },
"system": [
{
"type": "text",
"text": "You are a helpful assistant.",
"cache_control": { "type": "ephemeral" }
}
],
"messages": [{ "role": "user", "content": "What are the key terms?" }]
}자동 캐싱은 동일한 기본 캐싱 인프라를 사용합니다. 가격, 최소 토큰 임계값, 컨텍스트 순서 요구 사항 및 20블록 룩백 윈도우는 모두 명시적 중단점과 동일하게 적용됩니다.
cache_control이 있는 경우 자동 캐싱은 아무 작업도 수행하지 않습니다.cache_control이 있는 경우 API는 400 오류를 반환합니다.자동 캐싱은 Claude API, Claude Platform on AWS 및 Microsoft Foundry(베타)에서 사용할 수 있습니다. Bedrock 및 Vertex AI는 자동 캐싱을 지원하지 않습니다.
캐싱을 더 세밀하게 제어하려면 개별 콘텐츠 블록에 직접 cache_control을 배치할 수 있습니다. 이는 서로 다른 빈도로 변경되는 여러 섹션을 캐시해야 하거나 정확히 무엇이 캐시되는지 세밀하게 제어해야 할 때 유용합니다.
정적 콘텐츠(도구 정의, 시스템 지침, 컨텍스트, 예시)를 프롬프트의 시작 부분에 배치하세요. cache_control 매개변수를 사용하여 캐싱할 재사용 가능한 콘텐츠의 끝을 표시하세요.
캐시 접두사는 tools, system, messages 순서로 생성됩니다. 이 순서는 각 레벨이 이전 레벨을 기반으로 구축되는 계층 구조를 형성합니다.
정적 콘텐츠의 끝에 하나의 캐시 중단점만 사용하면 시스템이 이전 요청이 이미 캐시에 기록한 가장 긴 접두사를 자동으로 찾습니다. 이 작동 방식을 이해하면 캐싱 전략을 최적화하는 데 도움이 됩니다.
세 가지 핵심 원칙:
캐시 쓰기는 중단점에서만 발생합니다. 블록에 cache_control을 표시하면 정확히 하나의 캐시 항목, 즉 해당 블록에서 끝나는 접두사의 해시가 기록됩니다. 시스템은 더 이전 위치에 대한 항목을 기록하지 않습니다. 해시는 중단점까지의 모든 내용을 포함하는 누적 해시이므로, 중단점 또는 그 이전의 블록을 변경하면 다음 요청에서 다른 해시가 생성됩니다.
캐시 읽기는 이전 요청이 기록한 항목을 뒤로 탐색합니다. 각 요청에서 시스템은 중단점에서의 접두사 해시를 계산하고 일치하는 캐시 항목을 확인합니다. 없으면 한 번에 한 블록씩 뒤로 이동하면서 각 이전 위치의 접두사 해시가 이미 캐시에 있는 항목과 일치하는지 확인합니다. 이는 안정적인 콘텐츠가 아니라 이전 쓰기를 찾는 것입니다.
룩백 윈도우는 20블록입니다. 시스템은 중단점 자체를 첫 번째로 계산하여 중단점당 최대 20개의 위치를 확인합니다. 해당 윈도우에서 일치하는 항목을 찾지 못하면 확인이 중지됩니다(또는 다음 명시적 중단점이 있는 경우 거기서 재개됩니다).
예시: 증가하는 대화에서의 룩백
각 턴마다 새 블록을 추가하고 각 요청의 마지막 블록에 cache_control을 설정합니다:
흔한 실수: 매 요청마다 변경되는 콘텐츠에 중단점 설정
프롬프트에 큰 정적 시스템 컨텍스트(블록 1부터 5)가 있고 그 뒤에 타임스탬프와 사용자 메시지를 포함하는 요청별 블록(블록 6)이 있습니다. 블록 6에 cache_control을 설정합니다:
룩백은 중단점 뒤의 안정적인 콘텐츠를 찾아 캐시하지 않습니다. 이전 요청이 이미 기록한 항목을 찾으며, 쓰기는 중단점에서만 발생합니다. cache_control을 요청 간에 동일하게 유지되는 마지막 블록인 블록 5로 이동하면 모든 후속 요청이 캐시된 접두사를 읽습니다. 자동 캐싱도 동일한 함정에 빠집니다: 마지막 캐시 가능 블록에 중단점을 배치하는데, 이 구조에서는 매 요청마다 변경되는 블록이므로 대신 블록 5에 명시적 중단점을 사용하세요.
핵심 요점: 캐시를 공유하려는 요청 간에 접두사가 동일한 마지막 블록에 cache_control을 배치하세요. 증가하는 대화에서는 각 턴이 20개 미만의 블록을 추가하는 한 마지막 블록이 작동합니다: 이전 콘텐츠는 절대 변경되지 않으므로 다음 요청의 룩백이 이전 쓰기를 찾습니다. 변동하는 접미사(타임스탬프, 요청별 컨텍스트, 들어오는 메시지)가 있는 프롬프트의 경우 변동하는 블록이 아니라 정적 접두사의 끝에 중단점을 배치하세요.
다음과 같은 경우 최대 4개의 캐시 중단점을 정의할 수 있습니다:
중요한 제한 사항: 룩백은 이전 요청이 이미 기록한 항목만 찾을 수 있습니다. 증가하는 대화로 인해 중단점이 마지막 쓰기로부터 20블록 이상 떨어지면 룩백 윈도우가 이를 놓칩니다. 필요하기 전에 해당 위치에 쓰기가 누적되도록 처음부터 해당 위치에 더 가까운 두 번째 중단점을 추가하세요.
캐시 중단점 자체는 비용을 추가하지 않습니다. 다음에 대해서만 요금이 부과됩니다:
더 많은 cache_control 중단점을 추가해도 비용이 증가하지 않습니다. 실제로 캐시되고 읽힌 콘텐츠를 기준으로 동일한 금액을 지불합니다. 중단점은 단지 어떤 섹션을 독립적으로 캐시할 수 있는지에 대한 제어를 제공할 뿐입니다.
Claude API, Claude Platform on AWS, Vertex AI 및 Microsoft Foundry(베타)에서 캐시 가능한 최소 프롬프트 길이는 다음과 같습니다:
모델 가용성은 플랫폼에 따라 다르며, 새로 출시된 모델의 최소값도 다를 수 있습니다: Amazon Bedrock에서 Claude Fable 5 및 Claude Mythos 5의 캐시 가능한 최소 프롬프트 길이는 1,024 토큰입니다.
더 짧은 프롬프트는 cache_control로 표시되어 있어도 캐시할 수 없습니다. 이 토큰 수보다 적은 토큰을 캐시하려는 요청은 캐싱 없이 처리되며 오류가 반환되지 않습니다. 프롬프트가 캐시되었는지 확인하려면 응답 사용량 필드를 확인하세요: cache_creation_input_tokens와 cache_read_input_tokens가 모두 0이면 프롬프트가 캐시되지 않은 것입니다(최소 길이 요구 사항을 충족하지 못했을 가능성이 높음).
프롬프트가 모델 및 플랫폼의 최소값에 약간 못 미치는 경우, 임계값에 도달하도록 캐시된 콘텐츠를 확장하는 것이 종종 가치가 있습니다. 캐시 읽기는 캐시되지 않은 입력 토큰보다 훨씬 저렴하므로 최소값에 도달하면 자주 재사용되는 프롬프트의 비용을 줄일 수 있습니다.
Bedrock은 AWS에서 운영하는 플랫폼입니다. Bedrock에서는 적용되는 모델별 최소값, 실패 동작 및 사용량 필드 이름에 대해 Bedrock 프롬프트 캐싱 문서를 참조하세요.
동시 요청의 경우, 캐시 항목은 첫 번째 응답이 시작된 후에만 사용 가능해진다는 점에 유의하세요. 병렬 요청에 대한 캐시 히트가 필요한 경우 후속 요청을 보내기 전에 첫 번째 응답을 기다리세요.
현재 "ephemeral"이 유일하게 지원되는 캐시 유형이며, 기본적으로 5분의 수명을 가집니다.
요청의 대부분의 블록을 캐시할 수 있습니다. 여기에는 다음이 포함됩니다:
tools 배열의 도구 정의system 배열의 콘텐츠 블록messages.content 배열의 콘텐츠 블록messages.content 배열의 콘텐츠 블록messages.content 배열의 콘텐츠 블록이러한 각 요소는 자동으로 또는 cache_control로 표시하여 캐시할 수 있습니다.
대부분의 요청 블록을 캐시할 수 있지만 몇 가지 예외가 있습니다:
사고 블록은 cache_control로 직접 캐시할 수 없습니다. 그러나 사고 블록은 이전 어시스턴트 턴에 나타날 때 다른 콘텐츠와 함께 캐시될 수 있습니다. 이러한 방식으로 캐시되면 캐시에서 읽을 때 입력 토큰으로 계산됩니다.
하위 콘텐츠 블록(예: 인용) 자체는 직접 캐시할 수 없습니다. 대신 최상위 블록을 캐시하세요.
인용의 경우, 인용의 소스 자료 역할을 하는 최상위 문서 콘텐츠 블록을 캐시할 수 있습니다. 이를 통해 인용이 참조할 문서를 캐시하여 인용과 함께 프롬프트 캐싱을 효과적으로 사용할 수 있습니다.
빈 텍스트 블록은 캐시할 수 없습니다.
캐시된 콘텐츠를 수정하면 캐시의 일부 또는 전체가 무효화될 수 있습니다.
프롬프트 구조화에서 설명한 대로 캐시는 tools → system → messages 계층 구조를 따릅니다. 각 레벨의 변경은 해당 레벨과 모든 후속 레벨을 무효화합니다.
다음 표는 다양한 유형의 변경으로 인해 캐시의 어느 부분이 무효화되는지 보여줍니다. ✘는 캐시가 무효화됨을 나타내고, ✓는 캐시가 유효하게 유지됨을 나타냅니다.
| 변경 사항 | 도구 캐시 | 시스템 캐시 | 메시지 캐시 | 영향 |
|---|---|---|---|---|
| 도구 정의 | ✘ | ✘ | ✘ | 도구 정의(이름, 설명, 매개변수) 수정은 전체 캐시를 무효화합니다 |
| 웹 검색 토글 | ✓ | ✘ | ✘ | 웹 검색 활성화/비활성화는 시스템 프롬프트를 수정합니다 |
| 인용 토글 | ✓ | ✘ | ✘ | 인용 활성화/비활성화는 시스템 프롬프트를 수정합니다 |
| 속도 설정 | ✓ | ✘ | ✘ | speed: "fast"와 표준 속도 간 전환은 시스템 및 메시지 캐시를 무효화합니다 |
| 도구 선택 | ✓ | ✓ | ✘ | tool_choice 매개변수 변경은 메시지 블록에만 영향을 미칩니다 |
| 이미지 | ✓ | ✓ | ✘ | 프롬프트 어디에서든 이미지 추가/제거는 메시지 블록에 영향을 미칩니다 |
| 사고 매개변수 | ✓ | ✓ | ✘ | 확장 사고 설정(활성화/비활성화, 예산) 변경은 메시지 블록에 영향을 미칩니다 |
| 확장 사고 요청에 전달된 비도구 결과 | ✓ | ✓ | 모델별 | Opus 4.5+ 및 Sonnet 4.6+에서는 사고 블록이 기본적으로 보존되므로 캐시가 유효하게 유지됩니다(✓). 이전 Opus/Sonnet 모델 및 모든 Haiku 모델에서는 이전에 캐시된 모든 사고 블록이 컨텍스트에서 제거되고 해당 사고 블록 뒤에 오는 모든 메시지가 캐시에서 제거됩니다(✘). 자세한 내용은 사고 블록과 함께 캐싱을 참조하세요. |
Claude Opus 4.8에서는 시스템 또는 메시지 캐시를 무효화하지 않고 대화 중간에 새 시스템 지침을 추가할 수 있습니다. 최상위 system 필드를 편집하는 대신 messages에 {"role": "system"} 메시지를 추가하면 캐시된 접두사가 변경되지 않습니다. 대화 중간 시스템 메시지를 참조하세요.
응답의 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는 일반적으로 총 입력보다 훨씬 작으므로 비용과 속도 제한을 모두 이해하는 데 중요합니다.
확장 사고를 프롬프트 캐싱과 함께 사용할 때 사고 블록은 특별한 동작을 합니다:
다른 콘텐츠와 함께 자동 캐싱: 사고 블록은 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 caches its request content (not the response)
# The cache includes: user message, thinking_block_1, tool_use block 1, and 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]
# On earlier Opus/Sonnet and all Haiku models, non-tool-result user block causes prior thinking blocks to be stripped; on Opus 4.5+/Sonnet 4.6+ they are kept이전 Opus/Sonnet 모델 및 모든 Haiku 모델에서는 이 시점에서 모든 이전 사고 블록이 컨텍스트에서 제거됩니다. Opus 4.5+ 및 Sonnet 4.6+에서는 이전 사고 블록이 기본적으로 유지되며 캐시된 접두사의 일부로 남습니다.
더 자세한 정보는 확장 사고 문서를 참조하세요.
2026년 2월 5일부터 프롬프트 캐싱은 조직 수준 격리 대신 워크스페이스 수준 격리를 사용합니다. 캐시는 워크스페이스별로 격리되어 동일한 조직 내 워크스페이스 간 데이터 분리를 보장합니다. 이는 Claude API, Claude Platform on AWS 및 Microsoft Foundry(베타)에 적용되며, Bedrock 및 Vertex AI는 조직 수준 캐시 격리를 유지합니다. 여러 워크스페이스를 사용하는 경우 이 차이를 고려하여 캐싱 전략을 검토하세요.
조직 및 워크스페이스 격리: 캐시는 조직 간에 격리됩니다. 서로 다른 조직은 동일한 프롬프트를 사용하더라도 캐시를 공유하지 않습니다. 2026년 2월 5일부터 Claude API, Claude Platform on AWS 및 Microsoft Foundry(베타)에서는 조직 내 워크스페이스별로도 캐시가 격리됩니다. Bedrock 및 Vertex AI는 계속해서 조직 수준 격리만 사용합니다.
정확한 일치: 캐시 히트는 캐시 컨트롤로 표시된 블록까지 포함하여 모든 텍스트와 이미지를 포함한 100% 동일한 프롬프트 세그먼트가 필요합니다.
출력 토큰 생성: 프롬프트 캐싱은 출력 토큰 생성에 영향을 미치지 않습니다. 받는 응답은 프롬프트 캐싱을 사용하지 않았을 때 받을 응답과 동일합니다.
프롬프트 캐싱 성능을 최적화하려면:
시나리오에 맞게 프롬프트 캐싱 전략을 조정하세요:
예상치 못한 동작이 발생하는 경우:
캐시 진단(베타)은 API가 연속된 요청을 비교하고 프롬프트 접두사가 정확히 어디서 달라졌는지 보고하도록 하여 이 목록의 많은 단계를 자동으로 처리합니다.
cache_control 마커가 동일한 위치에 있는지 확인하세요tool_choice 및 이미지 사용이 호출 간에 일관되게 유지되는지 확인하세요tool_use 콘텐츠 블록의 키가 안정적인 순서를 가지는지 확인하세요tool_choice 변경 또는 프롬프트 어디에서든 이미지의 존재/부재는 캐시를 무효화하여 새 캐시 항목을 생성해야 합니다. 캐시 무효화에 대한 자세한 내용은 캐시를 무효화하는 요소를 참조하세요.
5분이 너무 짧다고 생각되면 Anthropic은 추가 비용으로 1시간 캐시 지속 시간도 제공합니다.
1시간 캐시 지속 시간은 Claude API, Claude Platform on AWS, Amazon Bedrock, Amazon Bedrock(레거시), Vertex AI 및 Microsoft Foundry(베타)에서 사용할 수 있습니다.
확장 캐시를 사용하려면 다음과 같이 cache_control 정의에 ttl을 포함하세요:
"cache_control": {
"type": "ephemeral",
"ttl": "1h"
}응답에는 다음과 같은 상세한 캐시 정보가 포함됩니다:
{
"usage": {
"input_tokens": 2048,
"cache_read_input_tokens": 1800,
"cache_creation_input_tokens": 248,
"output_tokens": 503,
"cache_creation": {
"ephemeral_5m_input_tokens": 148,
"ephemeral_1h_input_tokens": 100
}
}
}현재 cache_creation_input_tokens 필드는 cache_creation 객체의 값 합계와 같습니다.
정기적인 주기로 사용되는 프롬프트(즉, 5분마다 더 자주 사용되는 시스템 프롬프트)가 있는 경우 5분 캐시를 계속 사용하세요. 추가 비용 없이 계속 갱신되기 때문입니다.
1시간 캐시는 다음 시나리오에서 가장 적합합니다:
5분 및 1시간 캐시는 지연 시간 측면에서 동일하게 작동합니다. 일반적으로 긴 문서에 대해 첫 토큰까지의 시간이 개선됩니다.
동일한 요청에서 1시간 및 5분 캐시 컨트롤을 모두 사용할 수 있지만 중요한 제약이 있습니다: 더 긴 TTL을 가진 캐시 항목은 더 짧은 TTL보다 먼저 나타나야 합니다(즉, 1시간 캐시 항목은 모든 5분 캐시 항목보다 먼저 나타나야 함).
TTL을 혼합할 때 API는 프롬프트에서 세 가지 청구 위치를 결정합니다:
A: 가장 높은 캐시 히트에서의 토큰 수(히트가 없으면 0).B: A 이후 가장 높은 1시간 cache_control 블록에서의 토큰 수(없으면 A와 동일).C: 마지막 cache_control 블록에서의 토큰 수.B 및/또는 C가 A보다 크면 A가 가장 높은 캐시 히트이므로 반드시 캐시 미스입니다.
다음에 대해 요금이 부과됩니다:
A에 대한 캐시 읽기 토큰.(B - A)에 대한 1시간 캐시 쓰기 토큰.(C - B)에 대한 5분 캐시 쓰기 토큰.다음은 3가지 예시입니다. 각각 다른 캐시 히트와 캐시 미스를 가진 3개 요청의 입력 토큰을 보여줍니다. 그 결과 각각 색상 상자에 표시된 다른 계산된 가격을 가집니다.
캐시 사전 워밍을 사용하면 사용자가 실제 요청을 트리거하기 전에 시스템 프롬프트 또는 도구 정의를 프롬프트 캐시에 로드할 수 있습니다. 이를 통해 첫 번째 사용자 상호작용에서 캐시 미스 지연 시간 페널티를 제거하여 지연 시간에 민감한 애플리케이션의 "time-to-first-token"(첫 토큰까지의 시간), 즉 TTFT를 줄입니다.
요청에서 max_tokens: 0을 설정하세요. API는 프롬프트를 모델로 읽어 들이고 모든 cache_control 중단점에서 캐시를 기록한 다음 출력을 생성하지 않고 즉시 반환합니다. 응답에는 빈 content 배열, stop_reason: "max_tokens" 및 완전히 채워진 usage 블록이 있습니다.
cache_control 중단점을 플레이스홀더 사용자 메시지가 아니라 후속 요청과 공유되는 마지막 블록(일반적으로 시스템 프롬프트 또는 도구 정의)에 배치하세요. 그렇지 않으면 캐시 항목이 플레이스홀더에 키가 지정되어 후속 요청이 히트하지 못합니다. 이는 자동 캐싱이 아니라 명시적 캐시 중단점을 사용하는 것을 의미합니다. 자동 캐싱은 마지막 블록에 중단점을 배치하는데, 여기서는 플레이스홀더이기 때문입니다. 플레이스홀더 사용자 메시지는 공백이 아닌 콘텐츠를 가진 모든 문자열일 수 있습니다(여기 예시에서는 "warmup" 사용). 해당 콘텐츠는 모델로 읽혀지지만 응답되지 않습니다.
사전 워밍 요청은 접두사가 아직 캐시되지 않은 경우 다른 요청과 마찬가지로 캐시 쓰기 요금이 발생합니다. 응답에서 usage.cache_creation_input_tokens를 확인하여 쓰기가 발생했는지 확인하세요. 출력 토큰은 0개가 청구됩니다.
client = anthropic.Anthropic()
# 사용자가 도착하기 전에 실행하여 공유 시스템 프롬프트 캐시를 예열하세요.
prewarm = client.messages.create(
model="claude-opus-4-8",
max_tokens=0,
system=[
{
"type": "text",
"text": "You are an expert software engineer with deep knowledge of distributed systems...",
"cache_control": {"type": "ephemeral"},
}
],
messages=[{"role": "user", "content": "warmup"}],
)
print(prewarm.stop_reason) # "max_tokens"
print(prewarm.content) # []
print(prewarm.usage)API는 빈 content 배열을 반환합니다:
{
"id": "msg_01XFDUDYJgAACzvnptvVoYEL",
"type": "message",
"role": "assistant",
"content": [],
"model": "claude-opus-4-8",
"stop_reason": "max_tokens",
"stop_sequence": null,
"usage": {
"input_tokens": 8,
"cache_creation_input_tokens": 5120,
"cache_read_input_tokens": 0,
"cache_creation": {
"ephemeral_5m_input_tokens": 5120,
"ephemeral_1h_input_tokens": 0
},
"iterations": [
{
"input_tokens": 8,
"output_tokens": 0,
"cache_read_input_tokens": 0,
"cache_creation_input_tokens": 5120,
"cache_creation": {
"ephemeral_5m_input_tokens": 5120,
"ephemeral_1h_input_tokens": 0
},
"type": "message"
}
],
"output_tokens": 0,
"service_tier": "standard",
"inference_geo": "global"
}
}애플리케이션이 시작될 때(또는 예약된 간격으로) 사전 워밍 요청을 실행한 다음 사전 워밍이 완료된 후 실제 사용자 요청을 보내세요:
client = anthropic.Anthropic()
SYSTEM_PROMPT = [
{
"type": "text",
"text": "You are an expert software engineer with deep knowledge of distributed systems...",
"cache_control": {"type": "ephemeral"},
}
]
def prewarm_cache() -> None:
"""Call this at application startup or on a scheduled interval."""
client.messages.create(
model="claude-opus-4-8",
max_tokens=0,
system=SYSTEM_PROMPT,
messages=[{"role": "user", "content": "warmup"}],
)
def respond(user_message: str) -> anthropic.types.Message:
"""The real user request; benefits from a warm cache."""
return client.messages.create(
model="claude-opus-4-8",
max_tokens=1024,
system=SYSTEM_PROMPT,
messages=[{"role": "user", "content": user_message}],
)
# 사용자 트래픽이 도착하기 전에 캐시를 워밍합니다.
prewarm_cache()
# 이후 사용자가 메시지를 제출하면 시스템 프롬프트 접두사는 이미 캐시되어 있습니다.
response = respond("How do I implement a binary search tree?")
print(response.content[0].text)캐시 TTL이 여전히 적용된다는 점을 명심하세요. 기본 5분 캐시의 경우 캐시를 따뜻하게 유지하려면 최소 5분마다 새 사전 워밍 요청을 보내세요. 사용자 요청 간 간격이 더 긴 경우 대신 1시간 캐시 지속 시간을 사용하세요.
다음 중 하나라도 설정된 경우 max_tokens: 0 요청은 invalid_request_error와 함께 거부됩니다. 각 항목은 0 토큰 예산으로는 생성할 수 없는 출력을 의미하기 때문입니다:
stream: truethinking.type: "enabled")output_config.format){"type": "tool", ...} 또는 {"type": "any"}의 tool_choicemax_tokens: 0은 Message Batches 요청 내에서도 거부됩니다. 사전 워밍은 첫 토큰까지의 시간을 목표로 하는데, 이는 배치 처리에는 적용되지 않으며, 배치 처리 중에 작성된 캐시 항목은 후속 요청이 실행되기 전에 만료될 가능성이 높습니다.
max_tokens: 0이 제공되기 전에는 일부 애플리케이션이 동일한 효과를 얻기 위해 max_tokens: 1 워밍업 호출을 사용했습니다. max_tokens: 0 방식이 권장됩니다. 출력이 생성되지 않으므로 버려야 할 단일 토큰 응답이 없고, 출력 토큰에 대한 비용이 청구되지 않으며, 요청의 의도가 명확합니다.
프롬프트 캐싱을 시작하는 데 도움이 되도록 프롬프트 캐싱 쿡북에서 자세한 예제와 모범 사례를 제공합니다.
다음 코드 스니펫은 다양한 프롬프트 캐싱 패턴을 보여줍니다. 이 예제들은 다양한 시나리오에서 캐싱을 구현하는 방법을 보여주어 이 기능의 실제 적용 방법을 이해하는 데 도움이 됩니다:
프롬프트 캐싱(자동 및 명시적 모두)은 ZDR 적격입니다. Anthropic은 프롬프트의 원시 텍스트나 Claude의 응답을 저장하지 않습니다.
캐싱된 콘텐츠의 KV(키-값) 캐시 표현과 암호화 해시는 메모리에만 보관되며 디스크에 저장되지 않습니다. 캐싱된 항목은 최소 5분(표준) 또는 1시간(확장)의 수명을 가지며, 그 이후에는 즉시는 아니지만 신속하게 삭제됩니다. 캐시 항목은 조직 간에 격리되며, Claude API, Claude Platform on AWS, Microsoft Foundry(베타)에서는 조직 내 워크스페이스 간에도 격리됩니다.
모든 기능에 대한 ZDR 적격성은 API 및 데이터 보존을 참조하세요.
Was this page helpful?