한국어 서비스에 LLM을 붙이면서 "글자 수에 얼마를 곱하면 토큰 수가 나오느냐"를 찾고 계신가요? 결론부터 말하면 그런 고정 계수는 없어요. 같은 한국어 1,112자를 11개 토크나이저로 직접 재 보니 적게는 592토큰, 많게는 1,966토큰이었어요. GPT-2 어휘를 빼고 요즘 쓰이는 토크나이저만 봐도 1,000자당 532~1,055토큰으로 두 배 가까이 벌어져서, 비용 추정과 길이 제한은 반드시 쓰려는 모델의 토크나이저나 그 회사의 토큰 세기 API로 계산해야 해요.
토크나이저 원리는 알고 있다고 보고, 이 글은 고를 때 필요한 숫자만 다뤄요. 토크나이저별 실측, 공식 단가로 낸 비용, 토큰 세는 방법별 정확도를 나란히 놓았어요.
한국어 토큰 수, 토크나이저마다 얼마나 다른가
예문은 이 글을 위해 직접 쓴 한국어 네 편이에요. 생활 안내 설명문 305자, 이모티콘 섞인 구어체 고객 문의 209자, 명령어·환경 변수가 섞인 배포 문서 321자, 매출·비율이 이어지는 실적 요약 274자, 합쳐서 1,112자(UTF-8 2,356바이트)예요. tiktoken 0.14.0과 허깅페이스 tokenizers 0.23.3으로 각 모델 저장소의 tokenizer.json을 불러 특수 토큰 없이 쟀어요(2026-10-25).
| 토크나이저 | 어휘 크기 | 설명문 | 구어체 | 기술 문서 | 숫자 | 전체 1,112자 | 1,000자당 |
|---|---|---|---|---|---|---|---|
| gpt2 | 50,257 | 644 | 451 | 458 | 410 | 1,966 | 1,768 |
| cl100k_base | 100,277 | 315 | 195 | 213 | 247 | 970 | 872 |
| o200k_base | 200,019 | 196 | 114 | 148 | 177 | 635 | 571 |
| Qwen2.5·Qwen3 | 151,665 | 228 | 136 | 167 | 220 | 751 | 675 |
| DeepSeek-V3 | 128,815 | 228 | 152 | 174 | 188 | 743 | 668 |
| EXAONE 3.5 | 102,400 | 144 | 96 | 146 | 203 | 592 | 532 |
| Mistral Nemo | 131,072 | 165 | 112 | 150 | 203 | 631 | 567 |
| Kanana 1.5 | 128,259 | 200 | 114 | 154 | 177 | 645 | 580 |
| SOLAR 10.7B | 32,000 | 380 | 234 | 264 | 295 | 1,173 | 1,055 |
gpt-oss-20b는 o200k_base와, Qwen3는 Qwen2.5와 결과가 같았어요.
- 어휘가 크다고 무조건 유리하지 않아요. 어휘 102,400개인 EXAONE 3.5가 200,019개인 o200k_base보다 한국어 토큰을 적게 썼어요. 어휘를 만들 때 넣은 한국어 데이터 양이 더 크게 작용해요.
- 같은 토크나이저 안에서도 글 종류에 따라 달라요. o200k_base에서 1,000자당 토큰은 기술 문서 461, 구어체 545, 설명문 643, 숫자 글 646이었어요.
- 숫자 처리 방식이 결과를 뒤집어요. EXAONE 3.5는 설명문에서 가장 적었지만 숫자 글에서는 203토큰으로 o200k_base(177)보다 많았어요.
글자 수와 UTF-8 바이트는 글자 수 · 바이트 계산기로 볼 수 있고, 한글이 3바이트인 이유는 한글 한 글자 몇 바이트?에 정리해 두었어요.
설명문과 같은 내용의 영어 문단(569자)도 쟀어요. 영어는 거의 모든 토크나이저에서 120~126토큰이었어요.
o200k_base에서 한국어 프롬프트는 같은 영어보다 약 1.6배 비싸요. 지시문만 영어로 바꾸면 토큰은 줄지만 답변 품질이 달라질 수 있어서, 평가 세트로 두 버전을 비교한 뒤 정해요.
한국어 작업 비용 계산 — 모델 단가 × 토큰 수
- 작업: 고객 문의 답변. 입력 한국어 3,000자(시스템 프롬프트·참고 문서·문의), 출력 600자. o200k_base 실측 1,000자당 571토큰으로 입력 1,713토큰, 출력 343토큰.
- 단가: OpenAI 공식 가격표 Standard 기준(2026-10-25 확인). 100만 토큰당 입력/출력 gpt-5-nano 0.05/0.40달러, gpt-5-mini 0.25/2.00달러, gpt-4.1-mini 0.40/1.60달러, gpt-5.4-mini 0.75/4.50달러, gpt-5.4 2.50/15.00달러.
tiktoken0.14.0은gpt-4o·gpt-4.1·gpt-5로 시작하는 모델 이름을 o200k_base로 골라요. 실제 청구 토큰은 응답의usage로 확인해요.
| 모델 | 10만 건 비용 | 출력이 차지하는 비중 |
|---|---|---|
| gpt-5-nano | 약 22.3달러 | 62% |
| gpt-5-mini | 약 111.4달러 | 62% |
| gpt-4.1-mini | 약 123.4달러 | 44% |
| gpt-5.4-mini | 약 282.8달러 | 55% |
| gpt-5.4 | 약 942.8달러 | 55% |
- 모델 선택이 토크나이저 차이보다 커요. gpt-5-nano와 gpt-5.4는 같은 토크나이저인데 비용이 42배 차이 나요. 토크나이저 효율 차이(o200k_base와 cl100k_base 사이가 1.53배)는 그다음 문제예요.
- 출력 600자가 입력 3,000자만큼 비싸요. 출력 단가가 입력의 4~8배라서, 입력이 다섯 배 길어도 다섯 모델 중 네 개에서 비용의 절반 이상이 출력에서 나와요. 답변 길이 지시와 출력 상한이 효과가 커요.
- 반복되는 앞부분은 캐시로 줄여요. OpenAI 프롬프트 캐싱 안내는 캐싱이 기본으로 켜져 있고 앞부분 전체가 정확히 같아야 재사용된다고 적어요. 시스템 프롬프트 2,000자(1,142토큰)가 매번 캐시에 맞는다고 가정하면 gpt-5-mini 10만 건이 약 85.7달러로 23% 줄어요(캐시 입력 0.025달러).
토큰 단가만 나란히 놓고 회사끼리 비교하면 틀려요. Anthropic 토큰 세기 문서는 Claude Opus 4.7부터 새 토크나이저를 써서 같은 입력이 이전 모델보다 약 30% 많은 토큰이 된다고 적어요. 단가 × 내 데이터로 잰 토큰 수를 모델마다 따로 계산해요.
컨텍스트 창과 응답 시간 — 토큰 수가 바꾸는 것
128,000토큰 창을 예로 들면, 실측 비율로 들어가는 한국어는 EXAONE 3.5 약 24만 자, o200k_base 약 22.4만 자, Qwen2.5 약 19만 자, cl100k_base 약 14.7만 자, SOLAR 10.7B 약 12.1만 자, gpt2 약 7.2만 자예요. 같은 "128K"라도 세 배 넘게 차이 나니 RAG 검색 결과를 몇 개 붙일지, 대화 기록을 어디서 자를지는 토큰으로 계산해요.
응답 시간도 출력 토큰 수에 비례해요. 600자 답변은 o200k_base 계열에서 343토큰, cl100k_base 계열에서 523토큰이라 토큰당 속도가 같다면 52% 더 걸려요. 직접 서빙하며 디코딩을 빠르게 하는 방법은 투기적 디코딩 방식별 속도·비용 비교에 있어요.
토큰 세는 방법 고르기 — 로컬 토크나이저 vs 제공사 API
| 방법 | 정확도 | 비용·속도 | 쓰는 곳 |
|---|---|---|---|
로컬 tiktoken (OpenAI 계열) | 본문만, 형식·도구 토큰 빠짐 | 무료, 네트워크 없음 | 견적, 문서 자르기, 대량 전처리 |
로컬 tokenizer.json (공개 가중치 모델) | 서빙하는 모델과 같은 파일이면 정확 | 무료, tiktoken보다 느림 | 자체 서빙 모델의 한도 계산 |
| 제공사 토큰 세기 API | 형식·도구·이미지까지 포함 | 호출 1번(네트워크 왕복) | 보내기 직전 한도 판정 |
응답의 usage | 실제 청구 값 | 추가 비용 없음, 사후 | 청구 대조, 모니터링, 견적 보정 |
- OpenAI: 토큰 세기 가이드의
POST /v1/responses/input_tokens. 가이드는 로컬로 이미지·파일·도구 토큰을 세기 어렵다고 적어요. - Anthropic:
POST /v1/messages/count_tokens. 무료이고 분당 요청 수 제한(등급별 5,000~20,000)만 있으며, 결과는 추정치라고 적혀 있어요. 토크나이저가 공개돼 있지 않아 사실상 유일한 사전 계산 방법이에요. - Google Gemini: 토큰 안내 문서의
count_tokens. 문서의 "토큰 하나 ≈ 4글자"는 영어 기준이에요. 위 실측에서 o200k_base 한국어는 토큰당 1.75글자였어요.
로컬 계산이 빠뜨리는 형식 토큰은 OpenAI 쿡북의 tiktoken 토큰 세기 예제 기준으로 gpt-4o 계열에서 메시지마다 3토큰, 답변 시작에 3토큰이에요. 긴 대화와 도구 많은 에이전트에서는 쌓여요.
세는 속도는 걱정하지 않아도 돼요. M1 맥북에서 예문을 이어 붙인 4.7MB를 인코딩하니 tiktoken(o200k_base)이 3.6MB/s, tokenizers(Qwen2.5)가 0.6MB/s였어요. 한국어 3,000자(약 6.4KB)면 느린 쪽도 11ms예요. tiktoken 저장소는 비교 대상보다 3~6배 빠르다고 적는데, 이 측정에서는 약 6배였어요.
자기 데이터로 1,000자당 토큰과 예상 비용을 뽑는 스크립트예요.
# pip install tiktoken tokenizers huggingface_hub
import tiktoken
from huggingface_hub import hf_hub_download
from tokenizers import Tokenizer
def counter(name):
if "/" not in name: # tiktoken 인코딩 이름
enc = tiktoken.get_encoding(name)
return lambda s: len(enc.encode(s, disallowed_special=()))
tok = Tokenizer.from_file(hf_hub_download(name, "tokenizer.json"))
return lambda s: len(tok.encode(s, add_special_tokens=False).ids)
samples = [line for line in open("my_prompts.txt", encoding="utf-8") if line.strip()]
chars = sum(len(s) for s in samples)
for name in ["o200k_base", "cl100k_base", "Qwen/Qwen2.5-7B-Instruct"]:
n = sum(map(counter(name), samples))
per_1000 = n / chars * 1000
# 입력 3,000자 · 출력 600자, 100만 토큰당 입력 0.25 / 출력 2.00달러 예시
cost = (3000 * per_1000 / 1000 * 0.25 + 600 * per_1000 / 1000 * 2.00) / 1e6
print(f"{name:28s} 1,000자당 {per_1000:6.0f}토큰 · 1건 {cost:.6f}달러")
disallowed_special=()은 사용자 텍스트 속 특수 토큰 문자열을 에러 없이 평범한 글자로 세게 해요.
품질과 어휘 크기 — 토큰을 아끼면 잃는 것
숫자를 어떻게 자르는지 봐요. "신규 가입자 45,113명, 매출 1284억 원"을 넣어 보면 o200k_base는 45·,·113, 128·4처럼 최대 세 자리씩 묶었어요. EXAONE 3.5·Qwen2.5·Mistral Nemo는 4·5·,·1·1·3처럼 숫자를 한 자리씩 끊었어요. 숫자 글에서 토큰은 늘지만 자릿값이 일정해지는 설계라, 숫자가 중요한 서비스는 토큰 수보다 정답률을 먼저 재요.
토큰 경계가 바이트 중간에 걸리기도 해요. cl100k_base는 같은 문장에서 규·매·억을 바이트 조각 둘로 나눴어요. 토큰 수로 잘라 디코딩하면 마지막 글자가 깨질 수 있어서, 끝의 불완전한 바이트를 버리는 처리가 필요해요. 글자별 UTF-8 바이트는 유니코드 변환기로 볼 수 있어요.
직접 토크나이저를 만든다면 어휘 크기는 메모리와 맞바꿔요. 임베딩 행렬은 어휘 수 × 은닉 차원이라, 은닉 차원 4,096이면 어휘 3.2만 개가 약 1.3억, 20만 개가 약 8.2억 파라미터(bf16 1.64GB)예요. 입출력 행렬을 따로 두면 두 배라서 80억 모델의 약 20%가 임베딩이 돼요. 반대로 어휘 3.2만 개 SOLAR 10.7B는 한국어에 o200k_base의 1.85배 토큰을 써서, 추론마다 긴 시퀀스 비용을 내요. 어휘 10.2만 개로 가장 적은 토큰을 쓴 EXAONE 3.5를 보면, 어휘를 키우기보다 학습 말뭉치의 한국어 비중을 확보하는 쪽이 효율적이에요. 학습은 허깅페이스 Tokenizers 문서의 트레이너로 해요.
상황별 추천 — 무엇으로 세고 무엇을 고를까
| 상황 | 추천 | 이유 |
|---|---|---|
| OpenAI 모델 견적·문서 자르기 | tiktoken.encoding_for_model() | 무료·빠름, 본문 토큰은 정확 |
| OpenAI 요청 직전 한도 판정 | responses/input_tokens | 형식·도구 토큰까지 포함 |
| Claude 사용 | count_tokens API | 토크나이저 비공개, 무료로 셀 수 있음 |
| 공개 가중치 모델 직접 서빙 | 서빙 중인 모델의 tokenizer.json | 같은 파일이면 결과가 같음 |
| 한국어 비중이 큰 대량 처리 | 후보 모델 2~3개의 토큰 수를 내 데이터로 측정 | 같은 글이 토크나이저마다 1.6배 넘게 차이 |
| 모델 업그레이드 | 같은 요청을 새 모델로 다시 세기 | 세대가 바뀌면 토크나이저가 바뀔 수 있음 |
LLM 응답을 JSON으로 받는다면 스키마 토큰과 재시도 비용도 함께 봐야 해요. 그 계산은 Structured Outputs vs JSON 모드 비용 비교에 정리해 두었어요.
도입 체크리스트
- 실제 트래픽 샘플로 1,000자당 토큰을 재요. 글 종류별로 나눠 재면 편차가 보여요.
- 출력 비중을 먼저 계산해요.
max_output_tokens와 답변 길이 지시를 정해요. - 자르기는 그 모델의 토크나이저로 해요. 잘린 끝의 불완전한 UTF-8 바이트는 버려요.
- 로컬 값에 여유분을 둬요. 형식·도구 토큰 몫을 남기고, 한도 근처면 제공사 API로 다시 세요.
- 시스템 프롬프트는 앞쪽에 고정해요. 날짜·사용자 이름 같은 바뀌는 값은 뒤로 보내야 캐시가 맞아요.
usage를 기록해요. 입력·캐시·출력·추론 토큰을 남겨 견적과 청구를 대조해요.- 모델을 바꿀 때마다 다시 재요. 같은 회사 모델도 세대가 바뀌면 30%씩 달라질 수 있어요.
자주 묻는 질문
한국어 1,000자는 몇 토큰인가요?
토크나이저마다 달라요. 직접 쓴 예문 기준으로 o200k_base(gpt-4o·gpt-4.1·gpt-5 계열) 약 571토큰, cl100k_base(gpt-4·gpt-3.5) 약 872토큰, EXAONE 3.5 약 532토큰, Qwen2.5 약 675토큰이었어요. 같은 토크나이저 안에서도 글 종류에 따라 460~650토큰을 오갔어요.
한국어가 영어보다 비싼 이유는 뭔가요?
어휘를 만들 때 한국어 데이터가 적으면 3바이트짜리 한글 음절이 한 토큰으로 묶이지 않아요. 같은 내용으로 재면 o200k_base에서 한국어가 영어의 1.62배, cl100k_base에서 2.60배 토큰을 썼어요. 토큰 단가는 언어와 상관없이 같아서 그 배율이 그대로 비용 차이가 돼요.
tiktoken으로 센 값과 청구된 토큰이 다른 이유는요?
tiktoken은 넘긴 텍스트만 세요. 실제 요청에는 메시지 형식 토큰, 도구 정의, 스키마, 이미지가 더해져요. 정확한 값이 필요하면 responses/input_tokens API나 응답의 usage를 써요.
Claude나 Gemini 토큰 수는 어떻게 미리 세나요?
Claude는 토크나이저가 공개돼 있지 않아서 count_tokens API를 써요. 무료예요. Gemini는 count_tokens 메서드를 써요. 둘 다 실제로 쓸 모델 이름을 넣어 세요.
정리
- 한국어 토큰 수에 고정 계수는 없어요. 같은 1,112자가 592토큰(EXAONE 3.5)에서 1,966토큰(gpt2)까지, GPT-2를 빼도 1,000자당 532~1,055토큰으로 갈렸어요.
- 비용은 모델 단가 차이가 토크나이저 차이보다 커요. 입력 3,000자·출력 600자 10만 건이 gpt-5-nano 약 22달러, gpt-5.4 약 943달러였고, 대부분의 모델에서 비용의 절반 이상이 출력에서 나왔어요.
- 견적·자르기는 로컬 토크나이저로, 한도 판정은 제공사 토큰 세기 API로, 청구 대조는
usage로 해요. 로컬 계산은 형식·도구 토큰을 빠뜨려요. - 토큰 수만으로 모델을 고르지 말아요. 숫자 자르는 방식과 지시문 언어가 품질을 바꿔요. 토큰 수는 위 스크립트로 내 데이터에서 직접 재 보세요.