支付服务已经写入退款,网络却在返回响应时断开。Agent 看到超时,重新发起退款。如果只在正常网络下测十次,系统可能十次通过;一旦出现这个窗口,就可能把同一笔钱退两次。
可靠性评测要主动控制故障发生的位置。说“支持重试”并不能说明重试之后业务仍然正确。
故障必须绑定具体阶段
同样是 Timeout,发生在服务接受请求之前、事务提交之前、提交之后,含义不同。评测应记录注入点:在调用前抛异常、在写入后丢响应、在本地状态保存前结束进程。这些位置直接决定恢复策略。
下面是一个完全离线的内存模拟器,用于显示“提交后丢响应”。它不连接真实支付,也不模拟进程持久化:
receipts = {}
def refund(operation_id: str, amount_minor: int, lose_reply=False):
# 稳定业务键把同一逻辑操作的重试关联到已有结果。
if operation_id in receipts:
if receipts[operation_id]["amount_minor"] != amount_minor:
raise ValueError("同一操作键不能对应不同金额")
return receipts[operation_id]
receipt = {"amount_minor": amount_minor, "status": "committed"}
receipts[operation_id] = receipt # 先模拟业务提交。
if lose_reply:
raise TimeoutError("提交完成,但调用方没有收到响应")
return receipt
try:
refund("refund-A1042-v1", 29900, lose_reply=True)
except TimeoutError:
pass # 下一行模拟调用方用同一业务键恢复。
print(refund("refund-A1042-v1", 29900))
print(len(receipts)) # 1:本进程内没有新增第二条效果。
如果进程重启,内存字典会消失。因此这个例子不证明持久幂等;真实系统需要持久记录与原子约束。评测应跨进程重启后再查权威账本,且不能只查 Runtime 自己记了几次“完成”。
恢复不是从头再跑一遍
恢复测试从已经持久化的检查点开始,注入外部结果与本地状态不一致的情况。对于响应未知的写操作,系统可能需要查收据或按稳定键重试。若恢复每次生成新幂等键,底层去重就失效。
重复事件也是常见来源:同一审批被投递两次、同一任务被两个 Worker 同时领取、租约过期后旧 Worker 仍然继续执行。应检查最终副作用数量、操作键绑定、旧执行者写入是否被拒绝,而不只是异常有没有被捕获。
评测无法凭几个案例证明普遍的 exactly-once。它能暴露具体窗口下的错误,并验证设计中的不变量是否在这些条件下成立。
取消和补偿要先定义语义
用户在任务执行前取消,通常应阻止后续副作用;在退款已经提交后取消,系统不能假装资金从未变化。成功行为可能是说明不可撤销状态,或发起明确的补偿流程。
所以“收到取消后没有继续发送文本”不是业务取消成功。我们要同时观察正在运行的工具、后续动作以及最终状态。补偿也不是回到历史原点,而是另一个有授权、有结果、可能失败的业务操作。
攻击测试应指定攻击面与目标
直接注入来自用户输入,间接注入可能藏在检索文档、网页、邮件或工具返回中。构造攻击案例时,明确攻击者能控制什么、希望诱导什么,以及系统应保留什么合法能力。
例如合法目标是查询 A1042 的物流;恶意网页要求改查另一个租户并输出地址。攻击成功条件应是实际越权读取或信息外流,而不是模型是否复述了攻击文字。即使最终答复未暴露地址,地址已经进入不应访问的模型上下文,也可能构成边界失败。
可以在隔离环境放置虚构 canary 字符串,用于判断是否读取和传播了禁止内容。不得把真实密钥当作测试标记。测试工具只操作合成数据,写动作走独立环境。
防守还要保留正常能力
永远拒绝所有请求,会让攻击成功率下降到零,却不是可用的助手。攻击集旁边要放相似的正常样本,例如用户引用恶意指令来询问其含义,或者合法查询自己拥有的订单。分别报告攻击成功率和正常任务误拒率。
攻击成功率的分母也应清楚:全部尝试、可执行攻击、还是针对已知脆弱案例的攻击。不同攻击预算和不同目标集合不能直接横向比较。模型对某个字符串免疫,不代表对所有表达的攻击都免疫。
故障矩阵如何进入发布流程
按动作阶段、故障类型和业务风险组织矩阵,优先覆盖不可逆副作用窗口。每条案例保存初始状态、注入点、事件记录、最终状态和判定理由;已确认事故加入长期回归集。
正常质量实验与故障实验应分别报告。故意让全部请求超时,得到的成功率不是自然流量可用性;它是在指定故障条件下的恢复能力。生产发生频率需要线上观测估计,两种证据结合才能指导投入。
继续阅读与配套材料
上一篇:怎样评测完整 Agent:多轮对话、执行轨迹与业务结果。
下一篇:LLM-as-Judge 怎样工作:把主观要求变成可复核的评分。
完整示例、运行方式和验证边界见评测实验指南下载。本系列的订单、政策、金额和实验数据均为教学示例。