토큰화는 LLM이 글자를 그대로 읽지 않고 문장을 최소 단위인 토큰으로 쪼개 번호를 붙여 처리하는 과정이다. API 요금, 컨텍스트 한도, 출력 상한이 모두 토큰 수로 정해지므로 비용과 길이는 글자 수가 아니라 토큰 수로 따져야 한다.
| 항목 | 토큰과의 관계 |
|---|---|
| API 요금 | 입력·출력 토큰 수로 청구 |
| 컨텍스트 윈도우 | 한 번에 넣을 수 있는 토큰 한도 |
| RAG 청크 크기 | 토큰 단위로 나눠야 한도에 맞는다 |
대부분의 LLM은 BPE 방식을 쓴다. 자주 나란히 나오는 조각을 하나로 합치는 일을 반복해서, "the"처럼 흔한 단어는 토큰 하나가 되고 드문 단어는 여러 조각으로 나뉜다. 토큰 종류(어휘)가 많을수록 같은 문장이 더 적은 토큰으로 끝난다.
같은 일본어 생일 축하 문장 하나를 토크나이저별로 쪼갠 결과(OpenAI 쿡북 예시).
쪼개는 규칙이 영어 위주 데이터로 만들어지는 경우가 많고, 한글 한 글자는 3바이트라 잘게 쪼개지기 쉽다. 그래서 같은 내용이어도 한국어 프롬프트가 영어보다 비용이 더 드는 경향이 있다. 최신 토크나이저일수록 차이가 줄었지만 없어지지는 않았다.
긴 계약서나 로그를 넣기 전에 한도를 넘는지 확인하거나, 요청 크기에 따라 큰 모델과 작은 모델로 나눠 보낼 때 토큰 수를 미리 센다. 구조화된 데이터는 따옴표·중괄호가 많은 JSON보다 YAML이 토큰을 덜 쓰는 경우가 많다.
| 모델 | 세는 방법 |
|---|---|
| OpenAI | tiktoken의 encoding_for_model()로 로컬에서 계산 |
| Claude | count_tokens 엔드포인트에 요청 형식 그대로 보내기 (무료, 시스템 프롬프트·도구 포함) |
토크나이저는 모델마다 다르다. Claude Opus 4.7 이후 모델은 같은 텍스트가 이전보다 약 30% 많은 토큰으로 계산되니, 모델을 바꿀 때는 새 모델로 다시 세어야 한다.
모델은 "strawberry"를 알파벳 열 개가 아니라 토큰 두세 개로 본다. 그래서 글자 개수 세기, 문자열 뒤집기, 자릿수 계산 같은 작업에서 엉뚱한 실수를 하기 쉽다. 이런 작업은 결과를 따로 확인하는 게 안전하다.
사람들이 토큰화를 직접 마주하는 건 대부분 토큰 수를 세는 순간이다. 요청을 보내기 전에 미리 세어 두면 요금을 예상하고, 한도를 넘어 잘리거나 오류가 나는 일을 막을 수 있다.
| 어디서 | 어떻게 쓰나 |
|---|---|
| API 비용 견적 | 대표 프롬프트와 답변의 토큰 수를 세어 요청 수를 곱해 월 비용을 미리 계산 |
| 사내 문서 검색(RAG) | 문서를 글자 수가 아니라 토큰 수 기준으로 잘라 청크가 한도 안에 들어가게 |
| 긴 대화·코딩 에이전트 | 대화 기록이 컨텍스트 한도에 가까워지면 오래된 내용을 요약하거나 덜어냄 |
| 출력 길이 제어 | max_tokens를 작업에 맞게 정해 답이 중간에 끊기거나 너무 길어지지 않게 |