返回博客

编码 Agent 换 Harness 实测|平均分不动成本反涨的坑

人工智能3606
编码 Agent 换 Harness 实测|平均分不动成本反涨的坑

"换个 Harness,Agent 立刻变强"是接入圈流传最广的传说之一。一份受控对照实测把这个传说按在了数据上:平均成绩几乎不动,单任务成本反而可能上涨两到六成。

一、一个把假设量化的受控实验

我注意到一份相当扎实的方法论示范:在一套私有、防污染的任务套件上(256 个仓库任务与模型截止日期之后的竞赛题),把同一个模型分别跑在厂商原生 Harness 与第三方中性 Harness 上做配对对照。计划 800 次运行,792 次由隔离的评分程序完成判分。

结果分两层。平均层:两组成对对照的差值分别为 -1.25 个百分点(48.8% 对 50.0%,置信区间 [-10.0, +7.5])与 +1.25 个百分点(55.6% 对 54.4%,置信区间 [-4.4, +6.9]),置信区间都跨过零——"原生 Harness 平均更好"这个默认假设没有被支持。分层层:仓库任务上原生落后 9.0 个百分点,竞赛任务上原生领先 23.7 个百分点,两个符号相反的分层合并出一条看似持平的平均线。

成本层更扎心:按挂牌价对原始用量重新计价,中性 Harness 每解一题的成本是原生配置的 1.3 到 1.6 倍,另一组是 1.2 倍。换 Harness 不是免费实验,是先涨成本、再谈成绩的实验。

二、Harness 到底承担什么

编码 Agent 系统等于模型加 Harness:工具集、提示词模板、控制流、重试与上下文管理,共同把一个对话模型变成自主软件工程师。拆开看,Harness 至少管五件事:

组件职责换掉的影响面
工具集与 schema定义 Agent 能做什么动作成功率与失败模式直接变化
提示词与系统框架决定模型看到什么任务描述行为风格与指令遵从漂移
控制流步骤编排、重试、终止条件Token 消耗与延迟结构改变
上下文管理历史、压缩、窗口策略长任务稳定性差异最大的地方
权限与沙箱边界能访问什么、能执行什么安全态势与审批链路

这五件事里没有一件是"模型能力",但每一件都会改变模型能力的兑现程度。这就是 Harness 选型复杂性的根源:它不是换一个模型,而是换一整套兑现环境。

三、原理速览:选型实验应该长什么样

那次受控对照的实验设计,比结论本身更值得抄。把设计抽象成请求流与实验流两张图:

text
选型实验流(影子进行,不影响生产)
    |
    v
固定变量:模型、任务集、评分程序、时间窗
    |
    v
候选 A(原生 Harness)──> 同一批任务 ──> 隔离评分
    |
候选 B(中性 Harness)──> 同一批任务 ──> 隔离评分
    |
    v
三层结论:平均差值置信区间 / 任务分层差值 / 每解一题成本
    |
    v
决策:平均不显著时,按任务分层路由或维持现状

三个设计要点。第一,任务集必须防污染:模型训练数据里见过的题目会把对照变成默写比赛,截止日期之后的题目与私有仓库任务是底线。第二,评分必须与执行隔离:让执行方自己判分,等于让考生改自己的卷子。第三,成本口径必须事先定义:按 raw usage 乘挂牌价计,每解一题摊一次,而不是只看单次请求价格。

四、"平均持平"的正确打开方式

平均不显著不等于换了白换,它意味着答案在分层里。仓库任务与竞赛任务的相反符号(-9.0 对 +23.7 个百分点)给出一个务实的路由假设:贴近真实仓库、长周期、多文件的任务,可能更适合重上下文管理的 Harness;短周期、结构化的竞赛型任务,原生的深度推理编排可能占优。

但那份实验自己也写得诚实:这个分层是看过数据之后才选定的,需要专门设计的重复实验确认。接入方应该学会同样的克制——分层路由的依据要用预注册的分层标准(任务时长、文件数、是否多仓库)提前定义,而不是事后挑一个好看的切法。事后切出来的分层,十次里有几次是过拟合。

五、接入教程:Harness 影子对照器

下面这段 Python 示例以 4sapi 提供的 OpenAI 兼容接口为例,实现最小化的 Harness 影子对照:同一任务在两套编排参数下各跑一次,记录成绩与用量,输出分层的对照报告。4sapi 统一管理密钥与端点,两套编排只差本地配置。

python
import json
import statistics
import openai

client = openai.OpenAI(base_url="https://4sapi.com/v1", api_key="sk-xxx")

# 两套编排配置:同名模型,不同的系统框架与控制流参数
HARNESS_A = {"name": "native-like",  "system": "按厂商默认框架组织工具与步骤",
             "max_steps": 24, "temperature": 0.2}
HARNESS_B = {"name": "neutral",      "system": "按中性框架组织工具与步骤",
             "max_steps": 24, "temperature": 0.2}

TASKS = [
    {"id": "R-001", "kind": "repo",    "prompt": "在多文件仓库中定位并修复回归"},
    {"id": "C-001", "kind": "contest", "prompt": "限定时间内完成算法题并过全部用例"},
    # ... 预注册分层字段:kind 在跑之前就定好,不许事后改
]


def run_one(harness: dict, task: dict) -> dict:
    resp = client.chat.completions.create(
        model="agent-model",                     # 同一模型,配对对照的前提
        messages=[{"role": "system", "content": harness["system"]},
                  {"role": "user", "content": task["prompt"]}],
        temperature=harness["temperature"],
    )
    usage = resp.usage
    return {"task_id": task["id"], "kind": task["kind"],
            "harness": harness["name"], "score": grade(task, resp),
            "tokens": usage.total_tokens,
            "cost": estimate_cost(usage, "agent-model")}


def compare() -> dict:
    rows = [r for t in TASKS for r in (run_one(HARNESS_A, t),
                                       run_one(HARNESS_B, t))]
    report = {}
    for kind in {t["kind"] for t in TASKS}:      # 分层口径:预注册的 kind
        a = [r["score"] for r in rows if r["kind"] == kind and r["harness"] == "native-like"]
        b = [r["score"] for r in rows if r["kind"] == kind and r["harness"] == "neutral"]
        ca = [r["cost"] for r in rows if r["kind"] == kind and r["harness"] == "native-like"]
        cb = [r["cost"] for r in rows if r["kind"] == kind and r["harness"] == "neutral"]
        report[kind] = {"score_gap_pp": 100 * (statistics.mean(a) - statistics.mean(b)),
                        "cost_ratio": statistics.mean(cb) / statistics.mean(ca)}
    with open("harness_shadow_report.json", "w", encoding="utf-8") as f:
        json.dump(report, f, ensure_ascii=False, indent=2)
    return report

两个实现要点。第一,分层字段 kind 在跑实验之前写死进任务定义,报告只按预注册的分层出数,杜绝事后挑分层。第二,cost_ratioscore_gap_pp 并排出——只看成绩不看成本,正是那份实测里"平均持平、成本上涨"被忽略的原因。样本量按每层至少三十个任务起算,少于这个量级的置信区间宽得没有决策价值。

六、成本对比:选型决策的完整账

延续那份实测的成本结构,把选型决策的账算全(估算口径,实际以用量账单为准):

决策成绩影响每解一题成本隐性成本
维持原生 Harness基线1.0×供应商锁定,迁移能力退化
换中性 Harness平均持平1.2~1.6×换来迁移自由与工具自主权
按任务分层双 Harness分层各自取优约 1.1×(混合后)两套编排的维护成本

第二行的成本上涨不是浪费,买的是两样东西:供应商变更时的迁移能力,以及工具链的自主可控。第三行的混合路由是多数团队的终态,但前提是分层标准经过预注册实验验证,否则维护两套编排只是把不确定性复杂化。

七、被取消的任务也是信号

那份实测里还有个容易被略过的数字:81 次因时限被取消的运行中,22 次其实已经产出了能通过测试的补丁。这说明一部分"失败"不是能力不足,而是时间预算与终止条件的错配——Harness 的控制流在任务完成前就把它掐掉了。

接入方的对照实验里要专门记录这类样本:取消时是否已有可通过的产出、终止条件是步数还是时钟、超时前的最后一步在做什么。把终止参数从"固定步数"改成"产出验证 + 步数上限"双条件,一部分成本与失败可以同时消失。

八、成本与风险提示

第一条风险是用量核算的黑洞。那份实测有一组运行在供应商侧没有留下用量记录,导致按账单重定价的结论在两个倍数之间摇摆。接入侧的对策是把请求级 usage 逐条落库、与账单对账,不能默认账单永远可解释。

第二条风险是污染。任务集一旦进过公开数据集或被缓存,对照就作废。私有任务与截止后题目要定期轮换,防污染是评测资产的一部分。

第三条风险是过度工程。Harness 对照的结论有半衰期:模型版本一动,编排层的相对优势就可能翻转。与其追求"一次选对",不如把影子对照做成季度例行动作,选型始终跟着最新数据走。

红线不变:对照实验用正当接入的通道与配额跑,不做并发轰炸,不绕过任何上游限制;私有仓库任务不出域,防污染的前提是数据本身合规。

九、Harness 选型自查清单

  1. 任务集防污染:私有任务加截止后题目,定期轮换,评分程序与执行隔离。
  2. 分层预注册:任务分层标准在实验前写死,报告按预注册口径出数。
  3. 成本口径统一:raw usage 乘挂牌价,每解一题摊销,与账单对账核验。
  4. 样本量达标:每层至少三十任务,置信区间能支撑决策。
  5. 终止条件双保险:产出验证加步数上限,取消运行单独归因。
  6. 季度例行重测:模型版本更新后自动触发影子对照,选型不靠记忆。

十、总结

这一期想沉淀的结论是:Harness 选型是一个成本问题,不是一个信仰问题。受控对照给出的三层数据——平均持平、分层相反、成本上浮——说明"原生最好"的默认假设值得用自己任务上的影子实验重新审一遍,也说明换编排层的真实代价藏在每解一题的成本里而非平均分里。预注册分层、统一成本口径、把终止条件调成产出导向,是把这类实验做对的三块基石。我在 4sapi 看到的稳定团队,都是把 Harness 当成需要持续验证的架构资产,而不是一次性的选型决定。对分层标准或影子实验的规模有不同做法,欢迎在评论区聊聊。

标签:编码AgentHarness评测成本核算影子实验

推荐阅读

探索更多前沿洞察与行业干货。