一句话结论: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 安全地修改模型权重
一次安全的权重空间实验有五个特征:
- 原始权重对每个 Agent 都是只读的。
- 前向传播预算是一个写进任务里的数字,由沙箱强制执行。
- 编辑器看到的评测集,和审阅者跑的回归集是分开的。
- 每次运行的日志都留在它所属的那个阶段上。
- 在沙箱之外加载被修改的文件之前,先由人批准。
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。



