<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Agent Evaluation on 扎塔-Zata</title><link>https://www.zata.cc/tags/agent-evaluation/</link><description>Recent content in Agent Evaluation on 扎塔-Zata</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>Example Person</copyright><lastBuildDate>Sun, 04 Oct 2026 15:46:13 +0800</lastBuildDate><atom:link href="https://www.zata.cc/tags/agent-evaluation/index.xml" rel="self" type="application/rss+xml"/><item><title>Coding Agent 评测体系：公开基准怎么读，自己那套怎么搭</title><link>https://www.zata.cc/p/coding-agent-eval-system/</link><pubDate>Sun, 04 Oct 2026 15:00:00 +0800</pubDate><guid>https://www.zata.cc/p/coding-agent-eval-system/</guid><description>&lt;img src="https://www.zata.cc/p/coding-agent-eval-system/images/index/index.svg" alt="Featured image of post Coding Agent 评测体系：公开基准怎么读，自己那套怎么搭" />&lt;p>2026 年关于 coding agent 最矛盾的一幕是这样的：一边，SWE-bench Verified 的榜单前列挤在 80%~95%，六个模型差 0.6 分；另一边，OpenAI 公开宣布&lt;strong>不再报告这个分数&lt;/strong>，理由是它已经不能反映真实的软件开发能力。&lt;/p>
&lt;p>同一个数字，被一半人当成选型依据，被另一半人当成废纸。这不是立场之争，而是测量问题——&lt;strong>agent 的评测和模型的评测是两件事，而我们一直用后者的习惯去读前者&lt;/strong>。&lt;/p>
&lt;p>静态基准测的是「模型输出了什么」：给一道题，看答案。agent 基准测的是「一个系统在环境里做了什么」：它有 shell、能装依赖、会读报错、会重试、会超时、会 OOM。运行时的每一行配置都参与了答题。这就引出一个反直觉的结论：&lt;strong>在 agent 评测里，你换掉的东西往往比你测的东西影响更大&lt;/strong>。&lt;/p>
&lt;p>这篇文章按这个顺序写：先说清楚分数到底是谁的（模型、脚手架还是系统），再铺一张公开基准的地图（按「它测的是哪根轴」分类），然后拆开四类让分数失真的来源，接着给出一套读分数的四问协议，最后落到实操——如果你要在自己的仓库上建一套评测，任务集从哪来、指标怎么分层、怎么接进 CI。&lt;/p>
&lt;h2 id="一先问一句这个分数是谁的">一、先问一句：这个分数是谁的？
&lt;/h2>&lt;p>大部分人读榜单的默认姿势是「这是模型的分数」。但只要你去看一眼 Terminal-Bench 的榜单，就会发现它有一列是 SWE-bench 没有的：&lt;strong>harness 的名字&lt;/strong>。&lt;/p>
&lt;p>榜单上每一行是「harness + model」的组合，而不是模型。同一模型会出现多行：Claude Opus 4.6 在两个不同 wrapper 下分别是 75.3% 和 76.4%，GPT-5.5 在三个 harness 下是 84.7%、83.1%、82.2%。&lt;strong>模型权重一个字节没变，分数自己会走。&lt;/strong>&lt;/p>
&lt;p>这不是榜单的疏漏，恰恰是它的诚实之处。SWE-bench 的官方榜单一直要求披露 harness，也正是因为：&lt;strong>不存在「某个模型的 SWE-bench 分数」这种东西，只有「某个系统在某个配置下的分数」&lt;/strong>。&lt;/p>
&lt;p>拆开看，一个 agent 评测的分数至少是四层东西的联合产物：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>层&lt;/th>
&lt;th>决定什么&lt;/th>
&lt;th>典型变量&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>模型&lt;/td>
&lt;td>推理与决策能力&lt;/td>
&lt;td>权重、采样温度、推理强度档位&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>脚手架（harness）&lt;/td>
&lt;td>任务怎么被呈现、能试几次&lt;/td>
&lt;td>系统提示、工具集、检索方式、重试策略、步数上限&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>运行时&lt;/td>
&lt;td>环境允许多少资源&lt;/td>
&lt;td>CPU / 内存、容器配额与执行方式、超时、网络&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>判分器&lt;/td>
&lt;td>什么算「做对了」&lt;/td>
&lt;td>测试集、阈值、是否人工校验、是否允许部分分&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;img src="https://www.zata.cc/p/coding-agent-eval-system/images/index/eval-stack.svg"
loading="lazy"
alt="一个 agent 分数是四层的联合产物"
>&lt;/p>
&lt;p>&lt;em>▲ 模型只是其中一层。换掉下面任何一层，分数都会动。图：自绘&lt;/em>&lt;/p>
&lt;p>把这张表记住，后面所有「这个分数能不能信」的问题都会变得具体：&lt;strong>你要问的不是分数是多少，而是这四层分别是什么&lt;/strong>。&lt;/p>
&lt;h2 id="二公开基准地图别按名字记按测的是哪根轴记">二、公开基准地图：别按名字记，按「测的是哪根轴」记
&lt;/h2>&lt;p>现在公开基准很多，但它们不是同一个东西的不同难度档，而是&lt;strong>各自测一根不同的轴&lt;/strong>。按轴分类比按名字分类有用得多：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>基准&lt;/th>
&lt;th>任务形态&lt;/th>
&lt;th>判分方式&lt;/th>
&lt;th>测的轴&lt;/th>
&lt;th>已知盲区&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>SWE-bench / Verified / Multilingual&lt;/strong>&lt;/td>
&lt;td>真实 GitHub issue + 仓库快照，产出补丁&lt;/td>
&lt;td>仓库自带测试：F2P + P2P 全绿&lt;/td>
&lt;td>仓库级定位与修改&lt;/td>
&lt;td>只覆盖 Python 生态的少数仓库；任务全公开，污染风险高&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>SWE-bench Pro&lt;/strong>&lt;/td>
&lt;td>更长周期、多文件、跨语言，部分来自 copyleft 仓库&lt;/td>
&lt;td>新功能测试通过且不破坏旧功能&lt;/td>
&lt;td>抗污染 + 长周期工程&lt;/td>
&lt;td>自身也被审计出约三成问题任务（见第三节）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Terminal-Bench 2.x&lt;/strong>&lt;/td>
&lt;td>89 个人工验证的终端任务，Docker + 指令 + 隐藏测试 + 人类 oracle 解&lt;/td>
&lt;td>只看容器终态的 pytest&lt;/td>
&lt;td>shell 端到端：装包、编译、配服务、debug&lt;/td>
&lt;td>不测仓库级推理、代码质量、UI；公开仓库，无 held-out 集&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>τ-bench&lt;/strong>&lt;/td>
&lt;td>带模拟用户的工具调用， repeated runs&lt;/td>
&lt;td>终态 + pass^k&lt;/td>
&lt;td>人机交互下的可靠性&lt;/td>
&lt;td>场景有限，偏客服/零售域&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>METR time horizon&lt;/strong>&lt;/td>
&lt;td>一组软件任务，每个都标定人类专家耗时&lt;/td>
&lt;td>逻辑回归拟合「50% 成功率对应的任务时长」&lt;/td>
&lt;td>长程耐力，单位是「人类工时」&lt;/td>
&lt;td>任务以软件为主；16 小时以上不可靠&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>SWE-Lancer&lt;/strong>&lt;/td>
&lt;td>真实自由职业软件任务&lt;/td>
&lt;td>按完成任务的美元金额计分&lt;/td>
&lt;td>经济价值&lt;/td>
&lt;td>任务集小，难以复现&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>LiveCodeBench&lt;/strong>&lt;/td>
&lt;td>竞赛题，按时间切分只取模型发布时间之后的题&lt;/td>
&lt;td>测试用例&lt;/td>
&lt;td>抗污染的算法能力&lt;/td>
&lt;td>与「改仓库」相关性弱&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>OSWorld&lt;/strong>&lt;/td>
&lt;td>真实桌面 GUI 操作&lt;/td>
&lt;td>终态检查&lt;/td>
&lt;td>计算机使用（computer use）&lt;/td>
&lt;td>环境重、慢&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>几个值得单独说的点：&lt;/p>
&lt;p>&lt;strong>Terminal-Bench 2.0 是这批里设计得最较真的一个。&lt;/strong> 89 个任务从 229 份社区提案里筛出来，每个任务平均投入 3 小时以上做验证，总验证工时超过 300 小时，检查三件事：specification specificity（测试通过当且仅当状态正确）、solvability（oracle 解能过）、anti-triviality（没有抄近路的漏洞）。它按 &lt;strong>outcome-based&lt;/strong> 判分——只检查容器终态，不管 agent 走过什么路径。报告的是 pass@1 加 95% 置信区间。&lt;/p>
&lt;p>&lt;strong>METR 的时间视野是最适合回答「能不能放手让它自己干」的指标。&lt;/strong> 它不问「多少分」，而问「人类专家要花多久的任务，agent 能有 50% 把握做完」。METR 在 2026 年 1 月把任务集从 170 扩到 228（TH 1.1），2026 年 3 月又修正了一处正则化错误并重算了历史点位。目前的前沿大致是：Claude Opus 4.6 约 12 小时（2026 年 2 月），而 METR 自己声明&lt;strong>超过约 16 小时任务集就不再可靠&lt;/strong>。这条比任何百分比都更接近「 autonomy 的边界在哪」。&lt;/p>
&lt;p>&lt;strong>SWE-Lancer 用美元计分是个被低估的发明。&lt;/strong> 当所有基准都在报百分比时，只有它回答「这些活值多少钱」——而这恰恰是你要不要上 agent 的那个问题。&lt;/p>
&lt;h2 id="三四类失真为什么那个分数不能直接用">三、四类失真：为什么那个分数不能直接用
&lt;/h2>&lt;h3 id="31-污染与饱和openai-为什么停报-verified">3.1 污染与饱和：OpenAI 为什么停报 Verified
&lt;/h3>&lt;p>2026 年 2 月，OpenAI 发了一篇措辞异常直接的公告，宣布停止报告 SWE-bench Verified：&lt;/p>
&lt;blockquote>
&lt;p>Improvements on SWE-bench Verified no longer reflect meaningful improvements in models&amp;rsquo; real-world software development abilities; instead, they increasingly reflect how much the model was exposed to the benchmark at training time.&lt;/p>
&lt;p>（SWE-bench Verified 上的提升已不再反映模型真实软件开发能力的有意义提升；它们越来越反映的是模型在训练时对该基准的暴露程度。）&lt;/p>
&lt;/blockquote>
&lt;p>支撑这个结论的是一次审计：他们挑出 138 道 o3 在 &lt;strong>64 次独立运行&lt;/strong>中都不能稳定解决的题目，每道由至少六位资深工程师独立复核。结果是 &lt;strong>59.4% 的题目在测试设计和/或问题描述上存在实质问题&lt;/strong>，即使最强模型或人类也极难或无法解决。同一份公告里还提到一个信号：受测模型能复现 gold patch，甚至泄漏出从未出现在 prompt 里的 Django release note 细节。&lt;/p>
&lt;p>&lt;strong>注意这里的因果方向&lt;/strong>：不是「模型变强了所以分高」，而是「一部分分数来自见过题目，另一部分天花板来自题目本身有病」。前者是污染，后者是设计缺陷，两者都会让分数往上或往下漂，而且从数字本身看不出来。&lt;/p>
&lt;p>更值得记住的是后续。OpenAI 当时建议社区改用 &lt;strong>SWE-bench Pro&lt;/strong>——后者在 8 个月内把前沿模型的通过率从 23.3% 推到 80.3%。然后在 2026 年 7 月 8 日，他们发了《Separating signal from noise in coding evaluations》，&lt;strong>把这条推荐撤回来了&lt;/strong>：用数据点分析流水线审了 731 个公开任务，自动流程标记 200 个（27.4%），五位工程师的人工标注标记 249 个（34.1%），两者的类别判断在 74% 的案例上一致。四类缺陷是：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>测试过严&lt;/strong>（overly strict tests）：强制要求 prompt 里从未指定的实现细节，功能正确的提交被判无效。&lt;/li>
&lt;li>&lt;strong>提示不足&lt;/strong>（underspecified prompts）：遗漏了隐藏测试要求、且无法合理推断的条件。&lt;/li>
&lt;li>&lt;strong>测试覆盖不足&lt;/strong>（low-coverage tests）：不完整的修复也能通过。&lt;/li>
&lt;li>&lt;strong>提示误导&lt;/strong>（misleading prompts）：指向了错误行为，或与测试要求矛盾。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>一个被最看好的接班基准，自己也有约三成任务有问题。&lt;/strong> 这不说明 Pro 不好，它说明的是：任何「自动从代码历史里抽取任务 + 用测试判分」的流水线，都会带着一个比例不低的坏任务，而这个比例在分数涨得快的时候没人去查。&lt;/p>
&lt;h3 id="32-脚手架换-wrapper-不换权重">3.2 脚手架：换 wrapper 不换权重
&lt;/h3>&lt;p>第一节已经给了数字。这里补一个机制解释：脚手架决定的不是「模型聪明多少」，而是&lt;strong>任务被翻译成什么样&lt;/strong>——它拿到的是完整仓库还是十个检索文件；它能跑几次失败测试再交卷；它有多少次工具调用预算；超时之后是重试还是放弃。同一份权重，一个允许跑测试迭代的脚手架相比「一次性交卷」，差距可以是十几到二十几个点。&lt;/p>
&lt;p>所以「模型 A 比模型 B 高三个点」在跨实验室比较时基本不是发现，是噪声。&lt;/p>
&lt;h3 id="33-基础设施噪声容器配置也是考题的一部分">3.3 基础设施噪声：容器配置也是考题的一部分
&lt;/h3>&lt;p>这一条最容易被忽略，也是 Anthropic 工程博客在 2026 年 2 月专门写文章量化的事。&lt;/p>
&lt;p>他们最初在 GKE 上跑 Terminal-Bench 2.0，发现分数和官方榜单对不上，而且&lt;strong>高达 6% 的任务因为 pod 错误失败&lt;/strong>，大多数和模型能力无关。原因出在资源执行方式上：容器运行时有两个独立参数——&lt;strong>预留分配（guaranteed allocation）&lt;strong>和&lt;/strong>硬上限（hard limit，超过就 kill）&lt;/strong>。当两者设成同一个值时，瞬时的内存波动就能 OOM 掉一个本该成功的容器。Terminal-Bench 官方榜单用的沙箱供应商实现更宽松，允许临时超额而不终止容器。&lt;/p>
&lt;p>于是他们固定模型、脚手架、任务集，只改资源配置，跑了六种配置：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>配置&lt;/th>
&lt;th>基础设施错误率&lt;/th>
&lt;th>表现&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>1x（严格：预留 = 硬上限）&lt;/td>
&lt;td>5.8%&lt;/td>
&lt;td>基线&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>3x&lt;/td>
&lt;td>2.1%&lt;/td>
&lt;td>成功率变化落在噪声内（p = 0.40）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>不设上限&lt;/td>
&lt;td>0.5%&lt;/td>
&lt;td>总分比 1x &lt;strong>高 6 个百分点&lt;/strong>（p &amp;lt; 0.01）&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>关键在 3x 这个拐点。&lt;/strong> 从 1x 到 3x，多给的资源只是在修可靠性——被 OOM 掉的容器大多是本来也走不到正解的那些。而&lt;strong>从 3x 往上，多给的资源开始主动帮 agent 解出它原本解不出的题&lt;/strong>：拉大依赖、跑内存密集的测试套件、开昂贵子进程。基础设施错误率只再降 1.6 个百分点，成功率却涨了近 4 个点。&lt;/p>
&lt;blockquote>
&lt;p>Above the 3x mark, however, additional resources start actively helping the agent solve problems it couldn&amp;rsquo;t solve before, which shows that limits can actually change what the eval measures.&lt;/p>
&lt;p>（超过 3x 之后，额外的资源开始主动帮助 agent 解决它此前无法解决的问题，这说明资源限制实际上能改变评测在测什么。）&lt;/p>
&lt;/blockquote>
&lt;p>同样的效应在 SWE-bench 上也有，但小得多：RAM 从 1x 加到 5x，227 道题各采样 10 次，分数只涨 1.54 个百分点。原因也不难理解——SWE-bench 的任务没那么吃资源。&lt;strong>同一个旋钮，在一个区间是噪声，在另一个区间是考题，这正是它藏得住的原因。&lt;/strong>&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/coding-agent-eval-system/images/index/noise-ruler.svg"
loading="lazy"
alt="噪声和榜单差距同一量级"
>&lt;/p>
&lt;p>&lt;em>▲ 榜单前列的差距，常常小于配置带来的噪声。图：自绘&lt;/em>&lt;/p>
&lt;h3 id="34-采样pass1passk-和-passk-是三个不同的问题">3.4 采样：pass@1、pass@k 和 pass^k 是三个不同的问题
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>pass@1&lt;/strong>：单次尝试成功的比例。&lt;/li>
&lt;li>&lt;strong>pass@k&lt;/strong>：k 次尝试中至少成功一次——能力指标，适用于后面有验证器能挑出好结果的场景。&lt;/li>
&lt;li>&lt;strong>pass^k&lt;/strong>：k 次全部成功——可靠性指标，适用于 agent 直接对用户干活、只有一次机会的场景。&lt;/li>
&lt;/ul>
&lt;p>τ-bench 把这个区别推到了前台：retail 域上单次的成绩看着还行，要求连续 8 次都成功时，剩下不到 25%。算术很残酷——单次 80% 的 agent，pass^4 约 0.41，pass^8 约 0.17。&lt;strong>你的用户经历的是重复运行的分布，不是那次幸运的 demo。&lt;/strong>&lt;/p>
&lt;p>叠加两个常见做法，分数就彻底不可读了：&lt;strong>单次运行 + 小样本不报置信区间&lt;/strong>。Terminal-Bench 报 95% CI 是少数派的好习惯，而多数发布公告只有一根没有误差棒的柱子。&lt;/p>
&lt;h2 id="四读分数之前的四问">四、读分数之前的四问
&lt;/h2>&lt;p>把上面的失真来源反过来，就是一套可以直接用的读数协议。看到任何 coding agent 的分数，先问四个问题：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>哪个变体？&lt;/strong> Verified 和 Pro 之间可以差 40 个点。只说「SWE-bench 多少分」等于没说。&lt;/li>
&lt;li>&lt;strong>谁跑的？&lt;/strong> 厂商自报（vendor）用自家调优过的 harness，还有发布选择权；第三方裁判（referee, 如 Epoch AI、Vals AI、Artificial Analysis）统一 harness 且无论好坏都发。这两类数字不能混在一张表里比——而每一张发布日的对比图都在混。&lt;/li>
&lt;li>&lt;strong>单次还是 best-of-N？&lt;/strong> 有没有置信区间？跑了几遍？&lt;/li>
&lt;li>&lt;strong>什么资源配置？&lt;/strong> 有没有声明 CPU / 内存 / 超时 / 重试策略？基础设施错误率是多少？&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>一个能干脆回答这四问的厂商，给的是可用测量；给一个不带 harness 名字的裸百分比的，给的是营销素材。&lt;/strong>&lt;/p>
&lt;p>顺带一条 Anthropic 给出的实操建议：低于 3 个百分点的榜单差距，在配置被记录清楚并对齐之前都应持怀疑态度——因为二项分布的朴素置信区间本身就有 1~2 个百分点宽，基础设施噪声还要再叠一层。&lt;/p>
&lt;h2 id="五自己搭一套从一个分数到一张评分卡">五、自己搭一套：从「一个分数」到「一张评分卡」
&lt;/h2>&lt;p>公开基准对&lt;strong>训练模型的人&lt;/strong>不可或缺；对&lt;strong>要选工具、要上线、要守门禁的团队&lt;/strong>，它主要是噪声。真正的信号来自你自己的任务集。这一节讲怎么搭。&lt;/p>
&lt;h3 id="51-指标分五层而不是一个数字">5.1 指标分五层，而不是一个数字
&lt;/h3>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>层&lt;/th>
&lt;th>回答什么问题&lt;/th>
&lt;th>具体指标&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>结果&lt;/strong>&lt;/td>
&lt;td>做成了吗？&lt;/td>
&lt;td>终态断言（测试、数据库状态、文件）——&lt;strong>用代码判，不看 agent 自己说了什么&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>过程&lt;/strong>&lt;/td>
&lt;td>是怎么做到的？&lt;/td>
&lt;td>工具选择正确率、参数有效率、冗余调用率、步数分布、是否越权&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>稳定性&lt;/strong>&lt;/td>
&lt;td>每次都成吗？&lt;/td>
&lt;td>pass^k、每条任务的成功次数分布&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>成本&lt;/strong>&lt;/td>
&lt;td>值吗？&lt;/td>
&lt;td>每解决一个任务的美元数、token、p50 / p95 墙钟时间与步数&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>安全&lt;/strong>&lt;/td>
&lt;td>有没有越界？&lt;/td>
&lt;td>不可逆动作是否在批准下执行、被门禁拦截的调用数、该升级时有没有升级&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>几条容易做错的地方：&lt;/p>
&lt;p>&lt;strong>别给最终消息打分。&lt;/strong> agent 说「已退款」时，它可能退了两次，也可能一次没退。断言要打在世界的状态上。&lt;/p>
&lt;p>&lt;strong>过程层最值钱的不是分数，是不变量（invariants）。&lt;/strong> 它们是「每次运行、每个用例都必须成立」的性质，像单元测试一样便宜、二值、且能精确指出哪里坏了：&lt;/p>
&lt;ul>
&lt;li>&lt;code>write_file&lt;/code> 从不作用于本次运行中没有先读过的路径（抓盲目覆盖）&lt;/li>
&lt;li>任何修改类工具出现之前至少有一次读取&lt;/li>
&lt;li>相同的 (tool, args) 组合不出现超过两次&lt;/li>
&lt;li>每次运行都以 finish 结束，且其状态与结果断言一致——&lt;strong>声称 completed 但结果断言失败，和声称 blocked 是两种性质不同的 bug&lt;/strong>&lt;/li>
&lt;li>没有任何工具调用的参数里出现凭据模式&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>每解决一个任务的成本才是诚实的单位。&lt;/strong> 一个成功率 50% 的 agent，把每份结果的价格翻了一倍。&lt;/p>
&lt;h3 id="52-任务集从哪来回放--合成--故意做不成的">5.2 任务集从哪来：回放 + 合成 + 故意做不成的
&lt;/h3>&lt;p>&lt;strong>（1）真实回放。&lt;/strong> 从你们自己的 PR / issue 历史里挑 30~50 条起步。这是公认性价比最高的一步——「在我们代码库上的通过率」比任何公开榜单第一名都强。挑的时候要覆盖：每种任务类型、那些描述含糊的、以及&lt;strong>本该拒绝或升级&lt;/strong>的。&lt;/p>
&lt;p>&lt;strong>（2）合成生成。&lt;/strong> 真实 PR 数量有限，规模不够。两条现成的路子：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>SWE-smith&lt;/strong>：把任意 GitHub 仓库变成一个可执行环境，用 LLM 改写或程序化变异注入 bug，再用测试验证「这个 bug 至少能搞挂一个单测」，最后反向生成一段自然语言 issue。它在 128 个 Python 仓库上造了 5 万+ 实例，一个仓库一个镜像，把存储从 TB 级压到 128 GB。&lt;/li>
&lt;li>&lt;strong>R2E-Gym / SWEGEN&lt;/strong>：直接从 commit 出发做回译（back-translation）——不依赖人类写的 issue 和测试，自动生成 Fail→Pass 测试用例并据此生成问题描述，规模 8.1K 任务。&lt;/li>
&lt;/ul>
&lt;p>它们的共同内核值得抄：&lt;strong>先找到领域里的自动验证器，再围绕它造数据&lt;/strong>。判分器不是附属品，是整个流水线的前提。&lt;/p>
&lt;p>&lt;strong>（3）必须有做不成的用例。&lt;/strong> 一个全是「可解任务」的评测集永远测不到放弃路径，而那正是 agent 最缺测试、也最容易闯祸的地方。建议：约五分之一是&lt;strong>不可能完成或超出范围&lt;/strong>的任务，断言的是「什么都没发生」+「它去查了策略而不是随便拒绝」。再加至少一条敌应用例——工单、文档或网页里有一段&lt;strong>直接对 agent 说话的文本&lt;/strong>，断言那条注入指令没被遵循。这迟早会是一次真实事故，它应该先是测试。&lt;/p>
&lt;h3 id="53-运行纪律六条">5.3 运行纪律：六条
&lt;/h3>&lt;ol>
&lt;li>&lt;strong>冻结环境。&lt;/strong> 用 fixture 和 seed，不用共享的 staging 库。每次运行前重置。一个结果取决于「别人昨天改了什么」的评测，是你会误读成回归的噪声源。&lt;/li>
&lt;li>&lt;strong>每条跑 k 次，报分布。&lt;/strong> 均值会藏住那条 40 步的长尾，而长尾就是未来的线上事故。k 取多少没有通用答案，按失败成本、基线批次的方差、跑一次多少钱来定——&lt;strong>但要把 k 写在分数旁边&lt;/strong>，别让人把 6 次读成确定性。&lt;/li>
&lt;li>&lt;strong>把 harness 版本化。&lt;/strong> 模型标识与采样设置、系统提示、每个工具的名字/描述/schema、护栏规则、检索快照、harness 版本号——每次结果都要带上这些一起存档。任何一项变了就重跑固定集，逐条与基线比。&lt;/li>
&lt;li>&lt;strong>校准资源的上下限。&lt;/strong> Anthropic 的建议是给每个任务同时指定预留（floor）和硬上限（ceiling），并把两者调成&lt;strong>两端的分数落在彼此的噪声之内&lt;/strong>。对 Terminal-Bench 2.0 来说 3x 是个合理折中：既消掉了基础设施的干扰，又没有把有意义的资源压力拿走。&lt;/li>
&lt;li>&lt;strong>把线上失败变成新用例。&lt;/strong> 这是让评测集自己长大的机制：线上每一步都有 trace，评测 harness 和生产埋点只要输出同一种结构，&lt;strong>一次生产失败就能靠复制一条 trace 变成一个测试用例&lt;/strong>。这也正是本站反复讲的那件事——&lt;strong>无法追踪的 agent 无法评测&lt;/strong>。&lt;/li>
&lt;li>&lt;strong>分布而非均值。&lt;/strong> 成功率、pass^k、步数与成本都看分布；p95 才是你的预算必须扛住的那个数。&lt;/li>
&lt;/ol>
&lt;p>&lt;img src="https://www.zata.cc/p/coding-agent-eval-system/images/index/eval-loop.svg"
loading="lazy"
alt="自建评测的闭环"
>&lt;/p>
&lt;p>&lt;em>▲ 线上失败回流成用例，是评测集唯一能自己长大的方式。图：自绘&lt;/em>&lt;/p>
&lt;h3 id="54-接进门禁">5.4 接进门禁
&lt;/h3>&lt;p>最后一步才让它真正有用：把评分卡变成门槛，而不是仪表盘。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>阈值写在分布上&lt;/strong>，不写在「全绿」上：成功率在 n 次运行中高于 x%、规则违反为 0、升级率落在某个区间内。&lt;/li>
&lt;li>&lt;strong>一次模型升级，如果 pass@1 涨了但 pass^k 跌了，那不是升级。&lt;/strong> 对一个直接对用户干活的 agent，这是净退步。&lt;/li>
&lt;li>&lt;strong>回归集和探索集分开。&lt;/strong> 回归集要小、要稳、每次提交都跑；探索集可以大、可以慢，用来发现新的失败模式。混在一起的结果是要么太慢没人跑，要么噪声太大没人信。&lt;/li>
&lt;li>&lt;strong>人工只审尾部，而且是刻意挑出来的尾部&lt;/strong>：结果与过程不一致的、agent 自评置信度低的、碰到策略敏感工具的、动作难以撤销的。刻意挑出的 3% 有人认真看，胜过名义上 100% 实际没人看。&lt;/li>
&lt;/ul>
&lt;h2 id="六几点收获">六、几点收获
&lt;/h2>&lt;ul>
&lt;li>&lt;strong>分数是系统的属性，不是模型的属性。&lt;/strong> 模型、脚手架、运行时、判分器四层联合决定读数。看到任何 coding agent 分数，先问「变体、谁跑的、单次还是 best-of-N、什么资源」这四件事。&lt;/li>
&lt;li>&lt;strong>换 wrapper 和换容器配置，都能换来榜单前列那么大的差距。&lt;/strong> Anthropic 实测六种资源配置差 6 个百分点；跨脚手架的差距可以到十几分。所以当榜单前列只差两三分时，那个排序基本是在给噪声排名。&lt;/li>
&lt;li>&lt;strong>出题比答题更容易错。&lt;/strong> OpenAI 两次审计分别给出 59.4%（Verified 抽样）和约 30%（Pro 全量）。四类缺陷——测试过严、提示不足、覆盖不足、提示误导——&lt;strong>全都是「需求」和「验收标准」之间的关系出了毛病&lt;/strong>，而这层关系正是软件工程里最难的部分。你自己搭评测时会原样遇到。&lt;/li>
&lt;li>&lt;strong>pass^k 是最便宜的一次诚实升级。&lt;/strong> 单次 80% 的 agent，连续 4 次全成才 41%。你的用户活在后者里。&lt;/li>
&lt;li>&lt;strong>先找到自动验证器，再造数据。&lt;/strong> SWE-smith 和 R2E-Gym 都是这个内核。反过来说，&lt;strong>一个你写不出判分器的任务，就不该进评测集&lt;/strong>——它进了，也只能靠人工看，而人工看不了几百条。&lt;/li>
&lt;li>&lt;strong>评测集的唯一可持续来源是线上。&lt;/strong> 手工攒的那 50 条会过期、会饱和、会被团队绕过。只有当「生产失败 → 新用例」这条回流接上，它才是活的。&lt;/li>
&lt;/ul>
&lt;p>继续阅读：&lt;a class="link" href="https://www.zata.cc/p/agent-decision-audit-implementation/" >Agent 决策审计落地：写入点、复核器与门禁降级判据&lt;/a>；&lt;a class="link" href="https://www.zata.cc/p/agent-%E6%B2%99%E7%AE%B1%E9%80%89%E5%9E%8B%E6%8C%87%E5%8D%97%E9%9A%94%E7%A6%BB%E8%BE%B9%E7%95%8C%E4%BA%A7%E5%93%81%E5%AF%B9%E6%AF%94%E4%B8%8E%E5%88%A4%E6%96%AD%E6%A0%87%E5%87%86/" >Agent 沙箱选型指南：隔离边界、产品对比与判断标准&lt;/a>；&lt;a class="link" href="https://www.zata.cc/p/agent-logging-two-worldviews/" >Agent 日志的两种世界观：从 DeepSeek Harness 的会话日志说起&lt;/a>；&lt;a class="link" href="https://www.zata.cc/p/agent-decision-audit-and-tracing/" >Agent 决策审计：它与 Tracing 的关系&lt;/a>。&lt;/p></description></item></channel></rss>