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
用户任务 诊断正确率、用户修正次数、成本

故意注入三个失败

  1. 让模型返回未知工具,检查运行是否以 unknown_tool 收束;
  2. 让只读工具超时,检查是否保留 tool_timeout 事件;
  3. 在收到工具结果后取消运行,检查迟到结果不能改写为成功。

每次失败都要能从事件序列解释,而不是只看到一个异常堆栈。

本章自测

如果最终答案错误,你能否通过日志区分:模型选错工具、工具返回错误、Context Builder 丢掉证据,还是权限策略错误?如果不能,说明事件字段或版本信息还不够。

下一章:把脚本放进 API 和 worker

进入 keel 阅读