智能体动作空间的可达性分析:为你从未测试过的分支提供评测覆盖
你的团队第一次意识到 Agent 可以调用 revoke_api_key 是在某个早晨,一位好心的用户输入了:“这个 Token 感觉太旧了,能帮我轮换一下吗?” 这个工具是在六个月前作为认证团队 MCP 服务批量导入的一部分注册的。它通过了 Schema 验证,出现在目录枚举中,然后就一直闲置在那里。没有任何评测(Eval)调用过它,也没有任何生产环境追踪(Trace)触及过它。直到某条提示词(Prompt)、某个规划器(Planner)决策,事件频道(Incident Channel)才发现该工具竟然存在。
这就是隐藏在每一个拥有复杂工具目录的 Agent 中的失效模式。四十个注册函数和一个可以组合它们的规划器,产生了一个你从未观察到的计划可达图的长尾。假设“我们测试了常用路径”掩盖了一个事实:危险的分支几乎从定义上来说就是你从未见过的那一个。
好消息是,这个问题并不新鲜。五十年来,编译器一直在处理类似的问题 —— 控制流图中哪些路径是实际可达的,哪些是死代码。通过调整,这门学科可以迁移到 Agent 动作空间。坏消息是,大多数团队还没有完成这种迁移,因此他们的工具目录增长速度超过了评测覆盖范围,“拥有的工具”与“验证过的工具”之间的差距在悄然扩大。
你的工具目录是一个控制流图
从底层对象开始。工具目录不是一个列表。它是一个图,其节点是工具,边是规划器允许的组合,入口点是用户可能发送的提示词。动作空间是从任何入口点到任何终止状态在这个图上的有限路径集合。
动作空间的大小不是目录的大小。拥有 40 个工具且平均计划深度为 4,不同计划的上限达到数百万个。在实践中,大部分上限是不可达的 —— 规划器的策略、提示词分布以及工具输出依赖关系修剪了大部分边 —— 但“大部分”这个词背后隐藏了大量工作。可达子图是你的评测(Eval)需要覆盖的内容,而它总是比你实际评测覆盖的内容大得多。
在编译器设计中,可达性分析回答了这样一个问题:从程序入口开始,哪些基本块(Basic Blocks)可以通过某些执行被访问到?经典的算法是标记-清除(Mark-and-Sweep) —— 最初将每个块标记为不可达,然后从入口开始遍历,标记触及的所有内容。任何未标记的内容都是“死”的,可以删除。重点不在于死代码是错误的,而在于它是未经审计的:编译器无法推断其影响,测试套件无法执行它,任何到达它的执行路径都是分析未预测到的。
将同样的算法应用于你的 Agent,会得到一些有用的东西。将你的生产环境追踪(Production Traces)和评测追踪(Eval Traces)视为动作图上已观察到的路径集。标记每个追踪执行过的(工具、前任、继任)三元组。未标记的子图就是你未经审计的表面。
“不可达”在 Agent 领域究竟意味着什么
编译器类比需要一个重要的修正。在编译后的程序中,不可达代码被证明永远不会执行;分析是可靠的(Sound),因为语言语义是确定性的。但在 Agent 中,规划器是一个随机策略,其输出分布在你每次更改提示词、更换模型、添加工具或更新系统消息时都会发生偏移。一个从未被观察到的分支并不代表它是不可达的,而是“未观察到的”。这种区别很重要,因为在未观察到的分支和生产环境调用之间,唯一的障碍就是一个将规划器推向它的用户提示词。
因此,正确的模型不是“可达 vs. 死亡”,而是“已练习 vs. 未练习”。每个未练习的分支都带有被触达的概率以及被触达后的爆炸半径(Blast Radius)。这两者的乘积就是该分支的风险评分,而评测的优先级问题也就显而易见了:将覆盖预算花在乘积最大的地方,而不是最容易编写分支的地方。
经典软件测试文献多年来一直以“基于风险的覆盖”为名进行此类论证。核心发现 —— 风险加权测试比均匀覆盖在单位测试时间内能发现更多缺陷 —— 对 Agent 而言更加正确,因为动作空间巨大,且为每个分支编写评测的成本极高。你无法测试所有内容,但你可以测试那些一旦失败就会产生严重 后果的内容。
从追踪(Traces)中构建动作图
大多数团队并没有明确的动作图。他们拥有注册的工具目录、OpenTelemetry 跨度(Span)流以及有机增长的评测套件。第一项工作是推导出团队隐式运行的图。
构建过程是机械化的。从工具目录中枚举节点。从规划器公开的功能(Affordances)中推导出边 —— 哪些工具可以衔接哪些工具,哪些需要依赖先前输出的参数形式,哪些策略层禁止某些组合。从追踪流中,将每个观察到的计划映射到图中,并递增它穿过的每条边的访问计数。从评测套件中,进行同样的映射,并标记被任何评测覆盖的边。
现在,图有了注解。每条边都有生产频率、评测覆盖标记以及工具团队在注册工具时设置的静态爆炸半径标签。没有追踪的边是未观察到的。有追踪但没有评测的边是“已观察但未受保护”的 —— 仅由工具作者测试过的内容覆盖,对于许多工具来说,这仅仅是能让该季度的集成测试通过的内容。
此时最有用的产物不是指标,而是热力图。布置好图表,将高爆炸半径的边着色为红色,低爆炸半径的边着色为绿色,并对未观察且未受保护的边使用阴影图案。红色加阴影的单元格就是你的评测待办事项,其排序依据比工具注册的先后顺序要科学得多。
