3.2 可验证性原则

本节阐述可验证性原则的含义,说明其在生产系统中的重要性,深入讨论可验证性的三个层次及其实现方法。

3.2.1 原则的核心

可验证性 意味着:系统的每一个行为都应该是可观察的、可审计的、可重放的。当被问“Agent做了什么?”和“为什么这样做?”时,系统应该能够提供清晰、完整的答案。

这一原则在智能体时代变得尤为关键。传统软件的行为由预先编写的代码决定,而 Agent 的行为路径是 LLM 在运行时动态生成的——这些被称为“暗码(Dark Code)”的运行时行为执行完毕后即消散,无法像源代码一样被事先审查或精确复现。可验证性正是 Harness 对抗暗码的核心武器:通过将“即生即灭”的行为转化为“可观察、可追踪、可重放”的记录,让动态行为获得与静态代码同等的可审计性。

可验证性涵盖三个层面:

  1. 可观察性:看得见智能体在做什么

  2. 可追踪性:追踪来自何处,去往何处

  3. 可重放性:给定相同的输入,能够重现相同的结果

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的特点:

  1. 确定性:给定相同的workflow和输入,执行顺序总是相同

  2. 可重放:可以从任何步骤重新开始执行

  3. 可审计:完整的操作历史,精确到每一步

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 总结

可验证性原则的关键要点:

  1. 三个层次:操作日志 → 执行追踪 → 可重放性

  2. 结构化数据:使用统一的格式,便于机器和人类读取

  3. 完整的链路:从请求到响应,每一步都能被追踪

  4. 可视化:提供人类可读的总结和可视化工具

  5. 定期验证:通过重放,验证系统的一致性

实现可验证性看起来增加了复杂性,但它的回报是巨大的:快速诊断、用户信任、法律合规、系统改进。

最后更新于