프롬프트 캐싱 Prompt Caching
모델 프롬프트에는 시스템 프롬프트 및 일반적인 지침과 같은 반복적인 콘텐츠가 포함되어 있는 경우가 많습니다. OpenAI는 API 요청을 최근에 동일한 프롬프트를 처리한 서버로 라우팅하여 프롬프트를 처음부터 처리하는 것보다 더 저렴하고 빠르게 처리합니다. 이를 통해 대기 시간을 최대 80%까지 줄이고 긴 프롬프트의 경우 비용을 50%까지 절감할 수 있습니다. 프롬프트 캐싱은 모든 API 요청에서 자동으로 작동하며(코드 변경 필요 없음), 이와 관련된 추가 요금이 없습니다.
프롬프트 캐싱은 다음 모델에서 활성화됩니다:
- gpt-4o
- gpt-4o-mini
- o1-preview
- o1-mini
이 가이드에서는 프롬프트 캐싱의 작동 원리를 자세히 설명하여 프롬프트를 최적화하여 지연 시간과 비용을 줄일 수 있도록 합니다.
프롬프트 구조화하기
프롬프트 내에서 접두사가 정확히 일치하는 경우에만 캐시 히트가 가능합니다. 캐싱 이점을 실현하려면 프롬프트의 시작 부분에 지침이나 예제와 같은 정적 콘텐츠를 배치하고 사용자별 정보와 같은 가변 콘텐츠를 마지막에 배치하세요. 이는 요청 간에 동일해야 하는 이미지와 도구에도 적용됩니다.
작동 방식
1024 토큰 이상의 프롬프트에 대해 캐싱이 자동으로 활성화됩니다. API 요청을 하면 다음 단계가 진행됩니다:
- 캐시 조회: 시스템이 프롬프트의 초기 부분(접두사)이 캐시에 저장되어 있는지 확인합니다.
- 캐시 히트: 일치하는 접두사가 발견되면 시스템이 캐시된 결과를 사용합니다. 이렇게 하면 지연 시간이 크게 줄어들고 비용이 절감됩니다.
- 캐시 미스: 일치하는 접두사가 발견되지 않으면 시스템에서 전체 프롬프트를 처리합니다. 처리 후 프롬프트의 접두사는 향후 요청을 위해 캐시됩니다.
캐시된 접두사는 일반적으로 5~10분 동안 사용하지 않는 동안 활성 상태로 유지됩니다. 그러나 사용량이 많지 않은 시간대에는 최대 1시간 동안 캐시가 유지될 수 있습니다.
요구 사항
프롬프트에 1024개 이상의 토큰이 포함되어 있을 경우 캐싱이 가능하며, 캐시 히트는 128개 토큰 단위로 발생합니다. 따라서 요청에서 캐시된 토큰의 수는 항상 프롬프트의 길이에 따라 1024, 1152, 1280, 1408 등과 같은 순서에 해당하게 됩니다.
토큰이 1024개 미만인 요청을 포함한 모든 요청에는 chat completions object의 usage.prompt_tokens_details
에 캐시된 토큰 수를 나타내는 cached_tokens
필드를 표시합니다. 토큰이 1024개 미만인 요청의 경우에는 cached_tokens
가 0이 됩니다.
캐시할 수 있는 항목
- 메시지: 시스템, 사용자 및 어시스턴트 상호 작용을 포함하는 전체 메시지 배열입니다.
- 이미지: 사용자 메시지에 포함된 이미지(링크 또는 base64 인코딩 데이터)는 물론 여러 개의 이미지를 보낼 수 있습니다. 이미지 토큰화에 영향을 미치는 상세 매개변수가 동일하게 설정되어 있는지 확인하세요.
- 도구 사용: 메시지 배열과 사용 가능한 ‘도구’ 목록을 모두 캐시할 수 있어 최소 1024개 토큰 요구 사항을 충족할 수 있습니다.
- 구조화된 출력: 구조화된 출력 스키마는 시스템 메시지의 접두사 역할을 하며 캐시될 수 있습니다.
모범 사례
- 프롬프트의 시작에는 정적 또는 반복되는 콘텐츠를, 끝에는 동적 콘텐츠를 배치하세요.
- 캐시 적중률, 지연 시간, 캐시된 토큰 비율 등의 메트릭을 모니터링하여 프롬프트 및 캐싱 전략을 최적화하세요.
- 피크 시간대에는 캐시가 더 자주 제거되므로 캐시 적중률을 높이려면 프롬프트 길이를 늘리고 사용량이 적은 시간대에 API 요청을 하세요.
- 최근에 사용하지 않은 프롬프트는 캐시에서 자동으로 제거됩니다. 퇴출을 최소화하려면 동일한 프롬프트 접두사를 사용하여 일관된 요청 스트림을 유지하세요.
자주 묻는 질문
-
**캐시에 대한 데이터 개인정보는 어떻게 유지되나요?
프롬프트 캐시는 조직 간에 공유되지 않습니다. 동일한 조직의 구성원만 동일한 프롬프트의 캐시에 액세스할 수 있습니다.
-
**프롬프트 캐싱이 출력 토큰 생성이나 API의 최종 응답에 영향을 주나요?
프롬프트 캐싱은 출력 토큰 생성이나 API에서 제공하는 최종 응답에 영향을 미치지 않습니다. 캐싱 사용 여부에 관계없이 생성되는 출력은 캐시되지 않습니다. 입력 프롬프트 자체만 캐시되고 실제 응답은 캐시된 프롬프트를 기반으로 매번 새로 계산되기 때문입니다.
-
**캐시를 수동으로 지울 수 있는 방법이 있나요?
현재 수동 캐시 지우기는 제공되지 않습니다. 최근에 발생하지 않은 프롬프트는 캐시에서 자동으로 지워집니다. 일반적으로 5~10분 동안 활동이 없으면 캐시가 삭제되지만, 사용량이 적은 시간대에는 최대 1시간까지 지속되는 경우도 있습니다.
-
**프롬프트 캐싱을 쓰면 추가 비용을 지불해야 하나요?
아니요. 캐싱은 자동으로 수행되며, 캐싱 기능을 사용하기 위해 명시적인 조치를 취하거나 추가 비용을 지불할 필요가 없습니다.
-
**캐시된 프롬프트가 TPM 속도 제한에 영향을 주나요?
예. 캐싱은 속도 제한에 영향을 미치지 않습니다.
-
**프롬프트 캐싱 할인은 스케일 티어 및 배치 API에서 사용할 수 있나요?
프롬프트 캐싱에 대한 할인은 배치 API에서는 사용할 수 없지만 스케일 티어에서는 사용할 수 있습니다. 스케일 티어를 사용하면 공유 API로 유출되는 모든 토큰도 캐싱을 받을 수 있습니다.
-
**프롬프트 캐싱은 제로 데이터 보존 요청에 대해 작동하나요?
예. 프롬프트 캐싱은 기존의 데이터 보존 정책과 호환됩니다.