第 3 课 · 动手学大模型(上海交大)
Knowledge Editing
知识编辑:用 EasyEdit 改掉模型记住的一条事实
模型把「梅西踢足球」写进了参数里。如果要把它改成「梅西打篮球」,同时不影响它对别的问题的回答,该怎么做?这就是知识编辑要解决的问题,也是这一章的完整实验。
学习目标
- 熟悉 EasyEdit 工具包的安装与调用。
- 掌握一种最简的语言模型编辑方法,能跑通从准备参数到验证效果的全流程。
- 了解不同类型编辑方法的选型和应用场景。
核心概念
EasyEdit 是浙大 zjunlp 开源的编辑工具包,支持 GPT-J、Llama、GPT-NEO、GPT2、T5 等模型,目标是针对一条特定知识有效改变模型行为,同时不拖累其他输入上的表现。
它把整件事拆成四个模块:Editor 描述工作场景,包含待编辑的模型、待编辑的知识和必要超参;Method 是具体的编辑技术,比如 ROME、MEND、MEMIT;Evaluate 是评估指标;Trainer 供那些需要训练过程的方法使用。
评估指标有四个,理解它们比记住方法名更重要:可靠性看目标知识改没改成;通用性看换个问法还成不成立;局部性看无关知识有没有被误伤;可移植性看编辑后的知识能不能参与推理。只看可靠性很容易得到一个「改对了一句、坏掉了一片」的模型。
实践步骤
- 安装 EasyEdit,准备 GPT-2-XL 权重(本地路径或 Hugging Face 缓存)。
- 选方法为 ROME,填好
alg_name、model_name、device等参数,其余保持默认。 - 准备编辑数据四件套:
prompts是提问,ground_truth填football,target_new填basketball,subject填Lionel Messi。 - 用
ROMEHyperParams.from_hparams读超参,再用BaseEditor.from_hparams实例化 Editor。 - 调用
editor.edit(...),拿到metrics和edited_model。 - 传入评估数据算通用性、局部性、可移植性;也可以直接对比编辑前后两个模型的
generate行为,肉眼看差别。
常见误区
- 以为第一次编辑就该秒出结果。 首次编辑某个模型会下载 Wiki 语料并计算各层状态,存到
stats_dir后续复用。第一次慢是正常的,保证网络通畅耐心等即可。 - 只看编辑目标改没改成。 不传评估数据就只有可靠性一个数,局部性的坑要专门去踩。
- 拿单条编辑的方法做批量。 多条数据可以并列传入做 batch edit,但此时 MEMIT 才是更合适的方法,ROME 不是为批量设计的。
动手练习
先把梅西那条改完,再准备三组探针问题:换问法的(通用性)、完全无关的(局部性)、需要用到这条知识做二次推理的(可移植性)。编辑前后各问一遍,做成六行对照表。然后把同一条知识换 MEND 或 MEMIT 再编辑一次,比较四个指标的差异,写下你会在什么场景选哪个方法。
要点回顾
知识编辑是一把精度很高但很容易伤到旁边的手术刀。工程上跑通不难,难的是把四个评估维度都测到位。批量编辑和单条编辑是两类需求,方法不能混用。想做系统评测可以上 Counterfact 这类 benchmark,而不是停在一条梅西上。
参考来源
- 上海交通大学《动手学大模型》系列编程实践教程,第三章「知识编辑」:documents/chapter3,核验日期:2026-09-06。