🤖 AI/ML

SentencePiece

센텐스피스

언어 독립적 서브워드 토큰화 라이브러리. BPE, Unigram 알고리즘 지원. BERT, T5, LLaMA 등에서 사용.

📖 상세 설명

SentencePiece는 Google에서 개발한 언어 독립적인 서브워드 토큰화 라이브러리입니다. 텍스트를 의미 있는 작은 단위(서브워드)로 분할하여 모델이 효율적으로 처리할 수 있게 합니다. "사전 토큰화(pre-tokenization)" 없이 원시 텍스트에서 직접 학습할 수 있는 것이 핵심 특징입니다.

2018년 논문 "SentencePiece: A simple and language independent subword tokenizer"로 발표되었습니다. 기존 BPE(Byte Pair Encoding)나 WordPiece는 공백 기반 언어(영어)에 최적화되어 있었지만, SentencePiece는 공백이 없는 한국어, 일본어, 중국어도 동일하게 처리합니다.

두 가지 알고리즘을 지원합니다. BPE는 가장 빈번한 문자 쌍을 반복 병합하고, Unigram LM은 확률 기반으로 최적 분할을 찾습니다. 예를 들어 "인공지능"은 ["▁인공", "지능"] 또는 ["▁인", "공", "지", "능"]으로 분할될 수 있으며, ▁는 공백 위치를 나타냅니다.

T5, ALBERT, XLNet, LLaMA, Gemma 등 주요 LLM이 SentencePiece를 사용합니다. 32K~100K 어휘 크기가 일반적이며, 어휘 크기가 클수록 압축률이 높지만 임베딩 테이블이 커집니다. 한국어 NLP에서는 거의 필수적인 전처리 도구입니다.

💻 코드 예제

# SentencePiece 토큰화 예제
import sentencepiece as spm

# 1. 모델 학습 (BPE 알고리즘, 32K 어휘)
spm.SentencePieceTrainer.train(
    input='corpus.txt',           # 학습 텍스트 파일
    model_prefix='tokenizer',     # 출력 파일명
    vocab_size=32000,             # 어휘 크기
    model_type='bpe',             # 'bpe' 또는 'unigram'
    character_coverage=0.9995,    # 한국어는 0.9995 권장
    pad_id=0, unk_id=1, bos_id=2, eos_id=3
)

# 2. 학습된 모델 로드
sp = spm.SentencePieceProcessor()
sp.load('tokenizer.model')

# 3. 토큰화 (텍스트 → 토큰)
text = "인공지능이 세상을 바꾸고 있습니다."
tokens = sp.encode_as_pieces(text)
print(tokens)  # ['▁인공', '지능', '이', '▁세상', '을', '▁바꾸', '고', '▁있습니다', '.']

# 4. 토큰 → ID 변환
ids = sp.encode_as_ids(text)
print(ids)  # [1234, 5678, 23, 9012, ...]

# 5. ID → 텍스트 복원
decoded = sp.decode(ids)
print(decoded)  # "인공지능이 세상을 바꾸고 있습니다."

# 6. Hugging Face Transformers와 함께 사용
from transformers import T5Tokenizer
tokenizer = T5Tokenizer.from_pretrained('t5-base')
# T5Tokenizer는 내부적으로 SentencePiece 사용

🗣️ 실무에서 이렇게 말하세요

💬 한국어 LLM 개발 회의에서
"한국어 토크나이저는 SentencePiece Unigram으로 학습하죠. character_coverage 0.9995로 설정하면 한글 자모까지 커버되고, 어휘 크기는 32K면 충분합니다. BPE보다 Unigram이 형태소 경계를 더 잘 잡아요."
💬 면접에서
"SentencePiece의 핵심은 언어 독립적이라는 점입니다. 공백 기반 pre-tokenization 없이 원시 텍스트에서 바로 학습하기 때문에 한국어, 일본어 같은 교착어도 영어와 동일하게 처리할 수 있습니다. LLaMA, T5 등 대부분의 LLM이 사용합니다."
💬 토크나이저 선택 논의에서
"OpenAI는 tiktoken(BPE 기반), Google은 SentencePiece를 씁니다. 직접 학습하려면 SentencePiece가 편하고, 다국어 모델이면 Unigram 모드가 성능이 좋아요. 어휘 크기는 압축률과 모델 크기 트레이드오프를 고려해서 32K~64K 사이로 정하세요."

⚠️ 흔한 실수 & 주의사항

학습 데이터와 추론 데이터의 도메인 불일치

뉴스로 학습한 토크나이저를 코드나 의료 텍스트에 쓰면 OOV(미등록 단어)가 급증합니다. 도메인별로 토크나이저를 학습하거나 혼합 코퍼스를 사용하세요.

어휘 크기를 너무 작게 설정

vocab_size가 작으면 긴 단어가 많은 토큰으로 분할되어 시퀀스 길이가 늘어납니다. 한국어는 최소 32K, 다국어는 64K 이상 권장합니다.

올바른 방법

실제 서비스 데이터와 유사한 코퍼스로 학습하고, character_coverage는 0.9995 이상으로 설정하세요. BPE vs Unigram은 실험으로 비교하되, 다국어면 Unigram을 먼저 시도하세요.

🔗 관련 용어

📚 더 배우기