본문

1. AI가 사람의 언어를 이해하는 방법: 토크나이저의 역할

반응형

LLM 기초 이해하기

대규모 언어 모델(LLM)을 다루기 전에, 기본적인 개념부터 알아볼까요?

 

LLM이란 무엇인가?

LLM(Large Language Model)은 인공지능의 한 종류로, 엄청난 양의 텍스트 데이터를 학습하여 인간의 언어를 이해하고 생성할 수 있는 AI 모델입니다. 쉽게 말해, 우리가 일상적으로 사용하는 언어를 이해하고 대화할 수 있는 '디지털 두뇌'라고 할 수 있죠.

LLM의 핵심 특징

  1. 규모(Scale)
    • 수십억~수천억 개의 매개변수(파라미터) 보유
    • 방대한 양의 텍스트 데이터로 학습
    • (일반적으로) 더 큰 모델일수록 더 뛰어난 언어 이해력 보유
  2. 자기 지도 학습(Self-supervised Learning)
    • 별도의 레이블 없이 텍스트 자체에서 패턴을 학습
    • 다음 단어나 문장을 예측하며 언어 구조를 이해
    • 마치 아이가 주변 대화를 들으며 언어를 배우는 것과 유사
  3. 범용성(Versatility)
    • 번역, 요약, 작문, 코딩 등 다양한 작업 수행
    • 맥락 이해를 통한 유연한 응답 생성
    • 다양한 분야의 지식 활용 가능

AI의 대화 이해하기: 컨텍스트

 

AI와 대화할 때 가장 중요한 것은 'AI가 우리의 대화를 얼마나 잘 기억하고 이해하는가' 입니다. 이것을 전문용어로 '컨텍스트'라고 해요.

 

1. AI의 대화 이해력

우리가 친구와 대화할 때처럼, AI도 대화의 앞뒤 상황을 이해해야 자연스러운 대화가 가능합니다.

[카페에서의 대화]
사람: "이거 맛있어?"
AI: "무엇을 말씀하시는 건가요?"
사람: "아까 추천한 커피요"
AI: "아, 네! 그 카페라테는 부드럽고 고소해서 많은 분들이 좋아하시더라고요"

이 대화에서 AI는 '이거'가 '이전에 이야기했던 커피'라는 것을 기억하고 있었기 때문에 자연스럽게 답변할 수 있었어요.

 

2. AI의 기억력 한계

하지만 AI에게도 한계가 있습니다. 이를 '컨텍스트 윈도우'라고 하는데, 쉽게 말해 'AI가 한 번에 기억할 수 있는 대화의 양'을 의미해요.

예를 들어,

UpStage - Solar 10.7B(sLLM)의 경우:

  • 컨텍스트 윈도우: 4,096 토큰 (약 A4용지 8-10장)

Anthropic - Claude 3.5 Sonnet(LLM)의 경우:

  • 컨텍스트 윈도우: 200,000토큰 (약 A4 용지 400-500장)
  • 답변은 최대 A4 용지 16-20장(약 8,192토큰)까지 만들 수 있어요

 

3. 대화 기억의 특징

AI의 기억은 우리와 비슷하면서도 다릅니다:

  • 현재 진행 중인 대화는 잘 기억해요
  • 하지만 대화가 끝나면 모든 것을 잊어버려요 (새로운 대화 시작시 처음부터 다시 시작)
  • (Claude 3.5 Sonnet 기준) 2024년 4월까지의 정보만 알고 있어요

 

4. 한계 극복하기

이런 한계들을 어떻게 해결할까요?

  1. 긴 대화 내용 → 데이터베이스에 저장해두고 필요할 때 참고
  2. 최신 정보 부족 → RAG(검색증강생성) 방식으로 새로운 문서를 참고하거나 실시간 정보 수집(오픈API 또는 크롤링 등)

이렇게 AI의 특징과 한계를 이해하면, 더 효과적으로 AI와 대화할 수 있답니다!


[토크나이저] 역할과 원리

AI와 대화하기 위해 알아두면 좋은 기본 개념들을 알아보겠습니다.

토큰과 토크나이저

토큰

우리가 글을 읽을 때 단어나 문장으로 나누어 읽는 것처럼, AI도 텍스트를 작은 단위로 나누어 처리합니다.

예시:
"안녕하세요" → [안녕] [하세요]
"나는 학교에 갑니다" → [나는] [학교] [에] [갑니다]
  • 모델마다 텍스트를 나누는 방식이 다름
  • 한국어는 주로 형태소 단위로 분리
    • 형태소는 크게 두 종류로 나눌 수 있어요:
      1. 실질 형태소 (의미를 가진 중심 내용)
        • 체언: 학교, 책, 사람
        • 용언: 먹다, 예쁘다, 가다
        • 수식언: 빨리, 매우
      2. 형식 형태소 (문법적 기능을 하는 것)
        • 조사: ~이/가, ~을/를, ~에서
        • 어미: ~습니다, ~다, ~고

토크나이저

토크나이저는 사람의 언어를 AI가 이해할 수 있는 숫자로 바꿔주는 텍스트 변환기예요.

"안녕하세요" → [15, 789, 2045]
  • 사람의 텍스트를 모델이 이해할 수 있는 숫자(토큰)로 변환해요
  • 마치 한국어를 모르는 외국인에게 단어 카드로 설명하는 것처럼요!
  • [예시] OpenAI Platform - tokenizer


[토크나이저 ] 기본 동작 이해하기

토크나이저 준비하기

AI 모델과 소통하기 위한 '텍스트 변환기' 역할을 하는 토크나이저를 불러옵니다.

from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-7B-Instruct")

 

토크나이저의 처리 과정

1. 텍스트를 작은 단위로 나누고 숫자로 변환합니다.

text = "안녕하세요" 
tokens = tokenizer.tokenize(text) # → ["안녕", "하세요"] 
token_ids = tokenizer.convert_tokens_to_ids(tokens) # → [1, 2, 3, 4]

 

2. 여러 텍스트의 길이를 동일하게 맞춥니다:

tokenized_inputs = tokenizer( 
	["안녕", "안녕하세요"], # 두 개의 다른 길이 텍스트 
    padding=True, # 길이 맞추기 활성화 
    max_length=4 # 최대 길이 설정 
) 
# 결과: 
# "안녕" → [1, 2, 0, 0] # 짧은 텍스트는 0으로 채움 
# "안녕하세요" → [1, 2, 3, 4] # 원래 길이 유지

 

3. AI 모델이 이해할 수 있는 최종 형태 만들기

다양한 옵션 설정을 통해 필요한 모든 전처리 과정을 한 번에 수행할 수 있습니다:

tokenized_inputs = tokenizer(
	formatted_texts, 
    truncation=True, # 너무 긴 텍스트는 자르기 
    max_length=2048, # 최대 길이 설정 
    padding="max_length",# 길이 맞추기 
    return_tensors="pt" # AI가 이해할 수 있는 형태로 변환 
)

 

토크나이저 함수 하나에 필요한 옵션들을 모두 설정하면, 여러 단계의 전처리 작업을 자동으로 순차적으로 처리해줍니다.

마치 세탁기에 옵션을 설정하고 시작 버튼만 누르면 세탁, 헹굼, 탈수까지 자동으로 진행되는 것과 비슷합니다.

 

이렇게 처리된 데이터는 마치 외국어가 우리말로 완벽하게 번역된 것처럼, AI 모델이 바로 이해하고 처리할 수 있는 형태가 됩니다.

우리가 처음에 입력한 텍스트는 이제 AI와 대화할 준비가 완료된 것입니다.

 


[토크나이저] 실전 가이드

1. 한 문장 토큰화하기

간단한 한 문장이 AI가 이해할 수 있는 형태로 변환되는 과정을 살펴보겠습니다.

"나는 파이썬을 좋아해요"라는 문장이 어떻게 숫자로 변환되는지 보여드립니다:

[코드 및 결과 예시]
원본 텍스트: 나는 파이썬을 좋아해요
↓ 토큰으로 분리
['나는', '파이', '썬을', '좋아', '해요']
↓ 숫자로 변환
[15, 789, 2045, 167, 8]
from transformers import AutoTokenizer

# 토크나이저 준비하기
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-7B-Instruct")

# 간단한 문장으로 테스트
text = "나는 파이썬을 좋아해요"

# 토큰화하기
result = tokenizer(text)

print("원본 텍스트:", text)
print("토큰 ID:", result['input_ids'])
print("실제 토큰:", tokenizer.convert_ids_to_tokens(result['input_ids']))

# 출력 예시:
# 원본 텍스트: 나는 파이썬을 좋아해요
# 토큰 ID: [2, 15, 789, 2045, 167, 8, 1]
# 실제 토큰: ['<s>', '나는', '파이', '썬을', '좋아', '해요', '</s>']

 

2. 대화형 AI 응답 처리하기

AI와 대화하기 위해서는 우리의 일상 대화를 AI가 이해할 수 있는 특별한 형태로 바꿔야 합니다.

1단계: 일상 대화

우리가 나누는 평범한 대화:

사람: "오늘 날씨 어때?"
AI: "오늘은 맑고 화창한 날씨네요."

2단계: AI용 형식으로 변환

AI가 대화를 이해하기 위해서는 "누가 말했는지"를 명확히 표시해야 합니다:

<시작>사용자
오늘 날씨 어때?
<끝>

<시작>AI
오늘은 맑고 화창한 날씨네요.
<끝>

3단계: AI의 언어로 변환

AI는 숫자로만 이해하기 때문에, 모든 단어를 고유 번호로 바꿔줍니다:

"오늘" → 151
"날씨" → 782
"어때" → 2045
...

이렇게 변환된 숫자들을 AI가 읽으면, 마치 우리가 책을 읽듯이 그 의미를 이해할 수 있게 됩니다.

 

소스코드 예시

from transformers import AutoTokenizer

# 토크나이저 준비
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-7B-Instruct")

# 대화 예시
conversation = [
    {"role": "user", "content": "오늘 날씨 어때?"},
    {"role": "assistant", "content": "오늘은 맑고 화창한 날씨네요."}
]

# 1. 대화를 AI가 이해할 수 있는 형식으로 변환
formatted_text = ""
for message in conversation:
    if message["role"] == "user":
        formatted_text += f"<|im_start|>user\\n{message['content']}<|im_end|>\\n"
    else:
        formatted_text += f"<|im_start|>assistant\\n{message['content']}<|im_end|>\\n"

print("1. 변환된 형식:")
print(formatted_text)

# 2. 토큰화하기
tokens = tokenizer(formatted_text)

print("\\n2. 토큰 ID로 변환된 결과:")
print(tokens['input_ids'])

print("\\n3. 실제 토큰으로 확인해보기:")
real_tokens = tokenizer.convert_ids_to_tokens(tokens['input_ids'])
for id, token in zip(tokens['input_ids'], real_tokens):
    print(f"ID: {id:4d} → {token}")

# 출력 예시:
"""
1. 변환된 형식:
<|im_start|>user
오늘 날씨 어때?
<|im_end|>
<|im_start|>assistant
오늘은 맑고 화창한 날씨네요.
<|im_end|>

2. 토큰 ID로 변환된 결과:
[1, 3, 151, 782, 2045, 167, 8, 2, 1, 4, 151, 23, 445, 67, 2045, 167, 8, 2]

3. 실제 토큰으로 확인해보기:
ID:    1 → <|im_start|>
ID:    3 → user
ID:  151 → 오늘
ID:  782 → 날씨
ID: 2045 → 어때
ID:  167 → ?
ID:    8 → <|im_end|>
ID:    1 → <|im_start|>
ID:    4 → assistant
ID:  151 → 오늘
ID:   23 → 은
ID:  445 → 맑고
ID:   67 → 화창한
ID: 2045 → 날씨
ID:  167 → 네요
ID:    8 → .
ID:    2 → <|im_end|>
"""

# 3. PyTorch 텐서로 변환 (실제 학습/추론에 사용할 형태)
tensor_tokens = tokenizer(
    formatted_text,
    truncation=True,
    max_length=2048,
    padding="max_length",
    return_tensors="pt"
)

 

3. 여러 대화를 한번에 처리하기

AI에게 여러 문장을 동시에 전달하는 방법입니다. 마치 선생님이 여러 학생의 질문을 정리해서 한꺼번에 답변하는 것과 비슷합니다.

 

1단계: 여러 문장 입력

1. "안녕하세요?"
2. "파이썬 코딩이 재미있어요"
3. "오늘 점심 뭐 먹지?"

2단계: 문장 분리하기

각 문장을 작은 조각(토큰)으로 나눕니다:

"안녕하세요?" → [안녕] [하세요] [?]
"파이썬 코딩이 재미있어요" → [파이] [썬] [코딩이] [재미있어요]
"오늘 점심 뭐 먹지?" → [오늘] [점심] [뭐] [먹지] [?]

3단계: 길이 맞추기

가장 긴 문장에 맞춰 나머지 문장의 길이를 채웁니다.

마치 학생들의 줄을 맞추듯이, 빈 자리는 특별한 표시(PAD)로 채웁니다:

[안녕] [하세요] [?] [PAD] [PAD]
[파이] [썬] [코딩이] [재미있어요] [PAD]
[오늘] [점심] [뭐] [먹지] [?]

 

소스코드 예시

# 여러 대화 예시
conversations = [
    "안녕하세요?",
    "파이썬 코딩이 재미있어요",
    "오늘 점심 뭐 먹지?"
]

# 한번에 토큰화하기
batch_tokens = tokenizer(
    conversations,
    padding=True,             # 모든 텍스트의 길이를 동일하게 맞춤
    truncation=True,          # 필요하면 자르기
    return_tensors="pt"       # PyTorch 텐서로 변환
)

print("입력 텍스트 수:", len(conversations))
print("토큰화된 결과 크기:", batch_tokens['input_ids'].shape)
print("\\\\n각 문장의 실제 토큰:")
for i, text in enumerate(conversations):
    tokens = tokenizer.convert_ids_to_tokens(batch_tokens['input_ids'][i])
    print(f"\\\\n{text} →", tokens)

# 출력 예시:
# 입력 텍스트 수: 3
# 토큰화된 결과 크기: torch.Size([3, 8])
#
# 각 문장의 실제 토큰:
# 안녕하세요? → ['<s>', '안녕', '하세요', '?', '</s>', '<pad>', '<pad>', '<pad>']
# 파이썬 코딩이 재미있어요 → ['<s>', '파이', '썬', '코딩이', '재미있어요', '</s>', '<pad>', '<pad>']
# 오늘 점심 뭐 먹지? → ['<s>', '오늘', '점심', '뭐', '먹지', '?', '</s>', '<pad>']

 

반응형

공유

댓글