블로그로 돌아가기

비용 최적화가이드

요청을 보내기 전에 토큰 세기: Python에서 tiktoken 사용하기

tiktoken으로 프롬프트의 토큰 수를 오프라인으로 추정하고, 컨텍스트 윈도와 대조하고, 가격을 계산하고, API의 usage 필드와 비교하세요.

작성자: CheapTokens Team 게시됨읽는 시간 5분

pip install tiktoken과 한 줄 토큰 계산을 보여주는 터미널
이 페이지의 내용
  1. 토큰을 세는 다섯 줄
  2. 프롬프트가 윈도에 맞나요?
  3. 비용은 얼마인가요?
  4. 추정치를 사용량과 비교하기

프롬프트의 토큰 수는 전송 전에 자신의 머신에서 셀 수 있습니다. tiktoken를 설치하고, 텍스트를 인코딩한 뒤, 결과의 len()을 구하면 됩니다. tiktoken은 OpenAI의 토크나이저이므로 DeepSeek, GLM, MiniMax 모델에서는 이 숫자가 추정치입니다. 실제 수치는 첫 호출 후 usage.prompt_tokens로 돌아오며, 두 값을 비교하는 데는 한 줄이 더 필요합니다.

왜 이렇게 해야 할까요? 청구서와 오류 모두 입력 크기에서 시작하기 때문입니다. 긴 계약서를 스크립트에 붙여 넣으면 API가 400으로 응답할 때에야 너무 크다는 것을 알게 됩니다. 이메일 5천 건을 배치로 돌리면 잔액이 줄어들 때에야 비용이 얼마인지 알게 됩니다. 먼저 세면 두 가지 놀라움이 모두 미리 읽을 수 있는 숫자로 바뀝니다.

토큰을 세는 다섯 줄#

tiktoken README(2026년 11월 1일 확인)는 전체 아이디어를 보여줍니다. 인코딩을 고르고, 텍스트를 인코딩하면, 리스트의 길이가 토큰 수입니다.

bash
pip install tiktoken
python
import tiktoken

enc = tiktoken.get_encoding('o200k_base')
text = 'Hello world'
tokens = enc.encode(text)
print(len(tokens))  # how many tokens the text is
estimate.py라는 파일에 담긴 다섯 줄
카운터 전체: get_encoding, encode, len.

enc.decode(tokens)은 원본 텍스트를 돌려주므로, 모델이 보게 될 텍스트와 같은 텍스트를 보고 있는지 확인하는 데 유용합니다. README는 특정 OpenAI 모델의 토크나이저를 고르는 tiktoken.encoding_for_model('gpt-4o')도 언급합니다. 기억할 만한 함정은 바로 이것입니다. 토크나이저는 모델 계열에 속합니다. README의 경험 법칙은 토큰당 약 4바이트의 텍스트이며, OpenAI의 토크나이저만을 설명합니다.

그렇다면 DeepSeek 모델은 어떻게 할까요? 같은 계산을 작업용 추정치로 사용하고, 아래와 같이 보정하세요.

숫자 맞히기

2,000자짜리 영어 텍스트는 대략 몇 토큰인가요?

정답 보기

정답: 500

약 500입니다. README의 경험 법칙인 토큰당 4바이트와, 일반 영어 텍스트가 문자당 약 1바이트라는 점을 적용하면 2,000 ÷ 4 = 500입니다. 다른 언어와 이모지는 문자당 더 많은 바이트를 차지하므로, 같은 2,000자라도 이 법칙에 따르면 보통 더 많은 토큰을 의미합니다.

프롬프트가 윈도에 맞나요?#

모든 모델에는 컨텍스트 윈도가 있으며, 입력과 허용한 답변이 그 안에 들어가야 합니다. 저희가 제공하는 모델의 윈도는 DeepSeek-V4-Flash 380K, GLM-5.3-Flash 390K, MiniMax-M2.7 180K 토큰입니다. 최대 답변 길이는 DeepSeek-V4-Flash가 32,768 토큰, 나머지 두 모델이 8,192 토큰입니다(CheapTokens 모델 목록, 2026년 11월 1일).

호출 전 가드는 네 줄입니다:

python
CONTEXT = {
    'deepseek-ai/DeepSeek-V4-Flash-0731': 380_000,
    'zai-org/GLM-5.3-Flash': 390_000,
    'MiniMaxAI/MiniMax-M2.7': 180_000,
}

def fits(prompt_tokens, max_tokens, model):
    return prompt_tokens + max_tokens <= CONTEXT[model]

250,000 토큰짜리 문서가 있다고 해봅시다. fits(250_000, 8_192, 'MiniMaxAI/MiniMax-M2.7')은 False이므로, 그 작업을 더 큰 윈도를 가진 모델로 보내거나 문서를 나누면 400은 발생하지 않습니다. fits(250_000, 8_192, 'deepseek-ai/DeepSeek-V4-Flash-0731')은 True입니다. 오류가 어떤 모습인지 전체 이야기를 원하시면 request too long: 400 vs 413, context window and max_tokens에서 자세히 다룹니다.

비용은 얼마인가요?#

이제 예산입니다. 대표 항목 하나를 잡아 세고 곱하세요. 주문 이메일 5,000건을 분류한다고 가정합니다. 대표 이메일 하나를 세면 약 800 입력 토큰이 나오고, 레이블과 짧은 이유를 200 출력 토큰으로 제한합니다. 합계는 5,000 × 800 = 4,000,000 입력 토큰, 5,000 × 200 = 1,000,000 출력 토큰입니다.

아래 표는 바로 그 작업량을 실시간 가격으로, 입력과 출력을 합산해 계산한 것입니다:

모델 요청당 5,000회 요청 OpenRouter, 5,000회 요청
GLM-5.3-Flash $0.000024 $0.12 $0.217
DeepSeek-V4-Flash $0.000032 $0.16 $0.42
MiniMax-M2.7 $0.00007 $0.35 $4.20

요청당 입력 800개 및 출력 200개 토큰입니다. 100만 토큰당 가격은 현재 기준이며 당사 요금제에 따라 함께 변경됩니다. OpenRouter 열은 동일한 작업량에 대한 참고 가격을 보여줍니다.

입력과 출력을 합산한 총액에서, 이 모델들의 CheapTokens 열은 OpenRouter보다 저렴합니다. 세 숫자를 자신의 계산값으로 바꾸면 첫 요청 전에 예산을 갖게 됩니다. 청구서 양쪽의 차이는 input vs output tokens: what an AI API bills you for를, 실제 측정 사례는 how many tokens an API request uses를 참고하세요. 최신 가격은 항상 가격 페이지에 있습니다.

텍스트에서 실제 사용량까지의 추정 흐름
오프라인으로 추정하고, 윈도를 가드하고, 전송한 뒤, 사용량과 비교합니다.

추정치를 사용량과 비교하기#

추정치는 다른 사람의 토크나이저에 대한 추측이므로, 정답과 한 번 대조해 보세요. 모든 응답에는 usage 필드가 있으며, usage.prompt_tokens는 API가 입력에 대해 센 값입니다. 두 숫자를 나란히 놓고 나누세요.

단계별로

비교 실행하기

설정

패키지를 설치하고 키를 환경 변수에 넣으세요. 절대 스크립트에 붙여 넣지 마세요.

bash
pip install tiktoken openai
export CHEAPTOKENS_API_KEY='your-key-here'

스크립트 실행

이것을 compare.py로 저장하세요. 로컬에서 세고, 요청을 https://api.cheaptokens.dev/v1로 보내고, 두 숫자를 출력합니다. 모델 id는 CheapTokens 모델 목록의 전체 id입니다. 축약된 이름은 허용되지 않기 때문입니다.

python
import os
import tiktoken
from openai import OpenAI

MODEL = 'deepseek-ai/DeepSeek-V4-Flash-0731'
enc = tiktoken.get_encoding('o200k_base')
messages = [{'role': 'user',
             'content': 'Classify this email as order, refund or other: Hi, my parcel from last Tuesday has not arrived yet.'}]

estimate = sum(len(enc.encode(m['content'])) for m in messages)

client = OpenAI(base_url='https://api.cheaptokens.dev/v1',
                api_key=os.environ['CHEAPTOKENS_API_KEY'])
r = client.chat.completions.create(model=MODEL, messages=messages, max_tokens=200)

real = r.usage.prompt_tokens
print(f'estimate {estimate}, usage.prompt_tokens {real}, ratio {real / estimate:.2f}')

차이 읽기

마지막 줄이 세 숫자를 출력합니다. estimate 24, usage.prompt_tokens 31, ratio 1.29이 표시된다고 해봅시다. 그러면 예산을 잡기 전에 앞으로의 추정치에 그 비율을 곱하세요. 실제 프롬프트는 채팅 형식으로 감싸지므로, 실제 계산값이 일반 텍스트 추정치보다 조금 높게 나올 수 있습니다. 하나가 아니라 몇 개의 대표 프롬프트에서 실행하고 평균 비율을 사용하세요.

이제부터의 루틴은 이렇습니다. 로컬에서 추정하고, 윈도를 가드하고, 예산에 비율을 적용하고, 각 응답의 usage로 정직함을 유지하세요. 전체 작업에 걸친 누적 합계도 원하시면 track AI agent token cost in Python이 같은 필드 위에 그것을 구축합니다. 연결 자체가 처음이신가요? Your first API request with CheapTokens에서 다루며, 나머지는 문서에 있습니다.

짝 맞추기

각 이름을 그것이 알려주는 것과 연결하세요

  • len(enc.encode(text))입력 크기에 대한 로컬 추정치
  • usage.prompt_tokensAPI가 센 입력 크기
  • usage.completion_tokens답변의 크기, 출력 측에서 과금됨
  • max_tokens윈도 검사에서 예약하는 답변 길이 상한

세는 것은 저렴하고 로컬이며 몇 초면 됩니다. 비용이 드는 호출 전에 하세요.