Special tokens(特殊 token)的核心概念是「vocab 中保留給控制 / 邊界 / 結構用途的 token」、不是正常字面意義的詞。常見如 <bos>(begin of sequence)、<eos>(end of sequence)、<pad>(padding)、<|user|><|assistant|><|tool_call|> 等。

概念位置

LLM 中 special tokens 的常見類型:

Token用途範例
<bos> / <s>序列開頭Llama、Mistral
<eos> / </s>序列結尾、模型輸出這個就停所有 LLM
<pad>把 batch 內不同長度 sequence 填齊訓練 / batched 推論時用
<unk>遇到 vocab 外的 token(byte-level BPE 已不需要)早期 tokenizer
<|user|> / <|assistant|>Chat template 角色標記Llama 3 chat、Qwen chat
<|im_start|> / <|im_end|>ChatML 格式的對話邊界OpenAI、Qwen 系列
<|tool_call|> / <|tool_response|>Tool use / function calling 訊號Llama 3.1+ 等支援 tool use 的模型
<think> / </think>Chain-of-thought 標記DeepSeek-R1、O1 風格模型

關鍵特性:

  1. 訓練時用特殊 token ID 標記:模型透過大量範例學會「看到 <\|user\|> 後面是使用者輸入、看到 <\|assistant\|> 後面要生成回答」。
  2. Chat template 把這些組合起來:把使用者輸入 + 系統 prompt + 對話歷史依特定格式插入這些 token、組成模型訓練時看過的格式。
  3. <eos> 的 sampling 行為:模型輸出 <eos> 後、推論伺服器停止生成、所以「為什麼回答突然停了」很多時候就是模型決定發 EOS。

設計責任

讀 tokenizer config(tokenizer_config.json)看到 bos_tokeneos_tokenchat_template 等就是這組設定。寫 code 場景的判讀:用 Continue.dev / Ollama 時、伺服器會自動套用模型的 chat template、把使用者輸入轉成正確的 special tokens 格式;自己寫 inference code 時、要呼叫 tokenizer.apply_chat_template() 避免格式錯亂導致模型輸出爛。