토크나이제이션 파이프라인
토크나이제이션 파이프라인
Tokenizer.encode() 또는 encode_batch()를 호출하면 입력 텍스트가 일련의 파이프라인 단계를 거쳐요. 순서는 다음과 같아요.
- 정규화(normalization)
- 사전 토큰화(pre-tokenization)
- 모델(model)
- 후처리(post-processing)
각 단계가 무엇을 하는지, 그리고 tokenizers가 각 단계를 어떻게 커스터마이즈하게 해주는지 살펴볼게요.
정규화(Normalization)
각 정규화 연산은 Normalizer로 표현되고, 여러 개는 normalizers.Sequence로 합칠 수 있어요. 예를 들어 NFD 유니코드 정규화 + 악센트 제거를 조합할 수 있어요.
from tokenizers import normalizers
from tokenizers.normalizers import NFD, StripAccents
normalizer = normalizers.Sequence([NFD(), StripAccents()])
tokenizer.normalizer = normalizer
사전 토큰화(Pre-Tokenization)
사전 토큰화는 입력을 더 작은 조각으로 나눠, 최종 토큰의 상한선을 정하는 작업이에요. "단어"로 나눈다고 생각하면 돼요. 공백과 문장부호 기준으로 나누는 Whitespace가 가장 간단해요.
from tokenizers.pre_tokenizers import Whitespace
tokenizer.pre_tokenizer = Whitespace()
모델(Model)
모델은 실제 토크나이제이션을 담당하는 핵심 단계예요. 사전 토큰을 어휘의 토큰으로 분할하고, 각 토큰을 ID에 매핑해요. tokenizers는 다음 모델을 지원해요.
models.BPEmodels.Unigrammodels.WordLevelmodels.WordPiece
모델은 Tokenizer 초기화 시 전달되므로 이미 커스터마이즈가 끝난 상태예요.
후처리(Post-Processing)
후처리는 Encoding이 반환되기 전에 추가 변환을 수행하는 마지막 단계예요. 대표적으로 special token을 추가하는 TemplateProcessing이 있어요.
from tokenizers.processors import TemplateProcessing
tokenizer.post_processor = TemplateProcessing(
single="[CLS] $A [SEP]",
pair="[CLS] $A [SEP] $B:1 [SEP]:1",
special_tokens=[("[CLS]", 1), ("[SEP]", 2)],
)
single="[CLS] $A [SEP]"에서 $A는 문장을 뜻하고, :1은 그 부분의 type_id를 지정해요.
디코딩
ID를 다시 읽을 수 있는 텍스트로 되돌리려면 디코딩을 해요. ByteLevel처럼 특수 문자를 쓰는 모델은 전용 Decoder로 되돌려야 읽을 수 있어요.
더 알아보기
- 퀵스타트: Quicktour
- 구성 요소: Components
- BPE: BPE