12,000 토큰짜리 시스템 프롬프트는 에디터에서 보면 평범해 보인다. 하지만 Claude Sonnet 4.6 호출 한 번마다 3.6 센트가 빠져나가고, 사용자가 첫 글자를 치기도 전에 컨텍스트 윈도우 12K 가 이미 소진된 상태가 된다. 2026 년 LLM 지출은 모두 토큰 단위로 과금되고, “글자 수 × 0.25” 공식으로는 예산을 잡기 어렵다. 결국 공급자가 쓰는 것과 동일한 토크나이저가 필요하다.
이 가이드는 BPE 토크나이저가 실제로 무슨 일을 하는지, 같은 문장을 GPT-4o 와 Claude 가 왜 다르게 쪼개는지, 공급자별 비용 계산은 어떻게 작동하는지, 그리고 원격 토크나이저 API 호출이 허용되지 않는 프로덕션 코드 경로에서 어떻게 토큰을 로컬로 셀 수 있는지 짚어 본다.
API 키 없이 토큰 세기
프롬프트를 붙여 넣으면 현재 프런티어 모델 6 종 - GPT-5, GPT-4.1, GPT-4o, Claude Sonnet 4.6, Gemini 3 Pro, DeepSeek V3 - 의 토큰 수와 입력 비용 추정치가 한 번에 나온다. 계산은 브라우저에서 실행된다. GPT 계열은 OpenAI 의 o200k_base BPE 테이블로 정확히 세고, OpenAI 외 공급자는 보정된 근사치를 쓴다. 랭크 테이블은 idle 시점에 한 번만 로드되고, 그 뒤로는 페이지 밖으로 아무 데이터도 나가지 않는다.
토큰이란 무엇인가
토큰은 언어 모델이 실제로 읽는 단위다. 모델은 글자나 단어를 보지 않고, BPE(Byte Pair Encoding) 알고리즘이 인터넷 규모 텍스트로 학습되어 만들어 낸 정수 ID 시퀀스를 본다. 학습 과정에서는 가장 자주 등장하는 인접 바이트 쌍을 반복적으로 병합해 약 100,000 ~ 200,000 개 항목의 어휘를 구성한다. the, ing, you(앞 공백 포함) 같은 흔한 영어 조각은 토큰 하나로 합쳐지고, 드문 문자열·URL·대부분의 CJK 문자는 한 글자가 여러 토큰으로 분해된다.
머릿속에 두면 좋은 대략적인 감각.
| Sample | cl100k_base tokens | o200k_base tokens |
|---|---|---|
Hello, world! | 4 | 4 |
tokenizer | 1 | 2 |
browser-based developer tools | 4 | 4 |
https://api.example.com/v1/users?limit=10 | 12 | 12 |
你好,世界! | 7 | 4 |
東京の天気は晴れ | 10 | 7 |
마지막 두 행이 GPT-4o 와 함께 공개된 o200k_base 가 비영어권에서 왜 큰 사건이었는지 보여 준다. 어휘 크기를 두 배로 늘리자 중국어·일본어·한국어·아랍어 토큰 수가 20 ~ 40 % 줄었다. 긴 컨텍스트 호출에서 이건 곧 돈이다. 한국어처럼 멀티바이트 문자가 많은 언어에서는 효과가 특히 두드러져, 같은 한국어 문서를 GPT-3.5 에서 GPT-4o 로 옮기는 것만으로 입력 토큰이 30 % 가까이 줄어든 사례도 흔하다.
공급자별 토큰 수가 다른 이유
공급자마다 토크나이저를 따로 학습한다. 어휘, 바이트 폴백 전략, 특수 토큰 예약 정책이 모두 다르다. 같은 문단을 cl100k_base, o200k_base, Anthropic 토크나이저, Google SentencePiece, Meta Llama 3 토크나이저에 넣으면 4 ~ 6 가지 결과가 비슷하지만 결코 동일하지 않다.
| Provider | Tokenizer | Vocabulary size | Notes |
|---|---|---|---|
| OpenAI GPT-3.5/GPT-4 | cl100k_base (BPE) | ~100K | text-embedding-3 와 동일 |
| OpenAI GPT-4o/4.1/5 | o200k_base (BPE) | ~200K | 어휘 2 배, 다국어 효율 향상 |
| Anthropic Claude | Custom BPE (closed) | ~100K | 토크나이저 비공개, count_tokens API 로 측정 |
| Google Gemini | SentencePiece | ~256K | 알고리즘 계열 자체가 다름 |
| Meta Llama 3.x | tiktoken-style BPE | ~128K | OpenAI 호환 BPE 포맷, 어휘는 다름 |
| DeepSeek V3 | Custom BPE | ~100K | 영중 이중언어 코퍼스로 학습 |
여기서 두 가지 결과가 따라 나온다.
- 토큰 수는 직접 비교할 수 없다. “이 프롬프트는 1,000 토큰” 이라는 말은 토크나이저 이름을 함께 밝혀야 의미가 있다. 영어 기준 GPT-4o 1,000 토큰은 Claude 약 970 토큰, 중국어로는 850 ~ 1,100 토큰까지 흔들린다.
- 비용 비교는 토큰이 아니라 달러로 해야 한다. 공급자별 토큰 수에 100 만 토큰당 단가를 곱해 달러로 환산한 뒤 비교한다. ZeroTool 카운터는 그 단계를 대신 처리한다.
빠른 산수: 토큰을 달러로
비용 계산은 단순하지만 코드 리뷰 중에 눈대중으로 하다가는 자주 틀린다. 공식은 다음과 같다.
cost_usd = (tokens / 1_000_000) * price_per_1M_usd
현실적인 예시 하나로 풀어 보자. Anthropic Claude Sonnet 4.6 의 입력 단가가 100 만 토큰당 $3.00 이고, 12,000 토큰짜리 시스템 프롬프트가 매 요청마다 함께 전송된다고 하자.
cost_per_request_usd = (12_000 / 1_000_000) * 3.00 = 0.036
cost_per_1k_requests = 0.036 * 1000 = 36.00
cost_per_1M_requests = 0.036 * 1_000_000 = 36_000
12K 토큰 시스템 프롬프트는 사용자 입력이나 모델 출력을 세기도 전에 100 만 호출당 $36,000 을 먹는다. 출력 토큰은 청구서를 더 부풀린다. 출력 100 만 토큰당 $15 인 모델에서 평균 응답이 500 토큰이면, 같은 100 만 호출에 $7,500 가 추가된다. 토큰 카운터에 30 초만 투자하면 코드 리뷰 단계에서 이걸 잡아낼 수 있다.
js-tiktoken 이 브라우저에서 작동하는 방식
ZeroTool 카운터는 OpenAI 공식 tiktoken 라이브러리의 JavaScript 포팅인 js-tiktoken 위에 올려져 있다. tiktoken 은 오픈 소스이며, OpenAI 가 프로덕션에서 쓰는 BPE 테이블을 그대로 포함한다. JavaScript 포팅은 동일한 테이블을 브라우저 번들용으로 컴파일해 함께 제공한다.
핵심 구성 요소.
Tiktoken클래스 - 인코더/디코더 런타임. 어휘 테이블을 받고.encode(text)와.decode(ids)를 노출한다.- 랭크 테이블 -
cl100k_base,o200k_base,p50k_base,r50k_base,gpt2의 별도 모듈. 각 테이블은 gzip 기준 약 150 ~ 300 KB 다. ZeroTool 카운터는o200k_base만 동적으로 임포트하고,requestIdleCallback으로 지연시켜 첫 페인트를 1.2 초 안에 유지한다. - WASM 미사용 - 라이트 빌드는 순수 JavaScript 다. 덕분에 서비스 워커, Cloudflare Workers, deno deploy 같은 환경에서 바이너리 로더 없이 동작한다.
코드에서 토큰 세기
코드 경로용으로는 다음이 브라우저 도구와 같은 일을 한다. 런타임 차이는 번들 크기뿐이다. 서버 사이드에서는 보통 다섯 개 어휘를 모두 포함하는 풀 토크나이저를 쓰고, 브라우저에서는 필요한 것만 골라 쓴다.
Python (tiktoken)
import tiktoken
enc = tiktoken.get_encoding("o200k_base")
text = "Count me carefully, please."
tokens = enc.encode(text)
print(len(tokens), tokens)
# 6 [3417, 668, 18455, 11, 4843, 13]
인코딩 이름 대신 모델 이름을 쓰려면 tiktoken.encoding_for_model("gpt-4o") 를 호출한다. 알맞은 테이블로 자동 매핑된다.
JavaScript (js-tiktoken, 브라우저 또는 Node)
import { Tiktoken } from "js-tiktoken/lite";
import o200k_base from "js-tiktoken/ranks/o200k_base";
const enc = new Tiktoken(o200k_base);
const text = "Count me carefully, please.";
const tokens = enc.encode(text);
console.log(tokens.length, tokens);
// 6 [ 3417, 668, 18455, 11, 4843, 13 ]
번들을 더 줄이려면 사용자 제스처 뒤에서 랭크 테이블을 동적 임포트해 별도 청크로 쪼갠다.
Bash (CI 프롬프트용 원샷)
python -c "
import sys, tiktoken
enc = tiktoken.get_encoding('o200k_base')
print(len(enc.encode(sys.stdin.read())))
" < prompt.md
CI 가드로 유용하다. prompt.md 가 예컨대 2,000 토큰을 넘기면 빌드를 실패시킨다. find prompts/ -name '*.md' | xargs -I {} ... 와 조합하면 디렉터리 전체를 감사할 수 있다.
자주 부딪히는 함정
팀에 실제 비용이나 프로덕션 사고로 돌아온 패턴이다.
-
글자 수로 비용을 추정한다. “토큰당 4 글자 정도” 는 영어 평균으로는 맞지만 코드(
__init__.py는 11 글자에 5 토큰, 비율 2.2)나 CJK 텍스트(o200k_base 에서 한자는 보통 글자당 1 ~ 2 토큰, 0.25 가 아님)에서는 크게 빗나간다. 진짜 토크나이저를 써야 한다. -
챗 포맷 오버헤드를 잊는다. 챗 API 는 메시지마다 역할 마커(
<|im_start|>system\n...<|im_end|>)로 감싸고, 메시지당 3 ~ 8 토큰이 더 든다. 100 메시지짜리 대화는 본문 한 글자 들어가기 전에 순수 오버헤드만 300 ~ 800 토큰을 낸다. 카운터는 텍스트 한 덩이를 잰다. 챗 세션이라면 메시지별 합계에 턴당 약 4 토큰을 더한다. -
한 번 세고 여러 번 보낸다. 매 요청마다 함께 가는 시스템 프롬프트는 매 요청마다 청구된다. 캐시해야 한다. OpenAI, Anthropic, Google 모두 프롬프트 캐싱을 제공하고, 캐시된 부분은 50 ~ 90 % 할인된다. 카운터의 기준 단가는 캐시 미적용 가격이다.
-
도구 호출 페이로드를 무시한다. 함수 정의와 도구 스키마도 입력 예산에 포함된다. 30 개 중첩 필드를 가진 JSON 스키마가 800 토큰까지 부풀어 오를 수 있다. 모델을 바꿨더니 청구서가 올랐다면, 모델이 퇴보했다고 결론 내기 전에 도구 정의부터 감사한다.
-
대시보드에서 정확치와 근사치를 섞는다. ZeroTool 도구가 OpenAI 카운트는
exact, 나머지는approx로 표시하는 데에는 이유가 있다. 토큰 단위로 고객에게 과금한다면, 로컬 추정치가 아니라 API 응답에 들어 있는 공급자의 정확한 토큰 수를 기록해야 한다. -
출력 토큰 예산을 안 잡는다. 출력은 보통 입력보다 3 ~ 5 배 비싸다. 한 번에 1,000 토큰짜리 단락으로 답하는 봇은 사용자 프롬프트 전체보다 출력 쪽에서 더 많은 비용을 낸다.
로컬 토크나이저 vs 호스팅 토크나이저
대부분의 공개 토큰 카운터는 프롬프트를 서버 사이드 토크나이저 엔드포인트로 보낸다. 다음 세 부류 입력에는 문제가 된다.
- 독자 시스템 프롬프트. 영업 비밀, 모델 동작, 경쟁 해자가 들어 있다. 외부 엔드포인트로 흘려보내면 전부 새어 나간다.
- 고객 데이터. 실제 채팅 로그, 고객 지원 티켓, 프로덕션에서 생성된 콘텐츠는 개인정보 보호 약속에 묶여 있다. 외부 토크나이저가 요청을 로깅할 수도 있다.
- 에어 갭 환경. 헬스케어, 금융, 국방 등 규제 산업은 프롬프트를 공용 인터넷으로 라우팅하는 것 자체가 불가능하다.
ZeroTool 카운터는 BPE 인코더 전체를 브라우저에서 돌려 세 가지 문제를 한꺼번에 해결한다. DevTools 의 Network 탭에서 직접 확인할 수 있다. 페이지와 지연 로드된 랭크 테이블이 안정 상태에 들어간 뒤로는 자유롭게 입력해도 추가 외부 요청이 잡히지 않는다. 같은 접근이 코드에서도 통한다. Python 은 tiktoken, Node 와 브라우저는 js-tiktoken 으로 어휘를 프로세스 내부에 함께 싣는다. 카카오엔터프라이즈, 네이버 클로바 같은 국내 LLM 서비스도 토큰 단위 과금이라, 사내 프롬프트를 공급자 비교용으로 측정할 때 같은 우려가 그대로 적용된다.
ZeroTool vs 다른 카운터
| Tool | Tokenizer accuracy | Privacy model | Cost columns |
|---|---|---|---|
| OpenAI Platform Tokenizer | OpenAI 만 정확 | 서버 사이드 | 없음 |
| gpt-tokenizer.dev | tiktoken 으로 정확 | 클라이언트 사이드 | 없음 |
| tokencounter.org | OpenAI 정확 + 그 외 근사 | 서버 사이드 | 있음 |
| ZeroTool AI 토큰 카운터 | OpenAI 정확 + Claude/Gemini/DeepSeek 보정 근사 | 클라이언트 사이드 | 있음 |
공급자 자체 count_tokens API | 해당 공급자에 한해 정확 | 서버 사이드, API 키 필요 | 공급자별 |
OpenAI 만 쓰는 워크로드라면 gpt-tokenizer.dev 와 OpenAI 호스팅 도구 모두 잘 작동한다. 다중 모델을 비용 칼럼과 함께 비교하고 API 키도 필요 없는 가장 간단한 길은 ZeroTool 도구다.
카운터로 빨라지는 워크플로
카운터에 붙여 넣는 것만으로 시간을 아끼는 패턴 몇 가지.
- 배포 전 프롬프트 다이어트. 최종 시스템 프롬프트를 붙여 넣고 500 토큰을 더 깎을 수 있는지 확인한다. 절약된 토큰 하나하나가 배포 수명 동안 모든 사용자 요청에 누적된다.
- 벤더 교체 평가. 같은 페이로드를 6 개 공급자로 동시에 돌리고 비용 칼럼만 본다. 토크나이저 차이만으로 승자가 30 % 까지 뒤집히는 경우가 흔하다.
- 컨텍스트 윈도우 계획. GPT-4o 는 128K, Claude Sonnet 4.6 는 200K, Gemini 3 Pro 는 2M 윈도우를 가진다. 검색 시스템이 180K 토큰을 끌어온다면 Claude(200K)와 Gemini(2M)에는 여유가 있지만 GPT-4o(128K)에는 없다. 어떤 모델이 아직 자리가 남는지 카운터가 바로 보여 준다.
- 다국어 감사. 같은 콘텐츠를 영어와 타깃 시장 언어로 각각 돌린다. 한국어 콘텐츠를 다룬다면 cl100k_base 대비 o200k_base 의 CJK 효율 개선이 곧 비용 절감으로 이어지고, 모델 품질 향상은 덤이다.
- 가격 변경 대응. 공급자가 헤드라인 단가를 내릴 때마다(OpenAI 는 2024 ~ 2025 년에 세 차례 단행했다) 다시 계산한다. 카운터에는 FAQ 에 날짜가 박힌 정적 기준 단가가 실려 있다. 시작점으로만 쓰고, 갱신 계약 전에는 공급자 가격 페이지에서 다시 확인한다.
더 읽을거리
공급자 문서와 표준.
- OpenAI tokenizer cookbook -
tiktoken공식 Python · JS 예제 - Anthropic count_tokens API - API 로 측정하는 정확한 Claude 토큰 수
- Google AI count_tokens - Gemini API 의 SentencePiece 카운터
- BPE 원논문 (Sennrich et al., 2016) - 기반 기법
- Karpathy, “Let’s build the GPT tokenizer” - BPE 내부를 3 시간 동안 파고든 강의
연관 ZeroTool 위젯.
- Word & Character Counter - 토큰이 아닌 글자·단어 분량 제한이 필요한 경우
- JSON Formatter - 토큰을 세기 전에 도구 호출 스키마 정리
- cURL to Code - 공급자 API 예제를 Python · JS · Go · PHP · Node 로 변환
- Fake Data Generator - 부하 테스트용으로 알려진 토큰 크기의 합성 프롬프트 생성