如何为 Agent 构建可重复的测试沙箱?
简化版
Agent 测试沙箱要把模型和工具放进隔离、可重置、可观测的仿真环境:固定初始数据、模型版本、Prompt、工具契约、时间和随机种子;写操作只作用于临时资源,网络与权限采用允许列表。沙箱还要能注入超时、部分成功、重复回调和恶意内容,并以环境最终状态而不是模型自评判定任务成功。
详细版
沙箱通常包含任务夹具、工具替身或录制回放、临时数据库/文件系统、虚拟时钟、身份权限、资源限额和完整 Trace。每个用例从已知快照启动,执行后检查状态谓词、禁止副作用、成本与步骤,再销毁环境。
fixture -> isolated environment -> Agent + mocked/real tools
|
events / artifacts / cost
v
deterministic assertions -> reset
单元层验证工具适配和状态转移,集成层验证多步恢复,端到端层只用少量受控真实服务。外部模型存在采样波动时重复运行并报告置信区间;工具响应则尽量通过快照或模拟器确定化。测试数据不能含生产秘密,沙箱凭证也不得拥有生产权限。
完整版教学
一、为什么普通接口测试不够
Agent 会根据观察动态改变路径,同一目标可能调用不同工具和步骤。只断言最后一段文本包含某句话,既无法证明外部状态正确,也捕捉不到重复付款、越权读取和无限重试。
测试沙箱提供一个可控的小世界:初始状态已知,允许的动作有限,故障可以按时注入,最终状态可以直接检查。这样才能区分模型随机性、规划错误、工具故障和环境变化。
记忆钩子:Agent 测试不只是“问它一道题”,而是把它放进可重置世界,观察它做了什么以及世界变成什么。
二、每个用例从环境快照开始
用例应声明数据库记录、文件、工具配额、当前时间、用户身份和目标。例如订票测试可预置三趟车、500 元余额和一张已存在订单。执行结束后环境必须恢复,避免上一个用例污染下一个。
| 夹具 | 固定内容 | 断言用途 |
|---|---|---|
| 数据快照 | 商品、订单、版本 | 验证读写结果 |
| 虚拟时钟 | 当前时间与定时事件 | 测超时、过期、时区 |
| 身份权限 | 用户、租户、角色 | 测越权拦截 |
| 资源配额 | token、步骤、工具次数 | 测预算停止 |
容器、临时 schema 或 copy-on-write 文件系统都可实现隔离,选择取决于启动成本和真实性。
三、工具模拟要保持行为契约
简单 mock 只返回成功,会让测试漏掉分页、限流、异步和部分成功。更好的 fake 实现真实 Schema、状态转移与错误码;录制回放可保留真实响应,但要脱敏并处理时效字段。
模拟器应能脚本化,例如第二次搜索返回 429、付款已提交但响应超时、审批回调重复两次。故障点与预期恢复行为写入用例,而不是临时改工具代码。
过度模拟也会与真实服务漂移,所以要有契约测试定期核对 fake 与生产 API 的字段、状态和错误语义。
四、确定性边界要明确
固定温度和随机种子可以降低波动,却不能保证远程模型完全确定。测试不应要求计划文本逐字相同,而要断言允许工具集合、硬约束和最终状态。
允许:先查 A 再查 B,或并行查询 A/B
必须:总价 <= 500,且只创建 1 个订单
禁止:调用 delete_account
对于概率性结果,运行多次统计成功率。例如 100 次完成 93 次,报告 93% 和置信区间,而不是挑一次成功轨迹截图。
五、以状态谓词验证成功
模型说“已经完成”不能作为 oracle。代码任务由测试和文件 diff 判定,交易任务查询订单与余额,研究任务检查必需字段和证据映射。还要断言禁止事项没有发生。
假设目标是创建一个订单,环境中最终订单数为 2,即使回复文本正确也应失败。若订单数为 1,但金额超预算,同样失败。成功是多个状态谓词的合取。
开放式质量可用量表人评或校准评审模型补充,但权限、数量和一致性应由确定性断言负责。
六、故障注入覆盖恢复路径
要在调用前、调用中、外部提交后和结果落库前分别注入故障。它们对应完全不同的恢复策略,尤其能发现写操作重复执行。
1. 请求未发出 -> 可安全重试
2. 服务返回 429 -> 退避
3. 服务提交后响应丢失 -> 查询幂等键
4. 结果保存前进程崩溃 -> 从操作日志恢复
还应注入工具返回恶意指令、超大响应、错误编码、乱序回调和依赖状态变化,确认 Agent 不越权、不循环且能安全停止。
七、安全隔离必须独立于 Agent
沙箱进程使用无生产权限的临时凭证,网络默认拒绝,只开放测试服务;文件系统限制在临时目录,CPU、内存、进程数和运行时间都有上限。即使被测试 Agent 生成危险命令,也无法触达宿主或生产。
测试数据使用合成或脱敏样本。把生产密钥放入沙箱再要求模型不要读取,违背了最小权限原则。日志同样需要脱敏,防止测试失败输出秘密。
测试结束要清理临时资源,但保留安全的 Trace、产物哈希和失败快照用于复现。
八、分层测试控制成本
大量逻辑可在不调用真实大模型的条件下测试:状态机、权限网关、错误分类和幂等属于单元测试;固定模型响应可验证编排;少量模型在线测试再覆盖真实规划差异。
一个测试金字塔可包含 1000 个确定性单测、200 个模拟器集成测试、50 个录制回放和 20 个真实端到端任务。这样既快速发现回归,又不会让每次提交产生昂贵、波动的账单。
指标包括任务成功率、禁止动作次数、平均步骤、P95 成本、恢复成功率和不可复现失败率。失败样例要保存用例版本、模型、Prompt、种子和工具脚本。
九、常见误区与追问
- 误区:把温度设为 0 就能保证测试确定。 远程服务和工具仍可能变化,应断言状态而非逐字输出。
- 误区:所有工具都 mock 成成功最稳定。 这无法覆盖分页、部分成功和恢复路径。
- 误区:最后答案正确就算通过。 还要验证真实状态、权限、成本和禁止副作用。
- 误区:测试环境连生产数据最真实。 风险不可接受,应使用快照、合成数据和无生产权限身份。
- 误区:端到端测试越多越好。 它昂贵且难定位,基础逻辑应由低层确定性测试覆盖。
- 追问:怎样复现偶发失败? 保存完整版本、初始快照、事件脚本和 Trace,在同一沙箱回放。
- 追问:真实模型波动如何设门禁? 多次运行统计成功率和置信区间,并为硬安全断言保持零容忍。
- 追问:如何验证超时后的幂等? 在提交后断开响应,再恢复任务,断言最终只有一个副作用。
十、加强记忆
Agent 测试沙箱记住“快照、模拟、注错、断言、隔离”:从可重置快照启动,用符合真实契约的工具模拟器控制响应,在关键提交点注入故障,以环境最终状态和禁止副作用作断言;运行身份、网络、文件和资源都与生产隔离。概率性模型重复运行看分布,确定性编排大量做低成本测试,失败则保存完整版本与 Trace 供回放。