AI 공부

6. 모델별 Tokenizer, special token, chat_template 작동방식 비교 (feat. Llama, Deepseek, Phi, Qwen-Coder)

kdb1248 2026. 3. 15. 12:51

목차

1. Day 12 - Hugging Face Pipeline 이용해 보기  

2. Day 13 - 모델별 Tokenizer, special token, chat_template 작동방식 비교 (feat. Llama, Deepseek, Phi, Qwen-Coder) 

 

 


1. Day 12 - Hugging Face Pipeline 이용해 보기 

3주 차 중 2일째의 경우는 허깅페이스의 Pipeline을 이용해 허깅페이스에 있는 모델들을 쉽게 써보는 작업을 진행했다.

 

1) Pipeline?

Hugging Face의 pipeline() 함수는 코드 한 줄로 모델 사용이 가능하게 해 준다. 

내부적으로 원래는 사용자가 지정해야하는 아래 복잡한 task들을 알아서 처리해 줘
바로 모델을 사용(inference) 할 수 있게 해주는 역할을 한다고 볼 수 있다.

  1. 모델 로드
  2. 토크나이징
  3. 추론(inference)
  4. 후처리까지 자동 수행

대표적으로 아래 표의 작업들이 가능한데,
따로 모델을 지정하지 않더라도 각 작업에 사전에 매핑되어있는 모델들을 기본적으로 사용해서 실행해 준다. 

🧠 Sentiment Analysis 문장의 감정을 분류 (긍정/부정 등) pipeline("sentiment-analysis")
🏷️ Classifier 일반적인 분류 작업 (스팸/비스팸, 카테고리 등) pipeline("text-classification")
🧍‍♂️ Named Entity Recognition (NER) 문장에서 사람, 장소, 기관 등 개체 추출 pipeline("ner")
Question Answering 질문에 대한 답변 추출 (QA 시스템) pipeline("question-answering")
📰 Summarizing 긴 문장을 요약 pipeline("summarization")
🌐 Translation 번역 pipeline("translation", model="Helsinki-NLP/opus-mt-en-ko")

 

아래는 이 pipeline 기능을 통해 각 task를 직접 돌려본 예시들이다.

 

왼쪽부터 감정분석, 이미지 생성, 텍스트 내용 분류의 예시

 

=> 개인적으로 간단한 작업들을 복잡한 설정없이 진행할 수 있는 점,
모델 API 비용 없이 오픈소스 모델을 이용해서 작업을 할 수 있다는 점이 큰 이점으로 다가왔다.
(복잡하지 않은 task 는 이런 허깅페이스 기본 모델들은 pipeline 이용해서 쓸 수 있을 거 같은 느낌)

 


2. Day 13 - 모델별 Tokenizer, special token, chat_template 작동방식 비교 (feat. Llama, Deepseek, Phi, Qwen-Coder) 

3주차의 3일째엔 이전에 강의에서 다뤘던 Tokenizer를 비롯하여, special token, chat_template에 대해 Llama 3.1 모델을 비롯해 다양한 모델을 기준으로 실제 어떻게 작동하는지 테스트 해보며 심화내용을 배워볼 수 있었다. 

 

1) Tokenizer 전체 흐름 (token, token id, encode, decode)
한 줄로 요약하면 tokenizer는

"encoding과 decoding을 통해 모델이 이해할 수 있도록 텍스트를 숫자로 변환하고, 결과를 다시 인간이 읽을 수 있는 형태로 복원하는 역할  

 

문장이 있을 때 그걸 Chunk 들로 나눈 걸 Token (ex. Hello처럼 단어일 수도 있고, He/llo처럼 끊겨있을 수도 있고) 

그걸 모델이 이해할 수 있게 숫자로 변형한 걸 Token ID ([15496]) 라 한다. 

  • encode() → 텍스트를 토큰 ID들의 리스트로 변경
    • 예: "Hello" → [15496]
  • decode() → 반대로 토큰 ID를 사람이 읽을 수 있는 텍스트로 변경
    • 예: [15496] → "Hello"

 

2) special token

special token은 

모델에게 “특별한 의미”를 전달하기 위한 특수한 토큰

일반 단어가 아니라, 모델의 동작을 제어하거나 문맥을 구분하는 신호 역할

 

LLM은 기본적으로 "문자열을 예측하는 기계"

그런데 단순 문자열만 보면 모델은 아래 두 상황을 구분하지 못함

 

User: 안녕
Assistant: 안녕하세요!

 

모델 입장에서는 이게 그냥 하나의 긴 문자열

“여기까지가 유저 입력이고, 여기서부터는 내가 답변해야 한다”는 구분을 추가 신호로 알려줘야함

이때 쓰이는 것이 바로 스페셜 토큰

 

모델에 실제로 보내는 메시지는 이런 식으로 변환되고, 모델은 <|assistant|>

다음에 올 토큰을 예측함으로써 답변을 생성하는 것

<|startoftext|><|system|>
You are a helpful assistant.
<|user|>
안녕
<|assistant|>

 

스페셜 토큰 예시

`< startoftext >`
`< endoftext >`
`< system >`
`< user >`
`< assistant >`
<PAD> 패딩(padding) 입력 길이를 동일하게 맞추기 위한 채움
<BOS> Begin of Sequence 문장(시퀀스) 시작 표시 (startoftext와 유사)
<EOS> End of Sequence 문장(시퀀스) 끝 표시 (endoftext와 유사)
<MASK> 마스킹 토큰 마스크드 언어모델(BERT 등)에서 가려진 단어 자리 표시

 

이런 “스페셜 토큰의 이름”이나 “토큰 ID 값”은 모델마다 다르고,

해당 모델의 토크나이저 설정(vocab.json / tokenizer.json) 파일에 정의되어 있음

 

3) 실제 예시 (feat. Llama 3.1 8B) 

모델마다 고유의 토크나이저를 갖고 있음 

실제 라마 3.1 8B 모델을 바탕으로 

- 인코딩이 어떻게 되는지 (토큰을 어떤 토큰 ID 값으로 바꾸는지)

- 단어를 어떻게 토큰화하는지 (12 단어를 15개 토큰으로) 

- 토큰 ID를 어떤 형태로 디코딩해서 모델이 텍스트를 출력하기 위한 토큰으로 만드는지 

- 토크나이저 vocab(사전)을 통해 실제 스페셜 토큰(256개) 들이 어떤 토큰 ID로 매핑되어 있는지 
- 라마 토크나이저 기본 크기 (128256개)

를  보는 작업을 거쳤다.

라마 3.1 8B 토크나이저 인코딩, 디코딩, 스페셜 토큰 예시

 

4) Instruct 모델 

a. LLM 엔 두 종류가 있음 

  1. Base 모델 → 아무런 대화 규칙이 없는 “원시 모델”.
  2. Instruct 모델 → “사람의 지시를 잘 따르도록” 추가 훈련된 모델.

b. Instruct 모델 대부분은 아래처럼 Chat 형식의 프롬프트를 요구함

<System>
You are a helpful assistant.

<User>
번역해줘: I love you

<Assistant>

 

c. apply_chat_template()는 뭐 하는 함수?

HuggingFace의 transformers에서 제공하는 기능이고,

사람이 작성한 메시지 리스트를 자동으로 Instruct 모델이 이해하는 텍스트로 변환해 주는 도구

 

[ messages list ]
    ↓ apply_chat_template()
[ instruct model이 이해할 수 있는 올바른 프롬프트 형태 ]
    ↓
[ 모델에게 입력 → 자연스러운 답변 ]

 

코드 및 출력 예시:

 

messages → instruct 모델용 최종 프롬프트로 변환

 

결국에 모델이 최종적으로 받게 되는 건 위 토큰(스페셜 토큰 포함)을 token id로 인코딩한 리스트를( sequence of Token IDs ) input으로 받는 것 

 

messages (Python dict list)
      ↓ apply_chat_template()
"<|system|> You are a helpful assistant ... <|user|> Tell a joke"
      ↓ tokenizer
["<|system|>", "You", "are", "a", ...]
      ↓ token-id mapping
[29871, 441, 201, 98, ...]
      ↓ model input
LLM → next token probabilities

 

=> 특히나 챗 GPT 등을 쓸 때 대화를 어떻게 이렇게 인식을 하는 걸까 했을 때 이런 스페셜 토큰들의 역할을 이해할 수 있었다. 

=> 또한 이 흐름도를 이해하는 게 내가 텍스트로 쓴 문장이 어떻게 모델로 들어가고 또 나오게 되는지를 이해하는 데 큰 도움이 됐다. 

 

 

5) 다른 모델은 토크나이저를 어떻게 적용하나 

테스트해 본 모델 리스트는 아래와 같다.

- PHI4 = "microsoft/Phi-4-mini-instruct"
- DEEPSEEK = "deepseek-ai/DeepSeek-V3.1"
- QWEN_CODER = "Qwen/Qwen2.5-Coder-7B-Instruct"
 

 

같은 문장도 phi4와 llama가 서로 다르게 토큰화(텍스트 청크화) 하고, 각 토큰 별로의 토큰 id값(숫자)도 다른 걸 볼 수 있다. 

둘 다 같은 instruct 모델이더라도 apply chat template을 했을 때, 서로 다른 형태로 찍히는 걸 알 수 있다. 
(llama는  begin of text로 시작하지만 phi는 system으로 시작

 

 

deepseek까지 껴서 비교했을 때 모델별로 서로 다 다르게 토큰 id 변환, chat template 변환을 하는 걸 볼 수 있다.

 

마지막으로 qwen coder(코딩 모델) 이 코드를 어떤 식으로 토큰화하고, 토큰 id 화 하는지를 볼 수 있었다. 

 

=> 이렇게 특히 코딩 모델들이 코드를 어떻게 이해하는 걸까 가 궁금했었는데 이것도 결국 토큰화하고 토큰 id로 바꿔서 진행하는 걸 볼 수 있던 게 신기한 포인트였다.

 


이번글에선  모델별로 Tokenizer, special token, chat_template 작동방식을 실제 비교해 보면서 

모델이 작동하는 방식을 조금 더 깊게 파고들어 보는 시간이었다. 

무심코 쓰고 있던 모델의 뒷단에서의 작동원리를 이해해 보는 것 자체가 의미가 있던 거 같다. 

 

다음 글에선 양자화, 트랜스포머 모델 작동방식등 모델에 대한 또 다른 내용들을 담고 있던 3주 차 4,5일째 강의 내용을 작성해 보겠다. 

 

(꾸준히 공부하고, 적을 테니 많은 관심 부탁드립니다.)

 

Profile:

Linkedin