环境评测与综合项目

本节目标

  • 用 task、trial、trace、grader 与 outcome 评测环境型 Agent。
  • 同时检查终态、轨迹、副作用、成本、延迟与恢复。
  • 运行并扩展一个纯标准库的离线环境 runtime。

为什么“最后看起来对”仍不足

同一任务可能从不同初态启动,Agent 也可能以偶然轨迹成功。只看最后截图会漏掉重复发送、越界访问和中间数据泄露;只看轨迹相似度又会惩罚有效的新路径。环境型评测应以执行式 outcome 为核心,同时用轨迹与控制指标解释失败和风险。

WebArena 强调真实交互网站的功能正确性;OSWorld 把初态设置与自定义执行式 evaluator 纳入任务;SWE-bench 用仓库基线和测试评估补丁。这三类证据共同支持“初态可复现、终态可执行验证、过程副作用可审计”的方法,而不是提供一个通用万能分数。

怎样实现评测对象

对象环境型 Agent 中的含义
task目标、固定初态、身份/权限、允许副作用、预算与 grader 版本
trial一次独立运行;拥有 run ID、随机种子、环境镜像和 adapter/model 版本
traceobservation、proposal、拒绝/审批、action、receipt、checkpoint、verifier 事件
grader读取真实终态、业务对象、文件、测试或系统设置的确定性检查
outcomesuccess/failure/cancelled/waiting,加副作用、成本、延迟与终止原因

至少报告:任务成功率和多次 trial 方差;非法动作/越权/审批绕过率;未预期副作用与重复写次数;step、tool error、恢复成功率;端到端和人工等待延迟;模型/tool/环境成本。对不同环境分别保留失败分类,不要用平均成功率掩盖某类高风险失败。

benchmark 使用时记录数据/任务版本、harness、环境镜像、模型和 adapter;公开分数只能回答相应任务分布。生产门禁应加入自己的身份、数据、工具、异常、并发和事故场景。

评测卡还要覆盖控制面

执行成功率与安全性不能互相替代:一个永远拒绝动作的系统可能没有越权,却也无法完成任务;一个只在最后截图正确的系统,也可能已经重复发送或泄露数据。每张评测卡至少写明下列维度及其独立证据:

维度要问的问题证据示例
功能与完整性在允许初态下是否到达正确终态?独立 grader、后端对象、文件 hash、目标与回归测试
授权与注入韧性恶意 observation、跨租户/账号、过期或重放批准能否导致副作用?拒绝 trace、零副作用断言、policy/approval/receipt 绑定检查
隐私与审计trace 是否既能对账又不泄露原始秘密、PII 或隐藏答案?字段分类、redaction 测试、访问控制和可追溯 digest
恢复与运行超时、崩溃、并发、取消和环境漂移后是否安全收敛?crash-window trial、幂等 receipt、人工接管和清理记录
发布可复现性哪次变更导致指标变化,是否覆盖新的攻击面?fixture/harness/镜像/model/adapter/policy 版本与变更后的 abuse-case 回归

trace 本身不是合规审计结论。应把可复跑的 trace 与受保护的原始证据分离:前者保存 run、policy、environment、action、receipt 和 grader 的版本化 ID/摘要,后者按最小权限和留存策略保存;评测人员也不应借 grader、日志或隐藏答案获得生产凭据。提示、工具、memory、检索、策略、adapter 或模型供应商发生实质变更后,都应重跑相应的功能与对抗用例,而不是只比较一个总分。

综合项目

examples/ 提供一个无网络、无模型、无第三方包的内存文件环境:

  • environment_fixture.json:严格任务初态、预期终态、task/policy 版本、权限、路径与测试目标 allowlist,以及 proposal/step 预算;
  • environment_runtime.py:带环境版本、前置条件、风险与 deadline 的严格 action schema;模型外 HMAC approval store;环境实例/pre-post state 指纹/generation、双重 expiry 与过期 pending 安全刷新;权限门、内存 sandbox、pending intent、以 adapter 为权威的幂等 receipt;receipt 冲突的 needs_review 与可信人工 replan/abort;预检后的 HMAC checkpoint、外部单调高水位和版本化 verifier;
  • test_environment_runtime.py:103 个正向/负向测试。

运行:

Set-Location ".\docs\环境型Agent" # 进入课程项目目录,保证 fixture 与示例相对路径正确
$env:PYTHONDONTWRITEBYTECODE = "1" # 禁止生成 __pycache__,不把本机缓存混入知识库
python -B .\examples\environment_runtime.py # 运行离线环境 runtime demo;-B 同样避免字节码缓存
python -B -W error .\examples\test_environment_runtime.py # 将警告升级为失败,运行完整环境安全回归
python -B -O -W error .\examples\test_environment_runtime.py # 组合优化和严格警告模式,验证关键 gate 不依赖 bare assert

预期 demo 结果:phase=completed、terminal_reason=verified_outcome、environment_version=1、write_count=1、proposal_count=4、event_count=5。测试覆盖:重复/非有限 JSON、未知字段、路径穿越、陈旧 observation、动作风险/deadline、权限与 run_tests target allowlist;raw Action 自批拒绝;approval HMAC、task/run/policy/action/幂等键/intent、环境实例/pre-post fingerprint/generation、proposal/墙钟 expiry、nonce 绑定;过期 pending 的认证恢复、执行冻结与 fresh exact approval 刷新;拒绝/冲突/replay trace;proposal/step 预算失败终态;普通 checksum 重算、checkpoint HMAC 篡改、结构预检与外部 generation 防回滚;同版本状态漂移、跨环境实例、外部 task/policy 版本不匹配与伪造完成状态;adapter receipt 删除或 cache/adapter 完整字段漂移拒绝;已审批写入提交但 runtime receipt 未落盘的恢复;receipt intent 冲突后的冻结、可信人工继续/终止和 liveness;旧验证失效、取消和终态封闭。

这个 sandbox 只演示控制面:文件环境、approval/reviewer store、adapter receipt、checkpoint generation store、可信时钟和测试 grader 都是进程内的确定性替身;它不启动子进程,也不能证明真实浏览器、桌面、shell、持久数据库、审批服务或密钥服务已隔离。教学代码使用共享密钥 HMAC,不提供生产级密钥轮换、撤销、双人审批、可信时间源、耐久高水位、checkpoint 与高水位的原子持久化或并发事务。它还把同步内存 adapter 视为受信执行边界:receipt 未绑定 approval fingerprint 或可信 commit timestamp,因此不能证明绕过 runtime 的外部调用发生在批准到期前。接入真实 adapter 时,保留同一契约测试,再增加 adapter 侧 expiry、receipt—approval—提交时间绑定、缺证据时的人工 review、进程/VM 隔离、真实 identity、网络策略、durable approval/receipt 与防回滚存储、并发冲突和环境清理测试。

常见失败

  • 每个 trial 没有独立环境,前一次写入污染下一次结果。
  • grader 读取 Agent 自己生成的报告,形成自证循环。
  • 只测 happy path,没有恶意 observation、权限拒绝、超时和 crash。
  • 只跑一次;非确定性 Agent 的偶然成功被当稳定能力。
  • 忽略取消、等待人工、部分成功和预算耗尽等非二元 outcome。
  • 评测本身拥有过大权限或泄露隐藏答案。

怎样验证

普通与 -O 模式都以 warnings-as-errors 运行,确保关键校验不依赖会被优化移除的 assert。每个测试从新 runtime/fixture 开始;拒绝路径核对零副作用;成功路径核对当前版本的测试 receipt、单次写入和终态封闭。再用 mutation testing 思路删除一个权限或版本检查,确认至少一个测试会失败。

实践任务

在不连接真实 shell 的前提下扩展示例:新增 delete_file 动作,要求独立 permission、明确路径、幂等键和人工批准;checkpoint 能恢复其 receipt;只有 fixture 明确允许删除时 grader 才能完成。先写至少 6 个负向测试,再实现动作。最后提交一张评测卡,说明模拟器能证明什么、不能证明什么,以及迁移到浏览器/桌面/编码 adapter 时需要增加哪些集成测试。

参考