토큰이란 무엇인가
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