Skip to content
比较工程分析
待周评
只改了一句备注,评估通过率为什么从 100% 变成 0%?
开源工程观察 · 实验研究

只改了一句备注,评估通过率为什么从 100% 变成 0%?

真实聚合函数的隔离实验表明:顺序稳定可以与证据冲突被隐藏同时成立。问题不在排序是否确定,而在排序被赋予了怎样的判断权。

2026-09-09English →

只改了一句备注,评估通过率为什么从 100% 变成 0%?

两条评估记录使用同一个编号:一条说通过,另一条说失败。我们没有改它们的结果,只把两条记录的备注 ab 交换了一下。摘要里的通过率从 100% 变成了 0%。

这发生在一次真实聚合函数的隔离实验中,不是线上评分事故。更值得注意的是,模块原有的八项测试仍全部通过,包含“打乱输入顺序,结果保持一致”的测试。

实现确实是确定的。问题在于,它稳定地做出了一个没有证据资格支撑的选择。

测试没有说谎,只是回答了另一个问题

CodeFlowMu 是我们在开发的本地多 Agent 协作系统。它的一个评估辅助模块负责把记录归并成摘要。2026 年 8 月的变更说明已经明确了设计:同编号记录按内容比较选一条,避免结果取决于输入顺序。

这个目标有实际价值。文件枚举顺序、异步返回次序都不适合决定评估结果。但“让选择可重复”与“这个选择有理由”是两件事。

原测试把冲突记录正着输入、倒着输入,检查输出相同。它没有要求摘要同时保留冲突双方,也没有要求出现争议状态。所以,当实现始终选择同一方时,测试自然通过。

这不是一项测试失灵,而是一项未被写进合同的要求:同编号、不同内容究竟是重复观察,还是需要保留的冲突?

备注怎样取得了决定结果的权力

我们直接导入固定版本中的 summarizeEvalOutcomes,输入如下两条虚构记录:

json
[
  {"id":"A","status":"pass","note":"a"},
  {"id":"A","status":"fail","note":"b"}
]

函数先按记录身份分组,再把整条原始对象的键排序、序列化,最后选择字典序较小的一条。比较包括备注字段;在这组输入里,备注先于结果决定胜负。

把通过记录的备注改为 b、失败记录的备注改为 a,通过和失败各一条的事实不变,被保留的那条却换了。

算法没有检查哪一条来源更可信,也没有发现一次正式勘误。它只是比较了字符串。而最终摘要只留下编号、名称和状态,读者已经看不见被淘汰的另一条结果。

八组对照,把问题缩到能确认的范围

我们在两个独立 Node 进程中分别运行八组夹具;每组还比较原序与逆序。以下数字是该函数的输出,不能当作模型可靠率。

条件留下几条被计作重复输出通过率或状态
不同 ID,一条通过、一条失败2050%
同 ID,两条完全相同的通过记录11100%
同 ID,通过备注=a,失败备注=b11100%
同上,仅交换备注110%
同 ID,通过和失败均无备注110%
同测试编号、不同运行编号,没有独立记录 ID11100%
同上,为两次运行各给独立记录 ID2050%
有 ID,没有结果10unknown=1,通过率字段为 0

图:依据本文已保存观测绘制的实验逻辑示意;箭头表示本图标明的处理关系,不是实际运行截图。来源:随文实验附件。

图 1:依据本文已保存观测绘制的实验逻辑示意;箭头表示本图标明的处理关系,不是实际运行截图。来源:随文实验附件。

两轮结果一致。完全相同记录的对照证明,去重本身有必要;问题是当前“重复”计数把镜像记录与互相矛盾的记录放在了一起。

最后一行也很重要:缺少结果时,函数仍保留 unknown,没有把它归为通过。但通过率分母包含这项未知,数值为零,不能再把这个零解释成“一次已经确认失败的测试”。

同一个测试,不代表同一次运行

另一组实验暴露了身份粒度的影响。函数允许用 case_id 作为记录 ID 的后备值。如果同一个测试运行两次,只给相同的测试编号、不同的 run_id,它仍把两条记录合并。

给两次运行各自独立的记录 ID,汇总恢复为一条通过、一条失败,输出 50%。这说明不能直接断言“重复运行一定被吞掉”:正确的调用方可能早已提供独立 ID。需要先核实消费者的输入合同。

重复查询研究提醒人们关注测量波动,但在讨论重复多少次之前,还有一个更基础的检查:这几次是否作为独立观测留下来了。awesome-auditable-ai相关收录提交收窄了论文摘要,避免把特定研究的重复次数结论写成普遍定律。这里引用的是整理决定;本实验没有验证论文的统计方法。

修复前,先决定哪些东西可以合并

一个可供开发评审的方向,是明确区分三种情况:同记录同内容属于重放;同记录异内容属于冲突;同测试不同运行属于独立观测。

冲突双方应保留来源,摘要应让争议可见。备注是否属于内容身份、冲突时通过率应为空还是单独显示区间,都需要合同决定,不能偷偷换成“失败优先”就宣称解决。后者依然是在没有依据时替读者选择一方。

目前,该模块已进入开发评审材料。我们尚未找到生产调用入口,因此评审的第一项是确认消费者、影响面和继续保留该辅助模块的必要性,而不是把实验发现包装成线上紧急事故。

本轮的证据范围是一个历史变更包、当前纯函数和八组隔离夹具;不是生产样本统计。固定源码版本为 c008d9db91a21136fc61a4f60314e22db395d5d2。原始观测、字段定义与来源摘要见随文证据说明;产品源码的公开范围另行审查,不把本机路径留给读者充当证据。

确定性仍然值得要求。它让同一问题得到同一回答;冲突保全则让我们知道,这个问题是否已经有资格得到一个单一回答。

Last updated: