# 43.8%对33%：Genie登顶SWE-bench，靠还原工程师的思考过程

> Cognitive Revolution No. 178 中文精读

- 原标题：Automating Software Engineering: Genie Tops SWE-Bench, w/ Alistair Pullen, from Latent.Space podcast
- 发布日期：2024-10-02
- 主持：Nathan Labenz
- 网页版：https://cogrev.1mmt.com/ep/178-automating-software-engineering-genie-tops-swe-bench-w-alist-mij1OI.html
- 精读字数：约 5709 字（阅读约 13 分钟）

> 本文为 cogrev.1mmt.com 基于原始访谈的 AI 改写中文精读，非官方翻译；引用请注明出处并链接网页版。

2024年9月底，伦敦创业公司Cosine的CEO Alistair Pullen在一架飞往旧金山的航班上，用飞机WiFi按下了发布键。他发布的AI软件工程师Genie，在软件工程基准SWE-bench上拿到30%的解决率，是当时的最高纪录。几天后他又给出第二个数字：在OpenAI人工校验过的SWE-bench Verified上，Genie做对500道题里的219道，得分43.8%，同期GPT-4o是33%。

顺带一提，他这次旧金山之行只待两天。他自己的建议是：别学我，别从伦敦飞旧金山只待两天。

这期节目是Cognitive Revolution从Latent Space播客串台来的内容，原对话发生在Latent Space两位主持人Swyx和Alessio与Alistair之间，Swyx还是Cosine的天使投资人。Nathan Labenz在开场把推荐理由说得很直白：Cosine做的事，就是他那套AI自动化方法论的极限版本。**把复杂工作拆成AI能处理的小块，人工筛出黄金样本，用合成数据补齐推理链，高强度微调，最后把所有环节串成一个agent。**区别只在于Cosine预算更大、野心更足，而且真把行业最难的问题之一刷到了第一。

## 从外卖App到YC：两个手机开发者的转型

Alistair的起点很普通。埃克塞特大学计算机系毕业，他和联合创始人Sam一个写iOS一个写Android，在校时接外包项目，毕业后赶上疫情，俩人就在卧室里继续接活。后来一位同学拉他进了一家YC孵化的生鲜快送创业公司Fancy，他搬去伦敦，又把Sam拉进来。两个人包办了这家公司全部工程：客户端App、后端、库存系统、司机调度算法。18个月后，公司被GoPuff收购。

2022年，期权兑现完，两人决定自己干。Sam在Reddit上看到GPT-3，Alistair回家打开playground，第一件事是问它能不能写JSON。能写。俩人立刻去试作为手机开发者最想试的事：让AI从零写一个App。他们用4000 token的上下文窗口搭了一套链式prompt系统，先定技术栈，再逐层细化需求，最后让codex模型写每个模块。系统脆弱得要命，但偶尔真能跑出一个前后端齐全、能启动的东西。他们把demo拿给后来当COO的联合创始人Yang看，Yang的反应是："你们这是发现了火。"

三个人申请YC。面试又短又狠，面试官直说讨厌这个想法，觉得做不成。Alistair把那场面试当成免费咨询，当场转向：从零写App太远，那就先帮开发者处理已有的代码库。YC说行，两周交MVP。做出来的第一个产品是个很糟的命令行工具，之后转型做代码库语义检索。为了不把代码传上云，他们试着在本地跑语义搜索，几百万行的仓库，HNSW索引在VS Code里直接把内存吃光。公司当时叫Build It，麻烦在于没人会念，YC第一次聚会所有人都念成"build build build"，后来改名Cosine。

回头看，他自己总结得很清楚：**他们从第一天就想做"让AI替自己干活"，只是技术没到，就先把技术到位后必需的零件提前造好，检索是最重要的一个。**等模型追上来，零件插上就能用。后来发生的事，基本就是这个剧本。

## 核心洞察：模型读的是PR，缺的是"为什么"

Genie发布视频里，Alistair管它叫"世界首个AI软件工程同事"，重点全在训练数据上。他的核心判断是：**写代码的模型和做软件工程的模型，是两回事。**

打个比方，一个PR是大量思考和讨论被压缩后的最终产物。预训练模型读到的是这些最终diff，它学会了模仿结果，但PR本身信息损耗极大，为什么改、怎么想到的，基本都丢了。所以纯靠代码语料预训练的模型，在HumanEval这种"写个函数"的测试上能拿高分，到了SWE-bench这种真实仓库任务上就不行，因为它没有还原"人是怎么解决这个问题的"。

Cosine把全部精力押在这里：用一套他们称为derivation pipeline的流程，尽可能法医式地还原历史上每个改动背后的思考过程，再把推理链做成训练数据。Alistair的原话是，输出格式、diff怎么写这些都是外围，决定基准成绩的核心只有一件事：

> 问题是怎么被人解决的，以及我们能不能最好地还原人是怎么解决这些问题的。

原始数据有多脏，有个插曲可以作证。他们最早用GPT-3.5的16k版本直接灌数据，没做任何清洗，结果发现开源数据里最大的一块是更新README和文档。第一版模型别的不会，特别擅长更新README、写注释，还会在PR评论里跟人吵架，你给它反馈，它顶回一句"我觉得你不对"。从那天起他们明白，数据清洗和对齐的工作量远超预期。

## 数据流水线：故意把代码写坏，再教模型改对

这里有个反直觉的点。人类公开发布的代码，绝大多数是能跑的状态，模型见多了就只会"一枪命中"，没见过迭代，自然不会迭代。真实工程里，第一次就写对的情况很少。

Cosine的解法分两步。第一步，合成运行时错误：故意篡改AST，制造数组越界、引用不存在的变量这类基础模型本来就会犯的错，按一定概率混进训练数据。第二步，自我改进循环：第一批数据是完美样本，题目加答案，直接训；生成第二批时，让上一版模型先试着解题，预期它会做错，然后拿错误状态和正确状态做diff，把"从错误状态改到正确状态"的过程做成新数据喂回去。如此往复，模型学会了迭代，也学会了从错误里推理下一步该改什么。

数据集做到多大？Alistair的回答很实在：预算能撑多大就多大，他们是按每月烧钱额的多少倍来决定花多少的。即便如此，灌进模型的token以十亿计，而常规微调数据集的量级是百万。这也是OpenAI微调团队对他们产生兴趣的起点，团队负责人John Allard公开为他们背书，说Cosine在推动微调的能力边界。

技术细节也有意思。OpenAI的自服务微调要动态决定LoRA适配器的大小：太小配大数据没信号，太大配小数据学不到东西。Cosine因为数据量巨大，用上了比公开版本更大的适配器，随之要重调学习率调度等一串参数。Alistair说，他们现在的数据集只是"目前买得起的最低配置"，接下来六到十二个月要摸清的是数据的scaling law长什么样，瓶颈到底在模型还是在适配器。

## 四步循环：检索、规划、写码、测试里的硬细节

Genie的工作流分四步：找文件、规划、写代码、跑测试。每一步都有值得记的东西。

先说检索，这是他们眼中最肥的性能洼地。代码语义检索是个出了名的坑，他们的老说法是：要搜代码在做什么，别搜代码长什么样。最直觉的方案，把代码库切块、嵌入、算余弦相似度，实测效果很差，代码的形态和自然语言差太远。他们第一个有效的方案，是训一个模型把英文查询先转成一段"假想的答案代码"，再拿这段代码的嵌入去搜，仅这一步就把检索准确率拉上去一大截。到了Genie，他们换了思路：**不搭检索引擎，让模型在自博弈生成的数据里学会开发者找代码的方式。**从文件系统入手，挑候选文件，判断是不是目标，看到可疑的import就点进去，go to definition、go to references，沿着调用图一步步逼近。和人类开发者在陌生代码库里的动作一模一样。

目前的检索准确率是66%左右，口径是：完成任务所需的代码行，模型找到了约66%。一个关键动作是给模型接上语言服务器，让它真正用上go to definition，仅此一项把检索从54%拉到60%出头。Alistair的类比：LSP坏掉的编辑器，就像突然被缴了械，你意识不到自己平时多依赖它。

规划环节，他的判断是：让基础模型"一步一步想"远远不够，这类推理被模型本身的智力封了顶，否则它们不会在SWE-bench上离SOTA那么远。Cosine要的是让推理过程模仿工程师解题的思路。他还有一个清晰的杠杆：**更强的推理模型每发布一次，他重新生成一遍数据，信号就更强，再训一版模型，就完成一次跳级。**新模型对他来说是白捡的性能。另外Genie计划做到一切可编辑，包括它写的代码，patch里有个小错你手动改掉，它接着干。

写代码是模型最舒服的环节。他们对log probs做了分析，把上下文窗口里每个位置的token平均概率画出来，结论是模型写代码时的置信度远高于循环里的其他环节。训练方式上有个差异：多数模型改代码会重写整段，Genie被训练成直接写diff和patch，省token，而且patch本来就是人类工作的最终产物。Alistair猜这会让模型动用预训练里不同的"脑区"，他没有证据，但概率曲线支持这个判断。

然后是那条重要的曲线。**Genie的解题概率随上下文长度线性衰减，60k token是分水岭，超过60k，失败概率就大于成功概率。**哪怕训练数据里有在11万token处成功解题的样本，实际推理时模型在长上下文尾部就是不行。Alistair把这归因于基础模型的注意力机制，并把这份分析讲给了OpenAI微调团队。他们据此做的优化很朴素：不动结构，想办法让关键内容尽量落在60k以内的甜区。

跑测试这步，他们刻意做轻。Genie不负责搭建代码库环境，它架在GitHub上，直接调用你的CI，跑完通过Checks API把结果拉进上下文。理由是绝大多数企业本来就有CI流水线，让模型从零搭环境属于额外风险。交互上有两种模式：全自动模式，在Linear里派个工单它就直接干；网页端模式，任务太模糊它会先反问澄清，因为他们判断，从第一天就理解错方向然后搞砸，比多问一句让人烦得多。上线后你可以像审真人PR一样留评论，它接着改。Alistair还补了一句，它回应评审的态度比真人同事好，因为训练数据里那些敷衍的"LGTM"和不服气的抬杠，都被过滤掉了。

## 榜单风波，以及几个反直觉判断

榜单这事始于Devin。今年3月Devin发布并宣布自己是SOTA，Alistair把它当成挑战书，用他的话说，友谊、睡眠、体重全搭了进去，换来一个可以客观衡量的标尺，在此之前评估Genie只能靠"感觉一下好不好用"。

Genie的成绩目前没挂上SWE-bench官方排行榜，原因值得展开。SWE-bench在提交规则里新加了要求：必须附上模型轨迹，也就是推理过程，相当于数学考试要写解题步骤。Cosine的patch是公开的，任何人可以去他们的GitHub仓库复现数字。轨迹他们拒绝交。理由很商业：**模型输出是训练数据的镜像，把轨迹交出去，等于把整套方法论拱手让人，对方拿一个强基座模型做蒸馏，Genie就被白嫖了。**作为闭源公司，这是他必须做的取舍。

基准本身也在演进。原版SWE-bench有2294道题，Swyx估计跑一遍要8000美元，Alistair说他们自己的成本不方便公开，反正比这高，而且迭代起来太慢。此前的SWE-bench Lite偏简单，衡量不了整体水平。他们本来计划自己做一套300题的"SWE-bench small"，按难度分布抽样，结果OpenAI用人工标注抢先做了，就是500题的Verified。Alistair对此很满意：题目确认可解，跑起来便宜，迭代快。他还打算再进一步，SWE-bench只有通过和不通过两种结果，信息太稀疏，他们想测出模型在哪一步开始跑偏，就像数学卷子能看出你最后一行才错。

节目里还有几个和主流认知相左的判断。第一，浏览器没那么重要。Genie也带URL阅读和Perplexity API查询工具，但Alistair认为，读文档和Stack Overflow是锦上添花，把对的文件找出来才是根本。第二，超长上下文不是万能药。被问到如果有1000万token窗口会不会换路线，他说不会，Cosine的方法对基座模型中立，哪个最强就上哪个，等Gemini 1.5开放微调，Genie当天就能迁过去。第三，做难的事。他拿Cursor举例：从VS Code插件改成fork VS Code，当时几乎没人看好，事后看这是Cursor赢的关键。他自己总结的创业教训就一句：**不管你多小、资源多少，去做难的事，回报最大。**

商业化部分有个亮点：客户定制模型。Cosine内部有一个叫John的Genie版本，用员工名字命名，做法是把跑公开数据的同一条流水线，原样跑在Cosine自己的代码库上，得到一个既懂软件工程、又对自家仓库极其熟练的同事。Alistair说这个体验好到惊人。至于企业愿不愿意交出历史代码，他接触下来的观察是态度反而在软化，因为企业算得清账：如果这东西真能让团队提速，收益大于信息安全风险。理想客户画像也明确：技术栈以TypeScript、JavaScript、Python、Java为主，因为训练数据里JavaScript加TypeScript加TSX占了将近一半，Python占21%，总共覆盖15种语言。

对了，发布视频的初剪版，开场是Alistair模仿特朗普说"Cosine是世界上最了不起的AI实验室"。朋友们劝他删了，理由是没人知道你是谁。

## 明天就能用上的三件事

这期节目最有价值的部分，是把"微调一个领域agent"的全流程摊开了。哪怕不做编程产品，下面几条明天就能套用。

- **先造零件，再等风来。**Cosine在模型只有4k上下文时就开始做检索工具，等128k模型出现，零件插上就用。你今天就可以把业务流程里模型暂时做不好的环节，先做成独立的工具和数据管线。
- **训练数据要还原过程，别只喂结果。**只喂最终产物的模型学不会迭代。把人解决问题的中间步骤、错误和修正过程记下来，这些推理链才是微调里最值钱的部分。合成错误、让模型试错再教它改，是已被验证的做法。
- **用eval和log probs驱动迭代，别凭感觉。**SWE-bench给了Cosine一把客观标尺，log probs分析让他们发现60k悬崖并做出针对性优化。先给你的业务定一个可量化的评测集，再盯着模型的置信度曲线找性能洼地。

Nathan Labenz在开场说的那句话，可以当整期节目的注脚：如果Cosine用这套方法能在SWE-bench上刷新纪录，就没有理由怀疑你能在自己的业务里做同样的事。前提只有一个，肯下功夫把活干了。
