cache_control
블록을 사용하여 Messages API로 프롬프트 캐싱을 구현하는 방법의 예시입니다:
cache_control
매개변수를 사용하여 캐시됩니다. 이를 통해 매번 다시 처리하지 않고도 여러 API 호출에서 이 큰 텍스트를 재사용할 수 있습니다. 사용자 메시지만 변경하면 캐시된 콘텐츠를 활용하면서 책에 대한 다양한 질문을 할 수 있어 더 빠른 응답과 향상된 효율성을 얻을 수 있습니다.
cache_control
로 지정된 블록까지 포함하여 전체 프롬프트 - tools
, system
, messages
(이 순서로)를 참조합니다.Model | Base Input Tokens | 5m Cache Writes | 1h Cache Writes | Cache Hits & Refreshes | Output Tokens |
---|---|---|---|---|---|
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 | $3 / MTok | $3.75 / MTok | $6 / MTok | $0.30 / MTok | $15 / MTok |
Claude Sonnet 3.7 | $3 / MTok | $3.75 / MTok | $6 / MTok | $0.30 / MTok | $15 / MTok |
Claude Sonnet 3.5 (deprecated) | $3 / MTok | $3.75 / MTok | $6 / MTok | $0.30 / MTok | $15 / 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 |
cache_control
매개변수를 사용하여 캐싱을 위한 재사용 가능한 콘텐츠의 끝을 표시하세요.
캐시 접두사는 다음 순서로 생성됩니다: tools
, system
, 그 다음 messages
. 이 순서는 각 레벨이 이전 레벨을 기반으로 구축되는 계층을 형성합니다.
cache_control
중단점을 추가하면 시스템이 자동으로 모든 이전 콘텐츠 블록 경계에서 캐시 히트를 확인합니다 (명시적 중단점 이전 약 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
이벤트):
cache_creation_input_tokens
: 새 항목을 생성할 때 캐시에 쓰여진 토큰 수.cache_read_input_tokens
: 이 요청에 대해 캐시에서 검색된 토큰 수.input_tokens
: 캐시에서 읽히거나 캐시를 생성하는 데 사용되지 않은 입력 토큰 수.tool_choice
와 이미지 사용이 호출 간에 일관되게 유지되는지 확인하세요cache_control
매개변수가 필요할 수 있습니다tool_choice
의 변경이나 프롬프트 어디에서든 이미지의 존재/부재는 캐시를 무효화하여 새 캐시 항목을 생성해야 합니다. 캐시 무효화에 대한 자세한 내용은 캐시를 무효화하는 것을 참조하세요.cache_control
로 명시적으로 표시할 수 없지만 도구 결과와 함께 후속 API 호출을 할 때 요청 콘텐츠의 일부로 캐시됩니다. 이는 사고 블록을 다시 전달하여 대화를 계속할 때 도구 사용 중에 일반적으로 발생합니다.
입력 토큰 계산: 사고 블록이 캐시에서 읽힐 때 사용량 메트릭에서 입력 토큰으로 계산됩니다. 이는 비용 계산과 토큰 예산 책정에 중요합니다.
캐시 무효화 패턴:
cache_control
마커 없이도 발생합니다cache_control
정의에 ttl
을 포함하세요:
cache_creation_input_tokens
필드는 cache_creation
객체의 값들의 합과 같습니다.
A
: 가장 높은 캐시 히트에서의 토큰 수(히트가 없으면 0).B
: A
이후 가장 높은 1시간 cache_control
블록에서의 토큰 수(존재하지 않으면 A
와 같음).C
: 마지막 cache_control
블록에서의 토큰 수.B
및/또는 C
가 A
보다 크면 A
가 가장 높은 캐시 히트이기 때문에 반드시 캐시 미스가 됩니다.A
에 대한 캐시 읽기 토큰.(B - A)
에 대한 1시간 캐시 쓰기 토큰.(C - B)
에 대한 5분 캐시 쓰기 토큰.대용량 컨텍스트 캐싱 예시
input_tokens
: 사용자 메시지의 토큰 수만cache_creation_input_tokens
: 법적 문서를 포함한 전체 시스템 메시지의 토큰 수cache_read_input_tokens
: 0 (첫 번째 요청에서는 캐시 히트 없음)input_tokens
: 사용자 메시지의 토큰 수만cache_creation_input_tokens
: 0 (새 캐시 생성 없음)cache_read_input_tokens
: 전체 캐시된 시스템 메시지의 토큰 수도구 정의 캐싱
cache_control
매개변수는 마지막 도구(get_time
)에 배치되어 모든 도구를 정적 접두사의 일부로 지정합니다.이는 get_weather
와 get_time
이전에 정의된 다른 도구를 포함한 모든 도구 정의가 단일 접두사로 캐시됨을 의미합니다.이 접근 방식은 매번 다시 처리하지 않고 여러 요청에서 재사용하려는 일관된 도구 세트가 있을 때 유용합니다.첫 번째 요청의 경우:input_tokens
: 사용자 메시지의 토큰 수cache_creation_input_tokens
: 모든 도구 정의와 시스템 프롬프트의 토큰 수cache_read_input_tokens
: 0 (첫 번째 요청에서는 캐시 히트 없음)input_tokens
: 사용자 메시지의 토큰 수cache_creation_input_tokens
: 0 (새 캐시 생성 없음)cache_read_input_tokens
: 모든 캐시된 도구 정의와 시스템 프롬프트의 토큰 수다중 턴 대화 계속하기
cache_control
로 표시합니다. 시스템은 자동으로 후속 메시지에 대해 가장 긴 이전에 캐시된 접두사를 찾아 사용합니다. 즉, 이전에 cache_control
블록으로 표시된 블록들은 나중에 이것으로 표시되지 않지만 5분 내에 히트되면 여전히 캐시 히트(그리고 캐시 새로 고침!)로 간주됩니다.또한 cache_control
매개변수가 시스템 메시지에 배치되어 있음을 주목하세요. 이는 이것이 캐시에서 제거되면(5분 이상 사용되지 않은 후) 다음 요청에서 캐시에 다시 추가되도록 보장하기 위함입니다.이 접근 방식은 동일한 정보를 반복적으로 처리하지 않고 진행 중인 대화에서 컨텍스트를 유지하는 데 유용합니다.이것이 제대로 설정되면 각 요청의 사용량 응답에서 다음을 볼 수 있어야 합니다:input_tokens
: 새 사용자 메시지의 토큰 수 (최소한일 것)cache_creation_input_tokens
: 새 어시스턴트 및 사용자 턴의 토큰 수cache_read_input_tokens
: 이전 턴까지의 대화의 토큰 수모든 것을 종합: 여러 캐시 중단점
cache_control
매개변수가 모든 도구 정의를 캐시합니다.
cache_control
로 표시되어 대화가 진행됨에 따라 점진적 캐싱을 가능하게 합니다.
input_tokens
: 최종 사용자 메시지의 토큰cache_creation_input_tokens
: 모든 캐시된 세그먼트의 토큰 (도구 + 지침 + RAG 문서 + 대화 기록)cache_read_input_tokens
: 0 (캐시 히트 없음)input_tokens
: 새 사용자 메시지의 토큰만cache_creation_input_tokens
: 대화 기록에 추가된 새 토큰cache_read_input_tokens
: 이전에 캐시된 모든 토큰 (도구 + 지침 + RAG 문서 + 이전 대화)여러 캐시 중단점이 필요한가요, 아니면 끝에 하나만 있으면 충분한가요?
캐시 중단점이 추가 비용을 발생시키나요?
캐시 수명은 얼마나 되나요?
몇 개의 캐시 중단점을 사용할 수 있나요?
cache_control
매개변수 사용)을 정의할 수 있습니다.모든 모델에서 프롬프트 캐싱을 사용할 수 있나요?
확장 사고와 프롬프트 캐싱은 어떻게 작동하나요?
프롬프트 캐싱을 어떻게 활성화하나요?
cache_control
중단점을 포함하세요.다른 API 기능과 함께 프롬프트 캐싱을 사용할 수 있나요?
프롬프트 캐싱이 가격에 어떤 영향을 주나요?
캐시를 수동으로 지울 수 있나요?
캐싱 전략의 효과를 어떻게 추적할 수 있나요?
cache_creation_input_tokens
및 cache_read_input_tokens
필드를 사용하여 캐시 성능을 모니터링할 수 있습니다.캐시를 깨뜨릴 수 있는 것은 무엇인가요?
프롬프트 캐싱은 개인정보 보호와 데이터 분리를 어떻게 처리하나요?
cache_control
을 사용하는 것이 안전합니다. 비용 효율성을 위해서는 매우 가변적인 부분(예: 사용자의 임의 입력)을 캐싱에서 제외하는 것이 좋습니다.
Batches API와 함께 프롬프트 캐싱을 사용할 수 있나요?
Python에서 'AttributeError: 'Beta' object has no attribute 'prompt_caching'' 오류가 나타나는 이유는 무엇인가요?
'TypeError: Cannot read properties of undefined (reading 'messages')' 오류가 나타나는 이유는 무엇인가요?