# 怎麼知道一段文字是不是 AI 寫的？

> 模型產生文字時可以偷偷留下統計上的記號，再用演算法檢查。但翻譯、改寫會讓記號變淡，水印不是萬能的 AI 偵測器。

- 作者：Michael Kuo（https://mk-ai-notes.pages.dev/about/）
- 發布日期：2026-11-02（2026-11-02T20:05:00+08:00）
- 原文網址：https://mk-ai-notes.pages.dev/posts/ep05-watermark/
- 分類：一人公司工作流＋學習系列（https://mk-ai-notes.pages.dev/category/workflow/）
- 系列：動手學大模型 12 問 第 6 篇／共 12 篇（https://mk-ai-notes.pages.dev/series/dive-into-llms/）
- 標籤：AI 安全、水印、AI 偵測
- 閱讀時間：約 9 分鐘（約 1593 字）
- 參考來源：https://github.com/Lordog/dive-into-llms/tree/main/documents/chapter5

![怎麼知道一段文字是不是 AI 寫的？](https://mk-ai-notes.pages.dev/og/ep05-watermark.png)

---

## 一句話回答

如果模型在產生文字時就「埋了水印」，可以用演算法算出這段文字帶有水印的強度，判斷它很可能出自該模型。但這只對有埋水印的模型有效，而且文字被翻譯或大幅改寫後，水印會變弱。水印是一種輔助工具，不是看一眼就能判定「AI 寫的」的萬能偵測器。

## 為什麼值得知道

AI 文字越來越像人寫的，學校擔心作業代寫，平台擔心大量灌文，新聞擔心假消息。很多人想要一個「AI 偵測器」，但市面上靠文風去猜的工具，誤判並不少見。

文字水印走的是另一條路：不是事後猜，而是**產生的時候就留記號**。了解它的原理和限制，你就知道：

- 為什麼某些偵測結果只能當參考，不能當成定罪證據。
- 為什麼「翻譯一下」常被討論成去水印的方法，以及研究者怎麼應對。
- 為什麼這件事需要模型提供者配合，不是旁人說偵測就能偵測。

## 白話原理

### KGW：綠色清單

最經典的方法常以作者姓氏縮寫稱為 **KGW**（Kirchenbauer 等人提出）。比喻如下：

1. 模型每要寫下一個詞，先根據前一個詞和一把只有自己知道的「密鑰」，把整本字典隨機分成「綠色清單」和「紅色清單」。
2. 產生文字時，稍微偏心綠色清單的詞，替它們的分數加一點分。
3. 人讀起來幾乎感覺不到差別，但整篇文章裡綠色詞的比例會明顯偏高。

偵測時，用同一把密鑰重新算出每個位置的綠色清單，數一數綠色詞有幾個。如果文字跟水印無關，綠色詞大概只會落在隨機的比例附近；比例高得不尋常，就代表很可能有水印。這個「高得多不尋常」用 **z 分數**（z-score）表示，數字越大，水印越強。

### SIR 與 X-SIR：讓水印更耐改寫

KGW 的綠色清單綁在「具體用了哪個詞」上，所以換詞改寫就容易把記號洗掉。

- **SIR**（語意不變的穩健水印，Semantic Invariant Robust）：改成依照前文的**語意**來決定偏好哪些詞，意思不變的改寫比較不容易破壞水印。
- **X-SIR**：本章程式碼倉庫作者的研究，論文題目是〈水印能撐過翻譯嗎？〉。他們發現把文字翻成另一種語言，水印會大幅變弱；X-SIR 的做法是讓不同語言裡意思相近的詞落在同一組，提高跨語言的一致性。

| 方法 | 記號綁在哪裡 | 主要弱點 |
|---|---|---|
| KGW | 前一個詞＋密鑰 | 換詞、改寫、翻譯 |
| SIR | 前文語意 | 跨語言仍會變弱 |
| X-SIR | 跨語言共通的語意分組 | 原文沒有宣稱完全不受攻擊影響 |

## 教程裡實際做了什麼

這章使用 GitHub 上的 **X-SIR** 程式碼倉庫，裡面實作了 X-SIR、SIR、KGW 三種水印，以及「改寫」（paraphrase）和「翻譯」（translation）兩種去除水印的攻擊，用來測試穩健性。

1. **準備環境**：下載倉庫、建立 Python 3.10 環境、安裝套件（原文說版本只是建議）。
2. **準備資料**：把提示句整理成 jsonl 檔，每行一個 `prompt`。範例用倉庫內附的英文 mC4 資料，共 500 條，嫌慢可以自己減量。
3. **嵌入水印**：用 `baichuan-inc/Baichuan-7B` 模型搭配 KGW，執行 `gen.py` 產生帶水印的回答。
4. **偵測水印**：用 `detect.py` 分別替「有水印的生成文字」和「沒有水印的原始資料」算 z 分數，比較兩邊差多少。
5. **評估**：用 `eval_detection.py` 算出 AUC、在固定誤報率下的偵測率（TPR）、F1，並畫 ROC 曲線。原文示範結果 AUC 為 1.000，代表在沒有攻擊的情況下幾乎能完全分開。
6. **穩健性（選做）**：用 gpt-3.5-turbo-1106 把水印文字翻成中文，再重新評估，比較攻擊前後的分數變化。這一步需要自己的 OpenAI API 金鑰，也可以換成其他翻譯工具。

**硬體需求**：原文沒有寫。不過 7B 模型以半精度執行，一般需要有足夠顯存的 GPU，筆電大多跑不動。

## 動手試試

- **先理解，再跑程式**：拿一段英文，自己假裝用一個簡單規則（例如按字母分成兩半）當綠色清單，手算綠色詞比例，就能體會 z 分數在量什麼。這不需要任何硬體。
- **Colab 實作**：X-SIR 支援的都是 7B 等級模型，免費版 Colab 的資源可能不夠，需要付費 GPU 或雲端主機。可以先把資料縮減到幾十條試跑。
- **穩健性實驗**：翻譯攻擊會呼叫外部 API，有費用；這部分屬於研究用途，目的是評估水印夠不夠耐用，不是教人去除水印。

本文刻意不提供任何去除水印的具體操作。研究攻擊是為了讓防禦更好，實際使用請遵守平台規範與學術倫理。

## 常見誤解

- **「水印能偵測所有 AI 文字」**：只有產生時有埋水印、而且你拿得到同一把密鑰和方法，才偵測得到。其他模型寫的文字，水印偵測器根本無從判斷。
- **「z 分數高就是鐵證」**：它是統計上的可能性，短文字的訊號本來就弱，也有誤判的可能。評估時才要看固定誤報率下的表現。
- **「翻譯一下水印就完全消失」**：翻譯會讓 KGW 這類方法明顯變弱，但 X-SIR 等研究正是在改善這點，效果要看實驗數字，不能一概而論。
- **「有水印的文字讀起來比較差」**：設計目標是人察覺不到，但偏好特定詞確實可能影響品質，這也是研究者要權衡的地方。

## 延伸閱讀

- 原教程第 5 章：https://github.com/Lordog/dive-into-llms/tree/main/documents/chapter5
- X-SIR 程式碼倉庫（含 KGW、SIR 實作）：https://github.com/zwhe99/X-SIR

> 本文整理自上海交通大學《動手學大模型》第 5 章，原教程：https://github.com/Lordog/dive-into-llms/tree/main/documents/chapter5。內容由 MK 以自己的話解說，如有錯誤歡迎留言指正。

---

本系列整理自上海交通大學《動手學大模型》公益教程（https://github.com/Lordog/dive-into-llms），以自己的話解說，非官方內容。

引用本文請附原文網址：https://mk-ai-notes.pages.dev/posts/ep05-watermark/（作者：Michael Kuo）
