special token은 vocab에 예약된 ID들 — 어휘적 의미가 아니라 구조적 의미를 가져. 사용자가 쓴 입력 텍스트의 일부가 아니라, 시퀀스의 나머지를 어떻게 해석할지 모델한테 알려주는 신호.
| 토큰 | 역할 | 사용 |
|---|---|---|
| [CLS] | 분류 — 이 위치의 last-layer hidden state가 전체 입력 대표 | BERT |
| [SEP] | 두 segment(질문/문맥) 경계 | BERT |
| [PAD] | 배치 내 가변 길이 입력 정렬용 padding | 거의 모든 encoder |
| [MASK] | masked-LM 학습용 placeholder | BERT |
| <|endoftext|> | 문서 경계 | GPT-2/3/4 |
| <s> / </s> | 시퀀스 시작/끝 | Llama, T5 |
| <|im_start|> / <|im_end|> | chat message 역할 경계(system, user, assistant) | OpenAI Harmony, Llama chat |
왜 이게 중요해
모던 챗 모델은 special token으로 만든 chat template을 써. tokenizer.apply_chat_template(messages) 호출하면 라이브러리가 각 role 주위에 올바른 special token 삽입. template 우회해서 "User: ..." / "Assistant: ..." 직접 concat하는 거 — "모델이 이상하게 행동해요" 버그 top 3 원인. 모델은 <|im_start|>user 같은 토큰으로 학습됐지, 문자열 "User:"로 학습된 게 아니야.