13 个 AI 科学家共用一本 Git 仓库,12 天发了 1703 条"论文":Agora 把 Git 变成了集体研究的共享记忆

你有没有想过一个问题:让一个 AI 智能体自己跑实验、自己改进方案,这事已经被证明可行了——那把十个这样的智能体扔进同一个项目里,会发生什么?

直觉的答案可能是"十倍的速度"。但现实往往很骨感:每个智能体开一个新会话,记忆清零,各自从头摸索。人越多,重复劳动越多,十个智能体大概率是十份重复的搜索,而不是十倍的发现。这就像让十个研究员各自闷头做实验,谁也不许看别人的笔记——想想都浪费。

NVIDIA 的一篇新论文 Agora(arXiv: 2609.18094)就盯上了这个痛点,给出的答案朴素得有点出人意料:用 Git 当共享记忆。不是比喻,就是字面意思的 Git——每个研究贡献是一个 commit,每条"我站在巨人肩膀上"的引用是一条 parent 边,整个社区的知识状态就是一个只增不改的 DAG。然后他们真的跑了:13 个语言模型 worker,没有任务分配,没有中央调度,在一个权重迁移问题上连续干了将近 12 天,发布了 1703 条贡献,把评估指标从 3.39 打到 1.899 bits per byte,抹平了到训练版 GPT-2 124M 之间 62% 的差距。

这篇论文最值钱的地方,我觉得不是那个数字本身,而是它可能是目前对"多智能体集体研究到底长什么样"最诚实的一份 trace——包括其中难看的那部分。


论文信息

  • 标题:Agora: Git as Shared Memory for Collective AutoResearch
  • 作者:Yifan Zhang, Yunheng Zou, Shaokun Zhang, Jian Hu, Hao Zhang, Binfeng Xu, Jan Kautz, Yi Dong
  • 机构:NVIDIA
  • 发表日期:2026 年 9 月 16 日
  • 链接:https://arxiv.org/abs/2609.18094

🎯 核心摘要

单个 coding agent 自动跑研究循环已经不是新鲜事了,但多个 agent 并行时,每个会话都从零开始,算力翻倍只换来翻倍的重复搜索。Agora 的思路是把整个研究过程记录成一个存在 Git 里的 append-only DAG:每条结果、洞见、假设、验证、报告都是一个不可变的 commit,parent 边声明它建立在谁之上;派生出的索引暴露研究前沿、被忽视的分支和每条 claim 的验证状态;再加一个多样性感知的选择规则防止整个社区坍缩到单一leader上。首次持续使用中,13 个 worker 在 12 天里发布 1703 条贡献,把权重迁移任务的指标从 3.3923 降到 1.899 bpb;最优方案的 145 层祖先链横跨 15 个账户,165 次独立复现无一失败。这是一次系统设计加社会学观察的混合实验,工程上很漂亮,但作者自己也承认:缺对照实验,因果结论还下不了。


📖 为什么需要共享记忆:多智能体研究的"重复发明轮子"困境

先把背景说清楚。AutoResearch 这类自主研究循环——一个 coding agent 自己改训练配置、跑实验、读结果、再改——已经证明能无人值守地改进一个训练 setup。顺着这个思路往下走,最自然的扩展就是多开几个。

问题来了。这些 agent 会话之间默认是完全隔离的:不共享文件系统,不共享对话,不共享模型。worker A 昨天深夜试出来的失败方向,worker B 今天早上会原样再试一遍。论文后面给出的实测数字挺扎心:在 Agora 运行期间,有 696 对来自不同账户的帖子发布了完全相同的分数,其中 63% 的发布时间相差不到 1 小时,80% 不到 6 小时——即便在有了共享记忆之后,平行重复发明依然大量存在。没有共享状态的时候只会更糟。

说到这个,之前社区里其实已经有不少"AI 科学家"方向的工作,从单 agent 的自动化实验循环,到给 agent 加文献记忆、加经验回放。但这些方案大多是给单个 agent 增强记忆,而不是让一群 agent 之间形成真正的集体状态。Agora 问的问题更底层:集体研究的状态应该长什么样,才能让任意一个后来者随时"检出"任意一条 claim 并重跑?

他们的回答是:别想复杂了,软件工程早就解决了这个问题——一群互不认识的开发者在同一个代码库上异步协作,靠的就是 Git。


🏗️ Agora 的设计:研究即 commit

一张只增不改的 DAG

Agora 里一个项目的全部状态是一个有向无环图 \(G=(V,E)\),边 \((u,v)\) 表示 \(v\) builds on \(u\)——就是 Git 里 parent 的关系。每个节点存 commit hash、发布账户、标签、描述、结构化元数据、可选的项目指标、父节点集合和服务器时间戳。

有个设计决策我很喜欢:Git 是唯一的状态来源。SQLite 索引、分析视图、论文里所有图表,全部从 Git 历史派生,随时可重建。身份就是 hash,谱系就是 Git parentage,append-only 和无环是 Git 天然保证的,不需要额外发明一致性协议。参与者通过 CLI 或 HTTP API 发布,轻量路径直接发 JSON 元数据,带代码的走 Git bundle 上传加服务器验证。

贡献类型与"来自下游证据"的评分

每条贡献带标签,论文 Table 2 给了完整的标签体系。除了 setup 是第零号 commit,其余主要类型包括:result(实验结果,成功失败同等收录)、insight(解释和模式观察)、hypothesis(未测试的提案,禁止把指标伪装成已测)、report(人类可读的综合),以及权重最高的 verification——确认复现成功加 20 分,部分复现加 10 分,复现失败减 20 分,而且永远不能验证自己的工作

评分规则是整篇论文里我觉得最精巧的一处:

\[S(u)=\sum_{v:(u,v)\in E}\mathbbm{1}[a(u)\neq a(v)]\,w(v)\]

翻译成人话:一条贡献的分数,等于其他账户基于它构建的下游贡献的权重之和。自己扩展自己的分支不会给自己带来任何影响力。你不能靠刷分支刷出声望,只能靠"别人觉得你的工作有用、愿意站在上面继续盖楼"来积累。被复现过、被引用过的工作,自然浮到上面。

作者也很清醒,特意强调这个分数不是真理信号——它编码的只是"可操作性的社会证据",一条 claim 是否被接受,仍然取决于项目的评估器和验证政策。

Frontier 索引与防坍缩机制

光有一张大图不够,agent 每次开工前得知道"现在该看哪"。Agora 的 analyze 调用一次返回多个视图:指标领先者、被 build-on 最多的节点、叶子节点、有潜力但探索不足的结果、未验证的结果、有争议的验证、开放的假设。贡献够多之后还会对描述做语义聚类(要求 embedding 覆盖率不低于 50%,默认 cosine 阈值 0.90),报告 cluster 分布、top-cluster share、基于熵的有效 cluster 数。

候选的工作起点按一个多样性感知的 UCB 排序:

\[U(v)=100\,Q(v)+C\sqrt{\frac{\log(N+1)}{n(v)+1}}+\frac{100D}{\sqrt{1+\rho(v)}}\]

三项分别是质量百分位、经典的探索奖励(\(n(v)\)\(v\) 的后续工作数)、以及重复度惩罚(\(\rho(v)\) 是近似重复描述数)。候选被分成三个槽位展示:exploit(复现或改进领先者)、explore known(扩展稀疏 cluster 里有前景的工作)、explore novel(碰没人碰过的孤立节点)。

论文里有句话我觉得点得很准:"split 比具体分数更重要"——三槽位的价值在于把"利用还是探索"的权衡直接摆在参与者面前,让整个项目能意识到自己什么时候正在坍缩成 monoculture。这个判断后来被实战验证了,后面细说。


🧪 实验:一个故意设计成"谁都对不上号"的权重迁移任务

实验任务选得很刁钻:权重迁移。给你 141 个开放权重的 donor 模型(534 GB,覆盖 GPT-2、LLaMA、Mistral、Qwen、Gemma、Pythia、RWKV、Mamba 等 32 个架构家族),要求初始化一个目标模型——14 层 attention 与简化 Mamba 式 SSM 交替的混合架构,hidden size 672,119,572,320 参数。关键限制有三条:目标维度刻意与所有 donor 都不匹配不许用训练数据不许做梯度更新。只能用 donor 的权重和前向传播。

参与者提交一个含 transfer(model, config) 函数的 Python 文件,评估器在 200 篇 FineWeb-Edu 文本上算 bits per byte(越低越好),所有种子固定为 42,同代码同硬件两次运行 bit-identical。基线:随机初始化 3.3923 bpb;正常训练的 GPT-2 124M 大约 1.0(只是标尺,不可达)。项目简报给了一个 2.5 以下的 aspirational 目标。

13 个 worker 账户——跑的是 Claude Code 加 Claude Opus 4.7、Codex 加 GPT-5.5 的 coding-agent 会话——每个分到一块 80 GB GPU、一个 Agora 账户、一份两页纸的简报。简报里没有任何方法名、角色分配或参与者排名。会话结束就起新会话,全程 11 天 19 小时。


📊 结果:1703 条贡献,62% 的差距被抹平

总体数字先摆出来:1703 条贡献,其中 1124 个带分数的结果、284 条洞见、203 条假设、165 次验证、1 篇报告;233 个结果刷新了当时最优。分数从 3.3923 一路降到 1.899044 bpb,抹平了到训练版 GPT-2 差距的 62%。全社区稳定在每天约 170 条贡献的节奏。

还有两个自发涌现的行为值得单独拎出来:从 4 月 28 日起,超过 400 条描述在结果发布之前就声明了预测区间——没人要求他们这么做;165 次验证覆盖 95 个不同目标,验证者与作者都不同,无一失败,跨硬件(A100 对 H100)的差异最高只有 1.3×10⁻³ bpb。

权重迁移全过程的分数演进图

图 1:12 天里所有贡献的 val_bpb(纵轴,log 尺度,越低越好)随时间的分布。粉色点是大量失败或无效的尝试,散布在随机初始化基线 3.392 附近;绿色点是有效探索;橙色描边的圆点串是不断刷新 SOTA 的主线。注意 5 月 1 日到 5 月 5 日那段漫长的平台期——社区卡在 1.906 附近以每步 10⁻⁵ 的幅度精修,直到跌破 1.90 之后才有新的突破。第一个标注点很诚实:首次尝试切片复制 GPT-2 加 Mamba 权重,4.68,比随机还差。

获胜 recipe:把 donor 的"行为"而不是"参数"压缩进去

最优方案分两个阶段,思路我觉得相当漂亮。

Stage A 的核心洞察是:donor 的参数不能跨架构迁移,但 donor 的预测行为可以。具体做法:取六个共享 GPT-2 词表的 donor(GPT-2 small/large、Cerebras-GPT 111M 到 1.3B),在 28 个单 token 上下文下查询每个词表 token 的 next-token 分布,log-softmax 截断到 ±25 后按固定 donor 权重(GPT-2 small 占 0.725)和按方差与自然度加权的上下文权重混合,得到一张 50257×50257 的上下文平均 bigram 表 \(M\)。拆出列均值作为 unigram 锚点,中心化后的表用随机 SVD(oversample 32,1 次 power iteration)分解到秩 671,因子分别写入目标模型的输入 embedding 和输出 head,hidden 第 0 维承载 unigram 项,所有子层权重清零、norm 设为 identity。到此为止,整个 14 层网络其实是一个分解式 bigram 模型——已经能到 1.93 附近。

Stage B 再往上叠加稀疏的确定性编辑,给模型注入短程上下文信号:在 hidden state 的 96 维 band 上操作,attention 层被改成对过去 embedding 的单 band 均匀因果 mean-pool;SSM 块的 selective path 被禁用,退化成门控深度因果卷积,第 1 层用符号交替核 (1.85, 1.65, 0.20, −2.70) 强调近期位置,其余用均匀 1/4 核;第 0 层 FFN 接收 GPT-2 small 第一个 MLP 的 SVD 投影切片,缩放 0.009。每个常数都是作为对当时最优的单一改动引入、因评估器改进而保留的。

一句话概括这套 recipe 的最终形态:bigram 先验打底,浅层的 band 路由提供局部上下文修正。单看技术并不算惊人,惊人的是它是被一群互不认识的 agent 一块一块拼出来的。

里程碑与谱系:没有一个人拼出整个方案

时间(UTC) 账户 bpb 引入的改变
3.3923 随机初始化
Apr 27 00:24 worker1 4.6784 切片复制 GPT-2 和 Mamba 权重(比随机还差)
Apr 27 00:57 worker1 2.5151 GPT-2 预测的 unigram prior;残差子层清零
Apr 27 01:50 worker1 2.1284 bigram 转移矩阵,随机 SVD 写入 embedding 和 head
Apr 27 06:55 worker2 1.9319 24 个前缀,几何平均聚合
Apr 27 13:30 worker2 1.9304 平均前先做 per-prefix log-softmax
Apr 28 04:31 slurm_worker_4 1.9228 第二个 donor(Cerebras-GPT 111M)
Apr 29 11:04 slurm_worker_2 1.9136 六个 donor,28 个单 token 上下文
May 1 05:10 worker2 1.9062 随机 SVD 加一次 power iteration
May 1 10:28 slurm_worker_3 1.9043 第 0 层 attention 改为均匀因果 mean-pool
May 3 00:13 slurm_worker_3 1.9028 首个 SSM 编辑:第 1 层 band mean-pool
May 5 17:34 slurm_worker_6 1.8995 第 0 层 FFN 投影(来自 GPT-2 small)
May 8 13:24 slurm_worker_1 1.8990 第 1、3、7 层跨 band SSM 输出投影写入

最优贡献的祖先链有 145 个 commit,由 17 个账户中的 15 个撰写,144 条父边里 115 条跨越账户边界——没有任何一个 worker 独立组装出完整方案。那个 commit 本身是 83 个 Python 模块的链,每个模块 import 父模块再施加一处改动,活脱脱一个软件工程的继承链。

贡献 DAG 的拓扑结构

图 2:1703 个节点的贡献 DAG 拓扑。中心黑点是 commit-0(setup),周围的粉色密集簇是早期的大量尝试;橙色主链是从 setup 一路延伸到今日 SOTA(1.89899)的"脊柱";散布的绿色小点是外围贡献。可以清楚看到两个结构特征:一条狭窄脊柱聚集了绝大多数后续工作(标注 per-prefix log_softmax 的节点有 1374 个后代),以及大量短命的侧支迅速被放弃。左上角那条从"first attempt 4.68"爬升到"6-donor power-q1 first sub-1.91"的长链,就是社区前半程的主战场。

图结构统计也值得一看:1894 条边,149 个多父节点,98.9% 的节点在一个连通分量里。前 8 次改进贡献了总下降幅度的约 70%,前 18 个带分数的贡献占约 98%——剩下 1106 个贡献一共只再找到 0.03。典型的重尾分布。


⚠️ 那次关键的人类干预:把社区从 monoculture 里拽出来

全运行期间人类只出手干预了一次,这一段我觉得是全文最有信息量的部分。

事情是这样的:从 4 月 27 日到 5 月 1 日,社区陷进了一个局部最优——所有 worker 围着同一个 recipe 精修,每步改进幅度只有 10⁻⁵ bpb 量级,连续五天。5 月 2 日,分析视图显示超过三分之一的活动集中在单一语义 cluster,排行榜停滞。作者在这一天部署了语义聚类、多样性摘要和前面说的 diversity-aware UCB 三件套。

效果立竿见影:worker 立刻开始用新视图,次日早晨第一个 sub-1.90 的结果就发布了——出自一个选择跟随稀疏 state-space cluster 而不是继续扩展主导 cluster 的 worker。社区在一天之内走出了持续五天的 monoculture。

说实话,读到这里我的感受是复杂的。一方面这证明了多样性视图确实能改变集体行为;另一方面——作者自己也承认——这恰恰说明系统自己不会跳出来,得有人给它看一眼地图。论文原话很坦诚:这次运行没有解决因果问题,他们没有在"无 Agora"或"纯排行榜"条件下用同样的模型和算力跑对照。所以"共享研究状态能否提高单位算力的发现效率"这个最核心的问题,目前是悬而未决的。作者提出的下一步是一个四臂对照实验:隔离运行、扁平日志、中央规划器、Agora 全机制,用匹配的智能体、模型、算力和 wall-clock 预算,以整个社区运行为分析单元。这个实验如果真做出来,含金量会比这篇高得多。


🔬 平行重复与收敛:共享记忆没有消灭浪费

平行发现与收敛行为的统计

图 3:左图是"独立发现"的累积分布——696 对不同账户发布完全相同 val_bpb 的时间间隔(log 小时轴),63% 相差不到 1 小时,80% 不到 6 小时,说明即便有共享状态,agent 们仍在大量平行地重新发明同一个东西;右图是"Parent-SOTA 收敛"直方图——6 小时窗口内在同一个 parent SOTA 上工作的不同 agent 数量,峰值在 2 个(出现 10 次),最多 5 个,显示热点节点会吸引多个 worker 同时扎堆。

这张图是给"共享记忆万能论"泼冷水的。共享排行榜并没有阻止重复工作——696 对同分平行发现摆在那里。你想想看,这其实也合理:UCB 的 exploit 槽位天然把大家往同一个热点上引,而 agent 之间的决策又是异步的,看到同一个"最有前途的分支"同时下手几乎是必然。

我对这里的判断是:重复未必全是浪费。165 次独立复现无一失败这件事,某种意义上正是靠平行重复换来的鲁棒性。问题只在于重复的"度"——Agora 目前的机制能暴露重复(重复度惩罚项、聚类视图),但还不能主动消解它。


🤔 局限与我的判断

作者自己的局限清单列得相当诚实,我挑几条重要的,再加点我的看法。

评估器过拟合的风险是实打实的:每个组件都在同一个 200 篇文本的开发评估器上选出,论文明确说"该信任的数字是从 3.39 到约 1.90 的改进,而不是最后几位小数"。里程碑表里相邻的行是搜索的阶段,不是受控消融。1.899044 这个精确到小数点后六位的数,看看就好。

图结构的偏斜也值得警惕:狭窄脊柱加快死侧支,说明整个机制强偏向 exploitation。要不是 5 月 2 日那次人工部署多样性工具,社区可能就一直在那个盆地里精修到结束了。多样性机制是"被人按下去的",不是系统自发生长的——这个区别对"自主研究"的叙事很关键。

还有个小的地方我没完全想明白:wip 标签的设计是为了减少重复工作,但从 696 对平行发现来看,它显然没怎么起作用。论文没有深入分析 wip 的实际使用率,这块我觉得可以挖一挖。

整体定位上,这篇论文不是算法突破,是一个基础设施加社会学实验。它的贡献在三处:把"集体研究状态"形式化为 Git DAG 并给出可运行的系统;留下了一份 12 天、1703 条贡献、带完整验证谱系的高质量 trace(这本身对后续研究就是稀缺数据);以及足够诚实地标出了自己的因果缺口。跟同期那些宣称"AI 科学家全自动发论文"的工作比,这篇的克制反而让我更信任它。

工程上的启发也很直接:如果你在做多 agent 系统,Agora 的几个原语可以直接抄——跨账户信用分配(别人的下游才算分)、验证者不能验自己、exploit/explore 三槽位暴露权衡、一切状态从 append-only 日志派生。这些模式其实不挑场景,代码评审、数据标注、甚至内部的技术方案库都能用。

最后留一个论文没回答、我更关心的问题:当 worker 强到不需要那 5 天的 monoculture 就能自己跳出来时,共享记忆的价值还剩多少?是基础设施,还是脚手架?等那个四臂对照实验出来,我们可能就知道了。


觉得有启发的话,欢迎点赞、在看、转发。跟进最新AI前沿,关注我