Token 是什麼?LLM 為何只讀 Token?

前言

上篇講到LLM,這片就來說說裡面很常提到的字「Token」。Token 是語言模型可理解的最小單位,它像積木一樣把長句拆成小塊,讓模型逐一處理。這篇文章用更平易近人的方式解釋什麼是 token、為何 LLM 不直接處理完整的字詞,以及常見的斷詞方法,幫助你輕鬆掌握這個看似陌生卻無所不在的概念。

Token 是什麼?為何要用它?

LLM 是數學模型,必須把文字轉成向量才能運算。最簡單的做法是把每個單詞賦予一個向量,但這樣會遇到兩個問題:

  1. 無法處理新詞或拼錯字:如果訓練時沒有見過某個單字,模型就不知道如何表示它。
  2. 忽略語素結構:許多語言中,一個詞可以拆成詞根和詞綴,例如「running」「runner」都來自「run」。

為了兼顧彈性與效率,LLM 會先把輸入拆解成更小的 token。有人將 token 定義是「字、字元或包含標點的組合」。有些文中也強調,token 是模型用來處理文字的原子單位。透過 token,模型得以把複雜的語言拆成固定大小的向量,並對每個 token 指派唯一編號。

幾種常見的斷詞方法

不同 LLM 可能採用不同的分割策略。以下三種是最常見的斷詞方法:

  • 字級(Word):按空格切割。例如 “unbelievable performance” 被當作兩個 token。優點是數量少,但遇到新詞就無法處理。
  • 字元級(Character):每個字母和空白都是一個 token。它能處理任何輸入,但 token 數大幅增加,效率低下。
  • 子詞級(Subword):介於上述兩者之間,把常見詞根或片段視為 token,是現在主流 LLM 的做法。例如 “unbelievable performance” 可以拆成 ["un", "bel", "iev", "able", "per", "form", "ance"]

圖中展示同一句話經過三種方法切分後的樣子:

把詞拆成小塊,看出不同斷詞方式產生的 token 數量差異。

簡易 Python 範例:手寫子詞切分

以下程式碼示範如何使用簡單的片段詞表(模擬 BPE 結果)把長詞拆成 token。一樣,雖然不是完整的演算法,但能幫你理解 tokenization 的動作。

# 定義一組常見片段
subwords = ["un", "bel", "iev", "able", "per", "form", "ance"]

# 簡易子詞切分函式
def tokenize_subwords(text, subwords):
    tokens = []
    i = 0
    while i < len(text):
        match = None
        for sw in sorted(subwords, key=len, reverse=True):
            if text[i:].startswith(sw):
                match = sw
                break
        if match:
            tokens.append(match)
            i += len(match)
        else:
            tokens.append(text[i])
            i += 1
    return tokens

# 輸入與輸出示範
print(tokenize_subwords("unbelievable performance".replace(" ", ""), subwords))
# 可能輸出: ['un', 'bel', 'iev', 'able', 'per', 'form', 'ance']

每次優先匹配片段詞表中最長的項目,若無匹配則輸出單個字母,呈現出子詞分割的概念。

注意事項

  • 上下文長度有限:LLM 的輸入與輸出 token 有固定上限。如果採用字元分割,同樣一段話會產生更多 token,導致可用的輸出長度變短。
  • 不同模型斷詞規則不同:GPT-3、GPT-4 可能用 BPE,其他模型可能用 WordPiece 或 SentencePiece;結果不同會影響 token 數量與成本。
  • 計價與速率限制:許多雲端服務依 token 數量計費,並對每分鐘 token 數有上限。了解如何計算 token 有助於預估使用成本。

實際應用

在實際應用中,tokenization 是許多 NLP 任務的基礎。以下列出幾個典型場景:

  • 文字理解與問答:斷詞讓 LLM 能夠理解句子中詞語的關係,支援資訊檢索與問答系統。
  • 文本分類與分析:經過 tokenization 的文本可以餵給分類模型用於垃圾郵件偵測、情緒分析或主題分類。
  • 機器翻譯:子詞斷詞能將罕見或複雜的單字拆分,協助模型在源語言與目標語言之間轉換。
  • 命名實體辨識:將句子拆成 token 是辨識人名、日期、地點等實體的前置步驟。
  • 摘要與聊天機器人:Tokenization 讓模型把長文件拆成可管理的片段進行摘要,也能在對話場景中快速理解使用者輸入。

結語

Token 是大語言模型能理解和輸出的基本單位。透過適當的 tokenization,模型能在見識有限的情況下理解新詞、處理不同語言並產生連貫的文字。熟悉斷詞方法的差異與限制,能幫助我們更有效率地與 LLM 互動並控制成本。希望這篇文章用更簡潔的方式讓你理解 token 的本質,也幫你在未來使用 AI 時更有概念。



發表留言