分詞會滲進每一件事
現在你知道,文字在模型做任何事之前都會先變成 token。實務上的重點是:真正左右你在乎的幾乎所有事情的,是 token 數,而不是字元數:你付多少錢、回覆串流多快、你的提示塞不塞得下。價格是用每 token 費用(cost per token)報的,速度用每秒 token 數衡量,而脈絡長度上限(context length limit)也是用 token 數來算。學會用 token 來思考,是整個主題裡最實用的一項技能。
這條方便的經驗法則——也正是它不可靠的原因:程式碼、數字與非英文文字都會打破這個比例,所以要執行真正的斷詞器,而不是靠猜。
經典陷阱,逐一拆解
大多數有名的大型語言模型怪事,其實都是分詞陷阱(tokenization pitfalls)的偽裝。一旦你看見了 token,那些怪癖就不再神祕:
- 算術與拼字出錯:模型根本看不到一個個字母或數字。「1234」可能是一個 token,也可能被怪異地切成「12」+「34」,所以「數字元」或「做長乘法」對它來說是真的很難。
- 空格有差的 bug:「 hello」(前面有空格)和「hello」(沒有)常常是不同的 token。你提示結尾多一個空格,就可能悄悄改變模型的行為。
- 精確字串的脆弱:叫模型重複一個罕見 token,或把一個字的字母倒過來,可能會失敗,因為那個字對它而言是一個不透明的 token,而不是一串字元。
- 語言公平性:一個英文字可能是 1 個 token,但同樣的意思用泰文、印地語、甚至中文表達可能要好幾個。這代表非英文提示可能更貴,也更快吃掉脈絡視窗。
位元組層級(byte-level)分詞器能縮小語言差距,也保證沒有任何東西無法表示,但它無法消除差距:分詞器訓練資料中較少見的文字系統,仍然會被切成更多、更小的片段。
在相信任何估算之前,先數 token
因為比例並不可靠,專業的做法是直接跑你的模型實際使用的分詞器,看真正的數量。每個主流供應商都附了一個你可以在本地呼叫的分詞器——把你的提示餵給它,它就回傳 token 清單和長度。這就是你估算費用、確認沒超過脈絡上限、以及除錯空格意外的方法。
prompt = "the cat sat" ids = tokenizer.encode(prompt) print(ids) # -> [1820, 5169, 7493] print(len(ids)) # -> 3 tokens, this is what you are billed for
記得第 2 篇講的詞彙表大小(vocabulary size)取捨:詞彙表較大的模型,往往用更少的 token 就能編碼同樣的文字,這可能讓它更便宜、也能在視窗裡塞下更多——這還是在比較「每 token 標價」之前。Token 效率,是模型一個真實、可比較的特性。
不只文字:圖片也會變成 token
同樣的想法漂亮地推廣開來。多模態(multimodal)模型透過多模態分詞(multimodal tokenization)來處理圖片:一張圖被切成一塊塊小區塊(patch),每塊變成一個向量,於是這張圖以一串圖片 token(image tokens)的形式抵達,跟你的文字 token 並肩坐在同一個向量空間裡。這就是為什麼供應商把一張圖當成一堆 token 來計費,也是為什麼一張高解析度圖片會悄悄吃掉你脈絡視窗很大一塊——它真的就是更多 token。
用一個心智模型收攏整個主題
退一步看,這條管線又短又美。文字被切成詞彙表片段(分詞),每個片段變成一個整數編號,每個編號查出一個學好的向量(嵌入矩陣),而在輸出端,模型替每個 token 評分以挑出下一個——常常透過綁定嵌入(tied embeddings)重複使用輸入那張表。下游的一切——注意力、Transformer 堆疊、最終答案——全都在這些向量上運作。把這道前門弄懂,大型語言模型其餘的部分就不再是魔法,而開始變成一台看得懂的機器。
示意圖:詞向量作為空間中的點,king − man + woman ≈ queen。