Skip to content

LLM은 글자를 읽지 않는다 — 토크나이저가 만드는 이상한 일들 ​

먼저 밝혀 둔다. 이 글은 직접 모델을 학습시켜 본 경험담이 아니라, 논문과 문서를 읽고 정리한 글이다. 그래서 "내가 해보니"라는 말은 하지 않겠다. 대신 확인한 것과 확인하지 못한 것을 구분해서 적는다.

모델이 받는 건 글자가 아니라 번호다 ​

LLM에 문장을 넣으면 모델은 그 문장을 그대로 보지 않는다. 문장을 토큰이라는 조각으로 자르고, 각 조각을 정수 ID로 바꾼 뒤에야 계산을 시작한다. 이 자르는 부분을 맡는 게 토크나이저다.

그러면 질문이 하나 생긴다. 어떻게 자를까?

글자 단위로 자르면 어휘가 작고 못 읽는 단어도 없지만 문장이 너무 길어진다. 단어 단위로 자르면 짧아지는 대신 사전에 없는 단어(신조어, 이름, 오타)를 처리할 수 없다. 현실의 답은 그 중간, 자주 나오는 덩어리는 한 토큰으로 두고 드문 단어는 더 작은 조각으로 쪼개는 방식이다.

BPE: 자주 붙어 다니는 걸 합친다 ​

이 중간 방식의 대표가 BPE(Byte Pair Encoding)다. 기계 번역에서 희귀 단어를 다루려고 서브워드 단위를 쓰자고 한 Sennrich, Haddow, Birch의 논문 "Neural Machine Translation of Rare Words with Subword Units"(arXiv 1508.07909)가 이걸 신경망 번역에 가져왔다. 초록에 따르면 WMT 15 영어-독일어, 영어-러시아어에서 사전 백오프 기준선보다 각각 1.1, 1.3 BLEU 높았다.

원리는 단순하다. 처음엔 전부 글자 단위로 시작한다. 그다음 코퍼스에서 가장 자주 붙어 나오는 글자 쌍을 하나의 새 기호로 합친다. 이걸 정해 둔 횟수만큼 반복한다. 자주 나오는 단어는 결국 통째로 한 토큰이 되고, 드문 단어는 여러 조각으로 남는다.

요즘 LLM이 정확히 어떤 변형(바이트 단위 BPE 등)을 쓰는지는 모델마다 다르고, 나는 각 모델의 내부 구현을 일일이 확인하지 못했다. 위 설명은 원리 수준으로만 읽어 달라.

그래서 생기는 일들 ​

토크나이저 때문에 생기는 현상들은 원리를 알면 꽤 자연스럽다. 다만 아래는 "그럴 만한 이유"이고, 특정 모델에서 정확히 그렇게 동작한다고 내가 검증한 건 아니다.

  • 글자 세기, 철자 뒤집기에 약하다. 모델 입장에서 "strawberry"는 글자 열 개가 아니라 서너 개의 토큰일 수 있다. 글자 하나하나는 모델에게 직접 보이지 않는다.
  • 같은 내용이라도 언어에 따라 토큰 수가 다르다. 학습 코퍼스에서 영어가 압도적으로 많았다면 영어는 덩어리가 크게 합쳐지고, 한국어는 더 잘게 쪼개질 가능성이 높다. 토큰 수는 곧 비용과 컨텍스트 길이다.
  • 숫자도 조각난다. 긴 숫자가 어떻게 잘리느냐에 따라 산수 실수의 양상이 달라질 수 있다.
  • 앞에 공백이 있느냐 없느냐로 다른 토큰이 되기도 한다.

한국어가 얼마나 더 쪼개지는지는 말로 듣는 것보다 직접 넣어 보는 게 빠르다. OpenAI Tokenizer에 같은 뜻의 영어 문장과 한국어 문장을 넣어서 토큰 수를 비교해 보자. 모델마다 토크나이저가 다르니, 쓰는 모델의 공식 토큰 계산 도구가 있으면 그걸 쓰는 게 정확하다.

실무에서 쓸모 있는 것 ​

솔직히 토크나이저는 평소엔 존재감이 없다. 그런데 이럴 땐 떠올릴 만하다.

  • API 비용이나 컨텍스트 한도를 추정할 때: 글자 수가 아니라 토큰 수로 계산해야 한다.
  • 한국어 서비스에서 같은 프롬프트가 영어보다 비싸게 나올 때.
  • 파인튜닝 데이터를 만들 때: 학습 시 쓰는 토크나이저와 맞아야 한다. 다음 글에서 이어서 다룬다.
  • 모델이 글자 단위 작업(철자, 글자 수)에서 이상한 답을 낼 때: 모델이 멍청해서가 아니라 입력 단위가 달라서일 수 있다.

한 줄 요약

모델은 문장을 토큰 ID의 나열로 본다. 비용, 길이 제한, 일부 이상한 실수가 전부 여기서 나온다.

아직 모르는 것 ​

BPE 말고 SentencePiece, 유니그램 방식 등이 어떻게 다르고 한국어에 어느 쪽이 유리한지는 이 글에서 다루지 못했다. 최신 모델들의 어휘 크기와 한국어 효율이 실제로 얼마나 개선됐는지도 직접 측정하지 않았다. 측정해 보면 다시 쓰겠다.

참고 ​

  • Sennrich, Haddow, Birch, "Neural Machine Translation of Rare Words with Subword Units" (arXiv 1508.07909)
  • OpenAI Tokenizer

다음 글: 파인튜닝은 언제 하고 언제 하지 말아야 하나

멸종 위기 개발자