본문 바로가기
AI2025년 11월 12일6분 읽기

GPT 토큰 카운팅과 tiktoken 활용법

YS
김영삼
조회 727

토큰이란 무엇인가

LLM에서 토큰은 텍스트의 최소 처리 단위입니다. 단어, 서브워드, 또는 문자 단위로 분할되며, 모델마다 다른 토크나이저를 사용합니다. GPT-4/3.5는 BPE(Byte Pair Encoding) 기반의 cl100k_base 토크나이저를 사용합니다.

토큰 수 경험 규칙

언어근사치예시
영어1 토큰 약 4글자"hello" = 1 토큰
영어1 토큰 약 0.75단어"The cat sat" = 3 토큰
한국어1 토큰 약 1-2글자"안녕하세요" = 3-4 토큰
코드변동 큼키워드/기호에 따라 다름

Python tiktoken 사용법

import tiktoken

# GPT-4, GPT-3.5-turbo 토크나이저
enc = tiktoken.encoding_for_model("gpt-4")
enc = tiktoken.get_encoding("cl100k_base")

text = "안녕하세요, GPT 토큰 카운팅 예제입니다."
tokens = enc.encode(text)
print(f"토큰 수: {len(tokens)}")
print(f"토큰 ID: {tokens}")
print(f"디코딩: {enc.decode(tokens)}")

for token_id in tokens:
    print(f"  {token_id} -> '{enc.decode([token_id])}'")

# GPT-4o 토크나이저 (o200k_base)
enc_4o = tiktoken.get_encoding("o200k_base")
tokens_4o = enc_4o.encode(text)
print(f"GPT-4o 토큰 수: {len(tokens_4o)}")

Chat API 토큰 계산

def count_chat_tokens(messages, model="gpt-4"):
    enc = tiktoken.encoding_for_model(model)
    tokens_per_message = 3
    tokens_per_name = 1

    total = 0
    for msg in messages:
        total += tokens_per_message
        for key, value in msg.items():
            total += len(enc.encode(value))
            if key == "name":
                total += tokens_per_name

    total += 3  # 응답 프라이밍
    return total

messages = [
    {"role": "system", "content": "당신은 도움이 되는 AI 어시스턴트입니다."},
    {"role": "user", "content": "한국의 수도는 어디인가요?"},
]
tokens = count_chat_tokens(messages, "gpt-4")
print(f"총 토큰: {tokens}")

비용 계산 함수

PRICING = {
    "gpt-4-turbo": {"input": 0.01, "output": 0.03},
    "gpt-4o": {"input": 0.005, "output": 0.015},
    "gpt-4o-mini": {"input": 0.00015, "output": 0.0006},
    "gpt-3.5-turbo": {"input": 0.0005, "output": 0.0015},
}

def estimate_cost(model, input_tokens, output_tokens):
    prices = PRICING.get(model, PRICING["gpt-4o"])
    input_cost = (input_tokens / 1000) * prices["input"]
    output_cost = (output_tokens / 1000) * prices["output"]
    total = input_cost + output_cost
    return {
        "input_cost": f"${input_cost:.4f}",
        "output_cost": f"${output_cost:.4f}",
        "total": f"${total:.4f}",
    }

result = estimate_cost("gpt-4o", 500, 200)
print(result)

JavaScript에서의 토큰 카운팅

import { encodingForModel } from 'js-tiktoken';

const enc = encodingForModel('gpt-4');
const tokens = enc.encode('안녕하세요');
console.log('토큰 수:', tokens.length);
enc.free();

// gpt-tokenizer 패키지
import { encode, decode, isWithinTokenLimit } from 'gpt-tokenizer';

const tokenCount = encode('Hello, world!').length;
const withinLimit = isWithinTokenLimit('텍스트...', 4096);
  • 한국어는 영어보다 동일 의미에 약 1.5-2배 더 많은 토큰을 소비합니다
  • 시스템 프롬프트는 매 API 호출마다 포함되므로 간결하게 유지합니다
  • 대화 히스토리는 토큰 한도 내에서 오래된 메시지부터 제거합니다
  • GPT-4o의 o200k_base는 cl100k_base 대비 한국어 효율이 개선되었습니다

토큰 카운팅은 LLM API 비용 관리의 기초입니다. tiktoken으로 정확한 토큰 수를 파악하고, 프롬프트 최적화와 모델 선택을 통해 비용 대비 품질을 극대화할 수 있습니다.

댓글 0

아직 댓글이 없습니다.
Ctrl+Enter로 등록