토큰(Token)은 자연어 처리(NLP)에서 텍스트를 작은 단위로 나누는 기본 요소다. 문장을 단어나 서브워드(subword) 단위로 쪼개어 모델이 이해할 수 있도록 변환하는 과정에서 사용된다.
토큰은 문장을 분석 가능한 작은 단위로 나눈 요소다. 일반적으로 단어, 문자, 혹은 의미 있는 문자열 덩어리로 정의된다.
자연어 처리(NLP) 모델은 텍스트를 직접 이해하지 못하므로, 텍스트를 토큰 단위로 변환하는 토큰화(Tokenization) 과정이 필요하다.
예제: "나는 학교에 간다" → ['나', '는', '학교', '에', '간다']
인공지능은 문장을 이해하기 쉽도록 토큰화(Tokenization)로 작게 나눈다.
사람은 숫자가 아닌 단어와 문장으로 구성된 자연어에 익숙하지만,
컴퓨터는 숫자로 된 데이터를 처리하는 것에 가장 익숙하다.
따라서 인공지능이 사람의 언어를 이해하려면 문장을 ‘작은 조각(토큰)’으로
나누고, 이 토큰을 다시 숫자로 변환해야 한다.
이렇듯 문장을 나누는 과정을 토큰화(tokenization)라고 한다.
예를 들어 다음과 같은 문장을 생각해 보자.
예: "아버지가방에들어가신다"
이 문장은 어떻게 나누는가에 따라서 의미가 크게 달라질 수 있다.
한국어처럼 띄어쓰기 구분이 명확하지 않은 언어에서는 이 문제가 더 중요하다. 인공지능이 문장을 정확하게 이해하려면 적절한 토큰화 방법을 사용해야 한다.
토큰화는 띄어쓰기 단위, 음절 단위, 서브워드 단위 등 다양한 방법으로 나눌 수 있다.
입력: "아버지가방에들어가신다"
출력: ["아버지가방에들어가신다"]
이 경우 띄어쓰기가 없으므로 하나의 단어로 인식한다. 원래 문장이 다음과 같이 띄어쓰기로 구분되어 있다면 이렇게 문장이 구분된다.
입력: "아버지가 방에 들어가신다"
출력: ["아버지가", "방에", "들어가신다"]
이 방식은 영어처럼 띄어쓰기가 명확한 언어에서는 효과적으로 작동한다. 하지만 한국어에서는 조사(은, 는, 이, 가 등)가 붙는 경우에는 처리하기 어려울 수 있다.
이 방식은 문장을 한 글자씩 나눈다.
입력: "아버지가방에들어가신다"
출력: ["아", "버", "지", "가", "방", "에", "들", "어", "가", "신", "다"]
이 방식은 한국어처럼 띄어쓰기가 불명확한 언어에서 적용 가능하지만, 단어 의미를 제대로 반영하지 못할 수 있다는 한계가 있다.
서브워드 토큰화(subword tokenization)는 단어보다 작은 단위(서브워드)로 텍스트를 나누어 자연어 처리 모델이 더 효과적으로 학습할 수 있도록 하는 방식이다. 이 방식을 사용하면 인공지능이 처음 보는 단어들, 즉 기존에 있지 않던 단어도 효과적으로 처리할 수 있다. 서브워드 단위로 나누면 신조어, 복합어, 철자가 약간 다른 단어도 학습이 가능하다.
예: "초해상도영상처리" → ["초", "해상도", "영상", "처리"]
앞과 같은 긴 단어도 기존에 알고 있던 작은 단위로 구분하면 그 의미를 쉽게 파악할 수 있다.
from transformers import AutoTokenizer
model_id = "microsoft/phi-4"
tokenizer = AutoTokenizer.from_pretrained(model_id)
text = "I am studying tokenization."
tokens = tokenizer.tokenize(text)
print(tokens)
from transformers import AutoTokenizer
AutoTokenizer는 특정 모델에 맞는 토크나이저를 자동으로 불러오는 클래스이다.
즉, 우리가 사용할 모델의 ID만 입력하면 해당 모델과 가장 적절한 토크나이저가 로드된다.
model_id = "microsoft/phi-4"
model_id 변수에 모델의 경로(이름)를 저장하여 이후 코드에서 사용할 수 있다.
tokenizer = AutoTokenizer.from_pretrained(model_id)
AutoTokenizer.from_pretrained(model_id)를 실행하면
model_id에 해당하는 모델의 토크나이저를 자동으로 내려받는다.
즉, phi-4 모델과 호환되는 토크나이저를 자동으로 설정하는 과정이다.
AutoTokenizer라는 클래스를 사용해서
phi-4 모델에 최적화된 tokenizer 객체를 만든다.
text = "I am studying tokenization."
tokens = tokenizer.tokenize(text)
print(tokens)
text 변수에 "I am studying tokenization."이라는 문장을 저장한다.
tokenizer 클래스에는 문장을 여러 개의 토큰(단어 단위)으로 분해할 수 있는
tokenize라는 함수가 있다.
tokenizer.tokenize(text)를 실행하면
문장을 여러 개의 토큰(단어 단위)으로 분해한다.
print(tokens)를 실행하면 분해된 토큰들을 출력한다.
[실행 결과]
['I', 'Ġam', 'Ġstudying', 'Ġtoken', 'ization', '.']
그럼 왜 tokenization이 'token’과 'ization'으로 나뉘었을까? 사실 우리는 tokenization이라는 단어는 모르지만, 'token'과 'ization'은 이미 알고 있다고 가정해 보자. token은 '토큰(token)', ization은 '화(化)' 같은 의미로 많이 사용된다. 그렇기 때문에 'tokenization은 토큰을 만들어 주는 것이구나' 정도로 이해할 수 있다.
자연어 처리 인공지능 모델도 마찬가지이다. 먼저 인공지능은 모든 단어를 통째로 기억하지 않는다. 세상의 모든 단어를 다 알고 저장하는 것이 현실적으로 불가능하기 때문이다. 그 대신 자주 등장하는 조각(서브워드)로 나누어서 기억한다. 그래서 모델이 학습할 때 'token'과 'ization'을 따로 저장해 두면 새로운 단어가 나와도 빠르게 처리할 수 있다.
다른 예를 살펴보자. 'nationalization(국유화)'이라는 단어를 인공지능이 처음 본다고 가정해 보자. 처음 보는 단어라서 이해하기 어렵다. 하지만 'national'과 'ization'을 알고 있다면 'national(국가)' + 'ization(화)' → '국유화'라는 뜻을 이해할 수 있다.
이처럼 단어를 미리 조각 내어 저장하면 모델이 새로운 단어도 빠르게 처리할 수 있다. 이것으로 저장 공간을 절약할 수 있다.
인공지능은 글자를 읽고 바로 이해할 수 있을까? 아쉽지만 인공지능은 사람처럼 자연어를 그대로 이해할 수 없다. 컴퓨터가 이해할 수 있는 것은 숫자뿐이기 때문이다.
컴퓨터가 언어를 이해하는 과정은 마치 외국어를 번역하는 과정과 비슷하다. 우리가 한국어밖에 모른다고 가정해 보자. 누군가가 프랑스어로 "Que voulez-vous manger?"(무엇을 드시고 싶나요?)라고 묻는다면, 우리는 이 문장을 우리말로 번역해야 의미를 알 수 있다. 컴퓨터도 마찬가지이다. '자연어(Natural Language) → 숫자(Number)'로 변환해야 이해할 수 있다.
우리는 문장을 작은 조각(토큰)으로 나누는 토큰화(tokenization)를 배웠다. 이제 문장을 숫자로 변환하는 과정을 하나씩 살펴보자.
"I am studying tokenization."
이 문장은 다음과 같이 여러 개의 작은 조각(토큰)으로 나누어졌다.
['I', 'Ġam', 'Ġstudying', 'Ġtoken', 'ization', '.']
이제 토큰을 숫자로 바꾸어야 한다. 이 과정을 '토큰 ID 변환(token ID mapping)'이라고 한다. 각 토큰은 사용하는 언어 모델에 따라 고유한 숫자(token ID)를 가지고 있다. 토크나이저는 각 단어를 미리 학습한 단어 사전(vocabulary)에 따라 변환한다.
token_ids = phi4_tokenizer.convert_tokens_to_ids(tokens)
print(token_ids)
[실행 결과]
[40, 1097, 21630, 4037, 2065, 13]
각 토큰의 의미는 무엇일까?
즉, 인공지능은 문장을 그대로 이해하지 않고, 다음 과정을 거쳐 언어를 처리한다.
문장 → 토큰화 → 숫자(ID) 변환 → 모델 입력
즉, 컴퓨터는 'I am studying'을 이해하는 대신
[40, 1097, 21630]처럼 숫자로 변환한 후 의미를 분석한다.
숫자를 더 깊이 있는 정보로 변환하는 것을 임베딩(embedding)이라고 한다.
GPT-3 및 GPT-4 같은 AI 모델은 한 번에 처리할 수 있는 토큰 개수에 제한이 있다. 예를 들어, GPT-4는 최대 4,096개의 토큰을 처리할 수 있으며, 이 한계를 초과하면 텍스트가 잘리거나 일부가 무시된다.