GPT 같은 대형 언어 모델을 사용할 때 한글이 깨지거나 한자로 출력되는 현상을 경험한 적 있으신가요?
이 문제는 단순한 버그가 아니라, 토크나이저 구조와 인코딩 방식에서 비롯된 구조적인 이유가 있습니다.
특히, GPT와 Google Gemini의 토크나이저 방식의 차이가 이 현상의 핵심 원인입니다.
GPT는 입력 문장을 처리할 때 다음과 같은 과정을 거칩니다:
예를 들어 "가"
는 UTF-8에서 0xEA 0xB0 0x80
이라는 3개의 바이트로 인코딩됩니다.
이 바이트 중 일부가 잘못 병합되거나, 디코딩 환경이 깨지면, 다음과 같은 일이 발생할 수 있습니다:
문제 상황 | 결과 |
---|---|
바이트 일부만 디코딩됨 | 깨진 글자(예: � ) 출력 |
다른 문자 바이트와 섞여 병합됨 | 의도치 않은 문자 (예: 한자, 특수기호 등) 출력 |
출력 시 디코딩 환경이 UTF-8이 아님 | 전혀 다른 문자셋으로 해석됨 (Latin1, EUC-KR 등) |
보통은 아닙니다. 하지만 다음 경우에는 한자가 자연스럽게 등장할 수 있습니다:
0xE4 0xB8 0x80
→ '一'
)원인 | 설명 |
---|---|
바이트 단위 병합 | 한글은 3바이트 → 병합이 애매하면 잘못된 문자 생성 |
디코딩 오류 | 출력 환경이 UTF-8이 아니면 깨짐 발생 |
문자셋 오해 | 다른 문자셋으로 디코딩될 경우 의도치 않은 문자 출력 |
Google의 모델들(BERT, T5, Gemini 등)은 대부분 SentencePiece 토크나이저를 사용합니다.
"가"
는 처음부터 한 글자로 다뤄짐➡ 그래서 한글이 깨질 일이 거의 없습니다.
항목 | OpenAI GPT | Google Gemini |
---|---|---|
토크나이저 방식 | Byte-Level BPE | 유니코드 문자 기반 BPE / Unigram |
시작 단위 | UTF-8 바이트 | 유니코드 문자 |
한글 처리 방식 | 바이트로 쪼갠 후 병합 | 처음부터 하나의 글자로 인식 |
깨짐 가능성 | 상대적으로 있음 | 매우 낮음 |
대표 토크나이저 | tiktoken | SentencePiece |
.encode('utf-8').decode('utf-8')
로 보정GPT의 바이트 기반 토크나이저는 범용성이 뛰어나지만, 한글 같은 다바이트 문자 처리에서 깨짐이 발생할 수 있습니다.
반면 Gemini는 유니코드 문자 단위로 처리하기 때문에 한글 깨짐 가능성이 현저히 낮습니다.