简介:本文以智能体执行框架(Agent Harness)为评测对象,给出一套可复用的评测思路:先界定 Harness 的能力边界,再拆解功能完整性、任务有效性、长程稳定性、工具调用正确性、安全隔离、可观测性与成本结构等维度,最后说明测试环境如何控制变量、过程数据如何记录、结果如何解读以及在何种业务场景下应重点关注哪些指标。适合正在做智能体技术选型、搭建内部评测集的开发者、架构师与技术负责人阅读,帮助读者避免把“模型能力强”与“框架能力弱”混为一谈。
过去一年,行业讨论智能体的重心从“模型能不能答对”转向“系统能不能把事做完”。当一个智能体产品连续执行几十步、调用多个外部工具、读写文件、访问网络并管理长上下文时,真正决定成败的往往不是底层模型本身,而是包裹在模型外面的那一层执行框架,也就是通常所说的 Harness。
Harness 大致承担这些职责:驱动“思考—调用—观察—再决策”的循环、组装与裁剪上下文、把自然语言意图翻译成结构化的工具调用、约束权限与执行环境、处理超时与重试、记录全链路轨迹、控制 token 与步数开销。这些能力大多不出现在模型评测榜单里,却直接决定产品在真实业务中的可用性。
因此本文的评测对象不是某一个模型,而是一类执行框架的工程能力。评测的意义在于:帮助团队判断某个 Harness 方案是否值得进入试点、试点前应补齐哪些验证、以及在什么条件下它的结论不再成立。评测环境本身可基于公开的通用云资源搭建,例如云服务器、容器平台、对象存储、消息队列、日志服务、监控告警与身份认证等通用类目,不涉及任何特定厂商的专有实现。
需要强调的是,这是一次条件化评测,不是排名。同一套 Harness 在不同模型、不同工具集、不同任务分布下结论差异很大,任何脱离配置的结论都没有迁移价值。
| 组成模块 | 主要职责 | 缺失后的典型症状 |
|---|---|---|
| 循环控制层 | 终止条件、步数上限、失败退出、人工介入 | 死循环、无限调用、预算失控 |
| 上下文管理层 | 历史裁剪、摘要压缩、外部检索、状态外置 | 越跑越慢、早期指令被遗忘 |
| 工具适配层 | 工具描述、参数校验、返回值归一化、错误表达 | 参数幻觉、工具选错、错误无法被模型理解 |
| 执行与沙箱层 | 文件系统范围、进程与网络权限、依赖隔离 | 误改生产文件、越权访问 |
| 并行编排层 | 子任务拆分、结果汇总、冲突消解 | 多智能体互相覆盖、结果不可合并 |
| 可观测与治理层 | 轨迹记录、指标统计、成本记账、回放回归 | 无法复现、无法归因、无法优化 |
| 维度 | 关键观察指标 | 主要验证方式 |
|---|---|---|
| 功能完整性 | 需求覆盖比例、流程闭环率 | 场景清单逐项走查 |
| 任务有效性 | 一次通过率、返工轮次、验收得分 | 固定任务集多次重复 |
| 上下文与记忆 | 长任务指令保持率、压缩后信息损失 | 超长多轮任务、跨会话任务 |
| 工具调用正确性 | 选路准确率、参数合法率、错误恢复率 | 构造相似工具与歧义工具 |
| 长程稳定性 | 步数分布、中断率、恢复成功率 | 长链路任务与故障注入 |
| 安全 | 越权拦截率、注入抵抗率、密钥泄露情况 | 红队用例与恶意指令集 |
| 可观测性 | 轨迹完整度、定位耗时、回放成功率 | 人为制造故障再排查 |
| 可维护性 | 升级回归成本、配置变更影响面 | 版本升级与配置切换 |
| 成本结构 | 单位任务调用量、token 消耗、人力投入 | 同任务多方案对照记账 |
| 易用性 | 接入工作量、文档完备度、调试便利度 | 新人从零接入计时 |
维度不能一次全上。建议按“先有效性与安全、再稳定性与可观测、最后成本与体验”的顺序推进,否则容易出现指标很多但无法指导决策的情况。
控制变量是评测可信度的前提,测试前必须固定并书面记录以下内容:
同时必须建立基线:先用一个最小可用方案(例如不带压缩、不带并行、只读权限的简单循环)跑完整任务集,后续所有方案都与该基线对比。没有基线的对比数字没有意义。
推荐流程分七步:
一个最小的评测驱动骨架示意如下(伪代码,仅表达流程,不代表任何具体实现):
def run_eval(harness, tasks, model_cfg, repeats=3):results = []for task in tasks:for i in range(repeats):trace = harness.run(instruction=task.prompt,tools=task.allowed_tools,max_steps=task.step_budget,permission="read_only" if task.read_only else "workspace_write",)results.append({"task_id": task.id,"run": i,"passed": task.verify(trace), # 自动验收"steps": trace.step_count,"tool_errors": trace.error_count,"recovered": trace.recovered_count,"tokens": trace.token_usage,"human_interventions": trace.interventions,"violations": trace.policy_violations, # 越权/越界行为"trace_ref": trace.id,})return summarize(results) # 通过率分布、步数分布、成本分布、违规清单
长程任务与上下文管理。 设计 30 步以上、需要跨多个文件或多个会话的任务,观察早期指令是否被保留、状态是否被正确外置。有效做法是每隔若干步抽查“关键约束复述”,并对比开启压缩与关闭压缩的信息损失差异。如果压缩后任务成功率显著下降,说明摘要策略丢失了关键约束,而不是模型能力问题。
工具调用正确性与错误恢复。 故意提供若干功能相似的工具(如“搜索”“读取”“查询数据库”),并让其中一个的参数描述带有歧义,观察选路准确率;再让工具稳定返回错误码与可读错误信息,观察框架是否把错误有效反馈给模型并触发重试,而不是静默失败。这里的核心指标是恢复率,而非一次成功率。
并行与多智能体编排。 多智能体范式本身不是加分项,需要验证的是收益与代价:拆分子任务后总耗时、总 token 是否反而上升;并行写入是否互相覆盖;结果汇总是否引入新的错误。判断标准很直接——若并行版本的成功率没有提升而成本明显上升,则该场景下不应启用。
安全与隔离。 必须覆盖四类用例:越权读取工作目录之外的资源;写操作绕过确认流程;外部内容中夹带“忽略此前指令”类注入;日志与错误信息中泄露凭据。评测重点是默认拒绝是否成立,以及权限提示是否可被绕过。任何一次凭据泄露都应视为阻断性问题。
稳定性与容错。 注入依赖超时、限流、超大响应与非法 JSON,观察重试是否带退避、是否幂等、是否存在重试放大。同时观察资源占用曲线:长跑任务中的内存与文件句柄是否持续增长,是判断能否上生产的关键信号。
可观测性。 人为制造一次失败,记录从告警到定位根因所需的信息是否齐全:是否有完整轨迹、每步的输入输出、工具耗时、token 记账、策略拦截记录。能否一键回放同一轨迹做回归,决定了后续优化速度。
常见误读之一是把模型升级带来的收益记在框架头上。控制变量、逐次只改一项,是避免归因错误的唯一可靠办法。
| 场景 | 优先关注的维度 | 需要弱化的维度 |
|---|---|---|
| 编码与工程辅助 | 工具调用正确性、沙箱隔离、回滚能力 | 交互美观度 |
| 流程与办公自动化 | 功能完整性、人工确认机制、可维护性 | 极限吞吐 |
| 数据分析与报表 | 结果准确性、幂等性、可复现性 | 多智能体并行 |
| 客服与内容场景 | 安全合规、注入防护、成本 | 长程规划 |
| 内部研发平台 | 可观测性、接入成本、回归能力 | 单任务峰值性能 |
评测结论的边界主要来自四处:任务集与真实流量分布不一致导致的样本偏差;模型版本或依赖服务在评测期间变动导致的环境漂移;评测集被模型见过造成的乐观偏差;以及长周期行为(内存泄漏、成本累积、策略退化)在短测中不可见。此外,自动验收脚本本身的严格程度会直接放大或掩盖差距,脚本过松会系统性高估所有方案。
讨论 Harness,实质是在讨论“智能体如何被可靠地约束和驱动”。评测它的正确方式,是把它拆成循环控制、上下文管理、工具适配、执行沙箱、并行编排与可观测治理六个部分,分别设计可自动判定的指标,在控制变量的前提下建立基线、重复采样、注入故障并做安全红队,然后结合业务场景给出条件化结论。任何脱离任务分布与配置组合的绝对判断都不可迁移;真正有价值的产出不是一句“好用或不好用”,而是一套能随版本持续复用的评测集与改进清单。