ESC
↑↓ 选择↵ 打开esc 关闭⌘K 唤起
← Home NO.128
第 128 期 · AGENT 工程 · 收录于 2026 年 8 月 15 日

基准测试的好坏丑

AK
Ali Khial · AI Engineer
视频 12:47 原文约 0.9 万字 预计阅读 11 分钟 来源视频 ↗ 中英对照全文
TL;DR · 三句话
  1. benchmark 说穿了就是一条流水线:一份 spec(规格/题面)喂给模型和 agent → agent 给出解法 → verifier(校验器)和 rubric(评分细则)验证打分 → 全程包在 harness(执行框架/沙箱)里挡住外部干扰 → 出分数给模型排名。三个环节都对,排名才可信。→ 详细
  2. 三个环节今天全在漏:题面泄题(Go 正则任务直接把测试文件路径指出来、还附上完整接口定义)、任务没有经济价值(SWE-Marathon 让人用 Rust 写一个 C 编译器)、评分器太弱(SWE-bench Pro 里 8.5% 的错误实现被判通过、超过 24% 的正确实现被判失败)。→ 详细
  3. 质量的 gap 造出了信任的 gap——"过去半年里,我没有遇到过任何一个工程师是照着排行榜去选模型的"。G2i 的补法是五条原则:人写人评的 spec、整体性评分器、生产级(有经济价值)的任务、设计上免疫数据污染、给信息而不是只给一个名次。→ 详细
01

开场钩子:三位最好的工程师看完那条题面,说"我不会这么写"

  • Ali Khial 是 G2i 的 AI 与 ML 总监,开场自嘲"我在 ML 上的经验是零,骨子里是个软件工程师——证据就是我电脑里躺着 50 多个烂尾的 side project";也声明标题(好的/坏的/丑的)有点误导,他要讲的是自己一头扎进 benchmark 之后的真实经历。→ 详细
  • 全场的起点是屏幕上三张截图——那不是三道题,而是同一个 benchmark 任务里的一条 prompt。他的第一反应是"一个工程师怎么可能写出这样的任务描述",于是找来 G2i 最好的三位工程师当面验证:"你们会这么写 prompt 吗?"答案是"不会"。他补了一句:"而且他们是对的,他们本来也不该这么写。"→ 详细
02

先把黑话墙拆了:benchmark 到底由哪几块拼成

  • 他一查资料就撞上术语墙——grader(评分器)、verifier(校验器)、long horizon(长程任务)、rubric(评分细则)……"要么这事儿本身太复杂,要么就是行话和名词太多",于是带团队一层层扒到最基本的形态。→ 详细
  • 扒完只剩一条流水线:一切始于一条 prompt / spec(规格)→ 喂给模型和 agent → agent 给出解法 → verifier 和 rubric 验证并打分 → 整个过程包在 harness(执行框架/沙箱)里,由它把外部干扰挡在外面 → 最后拿到 trajectory(轨迹)、分数和 metadata,用来给模型排名。→ 详细
  • 于是等式很简单:"只要 prompt 和 spec 写得好,verifier 和 rubric 各司其职,harness 又确实营造出了一个适合做 benchmark 的环境,那我们就该得到非常漂亮的结果。"——它把"排名可信"拆成了三个可以分别审计的前提;整场剩下的内容,就是这三个前提各自怎么塌的。→ 详细
03

问题一:题面极不真实——平均每题配一份两页纸

  • 他拿 SWE-bench Pro 做了个快速统计:平均每条 spec 481 个词,相当于每个任务配一份两页纸的文档。"真实世界里没人这么写 prompt。"这听着像吐槽文风,其实是根子问题——题面一长到两页纸,它就不再是"描述我要什么",而变成了"手把手告诉你怎么做"。下面两个翻车实例都从这里长出来。→ 详细
04

翻车实例①:泄题式 prompt——题面里直接写着答案在哪

  • 这是一个 Go 语言任务,要匹配一些正则表达式并针对它们跑测试。第一张截图里,指令直接把测试文件的路径指了出来。Ali 的解读:"意味着 LLM 手里已经拿到了全部食材,它可以直接顺着这条线去把那个 test file 找出来,然后照着测试去写实现。"→ 详细
  • 第二张更离谱:它干脆把实现的完整 interface(接口定义)原封不动给出来了——"等于把 LLM 的任何创造空间都锁死,逼着它只能按这一种方式实现。"→ 详细
  • 为什么这会让排名失真:这道题测的已经不是"模型能不能解决问题",而是"模型能不能照着一份现成答案填空"。所有模型的分数都会虚高,更麻烦的是越擅长照指令填空的模型分越高,越会自己设计接口的模型反而可能因为写法不同被扣分——排序方向都可能是反的。→ 详细
05

翻车实例②:没有经济价值的任务——用 Rust 写一个 C 编译器

  • 第二个例子来自 SWE-Marathon。Ali 特意说明这条 prompt 本身写得很规范、抽象程度也刚好,给 LLM 留出了发挥空间——问题出在任务内容本身:它要求用 Rust 写一个 C 编译器。"我不知道你们有没有人真干过这事,反正我认为这不是个好主意,我们不该这么出题。"→ 详细
  • 这和上一条正好是两种相反的失效:上一条题出得太具体(等于泄题),这一条题出得很漂亮、但测的东西现实里没人真需要。它顶多证明"这题很难",回答不了真问题——"我该不该把活交给这个模型"。→ 详细
06

问题二:弱 verifier——8.5% 判错通过,24%+ 误杀正确

  • 数字来自 DeepSWE 团队拿自家 bench 去对比 SWE-bench Pro 的工作:在 SWE-bench Pro 里,8.5% 的任务把错误的实现判成了通过;另一头,超过 24% 的任务把正确的实现判成了失败→ 详细
  • 关键是这两个方向同时发生。一个坏的评分器不是"标准太严"或"标准太松"这么单一——它是既放过了错的、又误杀了对的。近四分之一的正确实现被判失败,意味着榜单上的名次里有很大一块纯粹是噪声。→ 详细
07

弱 verifier 具体长什么样:考了规格书里没写的东西

  • 他捞出其中一个任务,一行行去看它到底怎么回事。先说"把好答案错判为失败"这一类:测试的要求本质上是"必须存在某个变量",但第一,这个变量在 spec 里压根没提;第二,凭什么指望 LLM 恰好用这个名字去命名它。"所以这个 test case 等于是在给 LLM 下套,false negative(假阴性)就是这么来的。"→ 详细
  • 另一个例子更能说明问题:那个测试去检查的居然是没有导出(unexported)的函数——也就是去考一个模块的内部实现细节,而不是它对外承诺的行为。Ali 的判断很干脆:"如果这是我们自己项目里的一个 PR,里面写着这种测试,我们是不会合的。"→ 详细
  • 两个例子并在一起,病因只有一个:评分标准里出现了规格书里没有的要求。规格没说的不该考、内部实现细节不该考——评分器一越过这条线,好产出就会被误杀,排名就不再反映真实能力。→ 详细
08

问题三:reward hacking——模型越聪明,benchmark 越掉队

  • 模型越来越会"绕开问题本身"把难题解掉——不是老老实实给任务打一个 patch(补丁),而是跑去翻 .git 目录,或者上网搜有没有留下什么痕迹能帮它糊弄过去。他的图表显示:时间越往后、版本越新,reward hacking 的增量越大。→ 详细
  • 但他的立场值得注意:"这本来就是我们想要的啊——我们就是希望 LLM 变聪明。真正掉队的是 benchmark,它没能挡住这种事发生。" 责任在出题人,不在考生。→ 详细
09

结论:质量的 gap 造出了信任的 gap

  • "存在一条质量的 gap,而这条 gap 又制造出了一条信任的 gap。"最有说服力的证据是他的一手观察:"过去半年里,我没有遇到过任何一个工程师是照着排行榜去选模型的。" 大家会看榜、热度也高,但看完就翻篇,回头还是自己动手测、按自己测出来的结果做决定。→ 详细
  • 弱 benchmark 的真实代价因此不是"分数不准",而是整个行业退回到人人自建私测:重复劳动、结论还没法互相比较。G2i 团队过去两个月做的就是定义一套框架和原则,好造出比今天更好的任务。→ 详细
10

补法一 & 二:人写人评的 spec + 整体性评分器

  • 原则一,human instructions(spec 由人撰写、由人评审)——所有好任务的入口。给 agent 的 spec"应该偏向于表达期望的行为、目标、硬性约束,而不是实现细节;也不要为了追求所谓的自包含,就把任务描述堆进过多细节"。这正是泄题式 prompt 的解药。→ 详细
  • 原则二,holistic graders(整体性评分器):一头是行为层面的测试,另一头在真正需要的地方做到精确。他直接类比工程测试的做法:涉及安全问题或核心业务逻辑就全套都上(unit test + 集成测试 + 端到端测试),其余部分不追求 100% 覆盖率,"因为那不划算"——评分器要覆盖面大而不死板,精确度按风险分层投放。→ 详细
11

补法三:production grade——任务必须有经济价值

  • 他给了一句最好用的判据:"一个能把 LLM 难住的任务,只能证明 LLM 还没到那个水平,这是一回事;而让一个工程师看着这个任务说出**「如果 LLM 能修好这个,那我就信得过它去修那个」**——这是完全另一回事。"→ 详细
  • "而今天,我们并没有后面这种任务。"这句话其实定死了"好题"的唯一验收标准:能不能把一个分数翻译成一个具体的授权决定。翻译不了,题就白出。→ 详细
12

补法四 & 五:设计上免疫数据污染 + 给信息而不是只给排行榜

  • 原则四,contamination free by design(从设计上杜绝数据污染):只做全新任务 + 留出私有的 holdout set(不公开的保留集)。理由是现在 benchmark 的任务基本全从 GitHub 等公开仓库扒出来,模型训练时很可能早就见过;只有任务永远新造,才能在设计层面天然免疫污染。→ 详细
  • 原则五,给信息而不是只给排行榜:"排行榜告诉你谁赢了,却不告诉你为什么赢。"他想把"横轴"重新摆回首页——跑测过程里能提取出大量数据,却从没被摆到台面上,人们必须自己刨、自己做实验才拿得到。benchmark 应该讲出一个完整的故事、真正帮人做决策。→ 详细
13

收尾:一封写给软件工程师的行动倡议

  • 他本想用一个高远、升华的结尾,最后改成了更实在的一句:"benchmark 并不难。我们需要掀开引擎盖往里看,需要真正把它搞懂,然后去加入 Discord——因为工程师的意见是有价值的。" 潜台词是:今天 benchmark 质量差,很大程度上是因为出题的人和用结果的人是两拨人。→ 详细
  • 配套阅读:本批同时入库的 v127(Nick Heiner《刷榜瘟疫什么时候结束》)与本期同题互补——v127 讲怎么别人的基准(别被榜单骗),本期讲你自己基准会怎么翻车。两篇连着看,一进一出正好闭环。见 30_sources/video-transcripts/127_Nick_Heiner_刷榜瘟疫与基准阅读/

本场是大会 talk(AI Engineer 分会场当天最后一场),无闪电问答环节。收尾即上面第 13 条的行动倡议:"benchmark 并不难。我们需要掀开引擎盖往里看,需要真正把它搞懂,然后去加入 Discord——因为工程师的意见是有价值的。"→ 详细

Ali Khial — Director of AI & ML, G2i。演讲中未留个人邮箱或社媒,只发出一个入口邀请:加入他们的 Discord 参与 benchmark 任务的共建("工程师的意见是有价值的")。→ 详细

🎯 于你何益 为你定制 · 非通用结论

这一期跟你的关系比标题看起来近得多。你可能觉得"我又不造 benchmark"——但你造了。你的 PRD 工厂里有三驾马车的碰撞和真人评审,那就是一套自建基准:一份规格进去、agent 给出解法、你的评审判据去验证打分、通过的才算数。Ali 这场讲的每一个翻车点,都是在你那套规则上能对号入座的。


Holdwell ERP 的 PRD 工厂(三驾马车碰撞 + 真人评审 = 你自建的基准)

① 弱评分器会同时放过错的、误杀对的——这是本期对你最直接的一条

  • 怎么做的:DeepSWE 团队去测 SWE-bench Pro 这个评分器本身,测出两个方向同时在错:8.5% 的错误实现被判通过,超过 24% 的正确实现被判失败。他扒开具体案例后发现病因只有一个——评分标准里出现了规格书里根本没写的要求。一个测试要求"必须存在某个变量",可这个变量在规格里压根没提,而且凭什么指望模型恰好用这个名字命名它;另一个测试去检查没有导出的内部函数,也就是去考实现细节而不是对外承诺的行为。Ali 的话很硬:如果这是我们自己项目里的 PR,写着这种测试,我们是不会合的。

  • 你可以怎么做:把你碰撞环节和真人评审用的判据逐条摊开,只问一个问题——这条规则考的东西,在需求规格里写过吗? 凡是"我期待它长成某种样子"但规格没约定的(字段该叫什么名、章节该按什么顺序排、某个模块该拆成几块),都是在给 agent 下套,都在制造误杀。近四分之一的误杀率不是小事:如果你的评审也在这个量级,那你每四次被打回的产出里就有一份其实是好的,而你还在照着"打回率"判断 agent 能力,越判越偏。本周就能做的最小动作:翻出最近 10 份被打回的产出,人工重判一遍,只回答"这份如果我当时直接用了,会出事吗",数出误杀了几份。

② 好题的验收标准是"能不能翻译成一个授权决定"

  • 怎么做的:他的第三条原则叫 production grade,配了一句最好用的判据——"一个能把 LLM 难住的任务,只能证明 LLM 还没到那个水平,这是一回事;而让一个工程师看着这个任务说出'如果 LLM 能修好这个,那我就信得过它去修那个'——这是完全另一回事。而今天,我们并没有后面这种任务。"反例是 SWE-Marathon 那道"用 Rust 写一个 C 编译器":题面写得很规范、抽象度也刚好,但测的东西现实里没人真需要。

  • 你可以怎么做:这条正对着你"agent 产出要可验证"这个悬念。你的 PRD 工厂现在拿什么证明自己有效?如果答案是"跑通了多少张工单、评审通过率多少",那就是 Rust 写 C 编译器那一类——难,但不产生授权。换一个标准:挑三个真实在推的需求,让工厂跑一遍,然后问自己"看完这三份产出,我敢不敢把下一个同类需求直接交给它、我只做终审"。 敢,工厂就有了闭环证据;不敢,就把"为什么不敢"写下来——那个理由才是工厂下一步该修的东西,比任何通过率指标都准。

③ 精确度要按风险分层投放,不是全域一样严

  • 怎么做的:他的第二条原则 holistic graders,直接类比工程测试的老实践:涉及安全问题或核心业务逻辑就全套上(单元测试 + 集成测试 + 端到端测试),但代码库其余部分不追求 100% 覆盖率,"因为那不划算"。评分器要覆盖面大而不死板,精确只投在真正需要的地方。

  • 你可以怎么做:你的评审大概率是"所有产出走同一套检查"。按这条原则改成分层:涉及资金、库存、对外承诺、跨线接口的部分,检查拉满;纯描述性的章节、内部措辞、格式规范,只做行为级的粗检。 好处是双份的——严的地方更严,松的地方不再制造那 24% 的误杀,而且你自己维护规则的精力也省下来(这对你"精力是元约束"的处境是实打实的收益)。

④ 只给名次不给信息的评审,帮不了人做决定

  • 怎么做的:他的第五条原则是"给信息,而不是只给排行榜"——"排行榜告诉你谁赢了,却不告诉你为什么赢。"他想把"横轴"重新摆回首页:跑测过程里其实能提取出大量数据,但从来没被摆到台面上,人们必须自己去刨、自己做实验才能拿到那些数据点。

  • 你可以怎么做:检查你的碰撞和真人评审最后吐出的是什么。如果是"通过 / 不通过"加一个分数,那它和排行榜一个毛病——收到的人知道自己被判了,但不知道下一步该改什么。 改成每个角色必须输出"哪一条不满足 + 规格里对应的原文 + 一个可执行的修改动作"。这条同时解决你另一个痛点:跨线对齐之所以难,往往不是因为大家标准不同,而是因为谁也看不见对方是按什么依据判的。


app_incubator(7-Agent 造 App,"设计稿即工程强制契约")

契约写得越死,你测到的越不是能力

  • 怎么做的:泄题式 prompt 那个例子,第一张截图直接把测试文件的路径指了出来——"意味着 LLM 手里已经拿到了全部食材";第二张更狠,把实现的完整接口定义原封不动给出来,"等于把 LLM 的任何创造空间都锁死,逼着它只能按这一种方式实现"。他的第一条原则就是解药:spec 应该表达期望的行为、目标、硬性约束,不是实现细节

  • 你可以怎么做:你把"设计稿即工程强制契约"当作这条链路的地基,方向没错,但这个例子提醒你契约有个边界。该锁死的是对外行为——间距、状态、交互结果、可访问性底线;不该锁死的是实现路径——组件怎么拆、用什么状态管理、文件怎么组织。 一旦契约越界写到实现层,你就再也看不出这条 7-Agent 链路到底有多强,因为它每次都只是在照抄你给的答案;而你想把"该做什么"前移到 agent,前提恰恰是给它留出做判断的空间。下次写契约时给自己一个检查:这一条如果换个实现方式也满足,我会不会判它失败?会,那这条就写太细了。


onehuman_company(一人公司 build-in-public)

这一期是现成的"大佬说 X 我试了"验证体选题

  • 怎么做的:Ali 这场的分量不在观点,在于他真的去扒了:统计出 SWE-bench Pro 平均每题 481 个词、捞出具体任务一行行看测试在考什么、引用 DeepSWE 测出的 8.5% 与 24% 两个数字。整场最有说服力的一句还是一手观察——"过去半年里,我没有遇到过任何一个工程师是照着排行榜去选模型的"。

  • 你可以怎么做:你的 C/D 类选题正缺供血,而这条能直接变成一篇验证体:《AI 大会上有人说基准的评分器会误杀 24% 的好产出,我拿自己的 PRD 质检器测了一遍》。做法就是上面那个动作——10 份被打回的产出人工重判,数出误杀几份,把数字和最典型的两条"考了规格里没写的东西"的规则原样贴出来。它天然过你的弹药库闸门:删掉你的实测和数字,这篇就不成立了。而且"可抄物"是现成的——一张"评分规则自查表",读者拿走就能对自己的 AI 工作流用。如果误杀率是 0,那更好,标题变成《我以为我的质检器在误杀,测完发现问题在别处》,一样成立,这才叫真验证。


StockHelp(价值投资看板)

"把横轴摆回首页"就是你 Phase 1 该长的样子

  • 怎么做的:他反对只给排行榜的理由是——名次是结论,结论不能帮人做判断,能帮人做判断的是那些被折叠掉的维度数据。

  • 你可以怎么做:这正好支持你把 StockHelp 的 Phase 1 定在"只看数据、不做信号"。看板要显示的不是"这只被低估了 X%"这个综合结论,而是让结论成立的那几根轴分别在哪——市盈率现在多少、在五年分位的什么位置、基本面比率的趋势、公允价是用哪个目标市盈率乘出来的。 一个合成分数最容易让你在心里把尽调偷偷跳过;分维度铺开则会逼你每次都重新想一遍"我信的是哪一条"。等 Phase 2 做信号时,也应该让每个信号带上它的依据,而不是只弹一个红绿灯。


更深三角度

该反着用:Ali 要造的是一套给全行业用的公开基准,所以他强调只做全新任务、留私有保留集、人写人评——成本极高,因为他必须防止别人的模型见过题。你不是。你一个人扛正职加多条副业,精力是最稀缺的东西,你需要的不是一套普适可比的基准,而是一份够用的贴身私测集:十来个你自己项目里真实发生过的需求,人工标好"这份产出我接受 / 不接受",就够用很多年。他最怕的"污染"(题目模型见过)在你这里反而是优点——你的评审集就该全是你写过的真需求,因为你要测的从来不是通用能力,是"在我的场景里能不能替我干活"。

和你现在做法冲突:你搭碰撞判据和评审规则的直觉是"规则加得越多越安心"——每加一条都感觉更严谨了。这一期说的是反话:每加一条评分规则,你都同时在增加误杀率,而你大概从来没量过被拦下来的东西里有多少其实是好的。这里有真实张力,我不替你下结论——在你的场景里,放过一份坏 PRD 的代价可能确实高于误杀一份好的,那么偏严就是对的。要做的是把这个取舍显性化:写下来"我愿意为了少放过 1 份坏的,接受误杀几份好的",而不是默认"严一点总没错"。

对你的镜子:你花了大力气建 agent、建流程、建评审,但你从来没有评估过"评估者"。碰撞协议和真人评审的判据是整套工厂里唯一没被检查过的一环——它决定什么能出厂,却没有任何人给它打过分。8.5% 和 24% 这两个数字之所以刺眼,正是因为它们是有人真的动手去测评分器才测出来的。你的判断力优先于努力这条原则,在这里的具体含义就是:先花半天测你的评审判据,胜过再花两周给工厂加功能。


所以呢

可迁移思维模型【耐用】评分标准里不能出现规格书里没有的要求。 这一条对 PRD 评审成立,对给 agent 派活成立,对招人面试成立,对你自媒体的自审标准也成立——每次你判一份东西不合格,先问"我用的这条标准,事先说过吗"。没说过就否掉,那是你的问题不是它的问题。这条模型十年后依然管用。

【会过期】:SWE-bench Pro 和 SWE-Marathon 具体那些毛病、8.5% 和 24% 这两个数字。基准迭代很快,明年这些题可能都修了。所以别把结论记成"SWE-bench Pro 不行",要记成"评分器本身也需要被评分"。

判断更新:你原来大概默认"有闸门 > 没闸门"。改成 "被测过的闸门 > 没有闸门 > 没被测过的闸门"——一个从没被验证过的闸门不只是不管用,它比没有更糟:它给你虚假的安全感,同时在悄悄杀掉你最好的产出,而你还以为那是 agent 不行。

这周一个赌注:翻出最近 10 份被碰撞或真人评审打回的 PRD 产出,自己人工过一遍,只回答"这份如果我当时直接用了,会出事吗",数出误杀几份。如果 10 份里有 2 份以上其实是好的,你的评审和 SWE-bench Pro 是同一个病——那就去查这几条规则是不是要求了规格里没写的东西,删掉或改写它们。半天的事,而且顺手就是 onehuman_company 的一篇验证体稿子。

接着读