토큰화의 내부 원리: BPE, WordPiece, SentencePiece, Unigram 비교
요약
LLM의 성능과 비용에 직결되는 서브워드 토큰화 알고리즘의 원리와 중요성을 다룹니다. BPE, WordPiece, SentencePiece, Unigram의 차이점을 통해 어휘 사전 크기, 다국어 효율성, 추론 비용 간의 상관관계를 설명합니다.
핵심 포인트
- 토큰화 방식은 API 추론 비용과 직접적인 연관이 있음
- 어휘 사전 크기에 따라 언어별 토큰 효율성이 결정됨
- 토크나이저는 모델의 철자 능력 및 교차 언어 전이에 영향을 미침
- BPE는 GPT-4o, Llama 3 등 현대 LLM의 핵심 기술임
토큰화의 내부 원리: BPE, WordPiece, SentencePiece, Unigram 비교
당신은 챗봇을 배포합니다. 영어 쿼리는 평균 42개의 토큰을 사용합니다. 그런데 스페인어를 사용하는 사용자가 "¿Cómo puedo restablecer mi contraseña?"라고 보내자 103개의 토큰을 잡아먹습니다. 2주 후, 동일한 모델이 생성 결과의 가장자리에 "Ġcon"이라는 문자를 출력하기 시작하고, 이것이 버그인지 기능인지 알 수 없게 됩니다. 재무 팀은 아무도 설명할 수 없는 전월 대비 40%의 비용 증가를 보고합니다.
이것이 바로 토큰화 (Tokenization)를 보이지 않는 배관 작업처럼 취급했을 때 발생하는 일입니다. 모든 주요 LLM 파이프라인은 네 가지 서브워드 토큰화 (subword tokenization) 알고리즘 중 하나를 사용하며, 이 선택이 어휘 사전 크기 (vocabulary size), 희귀 단어 처리, 교차 언어 효율성, 그리고 추론 비용 (inference cost)을 결정합니다. 모델이 어떤 알고리즘을 사용하는지, 그리고 왜 사용하는지를 이해하는 것은 비용 효율적인 제품을 출시하는 것과 분기 중간에 쿼리당 토큰 비율이 조용히 두 배로 뛰었다는 사실을 발견하는 것 사이의 차이를 만듭니다.
이것이 중요한 이유
토큰화는 수익에 직접적인 영향을 미치는 세 가지 요소를 제어합니다:
추론 비용 (Inference cost). LLM API는 토큰 단위로 비용을 청구합니다. 32K 어휘 사전 크기의 BPE 토크나이저를 사용하는 모델은 "restablecer"를 8개의 토큰으로 나눌 수 있지만, 100K 어휘 사전 크기의 Unigram 토크나이저는 이를 3개로 처리할 수 있습니다. 백만 건의 쿼리를 처리할 때, 그 차이는 실제 비용의 차이로 이어집니다.
어휘 범위 (Vocabulary coverage). 희귀 단어, 코드 구문, 다국어 텍스트는 토크나이저에 부담을 줍니다. 적합하지 않은 어휘 사전은 더 긴 시퀀스 (sequences)를 의미하며, 이는 더 느린 생성 속도와 더 높은 비용을 의미합니다.
모델 동작 (Model behavior). 토크나이저는 언어에 대한 모델의 전체적인 시야입니다. 만약 토크나이저가 "cowboy"를 ["cow", "boy"]로 인코딩한다면, 모델은 이를 ["c", "owb", "oy"]로 인코딩할 때와는 다른 것을 학습하게 됩니다. 이는 철자 능력부터 교차 언어 전이 (cross-lingual transfer)에 이르기까지 모든 것에 영향을 미칩니다.
네 가지 토큰화 알고리즘
모든 현대적인 토크나이저 (tokenizer)는 원문 텍스트를 입력받아, 선택적으로 단어 단위로 사전 토큰화 (pre-tokenizes) 한 뒤 (공백 및 문장 부호 기준 분할), 고정된 크기의 어휘 사전 (vocabulary)으로부터 단어를 서브워드 (subword) 단위로 분해합니다. 차이점은 그 어휘 사전이 어떻게 구축되는지와 세그멘테이션 (segmentation) 결정이 어떻게 내려지는지에 있습니다.
1. BPE (Byte-Pair Encoding)
BPE는 1994년 데이터 압축을 위해 도입되었으며, 2016년 Sennrich 등에 의해 신경망 기계 번역 (neural machine translation)을 위해 변형되었습니다. OpenAI는 이를 GPT-2에 채택했으며, 이는 여전히 GPT-4o, Llama 3 및 대부분의 현대적인 LLM의 핵심으로 남아 있습니다.
작동 방식: 모든 개별 문자를 토큰으로 시작합니다. 모든 인접한 토큰 쌍을 계산하고, 가장 빈번한 쌍을 새로운 토큰으로 병합 (merge) 하여 어휘 사전에 추가하며, 목표 어휘 사전 크기에 도달할 때까지 이 과정을 반복합니다.
어휘 사전 크기 목표: 16
초기 어휘 사전: [a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, , ., ,]
학습 코퍼스 (Training corpus): "low low low low low low low low lower lowest lowest lowest lowest lowest lowest lowest"
...
BPE는 탐욕적 (greedy) 이고 결정론적 (deterministic) 입니다. 즉, 어떤 입력에 대해서도 세그멘테이션은 매번 동일합니다. 알고리즘은 학습된 병합 규칙을 순서대로 적용합니다. OpenAI의 GPT-4o는 o200k_base (200,096 토큰)를 사용하고, GPT-4는 cl100k_base (100,256 토큰)를 사용했으며, GPT-2는 50,257개의 토큰 어휘 사전을 사용했습니다.
사용처: GPT-4o, GPT-4, GPT-3.5, Llama 2, Llama 3 (SentencePiece를 통해), DeepSeek, Mistral.
2. WordPiece
Google은 2012년 일본어/한국어 음성 검색을 위해 WordPiece를 도입했으며, 이는 2018년 BERT의 기반이 되었습니다. 이는 종종 "빈도수 대신 가능도 (likelihood)를 사용하는 BPE"라고 설명됩니다.
작동 방식: 알고리즘은 BPE와 동일한 방식인 문자 수준의 초기 토큰으로 시작하지만, 단순 빈도수를 계산하는 대신 현재 어휘 사전 하에서 학습 데이터의 가능도를 최대화하는 쌍을 병합합니다. 실제로 이는 병합을 통해 코퍼스 가능도 (corpus-likelihood)를 가장 많이 증가시키는 쌍을 선택함을 의미합니다.
병합 후보 비교:
"a", "b" 병합 -> 새로운 토큰 가능도 이득: 0.0032
"th", "e" 병합 -> 새로운 토큰 가능도 이득: 0.0417
...
그 결과, WordPiece는 순수하게 빈도에 기반하여 병합하는 BPE에 비해 언어학적으로 더 의미 있는 토큰(흔히 쓰이는 접두사, 접미사, 어근 등)을 생성하는 경향이 있습니다.
사용 사례: BERT, DistilBERT, ELECTRA, 그리고 Google의 대부분의 인코더 전용 (encoder-only) 모델.
3. SentencePiece
SentencePiece는 Google(Kudo and Richardson, 2018)에서 개발한 프레임워크로, BPE와 Unigram 토큰화 (tokenization)를 모두 아우릅니다. 이 방식의 결정적인 혁신은 사전 토큰화 (pre-tokenization) 단계 없이 원시 텍스트 (raw text)에서 직접 작동한다는 점입니다. 대부분의 토크나이저는 학습 전에 공백이나 문장 부호를 기준으로 분리하는 과정이 필요하며, 이는 해당 토크나이저를 특정 언어의 "단어" 개념에 종속시킵니다. SentencePiece는 입력을 가공되지 않은 Unicode 바이트 시퀀스로 취급하여, 진정으로 언어 중립적 (language-agnostic)입니다.
원시 텍스트: "Hello世界"
사전 토큰화 사용 시: ["Hello", "世界"] <- 언어 의존적
SentencePiece 원시 데이터: "H", "e", "l", "l", "o", "世", "界" <- 사전 토큰화 불필요
사용 사례: Llama 2, Llama 3, Gemma, T5, XLNet (Unigram 모드).
4. Unigram Language Model
Unigram (Kudo, 2018)은 문제를 정반대로 뒤집습니다. 문자로부터 어휘집 (vocabulary)을 탐욕적으로 구축하는 대신, 후보 토큰들로 구성된 거대한 어휘집에서 시작하여 확률 모델을 사용하여 이를 가지치기 (prune) 합니다.
작동 원리: Unigram은 각 토큰을 독립적인 사건으로 모델링하며 어휘집에 대한 확률 분포를 학습합니다. 단어의 분절 (segmentation)은 확률의 곱이 가장 높은 점수를 기록하는 토큰들의 시퀀스로 이루어집니다.
어휘집: {"UN": 0.02, "UNIC": 0.005, "NI": 0.01, "UNI": 0.015, ...}
입력: "UNICORN"
...
Unigram은 여러 후보 분할(segmentations)을 평가하고 확률적으로 최적의 것을 선택하기 때문에, BPE보다 토큰화 속도는 느리지만 더 일관된 토큰-의미 매핑(token-to-meaning mappings)을 생성합니다. 이러한 확률적 특성은 또한 **서브워드 정규화 (subword regularization)**를 가능하게 합니다. 이는 학습 과정에서 대안적인 분할을 무작위로 샘플링하여 강건성(robustness)을 향상시키는 기법입니다.
사용 사례: T5, XLNet, ALBERT, 그리고 Unigram 모드의 SentencePiece.
알고리즘 비교
| 속성 | BPE | WordPiece | SentencePiece (BPE) | Unigram LM |
|---|---|---|---|---|
| 어휘 사전 구축 (Vocabulary building) | 빈도수에 따른 탐욕적 병합 (Greedy merge) | 가능도(likelihood)에 따른 탐욕적 병합 | 빈도수에 따른 탐욕적 병합 (BPE와 동일) | 크게 시작하여 가능도에 따라 가지치기 (prune) |
| ... |
실제 적용 사례
다음은 tiktoken (OpenAI의 BPE 토크나이저 라이브러리)을 사용하여 서로 다른 입력값이 어떻게 분해되는지 보여주는 Python 코드 스니펫입니다:
import tiktoken
# GPT-4o는 o200k_base 인코딩을 사용합니다
...
출력 결과 (o200k_base 기준 근사치):
Hello, world! -> 3개 토큰: ['Hello', ',', ' world']
restablecer -> 8개 토큰: ['rest', 'able', 'cer', ...]
Das ist fantastisch -> 6개 토큰: ['Das', ' ist', ' fant', 'ast', 'isch', ...]
...
스페인어 단어는 8개의 토큰을 차지하는 반면, 길이가 비슷한 유사한 영어 단어는 3~4개만 차지한다는 점에 주목하십시오. 이것이 여러분의 월간 청구서에 나타나는 비용 비대칭성(cost asymmetry)입니다.
다음은 단일 단어가 각 토크나이저 유형을 통과하는 과정을 보여주는 다이어그램입니다:
flowchart TD
A["입력: 'unbelievable'"] --> B["사전 토큰화 (Pre-tokenization)<br/>(공백/문장 부호 기준 분할)"]
B --> C{"토크나이저 유형?"}
...
흔한 실수
흔한 실수
모든 토크나이저가 다국어 텍스트를 동일하게 처리한다고 가정하는 것. 공백 접두사 사전 토큰화 (space-prefix pre-tokenization)에 의존하는 BPE 기반 토크나이저(예: cl100k_base)는 공백이 단어를 구분하지 않는 CJK(한중일) 및 인디(Indic) 계열 문표(scripts)에서 성능이 크게 저하됩니다. SentencePiece 모델은 바이트 수준 (byte level)에서 작동하기 때문에 이러한 문제를 더 잘 처리합니다. 만약 사용자의 언어 범위가 라틴 문자를 넘어선다면, 모델을 선택하기 전에 토크나이저의 교차 언어 효율성 (cross-language efficiency)을 확인해야 합니다.
프롬프트 설계를 잘못된 인코딩 (encoding)에 결합하는 것. "결과를 JSON으로 출력하세요"와 같은 지시문은 cl100k_base에서는 5개의 토큰을 소모하지만, o200k_base에서는 7개의 토큰을 소모합니다. GPT-4를 위해 프롬프트를 작성한 후 다른 토크나이저를 사용하는 모델로 이전하는 개발자들은 프롬프트의 토큰 경계 전달 (token boundary handoff) 방식을 자신도 모르게 변경하게 되며, 이는 출력 품질의 변화를 초래할 수 있습니다.
파인튜닝 (fine-tuning) 시 토크나이저의 역할을 무시하는 것. 모델을 파인튜닝할 때 어휘 사전 (vocabulary)을 확장할 수 있지만, 그렇게 하려면 새로운 임베딩 벡터 (embedding vectors)를 초기화해야 하며, 모델은 처음 수천 단계 (steps) 동안 새로운 토큰에 대해 예측 불가능하게 동작할 것입니다. 대부분의 실무자들은 기존 어휘 사전을 사용하고, 어휘 외 토큰 (out-of-vocabulary tokens)은 문자 수준 폴백 (character-level fallback)을 통해 처리하는 것이 더 낫습니다.
"접두사 공백 분할" 함정. 대부분의 BPE 토크나이저는 사전 토큰화 과정에서 각 단어 앞에 공백을 추가합니다 (byte-pair encoding은 "Hello"가 아닌 " Hello"라는 문자열에 대해 작동합니다). 이는 공백 접두사가 일관적이라면 "Hello"(대문자, 문장 시작)와 "hello"(소문자, 문장 중간)가 동일한 토큰인 " Hello"를 공유함을 의미합니다. 하지만 텍스트 형식이 변경되어—끝 공백을 제거하거나 표준이 아닌 문장 부호를 사용하는 경우—동일한 의미적 내용이라도 훨씬 더 많은 토큰으로 토큰화될 수 있습니다.
토크나이저 버전이 중요하다는 사실을 잊는 것. p50k_base, cl100k_base, o200k_base는 모두 서로 다른 사전 토큰화 (pre-tokenization) 규칙과 어휘 사전 (vocab) 크기를 가진 BPE를 사용합니다. 만약 두 모델의 토큰 수를 세는 데 서로 다른 토크나이저를 사용했다면, 두 모델 출력의 비교는 무의미합니다. 모든 평가 스크립트에서 tiktoken 버전 (2026년 6월 기준 tiktoken==0.13.0)과 인코딩 이름을 고정하십시오.
사용하지 말아야 할 때
정확한 문자 수준 (character-level) 제어가 필요할 때. 토큰화는 텍스트 문자와 모델 내부 표현 사이의 정렬 (alignment)을 파괴합니다. 철자 교정기 (spelling corrector)를 구축하고 있다면, 어떠한 서브워드 토크나이저 (subword tokenizer)보다 문자 수준 모델 (ByT5 또는 CANINE와 같은)이 더 나은 결과를 생성합니다.
지연 시간 (latency)이 절대적인 우선순위일 때. SentencePiece Unigram과 WordPiece는 모두 텍스트를 분할하기 위해 언어 모델 (language model) 또는 비터비 디코더 (Viterbi decoder)를 실행해야 합니다. BPE는 더 단순하고 빠릅니다. 만약 한 자릿수 밀리초 (ms) 단위의 첫 토큰 생성 시간 (TTFT) 예산을 측정하고 있다면, 순수 BPE 토크나이저를 사용하고 어휘 사전 크기를 50K 미만으로 유지하십시오.
단일 언어 및 도메인 특화 모델을 구축할 때. 만약 전체 작업이 영어 의료 텍스트 분류라면, 속도와 퍼플렉시티 (perplexity) 모두에서 범용 100K 어휘 사전보다 뛰어난 성능을 보이는 커스텀 BPE 어휘 사전 (15K-20K 토큰)을 구축할 수 있습니다. 범용 어휘 사전은 도메인 밀도가 아닌 웹 규모의 다양성에 최적화되어 있습니다.
가역적인 토큰화 (reversible tokenization)가 필요할 때. 서브워드 토큰화는 손실이 발생합니다 (lossy). 만약 토크나이저가 정규화 (normalization, 소문자 변환, NFKC Unicode 정규화 등)를 적용했다면, 토큰 ID로부터 원래의 문자열을 완벽하게 재구성할 수 없습니다. 바이트 수준의 왕복 (round-trip)이 필요하다면, 바이트 수준 토크나이저 (ByT5 또는 CANINE에 있는 것과 같은)를 사용하십시오.
모델 제품군(model families) 간의 벤치마크를 수행할 때. GPT-4o (200K 어휘 사전, BPE)를 Llama 3 (32K 어휘 사전, SentencePiece BPE)와 토큰 수로 비교하는 것은 사과와 오렌지를 비교하는 것과 같습니다. 모델들이 서로 다른 토크나이저를 사용하는 경우, 항상 토큰 비용이 아닌 문자 또는 바이트 비용으로 벤치마크를 수행하십시오.
요약 (TL;DR)
- BPE (GPT-4o, Llama 3, Mistral)는 가장 빈번하게 등장하는 문자 쌍을 탐욕적 (Greedy)으로 병합하여 어휘 사전 (Vocabulary)을 구축합니다. 결정론적 (Deterministic)이고 빠르지만, 다국어 텍스트 처리에는 취약합니다.
- WordPiece (BERT, ELECTRA)는 빈도수 대신 가능도 이득 (Likelihood gain)을 기준으로 병합합니다. 언어학적으로 더 의미 있는 토큰을 생성하지만, 사전 토큰화 (Pre-tokenization) 과정이 필요합니다.
- SentencePiece (Llama 3, Gemma, T5)는 BPE와 Unigram을 아우르며, 사전 토큰화 없이 원시 바이트 (Raw bytes) 단위로 작동합니다. 다국어 처리 능력이 가장 뛰어납니다.
- Unigram (T5, XLNet)은 큰 어휘 사전에서 시작하여 가능도 (Likelihood)를 기준으로 가지치기 (Pruning)를 수행합니다. 서브워드 정규화 (Subword regularization)를 지원하며, 세그멘테이션 (Segmentation) 속도가 느린 대신 토큰과 의미 간의 일관된 정렬을 생성합니다.
- 토크나이저의 선택은 추론 비용 (Inference cost)에 직접적인 영향을 미칩니다. 32K 어휘 사전의 영어 최적화 토크나이저와 200K 어휘 사전의 범용 토크나이저는 동일한 다국어 입력에 대해 매우 다른 토큰 수를 생성할 것입니다.
- 토큰 수 지표를 보고할 때는 반드시 토크나이저 버전과 인코딩 이름을 명시하십시오.
cl100k_base와o200k_base사이의 차이는 동일한 텍스트에 대해 토큰 수를 15~30%까지 변화시킬 수 있습니다.
다음 포스트
모델이 어떤 토크나이저를 사용하는지 알게 되었다면, 다음 질문은 토크나이저가 토큰을 최대한 낭비하지 않도록 데이터를 어떻게 준비하느냐입니다. 이는 전략적인 프롬프트 설계 (Prompt design), 사용 중인 언어 조합에 적합한 모델 선택, 그리고 정확도와 함께 토큰 효율성을 측정하는 평가 파이프라인 (Evaluation pipelines) 구축을 의미합니다. 다음 포스트에서는 배포 전 사용자당 토큰 소비량을 추정하는 구체적인 방법을 포함하여, 토큰 효율적인 프롬프트 엔지니어링 (Prompt engineering)에 대해 다룰 예정입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기