AI 비용이 하룻밤 사이에 세 배로 뛰었습니다. 모델, 트래픽 양, 심지어 프롬프트 텍스트까지 모두 동일했습니다. 범인은 OpenAI의 프롬프트 캐시를 망가뜨린 단 한 줄의 코드였습니다.
캐시가 중요한 이유
제공업체의 프롬프트 캐시는 바이트 단위로 완전히 동일한 접두사(prefix)로 시작하는 요청의 재처리를 건너뜀으로써 비용을 절감해 줍니다. 첫 번째 토큰들이 이전 호출과 일치하면, 제공업체는 이미 계산된 해당 토큰의 표현을 재사용하고 새로운 접미사(suffix)에 대해서만 비용을 청구합니다. 규칙은 엄격합니다. 단순히 유사한 것이 아니라 반드시 정확히 일치해야 합니다. 시작 부분에서 토큰 하나만 달라도 캐시 적중(cache hit)은 완전히 실패합니다.
적중률을 망가뜨린 실수
저희 에이전트에서는 모델에게 '현재'라는 감각을 주기 위해 시스템 프롬프트의 맨 윗부분에 현재 타임스탬프를 배치했습니다. 타임스탬프는 매초 바뀌기 때문에, 첫 번째 토큰 시퀀스는 모든 요청마다 고유했습니다. 캐시는 일치하는 항목을 전혀 찾지 못했고, 그 결과 각 호출마다 뒤따르는 18,000개의 정적 토큰(도구 스키마, 문서 스니펫, Few-shot 예시, 고정된 지침 등)에 대해 전체 비용이 발생했습니다. 결과적으로 캐시 적중률은 0%가 되었고, 청구 금액은 세 배로 불어났습니다.
캐시 효율을 위한 순서 재배치
해결 방법은 간단합니다. 변하지 않는 모든 것을 프롬프트의 앞부분에 두고, 변동성이 있는 데이터는 뒷부분으로 미루는 것입니다.
정적 접두사 (캐시 가능)
- 도구 정의 (Tool definitions)
- 검색 문서 (Retrieval documents)
- Few-shot 예시
- 고정된 시스템 지침
변동성 접미사 (캐시 불가능)
- 현재 시간
- 세션 식별자
- 사용자 메시지
- 실시간 컨텍스트
모델에 시간이 필요하다면, 앞에 붙이지 말고 정적 블록 뒤에 추가(append)하세요. 그러면 캐시는 용량이 큰 정적 부분을 재사용하면서도, 마지막에 신선한 컨텍스트를 제공할 수 있습니다.
스택 내의 숨겨진 위협 요소
템플릿이 올바르게 보여도, 미들웨어나 SDK가 페이로드가 API에 도달하기 전에 요청 ID, 타임스탬프 또는 기타 헤더와 같은 메타데이터를 조용히 앞에 추가할 수 있습니다. 일부 배포 파이프라인은 배포할 때마다 도구 정의의 순서를 섞기도 합니다. 이러한 보이지 않는 변화는 바이트 시퀀스를 변경하여, 프롬프트 빌더의 코드를 전혀 수정하지 않고도 캐시를 망가뜨립니다.
캐시 적중률을 모니터링하세요
캐시 적중률을 모든 AI 에이전트의 주요 상태 지표(health metric)로 취급하십시오. 적중률이 갑자기 떨어지면 요청의 앞부분 바이트 중 무언가가 가변적으로 변했다는 신호입니다. 적중률을 보여주는 모니터링 도구를 사용하면 비용 이상 징후가 폭발하기 전에 포착할 수 있습니다.
요약
프롬프트 캐싱은 불변의 접두사에 달려 있습니다. 매 요청의 시작 부분에서 바뀌는 모든 것(단 하나의 타임스탬프라도)은 캐시를 무효화하고 비용을 세 배로 늘릴 수 있습니다. 정적 콘텐츠는 앞에, 변동성 콘텐츠는 뒤에 두십시오. 도구 체인에 숨겨진 접두사 추가 요소가 있는지 점검하고 캐시 적중률을 모니터링하십시오. 체계적인 프롬프트 레이아웃은 성능과 수익성을 모두 보호합니다.
