How is LLM text watermark work

LLM 文字水印技術原理如何實現?

前言

Anthropic 近期公告未來的模型都會替文字添加水印:How Claude’s text watermark works🔗,官方聲明:

  • 採用的水印方法不會對輸出品質或內容產生任何實際影響
  • 讀者無法區分有水印和不帶水印的文字
  • 文字中沒有任何添加內容,也沒有隱藏字元
  • 水印不需要額外的 Token,也不會增加成本
  • 水印不包含任何識別訊息,無法追溯到特定個人、組織或聊天記錄
  • 這並非 Claude 專屬。自 8 月 2 日起,歐盟要求服務其市場的 AI 供應商對 AI 產生的內容進行水印標記。其他主要模型開發商也已簽署相同行為準則,將實施各自的水印方案

所以我想研究一下 LLM 文字水印是如何實現的且對使用者有什麼影響

紅綠名單

如何添加水印?

LLM 是一台接詞機,每一個 Token 回應都是機率決定,要從產生後的文字回推是否加上水印是透過統計特徵在生成過程中植入。根據 A Watermark for Large Language Models🔗 實踐一種方法不改變模型「能說什麼」,而是稍微改變模型「比較喜歡選哪些詞的機率」。

  • 🟢 綠名單(Green List):模型會稍微偏好選擇提高機率
  • 🔴 紅名單(Red List):模型不特別鼓勵選擇降低機率

水印不是固定某些字永遠是綠色或紅色,而是會根據當下前後文字內容動態產生,為了讓不知道金鑰的人看起來像隨機,知道金鑰的人卻可以重現規則。

(秘密金鑰 + 前後詞彙 + 偽亂數產生函式 = 種子),種子用於影響下個詞彙機率進而把水印寫入結果內容

透過設置一個只有模型和檢測器知道的秘密金鑰,在準備產生下個 Token 時把「前文」與「金鑰」交給偽隨機函式產生隨機種子,用來決定這次 Token 選擇時哪些是「綠色」、哪些是「紅色」。

使用者提示詞

LLM 產生下一個 Token

根據金鑰與前文決定綠名單

稍微提高綠名單 Token 的機率

模型選出 Token

加入文字成為新的前文

最終產生帶水印的文字

軟水印與硬水印

水印的實現方式分為兩種,差別在於對紅名單 Token 的限制程度:

硬水印(Hard Watermark)

  • 機制:完全禁止模型選擇紅名單中的 Token
  • 優點:產生的文本中綠名單命中率理論上為 100%,偵測非常容易
  • 缺點:嚴重影響文本品質。低熵(高可預測性)的序列會被迫選錯詞,例如「法國首都是」後面幾乎一定接「巴黎」,但如果「巴黎」恰好在紅名單中,模型只能輸出不自然的結果

軟水印(Soft Watermark)

  • 機制:不禁止紅名單,而是對綠名單的讓模型「稍微偏好」綠名單 Token
  • 優點:同樣使用 Z 檢定,綠名單命中率會高於 50% 但低於 100%,需要較多文本才能達到統計顯著性,在高熵位置(多個候選詞機率相近)水印會生效,在低熵位置(某個詞明顯主導)偏置幾乎無影響,因此能保持文本自然度
  • 缺點:須手動調整合適參數
比較項目硬水印軟水印
紅名單 Token完全禁止允許
偵測強度最強較低(需較長文本)
最短偵測文本長度很短較長(取決於文本熵)
文本品質影響嚴重劣化影響極小
低熵處理強迫選不自然的替代詞自適應,水印影響小
實際可部署性

如何判斷水印存在?

  • 文章共有 T 個 Token
  • 其中有 S 個 Token 落在綠名單
  • 綠名單佔詞表比例是 γ(典型值 0.5)

如果沒有水印,我們可以預期綠名單命中率大約就是 γ,例如文章長度:1,000 Token 而綠名單比例:50%,正常隨機生成的文字,要出現 65% 或 75% 的綠名單比例機率很低因此能斷定可能是添加水印過。

當觀察到綠名單命中率偏離預期時,需要透過統計檢定來判斷這是隨機波動還是水印的跡象。

  • Z-score(檢定統計量) 代表觀察值距離平均值有多遠,以標準差為單位:
  • P-value(顯著性 p 值) 代表在沒有水印的前提下,觀察到目前結果或更極端結果的機率。數值介於 0 到 1 之間,越小越有統計顯著性。

以文章長度 1,000 Token,γ = 0.5 為例:

情況綠名單命中數 (S)命中率Z-scoreP-value判斷
無水印(預期)50050%0.001.00正常
實際檢測65065%+3.16< 0.001可疑
實際檢測75075%+6.32< 0.0001極度可疑

SynthID-Text

如何添加水印?

同樣在文字生成時透過統計特徵嵌入偏好,但相較於強硬根據種子分類改變下個文字的選擇機率,SynthID-Text 拆分兩個機率:

  • 選名單(AI 負責): AI 挑出一批最通順合理的候選字,決定誰有資格參加淘汰賽(AI 的機率決定了「參賽門票」的數量)假設淘汰賽總共有 10 個名額:
    • A(70%) 拿走 7 個位子
    • B(20%) 拿走 2 個位子
    • C(10%) 拿走 1 個位子
  • 決定冠軍(g-value 負責): 進入淘汰賽後,AI 原本的機率就不管用了,。g-value 會根據「前文 + 秘密金鑰」的組合,給每一個參賽字發放一個 0 到 1 之間的隨機分數。比賽時,純粹就是比誰的 g-value 高,誰就晉級。

核心 Tournament Sampling 演算法運作流程如下:

  1. 產生隨機種子:根據「前數個 Token」與「秘密金鑰」透過雜湊函式產生隨機種子
  2. 計算 g-value:使用 m 個偽隨機函式 g₁, g₂, …, gₘ 為詞彙表中的每個候選 Token 賦予分數
  3. 錦標賽取樣:
    • 從 LLM 分布中取樣 2m 個候選 Token(可能重複)
    • 第 1 輪:將候選 Token 兩兩配對,根據 g₁ 分數較高者勝出
    • 第 2 輪:勝者再兩兩配對,根據 g₂ 分數較高者勝出
    • 重複直到第 m 輪,最後勝出的 Token 即為下一個生成的 Token
  4. 重複流程:對每個生成的 Token 重複上述步驟

SynthID-Text 不會改變輸出品質的原因是因為它不強硬干涉 AI 的選擇結果,而是在 AI 決定後才進行淘汰賽並在過程中暗藏水印。

偵測機制

SynthID-Text 的偵測不需存取原始 LLM,僅需文本、金鑰與隨機種子產生器。偵測器會計算文本中所有 Token 的 g-value,透過分數函式判斷是否含有水印。偵測器提供三種狀態:

狀態意義
Watermarked高信心度判定文本含有水印
Not Watermarked高信心度判定文本不含水印
Uncertain無法確定,需更多文本或人工判斷

限制與挑戰

偵測效果取決於文本的「自由度」。當模型在低熵場景(如事實回答、程式碼)生成時,詞語選擇空間受限,水印嵌入效果較弱。此外,翻譯或大幅改寫也會降低偵測信心度。

在偵測範圍上,每個 AI 供應商使用不同的金鑰與演算法,Claude 的偵測 API 無法檢測 GPT 或 Gemini 的輸出。水印只能回答「這段文字是否由 Claude 產生」,無法確認是否完全由人類原創。

總結

SynthID-Text 方法一直讓我想有個故事是佛羅倫斯共和國的「皮袋抽籤」,只有先算計好的「高機率字 / 自己人」能獲得門票進入錦標賽,看起來是隨機的 g-value 分數進行 PK 但實際上分佈還是依照 AI 給出的統計走。

延伸閱讀