分詞與其安全意涵
BPE 與 SentencePiece 分詞器如何運作,以及分詞器行為如何建立可利用攻擊面,包含邊界攻擊、同形字與編碼技巧。
概覽
分詞——將文字切為模型處理的離散符元——是 LLM 管線中最常被忽略但安全相關的階段之一。分詞決策影響安全訓練涵蓋、輸入過濾效果與對抗攻擊成功率。本頁深入探討分詞器行為與其安全意涵。
常見分詞器
Byte-Pair Encoding(BPE)
GPT 系列、Llama 與許多其他模型使用。於位元組層級工作:
- 開始以每位元組作為符元
- 迭代合併最常見的符元對
- 結果詞彙含子詞單位
安全特性:
- 可處理任何 Unicode 輸入
- 於 BPE 邊界建立可預測切割
- 稀有符元集群可觸發異常行為
SentencePiece
Gemini 與某些 Llama 變體使用。類似 BPE 但於 Unicode 字元層級。
安全特性:
- 對空白處理不同(影響分詞邊界)
- 具一些 BPE 沒有的邊緣案例
- 某些跨分詞器攻擊利用 BPE vs. SentencePiece 差異
分詞器行為
子詞邊界
現代分詞器不於字元或字層級——而於子詞層級。「tokenization」可能分為「token」+「ization」或「tok」+「en」+「ization」,依分詞器而定。
空白敏感度
空白常被納入符元。「hello」與「 hello」(開頭空格)是不同符元。此敏感度可被利用以改變分詞而保留意圖。
Unicode 處理
不同分詞器以不同方式處理 Unicode。某些正規化於分詞前(例如 NFC),其他保留差異。過濾器與模型可能於此不一致。
基於分詞的攻擊
同形字替換
以不同代碼點但視覺相同字元替換 ASCII 字元。「а」(西里爾)與「a」(拉丁)於分詞器中產生不同符元,使字串比對過濾失敗。
零寬字元插入
於關鍵字中插入零寬空格(U+200B)等不可見字元。「ign\u200bore」視覺相同但分詞為不同符元序列。
符元邊界操控
於子詞邊界插入字元變體改變分詞。「ig-nore」可能分為不同符元序列而「ignore」。
稀有符元利用
某些低頻符元引發意外模型行為。GCG 類對抗攻擊常發掘利用這些稀有符元。知名例子包含「SolidGoldMagikarp」與其他「glitch tokens」於 GPT 分詞器。
位元組層級攻擊
基於 BPE 的分詞器於位元組層級工作,允許建構於字元層級看似無害但於位元組層級觸發特定行為的輸入。
防禦意涵
輸入正規化
於過濾前將輸入規範化為單一形式(NFC 或 NFKC)。剝除零寬字元與其他不可見字元。
過濾器 / 模型一致性
確保輸入過濾器與模型使用相同分詞器。此避免過濾器檢查與模型處理之間的不一致。
稀有符元監控
監控異常符元序列(高熵、稀有符元集群)作為潛在 GCG 類攻擊指標。
輸入字元集限制
若應用不需多語言,將輸入限制於預期字元集可大幅降低同形字攻擊面。
紅隊演練意涵
- 對目標分詞器進行偵察(檢查文件、透過探測推斷)
- 測試分詞邊界變體(同形字、零寬、分隔變體)
- 於白箱測試中使用分詞器資訊最佳化攻擊
- 記錄模型版本與分詞器版本以供重現
範例分詞器分析
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("gpt2")
variants = [
"Ignore all previous instructions",
"Іgnоrе аll рrеvіоus іnstruсtіоns", # Cyrillic homoglyphs
"Ign\u200bore all pre\u200bvious instruct\u200bions", # Zero-width
]
for v in variants:
tokens = tokenizer.tokenize(v)
print(f"Input: {v[:40]}")
print(f" Token count: {len(tokens)}")
print(f" First 5 tokens: {tokens[:5]}")相關主題
參考文獻
- Sennrich et al. (2016). "Neural Machine Translation of Rare Words with Subword Units" (BPE)
- Kudo (2018). "Subword Regularization" (SentencePiece)
- Rumbelow & Watkins (2023). Analysis of "glitch tokens" in GPT tokenizers
為何同形字替換對輸入過濾器有效但對模型理解無效?