对 Llama3-8B 进行外科手术式知识编辑——在 FFN(前馈网络)层面精准修改模型存储的特定事实,不影响模型在不相干领域的表现。
传统 ROME/MEMIT 在 Transformer 层整体输出处优化编辑目标,v* 混入了 MHSA 和残差信号。本系统将该优化缩小到 MLP 子模块(down_proj)的输入输出映射上,使 FFN 学到"自己该负责的那部分知识",编辑更精准。
定位 (Causal Trace) → FFN解耦 v* 优化 → K矩阵提取 → 求解ΔW → 应用更新
| 项目 | 要求 |
|---|---|
| Python | 3.10 ~ 3.12 |
| PyTorch | >= 2.0 |
| Transformers | >= 4.40 |
| GPU | 32GB+ VRAM(模型 float32 ~28GB) |
| 模型 | meta-llama/Meta-Llama-3-8B-Instruct |
# 依赖
pip install -r requirements.txt
# 模型(国内用 ModelScope)
pip install modelscope
python -c "
from modelscope import snapshot_download
snapshot_download('LLM-Research/Meta-Llama-3-8B-Instruct', local_dir='./models/Llama3-8B')
"# 单事实编辑
python edit.py single -s "Eiffel Tower" -p "{} is located in" -v "Rome"
# 批量编辑
python edit.py batch -f data/sample_edits.json
# 反事实 Benchmark(fresh 模式,每个 case 独立模型)
python edit.py bench --fresh -o results/benchmark.json
# MMLU 基线
python edit.py mmlu --baseline -o results/mmlu_baseline.json
# MMLU 编辑后评估
python edit.py mmlu --eval -o results/mmlu_edited.json├── edit.py # CLI(4 子命令)
├── config.yaml # 模型路径 + 超参
├── requirements.txt
├── src/
│ ├── editor.py # PmetEditor 主类
│ ├── causal_trace.py # 因果追踪层定位
│ ├── compute_z.py # PMET v* 优化(FFN 解耦)
│ ├── compute_k.py # K 矩阵提取
│ ├── nethook.py # 网络钩子工具
│ ├── nullspace.py # P 矩阵计算(消融用)
│ ├── benchmark.py # 反事实 Benchmark(15 用例)
│ ├── mmlu.py # MMLU-90
│ └── report.py # 数据类
├── data/
│ ├── cases.json # 15 测试用例
│ └── sample_edits.json
├── scripts/
│ ├── seq_test.py # 顺序编辑稳定性测试
│ ├── clamp_test.py # Clamp 消融测试
│ └── make_figures.py # 图表生成
├── results/ # 实验数据
├── report/
│ ├── 实验报告.md # 完整中文报告
│ ├── PPT制作指南.md
│ └── figures/ # 5 张图表
└── tests/
| 指标 | 结果 |
|---|---|
| 地理类编辑成功率 | 3/3 = 100% |
| 人物类特异性 | 6/6 = 100% |
| MMLU 通用能力漂移 | 0.000 |
| 顺序编辑上限 | 4 次(ROME 的 2-3 倍) |
| P 矩阵消融 | 加了 P 总分从 42% → 27%(反面有益) |