3.2 可验证性原则
本节阐述可验证性原则的含义,说明其在生产系统中的重要性,深入讨论可验证性的三个层次及其实现方法。
3.2.1 原则的核心
可验证性 意味着:系统的每一个行为都应该是可观察的、可审计的、可重放的。当被问“Agent做了什么?”和“为什么这样做?”时,系统应该能够提供清晰、完整的答案。
这一原则在智能体时代变得尤为关键。传统软件的行为由预先编写的代码决定,而 Agent 的行为路径是 LLM 在运行时动态生成的——这些被称为“暗码(Dark Code)”的运行时行为执行完毕后即消散,无法像源代码一样被事先审查或精确复现。可验证性正是 Harness 对抗暗码的核心武器:通过将“即生即灭”的行为转化为“可观察、可追踪、可重放”的记录,让动态行为获得与静态代码同等的可审计性。
可验证性涵盖三个层面:
可观察性:看得见智能体在做什么
可追踪性:追踪来自何处,去往何处
可重放性:给定相同的输入,能够重现相同的结果
3.2.2 为什么可验证性至关重要
本小节通过具体问题场景、法规要求和技术挑战,说明可验证性为什么是系统可靠运行的基础。
问题场景
想象以下情况:
智能体执行了一个转账操作,但钱到了错误的账户
Agent生成了一个不符合规范的法律文件,造成了合规问题
Agent多次调用同一个API,导致重复扣款
在这些情况下,最紧迫的问题是:发生了什么?以及为什么?
如果系统不可验证,这些问题就无法被回答。开发者只能:
陷入无尽的调试
无法向用户解释
无法修复根本原因
可验证性的价值
1. 快速诊断 有完整的审计日志和执行追踪,我们可以立即看到问题发生的位置。
2. 用户信任 当用户询问“这笔钱去哪了?”,如果我们能够提供详细的操作日志,用户会更有信心。
3. 法律合规 许多行业(金融、医疗、法律)都要求对所有关键操作进行审计。
4. 系统改进 通过观察和分析执行数据,我们能够识别出系统的瓶颈和改进空间。
3.2.3 可验证性的三个层次
本小节从基础到高级,分别介绍操作日志、执行追踪和可重放性三个层次的可验证性,以及它们的实现方法。
第一层:操作日志
最基础的可验证性:记录发生了什么。
第二层:执行追踪
更高级的可验证性:记录操作之间的因果关系。
第三层:可重放性
最高级的可验证性:给定相同的输入,能够重现执行过程。
3.2.4 生产系统中的可验证性实践
Claude Code 使用 OpenTelemetry 标准进行追踪,这使得可以与许多现成的 APM 工具集成:
这种标准化的追踪方式的好处是:
可以与Jaeger、Zipkin等可视化工具集成
支持分布式追踪(跨多个微服务)
标准的性能分析
OpenClaw的Lobster引擎特别强调可重放性。每个工作流的执行都被记录在一个确定性的日志中:
Lobster的特点:
确定性:给定相同的workflow和输入,执行顺序总是相同
可重放:可以从任何步骤重新开始执行
可审计:完整的操作历史,精确到每一步
3.2.5 可验证性在实战中的应用
场景:转账操作
一个典型的转账操作应该被追踪如下:
Trace ID: trace-2024-04-01-001
1
Parse Request
{"from": "ACC001", "to": "ACC002", "amount": 1000}
{"from_account": {...}, "to_account": {...}}
2ms
2
Check Balance
{"account_id": "ACC001"}
{"balance": 5000}
15ms
3
Validate Transaction
{"amount": 1000, "available_balance": 5000}
{"valid": true}
1ms
4
Create Transaction Record
{"from": "ACC001", "to": "ACC002", "amount": 1000}
{"transaction_id": "TXN12345"}
50ms
5
Execute Transfer
{"transaction_id": "TXN12345"}
{"status": "completed"}
100ms
6
Send Confirmation
{"transaction_id": "TXN12345"}
{"notification_sent": true}
30ms
总耗时: 198ms 最终状态: Success
当用户问“我的转账怎么样了?”,我们可以立即从这个追踪中回答:
什么时候执行的? 2024-04-01 at 10:30:00
执行了哪些步骤? 6个步骤,每一步都成功了
如果失败了,在哪个步骤失败?(不适用,这里全部成功)
整个过程花了多长时间? 198毫秒
3.2.6 实现可验证性的最佳实践
本小节介绍实现可验证性的具体方法,包括结构化日志、链接日志和追踪、定期验证和用户可读摘要。
1. 使用结构化日志
结构化日志使用JSON格式记录关键字段,便于验证和审计:
2. 链接日志和追踪
通过trace ID将分布式日志和追踪关联起来,实现全链路可观测性:
3. 定期验证一致性
通过重放历史执行来验证系统行为的确定性和一致性:
4. 提供用户可读的摘要
虽然完整的追踪对于调试很有用,但用户通常需要一个简化版本:
3.2.7 总结
可验证性原则的关键要点:
三个层次:操作日志 → 执行追踪 → 可重放性
结构化数据:使用统一的格式,便于机器和人类读取
完整的链路:从请求到响应,每一步都能被追踪
可视化:提供人类可读的总结和可视化工具
定期验证:通过重放,验证系统的一致性
实现可验证性看起来增加了复杂性,但它的回报是巨大的:快速诊断、用户信任、法律合规、系统改进。
最后更新于
