토큰과 토크나이저 - LLM이 글자를 읽는 방식
LLM API를 써보면 "토큰"이라는 단위를 자주 만납니다. 요금도 토큰으로 매기고, 컨텍스트 한도도 토큰으로 표시됩니다. 그런데 토큰은 우리가 생각하는 "단어"나 "글자"와 정확히 일치하지 않습니다. LLM은 사람처럼 글자를 읽는 게 아니라, 자기만의 방식으로 텍스트를 조각내서 읽기 때문입니다.
이 글에서는 토큰이 무엇이고, 토크나이저가 어떻게 동작하며, 이게 비용·성능·특히 한국어에 어떤 영향을 주는지 정리합니다.
1. 토큰이란 무엇인가
토큰(token) 은 LLM이 텍스트를 처리하는 최소 단위입니다. 사람은 문장을 단어로 나눠 읽지만, LLM은 서브워드(subword), 즉 단어보다 잘거나 큰 조각으로 나눠 읽습니다.
영어 예시를 보면 감이 옵니다.
"unbelievable" → ["un", "believ", "able"] (3 토큰)
"cat" → ["cat"] (1 토큰)
"tokenization" → ["token", "ization"] (2 토큰)
- 자주 쓰이는 단어(
cat)는 통째로 1토큰 - 드물거나 긴 단어는 여러 조각으로 분해
즉 "자주 등장하는 덩어리는 크게, 드문 것은 잘게" 나누는 게 핵심 원리입니다. 대략적인 감각으로 영어는 1토큰 ≈ 4글자 ≈ 0.75단어 정도입니다.
2. 왜 단어도, 글자도 아닌 서브워드인가
토큰 단위를 정하는 데는 트레이드오프가 있습니다.
| 단위 | 장점 | 단점 |
|---|---|---|
| 글자(character) | 어휘가 아주 작음, 모르는 단어 없음 | 시퀀스가 너무 길어짐, 의미 단위 약함 |
| 단어(word) | 의미 단위가 명확 | 어휘 폭발, 신조어·오타 처리 불가 |
| 서브워드(subword) | 어휘 크기와 표현력의 균형 | (그 중간이라 대부분 채택) |
단어 단위로 하면 "어휘 사전"이 수백만 개로 불어나고, 처음 보는 신조어("킹받다")를 아예 처리 못 합니다. 글자 단위로 하면 어휘는 작아지지만 문장 하나가 수백 토큰이 되어 비효율적입니다.
서브워드는 그 사이의 절충안입니다. 알려진 조각을 조합해 어떤 단어든(심지어 오타나 신조어도) 표현할 수 있고, 어휘 크기도 5만~15만 개 수준으로 관리됩니다.
3. BPE - 서브워드를 만드는 대표 알고리즘
가장 널리 쓰이는 방식이 BPE(Byte Pair Encoding) 입니다. 아이디어는 단순합니다.
"가장 자주 붙어 나오는 글자 쌍을 계속 하나로 합쳐라."
동작을 개념적으로 보면 이렇습니다.
초기: l o w l o w e r n e w e s t
1단계: 'e s'가 가장 자주 등장 → 'es'로 병합
2단계: 'es t'가 자주 등장 → 'est'로 병합
3단계: 'l o'가 자주 등장 → 'lo'로 병합
...
반복하면 자주 쓰는 덩어리(low, est ...)가 하나의 토큰이 됨
이 병합을 수만 번 반복해 어휘 사전(vocabulary) 을 완성합니다. 실제 텍스트를 토큰화할 때는 이 사전을 보고 긴 조각부터 매칭합니다.
이렇게 만든 사전을 쓰는 게 토크나이저(tokenizer) 입니다. 토크나이저는 학습된 모델마다 다릅니다. GPT 계열은 tiktoken, 다른 모델은 SentencePiece 등 각자의 토크나이저를 씁니다. 같은 문장도 모델마다 토큰 수가 다르다는 뜻입니다.
요즘은 순수 문자가 아니라 를 많이 씁니다. 텍스트를 UTF-8 바이트로 본 뒤 병합하기 때문에, 어떤 언어·이모지·특수문자도 "모르는 글자" 없이 표현할 수 있습니다.