GPT API 토큰, 정확히 세지 않으면 비용이 새는 이유와 tiktoken 활용법

LLM API 비용 최적화

GPT API를 호출할 때마다 청구서를 보고 깜짝 놀란 적이 있다면, 원인은 대부분 하나다. 토큰 사용량을 제대로 파악하지 못한 채 프롬프트를 던지고 있기 때문이다. 이 글을 읽고 나면 tiktoken으로 토큰을 정확히 계산하고, 프롬프트를 최적화해서 같은 결과를 더 적은 비용에 얻는 방법을 알 수 있다. 토큰 카운팅 도구 비교부터 실전 프롬프트 압축 기법까지, 바로 적용 가능한 내용만 담았다.

API 비용이 예측과 다른 이유, 토큰 과금의 함정

눈에 보이는 글자 수와 실제 토큰 수의 괴리

많은 개발자가 처음 겪는 혼란이 있다. “500자짜리 프롬프트를 보냈는데 왜 토큰이 800개로 잡히지?” 같은 상황이다. 토큰은 글자 수가 아니다. OpenAI의 토크나이저는 BPE(Byte Pair Encoding) 알고리즘을 사용하며, 영어 단어 하나가 보통 1~2토큰인 반면 한글은 한 글자에 2~3토큰을 소모한다. 거기에 시스템 프롬프트, 대화 히스토리, 함수 정의까지 모두 입력 토큰에 포함된다는 점을 간과하면 예상 비용과 실제 비용 사이에 큰 차이가 생긴다.

숨겨진 토큰 소비 구간

Chat Completions API를 쓸 때, role 태그와 JSON 구조 자체도 토큰을 먹는다. function calling을 사용하면 함수 스키마 정의가 매 호출마다 입력에 포함된다. 실제 적용 사례를 살펴보면, 함수 10개를 정의한 채 반복 호출하는 서비스에서 함수 스키마만으로 호출당 1,500토큰 이상을 소비하는 경우도 있다. API 비용을 아키텍처 차원에서 줄이는 전략도 함께 검토할 필요가 있다.

GPT API 토큰 사용량 계산, tiktoken과 다른 도구 비교

tiktoken의 작동 원리

OpenAI가 공식 제공하는 Python 라이브러리 tiktoken은 GPT 모델별 토크나이저를 그대로 구현한 도구다. tiktoken GitHub 저장소에서 바로 설치할 수 있으며, 모델명을 지정하면 해당 모델이 실제로 사용하는 인코딩을 적용해 정확한 토큰 수를 반환한다.

import tiktoken
enc = tiktoken.encoding_for_model("gpt-4o")
tokens = enc.encode("프롬프트 텍스트")
print(len(tokens))

이 세 줄이면 API 호출 전에 비용을 미리 확인할 수 있다.

대안 도구와의 차이

tiktoken 외에도 토큰 카운팅 방법이 몇 가지 있다. 아래 비교를 참고하자.

  • OpenAI Tokenizer 웹 — 브라우저에서 바로 확인 가능하지만 자동화 불가. 빠른 테스트용으로만 적합하다.
  • Hugging Face transformers의 tokenizer — 오픈소스 모델에는 정확하지만, GPT 계열 모델의 토크나이저와 결과가 다를 수 있다. cl100k_base 인코딩을 쓰는 GPT-4o와는 호환되지 않는다.
  • API 응답의 usage 필드 — 호출 후에만 확인 가능하므로 사전 예측에는 쓸 수 없다. 다만 실제 과금 기준이므로 사후 검증에는 가장 정확하다.

결론적으로, 사전 예측에는 tiktoken, 사후 검증에는 usage 필드를 조합하는 것이 가장 현실적인 접근이다.

LLM API 비용 최적화

프롬프트 최적화로 토큰을 줄이는 구체적 방법

불필요한 토큰을 제거하는 압축 기법

“친절하게 설명해 주세요”, “다음 내용을 참고하여” 같은 관습적 문구가 프롬프트에 얼마나 많은지 한번 세어보라. 이런 표현을 걷어내는 것만으로 10~20%의 토큰을 절약할 수 있다. 핵심은 지시 사항을 명확하고 짧게 쓰는 것이다.

  • “아래 텍스트를 요약하시오. 3문장 이내.” → 명확한 지시, 최소 토큰
  • 반복되는 컨텍스트는 시스템 프롬프트에 한 번만 넣고 재사용
  • 대화 히스토리가 길어지면 오래된 메시지를 요약본으로 교체

구조적 접근: few-shot 예시 최적화

few-shot 예시를 5개 넣던 것을 2개로 줄여도 품질 차이가 미미한 경우가 많다. 실제 적용 사례를 살펴보면, 고객 문의 분류 태스크에서 예시를 5개에서 2개로 줄이고 대신 출력 형식을 JSON으로 고정했더니 토큰은 40% 감소하면서 정확도는 거의 동일했다는 보고가 있다. 모든 태스크에 통용되지는 않지만, 예시 수를 줄이고 지시를 구체화하는 방향은 시도해볼 가치가 충분하다.

tiktoken 토큰 카운팅 적용 시 주의할 점과 흔한 실수

모델별 인코딩 차이를 무시하면 생기는 오차

GPT-3.5-turbo와 GPT-4o는 같은 cl100k_base 인코딩을 쓰지만, 모델이 바뀌면 인코딩도 달라질 수 있다. tiktoken에서 encoding_for_model()을 쓰지 않고 인코딩을 하드코딩하면, 모델을 교체할 때 카운팅이 틀어진다. 항상 모델명 기반으로 인코딩을 가져오는 습관이 필요하다.

max_tokens 설정의 양날의 검

max_tokens를 너무 높게 잡으면 불필요하게 긴 응답이 생성되어 출력 토큰 비용이 늘어난다. 반대로 너무 낮게 잡으면 응답이 잘려서 재호출이 필요해지고, 결과적으로 비용이 두 배로 든다.

실전 팁: 예상 출력 길이의 1.3~1.5배 정도로 max_tokens를 설정하고, tiktoken으로 입력 토큰을 계산한 뒤 모델의 컨텍스트 윈도우에서 뺀 값과 비교하라. 이 간단한 계산이 비용 낭비를 막는 안전장치가 된다.

또한 OpenAI 공식 Rate Limits 문서를 참고하면 분당 토큰 제한(TPM)도 함께 관리할 수 있다.

LLM API 비용 최적화

결국 어떤 조합이 가장 효과적인가

비용 최적화의 3단계 프레임워크

토큰 관리는 단순히 글자 수를 줄이는 문제가 아니다. 아래 세 단계를 순서대로 적용하면 체계적으로 비용을 줄일 수 있다.

  • 1단계 — 측정: tiktoken으로 모든 API 호출의 입출력 토큰을 로깅한다. 측정 없이 최적화는 불가능하다.
  • 2단계 — 분석: 어떤 호출이 토큰을 가장 많이 소비하는지 파악한다. 대개 전체 비용의 80%가 상위 20%의 호출 유형에서 발생한다.
  • 3단계 — 최적화: 상위 소비 호출부터 프롬프트 압축, 캐싱, 모델 다운그레이드를 적용한다.

캐싱과 모델 선택까지 고려하기

동일한 프롬프트가 반복된다면 시맨틱 캐싱으로 API 호출 자체를 줄이는 것이 토큰 최적화보다 효과가 크다. 분류나 추출처럼 단순한 태스크는 GPT-4o 대신 GPT-4o-mini를 쓰면 토큰당 단가가 크게 낮아진다. 모든 호출에 최고 사양 모델을 쓸 필요는 없다는 점을 기억하자. BPE 알고리즘의 원리를 이해하면 왜 특정 언어가 더 많은 토큰을 소비하는지도 명확해진다.

핵심 정리

토큰은 글자 수가 아니며, 한글은 영어보다 2~3배 많은 토큰을 소비한다. tiktoken으로 호출 전에 비용을 예측하고, 프롬프트에서 관습적 문구를 걷어내는 것만으로도 상당한 절감 효과를 얻을 수 있다.

오늘 당장 할 일: 가장 자주 쓰는 프롬프트 하나를 tiktoken에 넣어보라. 예상보다 토큰이 많다면, 그것이 최적화의 출발점이다. 캐싱 전략과 모델 선택까지 확장하고 싶다면 시맨틱 캐싱 구현이나 모델별 비용 효율 비교를 다음 단계로 살펴보길 추천한다.

댓글 남기기