# AI 記錯一件事，能只改那一條嗎？

> 不重新訓練，也能直接改模型記住的某一條知識。用 EasyEdit 和 ROME 把梅西改成打籃球，再檢查有沒有改壞別的事。

- 作者：Michael Kuo（https://mk-ai-notes.pages.dev/about/）
- 發布日期：2026-11-02（2026-11-02T20:03:00+08:00）
- 原文網址：https://mk-ai-notes.pages.dev/posts/ep03-knowledge-edit/
- 分類：一人公司工作流＋學習系列（https://mk-ai-notes.pages.dev/category/workflow/）
- 系列：動手學大模型 12 問 第 4 篇／共 12 篇（https://mk-ai-notes.pages.dev/series/dive-into-llms/）
- 標籤：知識編輯、LLM、開源課程
- 閱讀時間：約 8 分鐘（約 1390 字）
- 參考來源：https://github.com/Lordog/dive-into-llms/tree/main/documents/chapter3

![AI 記錯一件事，能只改那一條嗎？](https://mk-ai-notes.pages.dev/og/ep03-knowledge-edit.png)

---

## 一句話回答

可以，這個研究方向叫「知識編輯」（Knowledge Editing）。它不重新訓練整個模型，而是找到模型裡跟某條知識有關的參數，只動那一小塊，讓模型對這件事的回答改掉，同時盡量不影響其他知識。不過「只改那一條」是目標，不是保證，改完一定要驗證。

## 為什麼值得知道

模型的知識停在訓練那一天。公司換了執行長、法規更新了，它還是照舊回答。補救方式有三種：

- **重新訓練或微調**：成本高，而且可能讓模型忘掉別的東西。
- **檢索增強（RAG）**：回答前先查資料庫，模型本身沒變。
- **知識編輯**：直接改模型內部，讓它「真的記成新的」。

知識編輯適合「少量、明確、要馬上修正」的事實錯誤。了解它，廠商說「可以直接修正模型」時，你就知道該追問什麼。

## 白話原理

把模型想成一座圖書館，知識分散在很多書架上。知識編輯是找到「梅西 → 足球」主要放在哪個書架，只改那裡。

本章用的方法是 **ROME**（Rank-One Model Editing）。它的核心想法：

1. 事實型知識常可以拆成「主體＋關係＋答案」，例如（梅西、從事的運動、足球）。
2. 研究發現，這類關聯和模型中間層的前饋網路（MLP）關係很大。
3. ROME 對那一層的權重做一次很小的「秩一」更新，可以想成只加上一個非常精準的修正量，讓「梅西」連到「籃球」。

改完之後要檢查四件事，這也是 EasyEdit 評估模組的四個指標：

| 指標 | 白話說法 | 例子 |
|---|---|---|
| 可靠性（Reliability） | 原本那句問法有沒有改成功 | 問「梅西打什麼運動」→ 籃球 |
| 通用性（Generalization） | 換個說法問還是新答案嗎 | 「梅西是哪種運動的選手」→ 籃球 |
| 局部性（Locality） | 無關的知識有沒有被誤傷 | 「Larry Bird 是職業……」還是籃球 |
| 可移植性（Portability） | 跟這條知識相關的推論有沒有跟著更新 | 由新事實延伸出的問題 |

好的編輯要四項兼顧，只看可靠性容易誤以為成功。

## 教程裡實際做了什麼

這章使用浙江大學團隊開源的 **EasyEdit** 工具包。它把編輯流程整理成幾個模組：Editor（要編輯的模型與知識、超參數）、Method（ROME、MEND 等編輯方法）、Evaluate（上面四個指標）、Trainer（需要先訓練的方法才用）。

示範任務是把 **GPT-2 XL** 記得的「梅西踢足球」改成「梅西打籃球」。步驟如下：

1. 下載 EasyEdit 並安裝套件（原文建議 Python 3.9.7 的 conda 環境）。
2. 選擇編輯方法 ROME，設定模型路徑與要用哪張 GPU，其他參數用原本的設定即可。
3. 準備編輯資料：提問句、原答案（football）、新答案（basketball）、主體（Lionel Messi）。
4. 讀入 ROME 的超參數檔，建立 Editor。
5. 呼叫 `edit` 方法執行編輯，取得評估結果與編輯後的模型。

核心呼叫只有幾行（摘自原教程第 3 章，有刪節）：

```python
hparams = ROMEHyperParams.from_hparams('./hparams/ROME/gpt2-xl.yaml')
editor = BaseEditor.from_hparams(hparams)
metrics, edited_model, _ = editor.edit(
    prompts=prompts, ground_truth=ground_truth,
    target_new=target_new, subject=subject)
```

驗證方式有兩種：在 `edit` 裡傳入 `locality_inputs` 等評估資料讓工具算分數；或把同一批句子丟給編輯前後的模型，直接比較生成結果。

原文提醒：第一次編輯某個模型會下載維基百科語料、計算各層統計值，所以比較久，之後會重複使用。

進階部分是**批次編輯**（Batch edit）：把多條知識排成列表一次傳入，原文指出這時 **MEMIT** 是比較合適的方法。另外介紹兩個常用測試集 **CounterFact** 和 **ZsRE**，每筆資料除了要改的事實，還附有換句話說的問法與「鄰居」問題，正好對應通用性與局部性。

硬體方面，原文只寫要指定 GPU，沒有寫需要多少顯存。

## 動手試試

最省事的入口是原文附的 Colab 筆記本（ROME 與批次編輯各一份），在瀏覽器就能跑。建議這樣玩：

1. 照原樣把梅西改成籃球，看可靠性分數。
2. 寫兩三句換說法的問題，檢查通用性。
3. 準備幾題無關的常識題，比較編輯前後，感受局部性。
4. 一次改兩條知識，看會不會互相干擾。

GPT-2 XL 是很早期的模型，本來就常答錯，重點是看「編輯前後的差異」。免費版 Colab 的 GPU 和時間有限，跑不動時可能要換付費方案，原文沒有這部分的建議。

## 常見誤解

- **「改一條就只會影響那一條」**：參數是很多知識共用的，改動可能波及相近的事實，所以才需要局部性指標。
- **「知識編輯可以取代重新訓練」**：它適合少量、明確的事實。大量或大範圍的更新，目前還是要靠訓練或檢索。
- **「編輯成功＝模型真的理解新事實」**：可靠性高不代表推理也跟著更新，可移植性常常是最難的一項。

## 延伸閱讀

- 原教程第 3 章：https://github.com/Lordog/dive-into-llms/tree/main/documents/chapter3
- EasyEdit 工具包：https://github.com/zjunlp/EasyEdit
- EasyEdit 的 ZsRE 範例程式：https://github.com/zjunlp/EasyEdit/blob/main/examples/run_zsre_llama2.py

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

---

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

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