KEEL · 龙骨 · A CURRICULUM FOR THE AI ERA
10. 怎样把一次运行还原出来? — keel 龙骨
当用户说“Agent 做错了”,你需要能够回答:它看到了什么、模型提出了什么、程序允许了什么、工具实际发生了什么。只保存最后一句回答是不够的。
当用户说“Agent 做错了”,你需要能够回答:它看到了什么、模型提出了什么、程序允许了什么、工具实际发生了什么。只保存最后一句回答是不够的。
用事件重建时间线
run.started
model.requested
model.response.received
decision.parsed
tool.started
tool.succeeded
model.requested
run.completed
每条事件至少带 run_id、event_id、sequence、类型、时间和脱敏后的数据引用。事件记录已经发生的事实;当前状态保存下一步该做什么。
测试分成三层
协议测试
固定输入验证模型响应是否能转换成内部 Decision,工具结果是否满足 schema。
控制测试
固定 Decision 验证未知工具、权限拒绝、最大步数、取消和审批状态。它们不能依赖模型随机性。
模型评估
使用真实模型评估工具选择、参数正确率、最终回答是否引用工具证据。模型评估不能替代前两层。
用回放定位问题
一次运行应能保存足够的版本信息:
model_name / model_version
prompt_version
tool_version
policy_version
run state
event sequence
回放时可以用原始 Decision 和固定 ToolResult 复现 Harness 控制逻辑,也可以重新调用模型比较版本差异。不要把“重新问一次模型”当成回放,因为模型本身是概率系统。
评估什么指标
| 目标 | 指标示例 |
|---|---|
| 决定解析 | 解析成功率、非法决定率 |
| 工具选择 | 选择准确率、参数错误率 |
| 运行控制 | 完成率、limit_reached、取消响应时间 |
| 工具执行 | 成功率、P95 延迟、未知结果数量 |
| 安全 | 未授权执行率,目标为 0 |
| 用户任务 | 诊断正确率、用户修正次数、成本 |
故意注入三个失败
- 让模型返回未知工具,检查运行是否以
unknown_tool收束; - 让只读工具超时,检查是否保留
tool_timeout事件; - 在收到工具结果后取消运行,检查迟到结果不能改写为成功。
每次失败都要能从事件序列解释,而不是只看到一个异常堆栈。
本章自测
如果最终答案错误,你能否通过日志区分:模型选错工具、工具返回错误、Context Builder 丢掉证据,还是权限策略错误?如果不能,说明事件字段或版本信息还不够。