编程 Agent 能改模型权重了:怎么安全地做权重空间实验

MIT CSAIL 的团队让前沿模型在 Python 沙箱里直接读写 Qwen3.5-0.8B 的权重,MATH-500 从 7.9% 升到 48.1%。想让编程 Agent 也这么改权重:把预算写进任务,只改副本,让另一个 Agent 独立复测,最后一步交给人签字。

Delta

Delta

2026-11-09

编程 Agent 能改模型权重了:怎么安全地做权重空间实验

一句话结论:MIT CSAIL 的一个团队让前沿模型在 Python 沙箱里读取并修改 Qwen3.5-0.8B 的权重,前向传播次数有硬预算,每一步都有完整日志。作者报告 MATH-500 从 7.9% 升到 48.1%。你也可以让编程 Agent 这样改模型权重:在看板上拆成五个任务,把预算写进每个任务,让第二个 Agent 负责评测,最后由人批准被修改的文件。

2026 年 11 月 2 日,Rikiya Takehi、Jayden Teoh、Alex Zhang 和 Omar Khattab 发表了 Sparks of Weight-Space Programming。他们研究里的模型 GPT-6 Astra 打开了权重张量,对着它们写 numpy 和 PyTorch,提出一个假设,然后在一个 8 亿参数的模型里改了 131,072 个数。

看它的实验设置,你会觉得很眼熟:一个沙箱、一份工具预算、每条提示和每个执行单元都有日志。这就是一个带 harness 的编程 Agent,而 harness 正是你的团队今天就能照搬的部分。

MIT 团队做了什么,用数字说

权重空间编程指的是:LLM 把网络的参数当成数据来读,并直接修改,不做梯度下降,也不跑训练。MIT 这篇博文报告的是小模型上的结果,工具限制很严,每一轮都有日志。

最显眼的结果是那次 Qwen3.5-0.8B 的修改:

指标(作者数据) 基础模型 修改后模型
MATH-500 7.9% 48.1%
GSM8K 13.8% 67.1%
IFEval 21.0% 62.3%
触及 32,768 Token 上限的运行 93.0% 33.1%

Astra 把模型「一直循环直到把 Token 用完」的习惯,追溯到第 15 层和第 19 层的 MLP 写出的一个方向,然后从这两层各 64 个输出列里把它减掉:131,072 个权重,占整个模型的 0.016%。发布的 checkpoint 是 Apache-2.0,它的模型卡说只有两个张量和基础模型不同:这两层里的 down_proj.weight 矩阵。

为什么结果由 harness 决定

这篇博文里有两个发现,对团队来说比标题数字更重要。

预算改变了结果。每次前向传播平均一批 64 条序列。跑 10 次时,MATH-500 到 12.3%;跑 25 次到 14.1%;跑 50 次到 48.1%。同一个模型、同一个任务,只是 Agent 能测试一个想法的次数上限不同。

工具也改变了结果。只给两个 Gemma 3 270M 变体的权重,Astra 四次尝试里一次都判断不出哪一个是那个「谄媚」的版本。给它一个能返回它自己写的 16 段文本对应注意力权重的工具后,三对里它全部指对了。

所以有两个杠杆:Agent 可以花多少,以及它可以看什么。这两件事都要在运行开始前写清楚。

边界同样清楚。Astra 没能在 MATH-500 上改进 Gemma 3 270M:基础分 6.8%,它最好的修改也只到 7.7%。作者把这件事读成「移除一个障碍」,而不是「补上模型原本没有的能力」。他们称这些发现为早期结果,其中几项只跑了一次。把你自己的实验当成一次测试,而不是一次修复。

怎么让编程 Agent 安全地修改模型权重

一次安全的权重空间实验有五个特征:

  1. 原始权重对每个 Agent 都是只读的。
  2. 前向传播预算是一个写进任务里的数字,由沙箱强制执行。
  3. 编辑器看到的评测集,和审阅者跑的回归集是分开的。
  4. 每次运行的日志都留在它所属的那个阶段上。
  5. 在沙箱之外加载被修改的文件之前,先由人批准。

HiFox 不数前向传播次数,也不检查张量。那是你的沙箱脚本在做的事,而读取和修改由你的运行时完成(Claude Code、Codex,或你已经在跑的其他 Agent)。HiFox 承载这项工作:每个阶段归谁、它能花多少、回来了什么、由谁签字。MIT 团队自己的日志仓库里有一个 harness/ 目录,放着 Codex 配置和沙箱脚本,是沙箱那一侧很有用的参考。

权重空间实验的五个阶段:对未改动模型的基线评测、在前向传播预算下提出假设、在沙箱副本里做修改、独立复测,以及在使用前由人把关

阶段 1:对未改动的模型做基线评测

第一个任务在原始 checkpoint 上跑你的评测,记下分数和模型在哪里失败。对 Qwen3.5-0.8B 来说,93.0% 的运行都撞上了 Token 上限。提假设的那个任务需要这份失败描述。

阶段 2:读权重,写一个假设

这是带预算的那个任务。把数字写进任务正文,写成 Agent 不会误读的形式:

## 阶段 2:从权重提出假设

模型:./models/qwen3.5-0.8b-base(只读,以 ro 挂载)
预算:50 次前向传播,batch 64。沙箱到 50 就停。
工具:numpy、torch(CPU)、forward() 包装器。没有注意力工具。
输入:阶段 1 的失败记录(任务 HF-101),只用 GSM8K/MATH 练习集。
输出:一页假设,写明层、张量和要改的方向,以及用掉的传播次数。
这个阶段不要写任何权重。

任务里的预算是承诺,沙箱包装器里的预算才是保证。两个都写,并让包装器打印用掉的次数,好让这个数字落进运行日志。

阶段 3:在沙箱副本里做修改

编辑 Agent 只改 checkpoint 副本并报告 diff,拿不到原文件写权限。在 HiFox 里,将 Agent 工作目录设为「创建临时目录」或「Worktree 隔离运行(并行)」后,仓库工作可以每个任务用一份独立的 worktree,所以阶段 3 碰不到阶段 1 量过的东西。

阶段 4:由审阅者 Agent 独立复测

把这阶段指派给另一个 Agent,重跑阶段 1 评测并补上编辑器没见过的回归集。如果你在跑一个小队,队长可以把修改交给一个成员,把复测交给另一个。这个模式对应「低成本执行 Agent 加高阶审阅 Agent 的混合模型小队」:写改动的人和打分的人不是同一个。

编辑器是照着它能看见的东西做优化的,所以只在那些题目上出现的提升说明不了什么。

阶段 5:由人对 diff 把关

最后一个任务落到人手里,带三份附件:改动张量清单、修改前后对照表、审阅者的回归结果。这个任务没有推进之前,沙箱之外不会加载被修改的 checkpoint。

下面这段短脚本生成第一份附件。它比较两个 safetensors checkpoint,列出每一个发生变化的张量:

from safetensors import safe_open
import torch

BASE = "models/qwen3.5-0.8b-base/model.safetensors"
EDIT = "sandbox/qwen3.5-0.8b-edit/model.safetensors"

changed, total = [], 0
with safe_open(BASE, "pt") as a, safe_open(EDIT, "pt") as b:
    assert set(a.keys()) == set(b.keys()), "tensor names differ"
    for name in a.keys():
        x, y = a.get_tensor(name), b.get_tensor(name)
        total += x.numel()
        n = (x != y).sum().item()
        if n:
            changed.append((name, n, (x - y).abs().max().item()))

for name, n, dmax in changed:
    print(f"{name}: {n:,} weights changed, max |delta| {dmax:.4g}")
print(f"{sum(c[1] for c in changed):,} of {total:,} weights changed")

在已发布的 checkpoint 上,模型卡说你应当看到正好两个 down_proj.weight 张量。如果你自己的修改碰到了假设里从没提过的张量,那就是丢掉它的理由。

在 HiFox 上跑这块看板

这是一次实验的看板。每一行是一个任务,有自己的处理人、状态和运行历史。

任务 处理人 预算或门禁 完成条件
1. 基线评测 评测 Agent 只用评测集 分数和失败记录已发出
2. 从权重提出假设 编辑器 Agent 50 次前向传播 假设已发出,用掉的传播次数已记录
3. 沙箱内修改 编辑器 Agent 只改副本,原文件只读 diff 和被修改的文件都在沙箱里
4. 复测和回归 审阅者 Agent 留出的回归集 修改前后对照表已发出
5. 批准或丢弃 人 人工门禁 决定记录在任务上

用阻塞关系把各阶段串起来。HiFox 的任务关联在卡片上显示依赖和进度,但不会自动移动任务或启动运行。前一阶段完成前,后续阶段留在「待处理」;停在「待处理」的任务不会触发 Agent 运行,移出该状态才是触发器。

阶段 4 结束后,Agent 可以让任务对话停在「等人审阅」(对需要处理的人显示「等你审阅」),人会在主侧栏「对话」模块(以及桌面横幅、飞书或 Slack 提醒)里看到它;若按任务完成交接,则会在收件箱收到「Agent 已完成」提醒。对话记录、运行详情与执行转录记录每次运行的开始时间、耗时、触发来源、输出和工具调用:这是留在对应阶段上的审计轨迹。想了解在哪停下 Agent,可读编程 Agent 的批准门。

动手前的现实边界

  • 从小处开始。这项研究用的是 0.8B 和 270M 的模型,CPU 上就能访问张量。挑一个你几分钟内能评测完的模型。
  • 别指望补上缺失的能力。Gemma 那个结果说明,修改可以解开一个模型被挡住的路径,但不能教会它新东西。
  • 一次运行只算轶事。换一个全新的 Agent 把实验重跑一遍,再决定要不要信这次修改。

结论

MIT 那篇博文里可复用的教训是 harness:写下来的预算、受限的工具、完整的日志,以及别人能复核的结果。这些正是你本来就想围在一个会改代码的编程 Agent 外面的控制手段。

想试的话,在一个 HiFox 空间里建这五个任务,把第 1 到第 4 阶段指派给你已连接电脑上的 Agent,第 5 阶段留给自己。HiFox 免费开始,官网是 hifox.com。

常见问题

编程 Agent 能修改模型权重吗?

在 MIT CSAIL 的这项研究里,可以。GPT-6 Astra 在 Python 沙箱里读取 Qwen3.5-0.8B 的张量,改了 131,072 个权重。作者报告 MATH-500 从 7.9% 升到 48.1%。这项工作还早,模型也小,其中几项结果只跑了一次。

什么是权重空间编程?

LLM 把网络的参数当成数据来读,并直接修改,不做训练。它用代码分析张量、提出假设、改动权重,再用有限次数的前向传播衡量效果。

为什么前向传播预算很重要?

在作者做的 Qwen 消融里,10 次传播在 MATH-500 上到 12.3%,25 次到 14.1%,50 次到 48.1%。预算决定了 Agent 能测试多少个想法。把它写进任务,并在沙箱里强制执行。

改权重能给模型加上新能力吗?

这项研究显示不能。Astra 最好的修改把 Gemma 3 270M 在 MATH-500 上从 6.8% 提到 7.7%。作者认为,在 Qwen 上这次修改是移除障碍,而不是增加能力。

怎么防止被修改的权重进入生产环境?

把原始权重以只读方式挂载,改副本,跑一次独立复测,并要求人在沙箱之外加载文件之前先批准张量 diff。

Explore more

Fable 5.2 实测:$8/$40 别无脑开 max 档

Fable 5.2 实测:$8/$40 别无脑开 max 档

Claude Fable 5.2 与 Mythos 5.2 将标准价格降至 $8/$40 每百万 Token、提速 30%,但实测显示 max 档会耗尽 128,000 思考 Token 并返回空结果。本文拆解其底层机制,给出 Effort 档位锁死与 Opus 5.5 + Fable 5.2 分层路由方案。

2026-11-10

Gemini 撤回免审承诺:防后台拉取云盘邮件送人审

Gemini 撤回免审承诺:防后台拉取云盘邮件送人审

Google 悄然撤回 2023 年「Gmail、Docs 与 Drive 个人内容不经人工审阅」承诺,更新 Answer 16836988 警告审阅员看到的可能就是邮件或文件本身。实测显示开启 Connected Apps 后日常闲聊即按概率触发后台全文抓取。本文拆解四档抓取状态与脱敏盲区,给出四步自查与三层防外泄方案。

2026-11-10

Gemini Omni 1.2 Flash API 实战:把视频生成变成 Agent 可执行的任务

Gemini Omni 1.2 Flash API 实战:把视频生成变成 Agent 可执行的任务

怎么把 Gemini Omni 1.2 Flash API 视频生成当成可追踪的 Agent 任务来跑?本文详解 Interactions API 调用结构、任务需求单、参考素材限制、保留 interaction ID 的多轮修改,以及成片发布前的人工审阅节点。

2026-11-09