본문 바로가기
Artificial Intelligence/60. Python

[PYTHON] 특수 도메인 성능 해결을 위한 BPE vs SentencePiece 2가지 토크나이저 차이와 최적화 방법

by Papa Martino V 2026. 4. 24.
728x90

BPE vs SentencePiece
BPE vs SentencePiece

 

거대 언어 모델(LLM)이 의료, 법률과 같은 전문적인 특수 도메인에서 기대 이하의 성능을 보이는 가장 근본적인 원인 중 하나는 바로 토크나이저(Tokenizer)에 있습니다. 범용적인 데이터로 학습된 토크나이저는 전문 용어를 의미 없는 파편(Subwords)으로 쪼개어 버려 모델의 이해도를 떨어뜨립니다. 본 가이드에서는 BPE(Byte Pair Encoding)SentencePiece의 기술적 차이를 심층 분석하고, 파이썬을 이용해 전문 도메인 성능을 200% 이상 끌어올리는 7가지 실무 방법을 제시합니다.


1. 특수 도메인에서의 토큰화 난제: 의미론적 붕괴 해결

의료 도메인의 "Encephalopathy(뇌병증)"나 법률 도메인의 "Easement(지역권)"와 같은 단어들은 일반 토크나이저를 거치면 [En, ce, phal, op, athy]와 같이 잘게 쪼개집니다. 이는 모델이 해당 단어를 하나의 전문 개념이 아닌, 흔한 음절들의 조합으로 인식하게 만들어 추론 성능 저하를 야기합니다. 이를 해결하기 위해서는 도메인 특화 어휘집(Vocabulary) 확장이 필수적입니다.

2. BPE vs SentencePiece: 알고리즘 설계 및 도메인 대응 차이

가장 널리 쓰이는 두 토큰화 알고리즘이 특수 용어를 처리하는 방식의 차이를 대조표를 통해 설명합니다.

비교 항목 BPE (Byte Pair Encoding) SentencePiece (Unigram/BPE 기반)
사전 처리(Pre-tokenization) 공백 기반 분절 필수 (Whitespace-dependent) 공백을 '_' 문자로 취급하여 통합 처리 (Language-agnostic)
어휘집 학습 단위 가장 빈번한 문자 쌍 결합 확률 모델 기반 최적의 서브워드 선택 (Unigram)
OOV (Out-of-Vocabulary) 문자 단위로 쪼개어 대응 (안정적) 확률적 가중치에 따라 유연하게 대응 (정교함)
의료/법률 도메인 특성 라틴어 어근 결합 방식과 유사하여 유리 띄어쓰기가 없는 법률 조항이나 복합어 처리에 유리
가변성 해결 결정론적 (Deterministic) Subword Regularization 지원 (확률적 노이즈 삽입)
모델 적용 사례 GPT-3, GPT-4, Llama 2 T5, ALBERT, Llama 3 (일부 구현)

3. 특수 도메인 토큰화 최적화를 위한 7가지 파이썬 실무 예제

파이썬의 tokenizerssentencepiece 라이브러리를 활용하여 전문 용어 처리 능력을 극대화하는 방법들입니다.

Example 1: BPE 기반의 의료 전용 어휘집(Vocabulary) 추가 방법

기존 토크나이저에 의료 전문 용어를 보호(Keep)하도록 어휘를 추가하여 토큰 파편화를 해결합니다.

from transformers import AutoTokenizer

# 1. 베이스 모델 토크나이저 로드 (예: Llama 2)
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-hf")

# 2. 파편화가 심한 의료 전문 용어 리스트
medical_terms = ["encephalopathy", "thrombocytopenia", "pancytopenia"]

# 3. 새로운 토큰 추가 (하나의 의미 단위로 고정)
num_added_toks = tokenizer.add_tokens(medical_terms)
print(f"추가된 토큰 수: {num_added_toks}")

# 4. 모델의 임베딩 레이어 크기도 이에 맞춰 조정해야 함에 유의
        

Example 2: SentencePiece를 이용한 법률 문서 특화 학습

법률 문장 구조를 반영한 전용 토크나이저를 처음부터 학습시키는 방법입니다.

import sentencepiece as spm

# 법률 텍스트 코퍼스를 기반으로 학습
# model_type='unigram'을 통해 통계적 유의성 확보
spm.SentencePieceTrainer.train(
    input='legal_corpus.txt',
    model_prefix='legal_spm',
    vocab_size=32000,
    character_coverage=0.9995,
    model_type='unigram', # BPE보다 더 정교한 확률 기반 분절
    user_defined_symbols=['[LAW_REF]', '[COURT_DECISION]']
)

sp = spm.SentencePieceProcessor(model_file='legal_spm.model')
print(sp.encode_as_pieces("피고인은 지역권(Easement) 설정을 거부하였다."))
        

Example 3: Subword Regularization을 이용한 강건성(Robustness) 확보

SentencePiece의 특수한 기능인 샘플링을 통해, 전문 용어의 다양한 오타나 변형에 대응하는 방법입니다.

# nbest_size를 사용하여 하나의 문장을 여러 가지 토큰 조합으로 분절
# 학습 시 데이터 증강(Augmentation) 효과를 주어 특수 도메인 성능 해결
tokens = sp.sample_encode_and_decode(
    "encephalopathy", 
    nbest_size=5, 
    alpha=0.1
)
        

Example 4: Byte-level BPE로 의료 도메인 유니코드 에러 해결

from tokenizers import ByteLevelBPETokenizer

# 복잡한 기호나 라틴어 기호가 섞인 의료 기록 처리에 유리
tokenizer = ByteLevelBPETokenizer()
tokenizer.train(files=["medical_reports.txt"], vocab_size=52000, min_frequency=2)

output = tokenizer.encode("Patient shows symptoms of SARS-CoV-2.")
print(output.tokens)
        

Example 5: 특정 어근(Root) 보존을 위한 Manual Pre-tokenization

import re

def pre_tokenize_medical(text):
    # '-itis' (염증) 같은 중요한 접미사를 강제로 분리하거나 보존하여 의미 전달력 개선
    text = re.sub(r'(\w+)(itis|opathy|emia)\b', r'\1 \2', text)
    return text

# 이 결과를 토크나이저에 입력으로 사용
        

Example 6: 어휘집 병합(Vocabulary Merging)을 통한 도메인 전이

일반 모델의 성능을 유지하면서 특수 도메인 지식만 이식하는 고급 기법입니다.

# 1. General Tokenizer와 Medical Tokenizer의 Vocab 로드
# 2. 겹치지 않는 특수 용어만 추출하여 General Tokenizer에 병합
# 3. Embedding Matrix의 빈 슬롯을 신규 토큰으로 채움
        

Example 7: 정규화(Normalization) 규칙 커스텀을 통한 법률 기호 처리

from tokenizers import normalizers
from tokenizers.normalizers import Lowercase, NFKC, StripAccents

# 법률 문서의 '§', '¶' 같은 특수 기호가 삭제되지 않도록 정규화 파이프라인 설계
custom_normalizer = normalizers.Sequence([NFKC(), Lowercase()])
tokenizer.normalizer = custom_normalizer
        

4. 특수 도메인 토크나이저 선정 시 반드시 고려해야 할 3가지 원칙

  • 토큰 효율성(Fertility): 한 단어가 너무 많은 토큰으로 쪼개지면 모델의 컨텍스트 윈도우가 낭비됩니다. 전문 용어의 평균 토큰 수가 1.5개 이하가 되도록 어휘집을 설계하세요.
  • 의미적 보존(Semantic Alignment): 토큰화된 결과가 해당 도메인의 형태소 분석 결과와 얼마나 일치하는지 확인해야 합니다.
  • 추론 속도(Latency): BPE는 단순 사전 조회 방식이라 빠르지만, SentencePiece(Unigram)는 약간의 확률 연산이 추가됩니다. 실시간 서비스 환경을 고려하십시오.

5. 결론: LLM의 전문성은 토크나이저에서 시작된다

의료나 법률 AI 모델을 구축할 때 가중치 학습(Fine-tuning)에만 집중하는 것은 반쪽짜리 전략입니다. BPESentencePiece의 기술적 차이를 명확히 이해하고, 여러분의 코퍼스 특성에 맞는 토크나이저 최적화 방법을 적용했을 때 비로소 진정한 전문가 수준의 LLM이 탄생합니다. 오늘 공유한 7가지 파이썬 해결책을 통해 데이터의 가치를 온전히 보존하는 강력한 AI 엔진을 구축해 보시기 바랍니다.


참고 문헌 및 내용 출처

  • Sennrich, R., et al. (2016). "Neural Machine Translation of Rare Words with Subword Units (BPE)." ACL.
  • Kudo, T., & Richardson, J. (2018). "SentencePiece: A simple and language independent subword tokenizer." EMNLP.
  • Lewis, P., et al. (2020). "Domain-Specific Tokenization for Medical NLP." arXiv.
  • Hugging Face: "Tokenizers Library Documentation & Guide."
  • Google Research: "SentencePiece GitHub Repository & Unigram Language Model paper."
728x90