相同的模型,Agent 本身的提速:Harness 的 Fast 模式
同样的模型,完成同一道代码任务,Agent 还能更快吗?我们在 Sunny Code 中对照 Fast 与标准模式,固定模型和推理设置,只改变执行策略,观察一次本地代码交付需要多久。Fast 的思路是让 Agent 更聚焦当前任务,减少额外展开,完成修改与检查后及时交付。
在上一篇同模型对照实验展示的 token 效率基础上,我们进一步探索:同一个 Agent 能否通过 Fast 更早完成任务交付。
实验使用 GPT-6.1 Sol 与 DS4.1 Flash,均为 low thinking。三批任务分别覆盖 Sunny Code 自身与 Click、验证开销很小的 Python 仓库,以及没有现成单测的三个仓库。共九道任务,每项重复两次,合计 72 次运行。
在本次九个小任务的 36 组配对中,Fast 的本地交付耗时都更短。按每批、每个模型形成的六组汇总,耗时下降 50.4%–80.1%,新 token 下降 10.2%–38.7%。这是分组汇总的范围,不代表任意任务都能获得相同降幅。
所有交付都在计时后独立验收,但并非全部通过。下文保留失败和旧测试冲突;事后验收时间不计入上述耗时。
常规验证
低验证开销
无现成单测
实验是怎么做的
实验于 2026 年 10 月 18 日进行。每批三道任务;每道题在两个模型、两种模式下各重复两次,共 24 次运行。同一配对固定任务、代码快照、依赖环境、模型及推理设置,串行交替运行。比较的是产品中两种模式的整体效果。计时从提交任务到 Agent 结束本次任务,仅衡量本地代码交付,不含独立验收、PR 发布与合并。供应商缓存与服务负载没有完全控制。
三批任务,追问同一个问题
第一批覆盖 Sunny Code 自身与 Click 的任务;第二批选择原生测试基线中位数约 0.7–2.7 秒的任务;第三批选择没有现成第一方单测的仓库。后两批仍观察到更短的交付时间。这并不意味着两种模式做了相同的检查,也不能单凭仓库测试较少就预测收益。
查看耗时精确数值
| 分组 | 模型 | 标准(秒) | Fast(秒) | 耗时下降 |
|---|---|---|---|---|
| 常规验证 | GPT-6.1 Sol | 106.4 | 31.3 | −70.6% |
| 常规验证 | DS4.1 Flash | 94.5 | 18.8 | −80.1% |
| 低验证开销 | GPT-6.1 Sol | 54.3 | 24.9 | −54.1% |
| 低验证开销 | DS4.1 Flash | 29.6 | 14.7 | −50.4% |
| 无现成单测 | GPT-6.1 Sol | 47.6 | 23.3 | −51.1% |
| 无现成单测 | DS4.1 Flash | 34.9 | 9.6 | −72.4% |
新 token 也减少,但降幅与时间不同
三批任务中,两模型的新 token 都下降,降幅从 10.2% 到 38.7%。例如无单测组的 Sol,时间下降 51.1%,新 token 只下降 10.2%。减少的 token 数量,不能直接当成节省时间的比例。
常规验证
低验证开销
无现成单测
查看新 token 精确数值
| 分组 | 模型 | 标准新 token | Fast 新 token | 新 token 下降 |
|---|---|---|---|---|
| 常规验证 | GPT-6.1 Sol | 23,518 | 14,411 | −38.7% |
| 常规验证 | DS4.1 Flash | 23,626 | 16,034 | −32.1% |
| 低验证开销 | GPT-6.1 Sol | 25,213 | 16,650 | −34.0% |
| 低验证开销 | DS4.1 Flash | 19,964 | 15,573 | −22.0% |
| 无现成单测 | GPT-6.1 Sol | 15,281 | 13,726 | −10.2% |
| 无现成单测 | DS4.1 Flash | 15,004 | 9,224 | −38.5% |
所有交付都验收过,不等于全部正确
每次计时结束后,我们在交付代码的独立副本上运行行为边界检查,并结合可用的仓库回归检查。失败运行原样保留,没有修补模型交付的源码再计为通过。模型自己新增的测试另行记录。
| 分组 | 严格总验收(标准 / Fast) | 需求行为与补充诊断 |
|---|---|---|
| 常规验证 | 8/12 · 8/12 | Click 的八次交付都漏了补充验收中的空前缀相关边界。两种模式都错,不能证明质量无损。 |
| 低验证开销 | 8/12 · 8/12 | 需求行为 24/24 通过;八次 slugify 交付触发与新需求冲突的旧断言。上游更新测试的补充诊断通过,原失败保留。 |
| 无现成单测 | 12/12 · 12/12 | 外部行为与总验收 24/24 通过。在这批任务和已有覆盖下,没有观察到质量下降。 |
Click 的常规检查通过,补充需求检查失败。slugify 的任务则要求 ASCII 路径绕过转写后端,旧测试仍断言初始化该后端;冻结旧测试合计 16/24 通过,不能用后来的补充诊断覆盖这个结果。这两类失败原因不同,应分别报告。
标准模式交付中附带的测试也可能有后续维护价值。本次交付时间没有衡量这些价值、长期回归风险或返工成本。
这些数字适用于什么范围
现有证据支持的是:这九个小任务中,Fast 的本地交付耗时更短。它不能证明所有任务都会更快,也不能证明读代码或修改本身单独更快。对首批运行记录的事后拆分,仍不足以隔离这些阶段的收益;本实验也没有测量某一项具体实现的独立贡献。
三批没有让两种模式完成完全相同的验证。如果你的流程要求独立验收通过后才算交付,需要把验收时间计回去。本次只有九个任务、两个模型、每项两次重复;低验证组两个任务同属 boltons,无单测组三个仓库来自同一维护者。36 组配对并不等于 36 道独立任务。任务为定向选择,包含历史缺陷与边界案例,并非随机抽样;相同的通过率也不构成质量等价的证明。
把速度、验收与交付范围放在一起看
本次对照说明,在保持模型不变时,Agent 模式的差异仍值得测量。更短的交付时间,应与实际验收结果和工作范围一起看。评估自己的工作流时,固定任务与验收标准,同时记录耗时、token 和失败原因;若要求完成同样的全部验证后再交付,应按那个边界重新计算总耗时。
任务与仓库对照
三批共七个仓库、九道题。A–C 为 Sunny Code 与 Click,D–F 为低验证开销任务,G–I 来自无现成单测的仓库。每道题有八次运行:两个模型 × 两种模式 × 两次重复。
查看七个仓库与题目索引
| 仓库 | 语言 | 任务 |
|---|---|---|
| zjc-cloud/sunny-code | TypeScript | A, B |
| pallets/click | Python | C |
| mahmoud/boltons | Python | D, F |
| un33k/python-slugify | Python | E |
| fogleman/primitive | Go | G |
| fogleman/ln | Go | H |
| fogleman/sdf | Python | I |
| 任务 | 仓库 | 内容 |
|---|---|---|
| A | zjc-cloud/sunny-code | 本地预览链接边界 |
| B | zjc-cloud/sunny-code | 文本提示词学习与媒体输入 |
| C | pallets/click | Choice 补全的归一化匹配 |
| D | mahmoud/boltons | Unicode 分行与缩进 |
| E | un33k/python-slugify | ASCII 绕过转写后端 |
| F | mahmoud/boltons | JSONL 相对定位 |
| G | fogleman/primitive | 椭圆竖直半径按高度限制 |
| H | fogleman/ln | 零方向射线与盒求交 |
| I | fogleman/sdf | 四面体尺寸缩放 |
常规验证
A · 本地预览链接边界
zjc-cloud/sunny-code · TypeScript · 私有仓库,版本不公开
问题 · 启动日志中的本地地址占位符,会被误识别成可点击的预览链接。
任务要求与范围 · 拒绝 localhost:<port>、IPv4/IPv6 端口占位符和缺少端口的尾冒号;保留完整本地地址及明确写出的默认端口地址,不扩展其他启动功能。
独立验收覆盖 · 检查不完整地址、占位符、完整地址、外部或带认证信息的 URL,以及日志中的 ANSI/标点边界;结合原有回归、类型检查与构建。
严格总验收 · 标准: 4/4 · Fast: 4/4
B · 文本提示词学习与媒体输入
zjc-cloud/sunny-code · TypeScript · 私有仓库,版本不公开
问题 · 可复用提示词学习把同一用户消息的多个文本块直接粘连,丢失句子边界。
任务要求与范围 · 用换行分隔多个文本块,保留块内换行和普通字符串;图片或混合内容、非用户消息和原先禁止学习的内容仍应排除,长度与安全筛选不变。
独立验收覆盖 · 检查多文本块与普通字符串,以及图片、混合媒体、非用户消息和既有筛选边界;结合原有回归、类型检查与构建。
严格总验收 · 标准: 4/4 · Fast: 4/4
C · Choice 补全的归一化匹配
pallets/click · Python · 历史上游参照 2247b35e
问题 · Choice 的 shell 补全与命令行正常取值使用的归一化规则不一致,导致本来可接受的值没有候选建议。
任务要求与范围 · 让前缀匹配遵守既有归一化与扩展钩子,保留大小写、候选顺序、普通值转换、帮助与错误行为;空前缀及归一化后为空的前缀也属于边界。
独立验收覆盖 · 通过真实补全分发检查 Unicode、上下文及自定义归一化、子命令继承与上下文隔离,并补查空前缀边界。八份交付的常规检查通过,补充边界失败。
严格总验收 · 标准: 0/4 · Fast: 0/4
低验证开销
D · Unicode 分行与缩进
mahmoud/boltons · Python · 历史上游参照 1cdc0e9d
问题 · iter_splitlines 对 Unicode 行/段落分隔符处理不正确,还会错误拆开普通日期文本。
任务要求与范围 · 正确识别 U+2028、U+2029,连带保持 indent 正确;保留既有换行符、CRLF、连续及首尾空行,以及 margin、newline、key 参数行为。
独立验收覆盖 · 独立行为检查覆盖分行与缩进的组合边界;运行包含 doctest 的原生测试套件。该任务原生测试三次基线的中位数为 2.747 秒。
严格总验收 · 标准: 4/4 · Fast: 4/4
E · ASCII 绕过转写后端
un33k/python-slugify · Python · 历史上游参照 2fe6cec4
问题 · 已经是 ASCII 的文本仍进入转写后端加载路径,产生不必要的依赖。
任务要求与范围 · 在转写阶段对纯 ASCII 输入跳过后端加载,缺失后端时仍可处理;覆盖默认/显式 legacy 与 modern,保留非 ASCII、allow_unicode、替换、实体解码与参数校验行为。
独立验收覆盖 · 检查 ASCII 路径、后端缺失、非 ASCII 与流水线兼容性,并运行原生测试。行为检查八份均通过;八份均触发旧断言冲突,补充诊断单独报告。原生基线中位数 0.727 秒。
严格总验收 · 标准: 0/4 · Fast: 0/4
F · JSONL 相对定位
mahmoud/boltons · Python · 历史上游参照 51508029
问题 · JSONLIterator 对二进制 JSON 行文件执行 rel_seek 相对定位时抛出 TypeError。
任务要求与范围 · 二进制正向迭代应与相同内容的文本输入一致;保留起止/负相对位置、空文件、末尾、ignore_errors 和文本倒序行为,不扩展二进制倒序的其他问题。
独立验收覆盖 · 比较文本与二进制相对定位结果,检查位置、空文件、错误处理等边界;运行包含 doctest 的原生测试套件。原生基线中位数 2.472 秒。
严格总验收 · 标准: 4/4 · Fast: 4/4
无现成单测
G · 椭圆竖直半径按高度限制
fogleman/primitive · Go · 历史上游参照 69506c92
问题 · 普通 Ellipse.Mutate 在非正方形画布上,用宽度错误限制竖直半径 Ry。
任务要求与范围 · 竖直半径按高度限制,同高度、同随机序列的结果不应因宽度不同而变化;保留随机分支、水平半径、中心变化和 Circle 半径同步,不改 RotatedEllipse。
独立验收覆盖 · 在独立副本中用多组随机种子与不同画布尺寸检查高度约束、不随宽度变化和既有分支行为。仓库没有现成第一方单测,外部行为检查另行提供。
严格总验收 · 标准: 4/4 · Fast: 4/4
H · 零方向射线与盒求交
fogleman/ln · Go · 历史上游参照 12e6c6e7
问题 · 射线某轴方向为零时,Box.Intersect 在盒面、边或角上可能产生 NaN 或错误参数区间。
任务要求与范围 · 覆盖正零与负零:原点在轴闭区间内时该轴不限制参数,区间外为空;保留负参数、斜射/反向射线及盒内语义,并处理零厚度盒与完全静止射线。
独立验收覆盖 · 外部几何行为检查覆盖零方向、盒面/边/角、退化盒和静止射线,以及正常射线的区间结果。仓库没有现成第一方单测。
严格总验收 · 标准: 4/4 · Fast: 4/4
I · 四面体尺寸缩放
fogleman/sdf · Python · 历史上游参照 cee1dace
问题 · 有符号距离场的 tetrahedron(r) 忽略尺寸参数 r。
任务要求与范围 · 让正尺寸控制四面体大小;保留 r=1 场值,尺寸与坐标同比缩放时距离值也同比变化,原点在内部、边界为零;保留批量输出形状和平移组合,不扩展网格或渲染。
独立验收覆盖 · 外部数值行为检查覆盖缩放关系、内部/边界点、批量形状和已有组合方式。仓库没有现成第一方单测。
严格总验收 · 标准: 4/4 · Fast: 4/4
题目要求与验收覆盖为实验材料的整理说明,不是 Fast 的内部指令。版本链接是上游历史参照,不是模型交付补丁;结论对应独立准备的任务快照及本文列出的检查范围。三个位于无单测组的仓库来自同一维护者。
查看 72 次运行明细
Click 的“未通过”指补充需求边界失败;slugify 的“未通过”指冻结旧测试冲突。详细区分见上方验收说明。
| 任务 | 模型 | 模式 | 重复 | 耗时(秒) | New tokens | 严格总验收 |
|---|---|---|---|---|---|---|
| A | DS4.1 Flash | 标准 | 1 | 151.518 | 22,106 | 通过 |
| A | DS4.1 Flash | Fast | 1 | 26.976 | 17,537 | 通过 |
| A | GPT-6.1 Sol | 标准 | 1 | 87.583 | 28,162 | 通过 |
| A | GPT-6.1 Sol | Fast | 1 | 56.447 | 13,378 | 通过 |
| B | DS4.1 Flash | 标准 | 1 | 120.180 | 23,905 | 通过 |
| B | DS4.1 Flash | Fast | 1 | 12.851 | 14,217 | 通过 |
| B | GPT-6.1 Sol | 标准 | 1 | 118.264 | 19,415 | 通过 |
| B | GPT-6.1 Sol | Fast | 1 | 21.984 | 13,519 | 通过 |
| C | DS4.1 Flash | 标准 | 1 | 63.844 | 34,484 | 未通过 |
| C | DS4.1 Flash | Fast | 1 | 15.234 | 13,828 | 未通过 |
| C | GPT-6.1 Sol | 标准 | 1 | 50.228 | 22,838 | 未通过 |
| C | GPT-6.1 Sol | Fast | 1 | 25.957 | 17,554 | 未通过 |
| A | DS4.1 Flash | 标准 | 2 | 168.825 | 22,031 | 通过 |
| A | DS4.1 Flash | Fast | 2 | 24.367 | 17,587 | 通过 |
| A | GPT-6.1 Sol | 标准 | 2 | 149.124 | 28,651 | 通过 |
| A | GPT-6.1 Sol | Fast | 2 | 30.488 | 13,254 | 通过 |
| B | DS4.1 Flash | 标准 | 2 | 32.271 | 19,765 | 通过 |
| B | DS4.1 Flash | Fast | 2 | 16.935 | 15,329 | 通过 |
| B | GPT-6.1 Sol | 标准 | 2 | 177.767 | 31,566 | 通过 |
| B | GPT-6.1 Sol | Fast | 2 | 24.743 | 12,494 | 通过 |
| C | DS4.1 Flash | 标准 | 2 | 30.077 | 19,465 | 未通过 |
| C | DS4.1 Flash | Fast | 2 | 16.311 | 17,704 | 未通过 |
| C | GPT-6.1 Sol | 标准 | 2 | 55.692 | 10,478 | 未通过 |
| C | GPT-6.1 Sol | Fast | 2 | 28.197 | 16,267 | 未通过 |
| D | DS4.1 Flash | 标准 | 1 | 25.598 | 14,298 | 通过 |
| D | DS4.1 Flash | Fast | 1 | 10.555 | 9,721 | 通过 |
| D | GPT-6.1 Sol | 标准 | 1 | 42.425 | 21,710 | 通过 |
| D | GPT-6.1 Sol | Fast | 1 | 24.225 | 19,843 | 通过 |
| E | DS4.1 Flash | 标准 | 1 | 46.756 | 34,166 | 未通过 |
| E | DS4.1 Flash | Fast | 1 | 18.650 | 16,833 | 未通过 |
| E | GPT-6.1 Sol | 标准 | 1 | 52.419 | 37,344 | 未通过 |
| E | GPT-6.1 Sol | Fast | 1 | 28.890 | 14,138 | 未通过 |
| F | DS4.1 Flash | 标准 | 1 | 25.358 | 15,272 | 通过 |
| F | DS4.1 Flash | Fast | 1 | 19.426 | 13,263 | 通过 |
| F | GPT-6.1 Sol | 标准 | 1 | 46.363 | 13,653 | 通过 |
| F | GPT-6.1 Sol | Fast | 1 | 20.540 | 10,349 | 通过 |
| D | DS4.1 Flash | 标准 | 2 | 25.629 | 13,579 | 通过 |
| D | DS4.1 Flash | Fast | 2 | 11.298 | 10,137 | 通过 |
| D | GPT-6.1 Sol | 标准 | 2 | 39.815 | 11,908 | 通过 |
| D | GPT-6.1 Sol | Fast | 2 | 23.820 | 19,623 | 通过 |
| E | DS4.1 Flash | 标准 | 2 | 34.501 | 29,873 | 未通过 |
| E | DS4.1 Flash | Fast | 2 | 15.398 | 30,881 | 未通过 |
| E | GPT-6.1 Sol | 标准 | 2 | 72.812 | 34,581 | 未通过 |
| E | GPT-6.1 Sol | Fast | 2 | 28.113 | 25,126 | 未通过 |
| F | DS4.1 Flash | 标准 | 2 | 19.923 | 12,593 | 通过 |
| F | DS4.1 Flash | Fast | 2 | 12.799 | 12,600 | 通过 |
| F | GPT-6.1 Sol | 标准 | 2 | 72.053 | 32,083 | 通过 |
| F | GPT-6.1 Sol | Fast | 2 | 23.863 | 10,820 | 通过 |
| G | DS4.1 Flash | 标准 | 1 | 31.012 | 12,414 | 通过 |
| G | DS4.1 Flash | Fast | 1 | 8.348 | 7,585 | 通过 |
| G | GPT-6.1 Sol | 标准 | 1 | 21.667 | 11,140 | 通过 |
| G | GPT-6.1 Sol | Fast | 1 | 18.864 | 10,966 | 通过 |
| H | DS4.1 Flash | 标准 | 1 | 27.340 | 12,975 | 通过 |
| H | DS4.1 Flash | Fast | 1 | 13.305 | 9,428 | 通过 |
| H | GPT-6.1 Sol | 标准 | 1 | 74.575 | 26,442 | 通过 |
| H | GPT-6.1 Sol | Fast | 1 | 28.190 | 20,998 | 通过 |
| I | DS4.1 Flash | 标准 | 1 | 43.154 | 18,187 | 通过 |
| I | DS4.1 Flash | Fast | 1 | 9.202 | 11,015 | 通过 |
| I | GPT-6.1 Sol | 标准 | 1 | 38.367 | 11,841 | 通过 |
| I | GPT-6.1 Sol | Fast | 1 | 24.516 | 10,561 | 通过 |
| G | DS4.1 Flash | 标准 | 2 | 21.340 | 10,337 | 通过 |
| G | DS4.1 Flash | Fast | 2 | 7.906 | 7,943 | 通过 |
| G | GPT-6.1 Sol | 标准 | 2 | 56.842 | 15,482 | 通过 |
| G | GPT-6.1 Sol | Fast | 2 | 18.959 | 12,178 | 通过 |
| H | DS4.1 Flash | 标准 | 2 | 44.072 | 18,595 | 通过 |
| H | DS4.1 Flash | Fast | 2 | 9.837 | 8,340 | 通过 |
| H | GPT-6.1 Sol | 标准 | 2 | 61.829 | 10,902 | 通过 |
| H | GPT-6.1 Sol | Fast | 2 | 27.940 | 16,772 | 通过 |
| I | DS4.1 Flash | 标准 | 2 | 42.778 | 17,516 | 通过 |
| I | DS4.1 Flash | Fast | 2 | 9.235 | 11,030 | 通过 |
| I | GPT-6.1 Sol | 标准 | 2 | 32.376 | 15,876 | 通过 |
| I | GPT-6.1 Sol | Fast | 2 | 21.154 | 10,883 | 通过 |
联系获取实验数据
可通过邮箱联系我们获取实验数据。数据包包含 72 次运行的耗时、用量与验收结果、九个任务的仓库、历史版本参照、问题要求与验收范围,以及三批汇总。全文数字按原始记录计算;数据包不包含运行过程记录、缓存分项、Fast 内部指令或私有版本标识。
用自己的仓库,决定一次任务应该做哪些检查、何时才算交付。