왜 한국어는 토큰을 많이 먹는가
대부분의 LLM은 BPE(Byte Pair Encoding) 계열 토크나이저를 쓰고, 어휘 사전은 영어 중심 코퍼스로 학습된다. 이 때문에 한국어는 자모 단위나 바이트 단위로 잘게 쪼개져 같은 의미라도 영어보다 토큰 수가 2~3배 늘어난다. 예를 들어 영어 "settings"는 1토큰이지만, "설정"은 토크나이저에 따라 2~4토큰이 된다. 비용은 토큰 수에 비례하므로, 프롬프트가 길고 트래픽이 많은 서비스에서는 이 차이가 곧 월 청구서 차이가 된다.
먼저 측정하라
추측 대신 실제 토큰 수를 세는 것이 출발점이다. 같은 문장을 여러 토크나이저에 넣어 비교하면 어떤 모델이 한국어에 유리한지 바로 드러난다.
import tiktoken
text = "안녕하세요, 오늘 회의 일정을 확인해 주세요."
for name in ["cl100k_base", "o200k_base"]:
enc = tiktoken.get_encoding(name)
n = len(enc.encode(text))
print(f"{name:12} -> {n} tokens ({len(text)} chars)")
# cl100k_base -> 24 tokens
# o200k_base -> 15 tokens
수치는 버전에 따라 다를 수 있으니 반드시 자신의 실제 프롬프트로 재측정한다. 문장 하나가 아니라 대표 트래픽 샘플 수천 건으로 돌려 평균과 분포를 봐야 실제 비용을 추정할 수 있다.
토크나이저별 특성 비교
| 토크나이저 | 주 사용 모델군 | 한국어 효율 | 비고 |
|---|---|---|---|
| cl100k_base | GPT-3.5/4 세대 | 낮음 | 영어 중심, 한글 파편화 심함 |
| o200k_base | GPT-4o 세대 | 중상 | 어휘 확장으로 한글 병합 개선 |
| SentencePiece(다국어) | 다국어 오픈모델 | 가변 | 학습 코퍼스에 한국어 비중이 관건 |
핵심은 "최신일수록 어휘 사전이 크고 다국어를 잘 병합한다"는 경향이지, 절대 규칙이 아니라는 점이다. 모델 선택은 품질·지연·가격을 함께 봐야 하지만, 한국어 토큰 효율도 무시할 수 없는 축이다.
프롬프트 설계로 줄이기
토크나이저를 바꿀 수 없다면 입력 자체를 줄인다. 반복되는 지시문은 압축하고, 장황한 예시는 핵심만 남긴다. 특히 시스템 프롬프트는 매 요청 반복되므로 절감 효과가 크다.
- 불필요한 존댓말·수식어 제거: 지시문은 간결한 명령형으로.
- 중복 설명 통합: 같은 규칙을 여러 번 풀어 쓰지 않는다.
- 출력 형식 강제(JSON 등)로 장황한 서술형 응답 억제.
- 고정 컨텍스트는 프롬프트 캐싱으로 재사용해 반복 비용 제거.
비용 추정 자동화
배포 전에 토큰 수 기반 비용을 파이프라인에서 자동 검증하면 회귀를 막을 수 있다. 아래처럼 요청/응답 토큰을 로깅하고 임계치를 넘으면 경고를 띄운다.
PRICE_IN = 0.15 / 1_000_000 # 입력 100만 토큰당 단가(예시)
PRICE_OUT = 0.60 / 1_000_000
def estimate_cost(enc, prompt, completion):
n_in = len(enc.encode(prompt))
n_out = len(enc.encode(completion))
cost = n_in * PRICE_IN + n_out * PRICE_OUT
if n_in > 4000:
print(f"[warn] 프롬프트 과다: {n_in} tokens")
return round(cost, 6)
단가는 반드시 사용 중인 공급자의 실제 가격으로 채워 넣는다. 값을 하드코딩하지 말고 설정 파일로 분리해 관리하는 편이 안전하다.
주의점
토큰 절감을 과하게 밀어붙이면 부작용이 생긴다. 지시문을 지나치게 줄이면 모델이 형식을 어기거나 품질이 떨어질 수 있으므로, 비용과 정확도를 함께 측정해야 한다. 또한 토크나이저는 모델 버전 업그레이드 시 조용히 바뀔 수 있어, 배포 파이프라인에서 토큰 수를 지속 모니터링하는 것이 안전하다. 마지막으로 토큰 수는 문자 수와 선형 관계가 아니다. 이모지, 특수문자, 코드 블록은 예상보다 훨씬 많은 토큰을 소비하므로 실제 데이터로 검증하는 습관이 가장 중요하다.