토크나이저와 BPE (기술 심화)
:::note 전제 03. 동작 원리에서 "토큰"의 개념을 봤다는 가정하에, 이 문서는 토큰이 실제로 어떻게 만들어지는지를 다룹니다. 모든 계산(어텐션)의 입구에 해당합니다. :::
1. 왜 토크나이저가 필요한가
모델은 글자도 단어도 아닌 정수 ID 배열만 다룹니다. 토크나이저는 텍스트 ↔ ID를 변환하는 사전입니다.
"보안" ──(encode)──▶ [15329, 8842] ──모델──▶ ... ──(decode)──▶ "보안"
선택지는 세 가지였습니다.
| 단위 | 문제 |
|---|---|
| 글자(char) | 시퀀스가 너무 길어짐(비효율), 의미 단위 약함 |
| 단어(word) | 어휘집 폭발, 오타·신조어·미등록어(OOV) 처리 불가 |
| 서브워드(subword) | 둘의 절충 — 현대 LLM의 표준 |
2. BPE(Byte-Pair Encoding) — 핵심 알고리즘
가장 널리 쓰이는 서브워드 방식. 자주 같이 나오는 쌍을 반복해 병합해 어휘집을 만듭니다.
학습(어휘집 생성) 과정:
초기: 모든 글자를 토큰으로 시작
low, lower, newest, widest ...
→ 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"
...목표 어휘집 크기에 도달할 때까지 반복
추론(인코딩) 시에는 학습된 병합 규칙을 순서대로 적용해 텍스트를 토큰으로 쪼갭니다.
:::info 변형
- Byte-level BPE (GPT 계열): 유니코드 글자가 아니라 바이트 단위에서 BPE → 어떤 문자(이모지·희귀문자)도 OOV 없이 표현
- WordPiece (BERT): 병합 기준이 빈도가 아니라 우도(likelihood) 증가량
- SentencePiece (다국어): 공백도 기호(▁)로 다뤄 언어 구분 없이 처리 :::
3. 어휘집(Vocabulary)
- 어휘집 크기는 보통 3만~30만(예: 32k, 100k, 256k)
- 각 토큰 ID는 어텐션 문서의 임베딩 테이블 행과 1:1 대응
- 특수 토큰 존재:
<bos>(시작),<eos>(끝),<pad>,<unk>, 그리고 채팅 템플릿용 역할 토큰
4. 한국어가 토큰을 더 쓰는 이유
같은 의미라도 한국어가 영어보다 토큰을 많이 소비합니다.
"security" → [sec][urity] 2토큰
"보안" → [보][안] 또는 [보안] 1~2토큰(모델별)
"정보보호" → [정][보][보][호] 가능 최대 4토큰
원인:
- 영어 중심으로 학습된 어휘집은 영어 서브워드가 풍부, 한국어는 글자 단위로 쪼개지기 쉬움
- byte-level BPE에서 한글 1글자 = UTF-8 3바이트 → 더 잘게 나뉠 수 있음
영향:
- 비용(토큰당 과금)과 컨텍스트 길이 한계가 한국어에서 불리
- 다국어·한국어 특화 토크나이저를 쓰는 모델이 한국어 효율이 좋음
5. 실무에서 알아둘 점
- 토큰 ≠ 글자 수: 길이 제한·비용 계산은 토큰 기준
- 토크나이저가 다르면 같은 문장도 토큰 수가 다름 → 모델 간 비용 비교 시 주의
- 코드·숫자·공백 처리 방식이 모델마다 달라 성능 차이를 만듦
6. 요약
| 개념 | 한 줄 |
|---|---|
| 토크나이저 | 텍스트 ↔ 정수 ID 변환 사전 |
| BPE | 빈번한 쌍을 반복 병합해 서브워드 어휘집 생성 |
| byte-level | 바이트 단위라 OOV 없음(GPT 계열) |
| 어휘집 | 토큰 ID ↔ 임베딩 행 1:1 |
| 한국어 비효율 | 어휘집 편향·UTF-8 바이트로 토큰 수 ↑ |
- 다음: 어텐션과 트랜스포머 (심화)