Claude Code Costs, Act II — Where the big hidden costs are

개요

Claude Code에서 모델을 전환할 때 발생하는 숨겨진 비용은 주로 모델별 캐시 및 사고 블록(thinking blocks) 처리 방식과 관련이 있으며, 이는 비용 증가로 이어질 수 있다.

주요 내용

  • 모델 전환 시 캐시 손실: 각 Claude 모델은 자체적인 프롬프트 캐시를 가지며, 다른 모델로 전환하면 이전에 사용한 캐시를 재사용할 수 없다. 이로 인해 처음 해당 모델을 사용할 때처럼 비용이 발생할 수 있다.
  • "Sticky" vs. "Per-turn bouncing" 모델 전략: 대화를 하나의 모델에 고정하는 "Sticky" 전략은 캐시 재사용을 통해 비용을 절감하는 반면, 대화 중에 모델을 빈번하게 전환하는 "Per-turn bouncing"은 두 개의 캐시를 유지하고 전환마다 추가적인 쓰기 비용을 발생시켜 더 비쌀 수 있다.
  • 사고 블록(Thinking Blocks) 처리: 모델의 이전 사고 과정(thinking blocks)은 클라이언트가 매 턴마다 재전송하는 컨텍스트의 일부이다. 모델 전환 시 이 사고 블록은 새 모델의 입력으로 재청구되거나(비용 발생), 모델에서 제거될 수 있다.
  • 사고 블록의 암호화 및 무결성: 사고 블록은 읽거나 수정할 수 없는 암호화된 서명 형태로 전달되며, 무결성이 보장된다. 이를 편집하거나 재정렬하는 것은 불가능하며, 이를 제거하면 연속성이 깨져 캐시 읽기가 비용이 많이 드는 캐시 생성으로 전환될 수 있다.
  • 토크나이저 차이: 모델마다 토크나이저가 다르기 때문에 동일한 텍스트라도 토큰 수가 달라져 비용이 달라지는 별도의 비용 효과가 발생한다.
  • 캐시의 모델 종속성: 캐시 항목은 특정 모델에만 의미가 있으며, 다른 모델은 이를 읽을 수 없다. 이는 모델 전환 시 캐시 재사용이 불가능한 근본적인 이유이다.
  • Claude Code의 사고 블록 처리: Claude Code는 기본적으로 "keep: 'all'" 설정을 사용하여 모든 모델이 사고 블록을 유지하도록 강제한다. 이는 Haiku 모델의 기본 동작(사고 블록 제거)을 재정의하며, Sonnet과 같은 모델에서는 사고 블록이 캐시 및 청구에 포함된다.
  • 프록시에서의 사고 블록 편집 비용: 사고 블록을 수정하거나 제거하는 프록시를 사용할 경우, 편집 위치에 따라 캐시 비용이 크게 달라진다. 대화 초반의 사고 블록을 수정하면 더 많은 캐시 생성이 발생한다.

시사점

Claude Code에서 모델 전환으로 인한 비용 증가를 최소화하려면, 각 대화 또는 하위 에이전트마다 하나의 모델을 선택하고 해당 모델의 요청 본문을 변경하지 않는 "Sticky" 전략을 채택하는 것이 중요하다. 또한, 사고 블록의 처리 방식과 캐시 종속성을 이해하고, 무단으로 접두사를 변경하지 않도록 주의해야 한다.

원문 읽기 →
원문을 불러오는 중...

댓글

GitHub Discussions