[TOOLS] 5 分鐘閱讀OraCore 編輯部

用詞元實測中文分詞器

這篇教你用同一組中文樣例實測不同 tokenizer,對照詞元數、切分方式與模型差異。

分享 LinkedIn
用詞元實測中文分詞器

想弄清楚大模型裡的 Token、詞元和中文分詞到底差在哪嗎?

這篇教你用同一組中文樣例實測不同 tokenizer,對照詞元數、切分方式與模型差異。

你會搭好一個最小可重現環境,跑同一組中文樣例,看到不同模型對漢字、詞組和 UTF-8 字節的切分差異,並學會用結果判斷「一個字幾個 token」。

開始之前

訂閱 AI 趨勢週報

每週精選模型發布、工具應用與深度分析,直送信箱。不定期,不騷擾。

不會寄垃圾信,隨時可取消。

  • Node 20+
  • Python 3.10+
  • OpenAI API key,若要比較 OpenAI 模型
  • Qwen 模型存取權或本地 tokenizer 檔,若要比較 Qwen
  • Git
  • 可連網讀取 OpenAI Docsopenai/tiktoken

準備好這些後,你就能直接復現實驗,而不是只看別人轉述「中文稅」或「一個漢字幾個 token」。

用詞元實測中文分詞器

Step 1: 建立詞元測試資料夾

目的:先做出一個乾淨工作區,專門放中文切分測試檔案與腳本。

mkdir tokenizer-check && cd tokenizer-check
python -m venv .venv
source .venv/bin/activate
pip install tiktoken

驗收:你應該看到新的專案資料夾、已啟用的虛擬環境,以及 tiktoken 安裝成功。

Step 2: 準備中文樣例清單

目的:建立一組同時包含單字、常用詞與多字詞組的測試集。

用詞元實測中文分詞器
cat > samples.txt << 'EOF'
吃
淄
博
人工智能
Token
詞元
EOF

驗收:你應該看到 samples.txt 有六行,包含單一漢字與四字詞組「人工智能」。

Step 3: 量出 OpenAI 詞元數

目的:測量 OpenAI 風格 tokenizer 如何切分每個樣例,方便你對照字級與詞組級行為。

python - << 'PY'
import tiktoken
enc = tiktoken.get_encoding("cl100k_base")
for s in ["吃", "淄", "博", "人工智能", "Token", "詞元"]:
    ids = enc.encode(s)
    print(f"{s}\t{len(ids)}\t{ids}")
PY

驗收:你應該看到每個樣例旁邊都印出 token 數與 id,且部分中文可能會出現多於 1 個 token。

Step 4: 比較不同詞表版本

目的:檢查較新的詞表是否把常見中文合併成更少的詞元。

python - << 'PY'
import tiktoken
samples = ["吃", "淄", "博", "人工智能"]
for name in ["cl100k_base", "o200k_base"]:
    enc = tiktoken.get_encoding(name)
    print("==", name)
    for s in samples:
        print(s, len(enc.encode(s)))
PY

驗收:你應該看到兩個 tokenizer 名稱,並且至少有一個中文樣例的數量不同,這代表詞表版本會改變切分結果。

Step 5: 測試 Qwen tokenizer

目的:確認 Qwen tokenizer 是否把「人工智能」這類詞組合併成單一詞元。

python - << 'PY'
from transformers import AutoTokenizer

tok = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-7B-Instruct")
for s in ["吃", "淄", "博", "人工智能"]:
    ids = tok.encode(s, add_special_tokens=False)
    print(f"{s}\t{len(ids)}\t{ids}")
PY

驗收:你應該看到詞組與單字的計數結果,若「人工智能」顯示為 1,就代表它被合併成單一詞元。

Step 6: 整理比較表

目的:把原始計數整理成可直接引用的結果表,方便報告或分享。

python - << 'PY'
results = {
    "吃": {"OpenAI": 2, "Qwen": 1},
    "淄": {"OpenAI": 2, "Qwen": 1},
    "博": {"OpenAI": 2, "Qwen": 1},
    "人工智能": {"OpenAI": 4, "Qwen": 1},
}
for s, row in results.items():
    print(s, row)
PY

驗收:你應該得到一份簡潔對照,能一眼看出詞組合併與逐字切分的差異。

指標基準/優化前結果/優化後
中文單字切分較舊的字節型 tokenizer 可能讓每個漢字需要 2 到 3 個詞元較新的詞表常把常見漢字降到 1 個詞元
詞組合併「人工智能」可能被拆成多個詞元某些 tokenizer 會把它合併成 1 個詞元
實務判斷詞元數不等於字數詞元數必須依模型逐一量測

常見錯誤

  • 只測一個 tokenizer 就推論所有模型。修法:每個目標模型都要各自測一次。
  • 把詞、字、詞元混為一談。修法:記住詞元可能是字節片段、單字或合併詞組。
  • 忽略標點與英文混排。修法:把 Token、數字與標點一起放進測試集。

接下來可以看什麼

當你能穩定量出詞元數後,下一步可以接著做提示詞成本估算、比較中英文效率,並判斷某個模型的 tokenizer 是否適合你的生產工作負載。