본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 05. 26. 07:25

로컬 Python 도구를 사용하여 Anthropic API 비용을 50% 절감한 방법

요약

Anthropic API 비용을 절감하기 위해 개발된 로컬 Python CLI 도구인 `ai-cost-optimizer`를 소개합니다. 시맨틱 캐싱, 프롬프트 압축, 모델 라우팅 기술을 통해 API 호출 횟수와 토큰 사용량을 최적화합니다.

핵심 포인트

  • 시맨틱 캐시를 통한 중복 질문에 대한 API 호출 비용 제거
  • BM25 기반 프롬프트 압축으로 불필요한 토큰 사용량 감소
  • 작업 난이도에 따른 적절한 모델 라우팅으로 비용 효율화
  • 로컬 실행 방식으로 데이터 보안 및 프라이버시 유지

나의 Anthropic 청구 금액이 두 달 연속으로 두 배가 되었다. 더 큰 것을 만들고 있었기 때문이 아니라, 같은 질문을 반복하고, 불필요하게 비대한 프롬프트 (prompts)를 보내고, Haiku가 처리할 수 있는 작업에도 기본 설정인 Sonnet을 사용했기 때문이다. 이를 해결하기 위해 도구를 만들었다. 어떻게 작동하는지 소개한다.

문제점 (The Problem)

AI API 비용이 빠르게 누적되는 데에는 세 가지 이유가 있다. 첫째, 프로젝트를 반복 수행할 때 "X는 어떻게 작동하나요", "이 코드의 문제는 무엇인가요"와 같이 유사한 질문을 반복해서 던지며 매번 전체 비용을 지불한다. 둘째, 프롬프트에 컨텍스트 (context)가 쌓인다. 문서 조각, 에러 트레이스 (error traces), 상용구 지침 등이 수백 개의 토큰 (tokens)을 추가하지만 답변에는 아무런 도움이 되지 않는다. 셋째, 대부분의 사람들은 처음에 기본으로 설정한 모델을 그대로 사용한다. Haiku가 1M 입력 토큰당 1달러로 답변할 수 있는 질문에 대해 1M 입력 토큰당 15달러인 Claude Opus를 사용하는 것은 매 호출마다 15배의 비용 승수를 적용하는 것과 같다.

해결책 (The Solution)

나는 터미널과 Anthropic API 사이에서 작동하는 로컬 CLI인 ai-cost-optimizer를 구축했다. 이 도구는 네트워크로 데이터가 전송되기 전, 모든 요청에 대해 시맨틱 캐시 (semantic cache), 프롬프트 압축기 (prompt compressor), 그리고 모델 라우터 (model router)를 실행한다. 클라우드도, 구독도 필요 없으며, 데이터가 기기를 벗어나지도 않는다. 그저 한 번 설치하면 되는 Python 패키지일 뿐이다.

작동 방식 (How It Works)

1. 시맨틱 캐시 (Semantic Cache)

캐시는 모든 응답을 벡터 임베딩 (vector embedding)으로 저장한다. 새로운 요청이 있을 때마다 프롬프트에 대한 임베딩을 계산하고, 저장된 모든 항목과 코사인 유사도 (cosine similarity)를 비교한다. 유사도가 임계값(기본값: 0.80)보다 높으면 캐시된 답변을 반환한다. API 호출이 발생하지 않으므로 비용은 0이다.

$ aiproxy ask "What is the capital of France?"

  Model         claude-haiku-4-5-20251001
...

"Capital of France?"는 첫 번째 쿼리와 의미론적으로 동일하다. 캐시 히트 (Cache hit)가 발생했다. API는 이를 인지조차 못 한다.

캐시는 임베딩을 위해 sentence-transformers/all-MiniLM-L6-v2를 사용하며 (80 MB, 완전히 프로세스 내에서 실행됨), 빠른 ANN 조회를 위해 usearch를 사용한다. 첫 실행 시 콜드 로드 (Cold load)는 약 1.5초 정도 걸리며, 이후 쿼리는 100ms 미만으로 처리된다.

2. 프롬프트 압축기 (Prompt Compressor)

긴 프롬프트가 비용이 많이 드는 이유는 단순히 길기 때문이 아니라, 그 길이의 대부분이 불필요한 내용(filler)이기 때문이다. 이 압축기(compressor)는 BM25를 사용하여 각 문장이 쿼리(query)와 얼마나 관련이 있는지 점수를 매기고, 점수가 높은 상위 문장들만 유지하며 나머지는 버린다.

쉽게 말해, 프롬프트를 읽고 어떤 문장이 질문과 실제로 관련이 있는지 파악한 뒤, 관련 없는 문장은 삭제하는 방식이다. 요약(summarization)이나 LLM을 사용하지 않으며, 순수하게 어휘 점수 산정(lexical scoring) 방식을 사용하는 결정론적(deterministic)이고 빠른 방식이다.

문서 쿼리에서의 실제 예시:

Original prompt:  370 tokens  ($0.001110 at Sonnet pricing)
Compressed:        61 tokens  ($0.000183 at Sonnet pricing)
Tokens saved:     309 tokens  (83% reduction)

압축 임계값(threshold)은 설정 가능하며(.env 파일의 MAX_PROMPT_TOKENS=500), 해당 제한 미만의 프롬프트는 있는 그대로 전송된다.

3. 모델 라우터 (Model Router)

라우터는 각 프롬프트를 분류하고 이를 처리할 수 있는 가장 저렴한 모델을 선택한다. 로직은 규칙 기반(rule-based)이다: 토큰 수, 복잡성을 나타내는 키워드 신호, 그리고 코드 vs 산문(prose) vs 추론(reasoning) 작업에 대한 몇 가지 휴리스틱(heuristics)을 사용한다.

쿼리라우팅 대상1M 토큰당 입력 비용
"What is 2+2?"Haiku$1.00
...

--model을 명시적으로 전달하여 라우터를 재정의(override)할 수 있다. 하지만 명시하지 않으면 작업에 적합한 가장 저렴한 모델을 기본값으로 사용하며, 실제로 이는 Haiku가 대부분의 짧은 사실적 쿼리를 처리함을 의미한다.

실제 수치

코드에 대해 질문하고, 오류를 디버깅하며, 짧은 코드 스니펫(snippets)을 생성하는 등 일반적인 개발 용도로 2주간 사용한 결과:

$ aiproxy stats

  Cache entries       14
...
  • 23번의 API 호출, 총 $0.16
  • 해당 호출들을 통해 압축으로 566 토큰 절약
  • 12%의 캐시 히트율 (새로운 주제를 탐색 중이었기에 낮았으며, 반복적인 작업의 경우 30-40%에 달함)

압축으로 인한 절감액은 아직 stats에 표시되지 않는데, 이는 현재 수정 중인 알려진 공백(gap)이다.

설치

git clone https://github.com/desaikat/ai-cost-optimizer.git
cd ai-cost-optimizer
python -m venv .venv
...

또한 누적 지출, 캐시 적중률 (cache hit rate), 모델 분포, 그리고 시간에 따른 압축 절감액을 보여주는 Streamlit 대시보드(aiproxy-dashboard)도 제공됩니다.

향후 계획

  • OpenAI 및 Gemini 지원 — 캐시와 압축기는 제공자 중립적 (provider-agnostic)이므로, 클라이언트 계층에 어댑터(adapter)만 추가하면 됩니다.
  • 팀 모드 (Team mode) — 공유 SQLite 또는 Postgres 캐시를 사용하여 팀원들이 동일한 쿼리에 대해 각각 비용을 지불하는 일을 방지합니다.
  • REST API 모드 — 즉시 사용 가능한 프록시 엔드포인트를 제공하여 Python뿐만 아니라 어떤 언어에서도 사용할 수 있게 합니다.
  • PyInstaller .exe — 가상 환경 (venv) 관리를 원하지 않는 Windows 사용자를 위한 무설치 배포판입니다.

사용해 보기 / 피드백 환영

저장소: github.com/desaikat/ai-cost-optimizer

현재 제가 적극적으로 확신하지 못하고 있어 의견을 듣고 싶은 두 가지 사항이 있습니다:

  1. 유사도 임계값 (Similarity threshold) 조정 — 0.80이 저에게는 적당하지만, 미세한 문구 차이가 중요한 코드 쿼리(code queries)의 경우 너무 공격적일 수 있습니다. 귀하의 사용 사례에서는 어떤 임계값이 적절할까요?
  2. 압축 품질 (Compression quality) — BM25는 빠르고 결정론적 (deterministic)이지만 의미론적 관련성 (semantic relevance)을 놓칩니다. 프롬프트당 100ms 미만을 유지하는 가벼운 임베딩 기반 문장 점수 산출기 (embedding-based sentence scorer)를 사용해 보신 분이 계신가요?

Open issue와 PR(Pull Request)을 환영합니다.

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0