传统软件测试有一个根本性局限:测试用例是人写的,覆盖的是人能想到的场景。Agent 系统的输入空间是自然语言——无限的、非结构化的、充满意外的。我们的 Nous 知识本体系统有 961 个 unit test,覆盖了 parser、database、sync、gate、verdict 等 20 个模块。这些测试给了我们基本的代码正确性信心。但它们无法回答一个关键问题:在真实的用户请求上,系统表现如何?
Shadow 验证的思想来自大规模互联网服务的灰度发布:在生产流量上并行运行两个系统(或同一系统的两个版本),比较输出,但只有一个系统的结果被实际使用。我们的实现:每次 Ontology Gate 评估一个工具调用时,主引擎给出判定(allow/block),Shadow 引擎独立给出判定,然后比较。不一致的 case 被记录为 divergence,定期分析根因。
两个月积累了 22,792 次调用,consistency rate 99.49%。这个数字意味着每 200 次调用只有约 1 次分歧。分歧分两类:False Positive(主引擎放行但 Shadow 拦截)和 False Negative(主引擎拦截但 Shadow 放行)。FP 率 4.0% 是在 AgentHarm 完整 benchmark(352 cases)上测的——不是我们自己造的测试集,是 ICLR 2025 发表的学术标准。
Shadow 发现了 unit test 找不到的问题。一个例子:Loop 58 中 has_advocacy_signal 规则在特定 phrasing 下会误触发,导致正常学术讨论被标记为 disinformation。这个 pattern 在 961 个 test case 中完全没有覆盖——因为没有人能预想到用户会用那种特定的表述方式。Shadow 抓到了,因为它看的是真实流量。另一个例子:多语言输入(文言文+现代中文混合)导致语义分析偏移,规则触发阈值需要校准。
Shadow 的局限也很明确:它只能发现主引擎和 Shadow 引擎之间的不一致,不能判断谁是对的。一致性 99.49% 不意味着正确性 99.49%——如果两个引擎都犯同样的错,Shadow 检测不到。所以 Shadow 是 unit test 的补充,不是替代。理想的测试金字塔:底层 unit test 保证代码逻辑,中层 Golden Test(我们有 30 题,avg 8.5/10)保证端到端行为,顶层 Shadow 保证生产表现。三者缺一不可。