研究者让AI独立为业务决策逻辑编写测试用例,50次重复生成中49次完整覆盖6类边界缺陷,验证了AI生成测试用例的可靠性。
我一直在尝试一个具体的问题:AI 能否独立编写出挑战结构化业务决策逻辑所需的测试用例?
假设有一个供应商筛选策略,包含制裁规则、国家限制、个人数据条件和风险阈值。如果该策略被转换为可执行的决策逻辑,仍然需要有人来测试那些难以触及的边界——恰好 70 与略低于 70 的区别、制裁名单成员是否被正确处理、以及涉及个人数据时条件是否发生变化。
在早期的 Judgment Pack 评估器实验中,我给了一个独立 AI 模型该策略,并要求它在不看 Judgment Pack 或后续待测缺陷的情况下编写这类记录。
在编写调用之前,六类潜在缺陷已经被确认。
该模型编写了覆盖全部 6 类的记录。
这很令人鼓舞,但它只回答了一个问题:
它没有回答更重要的可靠性问题:
如果我让它做同样的工作,它能在多少次中覆盖这些边界?
单次成功生成可能只是一个幸运的随机结果。
因此 Study 011 将相同的盲写任务重复了 50 次。
对于这个特定实验设置,结果很引人注目:
49 次运行通过了预先注册的流水线检查
1 次运行在评分前被拒绝
全部 49 次有效运行覆盖了全部六个边界类
每次有效运行都产生了恰好 16 条被接受的记录
784 条被接受的记录全部与参考策略语义一致
49 次有效完成全部各不相同
对于这个 prompt、这个模型、这个合成策略,"多长时间一次?"的答案是:
在我们观察到的每一次有效运行中。
这听起来是个完美的结果。
而理解其背后的原因才是实验有趣的部分。
我正在开发一个叫做 Judgment Pack Specification 的开源项目。
我正在探索的一个领域是 AI 能否帮助人类编写围绕组织决策逻辑的结构化测试用例。
想象一个包含如下规则的供应商筛选策略:
制裁匹配会产生硬性停止
注册在禁运国家的供应商需要不同的结果
风险分数 70 跨越了高风险边界
处理个人数据会将阈值改变为 40
这些规则产生了边界。
而边界正是微妙错误藏身之处。
risk = 69.99
risk = 70
risk = 70.01
如果策略规定的是:
risk >= 70
这三个值可能代表三种完全不同的情况。
同样的问题出现在个人数据阈值附近:
39.99
40
40.01
如果 AI 要帮助为这些规则编写测试,我不只关心它是否注意到了一次边界。
我想知道它能多么一致地注意到它。
Study 011 问的是"多长时间一次?"
实验使用了一个固定的实验单元:
一个模型 - gpt-5.6-sol
一个固定的合成策略
一个固定的 CLI 和二进制文件
每次调用使用全新的隔离环境
50 次顺序编写调用
六个预先注册的覆盖类别
prompt、策略族、二进制文件、环境捕获和预注册全部经过摘要锁定。
评分规则在看批量结果之前就已确定。
没有竞争分支,也没有假设检验。
这项研究只是在估计一个频率。
六个边界类别在批量运行前就已注册。
类别 0 - 精确高风险边界
No sanctions hit
Non-embargoed country
risk = 70
这针对的是一个常见实现错误:
risk > 70
risk >= 70
该模型独立编写了如下名称的记录:
exact-high-risk-threshold
northstar-risk-seventy
alpine-exact-seventy
summit-exactly-seventy
每次有效运行都包含一个在此边界上正确标记的记录。
[0.9275, 1.0000]
类别 1 - 70 上方的 off-by-one 区域
下一个类别测试的是:
70 <= risk < 71
想象有人不小心把阈值从:
>= 70
改成了:
>= 71
只测试 70 和 80 可能会错过关于该区域的有用信息。
所编写的记录包括以下名称代表的案例:
fraction-above-high-risk-threshold
atlas-risk-seventy-decimal
harbor-above-seventy
baltic-risk-above-seventy
类别 2 - 40 处的个人数据边界
策略在供应商处理个人数据时也会改变行为。
handles personal data
40 <= risk < 41
它旨在暴露如下低边界变更:
risk >= 41
risk >= 40
独立编写的记录示例包括:
personal-data-exact-threshold
harbor-data-risk-forty
bluebell-personal-data-at-forty
maple-data-forty
类别 3 - 内部决策区域
40 <= risk < 70
个人数据标志为任意值。
这是有意设计得较宽的区域。
该模型在该空间中反复生成了多条记录,包括以下标签的示例:
personal-data-mid-band
no-personal-data-mid-band
fjord-data-midrange
andes-no-data-moderate-risk
类别 4 - 成员资格而非算术
并非每个策略缺陷都是数值阈值。
另一类别测试了注册在叙利亚的供应商:
registered country = SY
这是为了捕捉 SY 从禁运名单中消失的变更。
该模型反复产生了如下示例:
syria-registration-high-risk
damascus-embargo-high-risk
levant-syria-high-risk
levant-cloud-embargo
因此编写行为并不局限于发现数值边界。
类别 5 - 有趣的那一个
最后一个类别测试的是:
handles personal data
39 <= risk < 40
这个类别值得特别关注。
合成策略文本明确提到了 40 处的阈值。
它没有明确说:
请测试 39 处的隐藏族边界。
然而全部 49 次有效运行都产生了一条该区间内的记录。
实际数值非常揭示真相:
所以该模型一直在生成一个"刚好低于 40"的案例。
personal-data-just-below-forty
fjord-data-below-forty
maple-data-below-threshold
cedar-data-below-forty
这在技术上覆盖了注册的类别。
但它不能证明该模型发现了 39 处某个隐藏的语义阈值。
一个简单得多的解释符合证据:
prompt 要求在所述阈值 40 附近的边界情况,而该模型生成了恰好低于 40 的值。
这个区别很重要。
解释必须保持狭窄。
每个比率具有相同的精确 95% Clopper-Pearson 置信区间:
[0.9275, 1.0000]
这个区间很重要。
观察到 49 次成功 / 49 次有效运行并不能确立真实的 100% 比率。
在这个样本量下,实验无法区分:
"在此实验单元下至少约 92.75%"
这就是为什么我更倾向于报告:
49 / 49
95% CI [0.9275, 1.0000]
而不是简单地说:
100% 可靠
另一个结果让我惊讶。
全部 49 次有效完成都各不相同。
最大的字节完全相同的输出组是:
1
所以这不是一个被意外重复计数了 49 次的缓存完成。
该模型在各次运行中变化了名称、示例和记录组成。
例如,精确 70 的案例出现了以下不同名称下:
exact-high-risk-threshold
northstar-risk-seventy
atlas-risk-threshold
alpine-security-threshold
granite-risk-seventy
summit-risk-threshold
表面形式改变了。
边界覆盖没有改变。
这是一种有趣的可靠性形式:
不同的生成收敛到了相同的重要语义区域。
但即便如此也有局限性。
不同的输出不能证明统计上独立的抽取。
提供者端的跨会话行为无法从保留的 artifact 中观察。
研究记录了这个局限性,而不是假装它能证明独立性。
每次有效运行产生了恰好:
16 条记录
49 x 16 = 784 条被接受的记录
对照研究的策略镜像:
与策略一致的记录:784
标签错误的记录:0
被丢弃的记录:0
所以合并的标签一致性是:
784 / 784 = 1.000
我有意不为这个数字附加二项式置信区间。
单次完成内的 16 条记录不是独立试验。
将全部 784 条记录视为独立观察会使精确度看起来比实际强得多。
运行仍然是有效的重复单元。
Run 026 没有被评分。
模型进程本身成功退出了。
但预 prompt 开发者上下文与锁定的 golden 上下文不匹配。
因此流水线返回了:
transcript-refused
并在查看其编写记录之前就排除了该运行。
观察到的流水线无效比率是:
1 / 50 = 2%
95% 置信区间为:
[0.05%, 10.65%]
可能的解释是服务端样板变化。
但研究刻意不检查被拒绝的转录并说:
这个差异看起来无害,我们还是把它算进去吧。
这会破坏使用允许列表的意义。
上下文匹配注册的环境
-> 接纳
上下文不同
-> 拒绝
我实际上觉得这个结果有用。
模型编写行为看起来非常稳定。
实验流水线并不完美。
这是两个不同的可靠性问题。
在运行批量之前,研究注册了一个从观察到覆盖到审核深度的简单映射。
它使用置信区间的下界:
下界 >= 0.80 -> 轻度审核
下界 >= 0.40 -> 标准审核
下界 < 0.40 -> 完整审核
高标签错误率可以升级审核层级。
全部六个类别的最终结果是:
下界 = 0.9275
错误标签比例 = 0
层级 = 轻度
所以在预注册的映射下,每个类别都接收:
轻度审核。
这并不意味着 AI 编写的策略 artifact 不再需要人类。
审核层级映射本身是实验性的,尚未经过操作验证。
但它指向了一个有趣的方向。
与其将每个 AI 编写的规则或测试用例视为同等可信,也许审核深度最终可以依赖于关于编写过程的实证证据。
AI 编写候选记录
|
v
测量历史覆盖 / 错误率
|
v
分配置信度
|
+------ 高置信度 ------> 轻度审核
|
+------ 不确定 ------------> 标准审核
|
+------ 证据薄弱 --------> 完整审核
这更接近我最终想要的 AI 辅助编写。
"模型写的,相信它。"
"模型写的,人工重做一切。"
"我们有的是关于这个编写过程在哪里强大、人类应该在哪里花时间审核的测量证据。"
这是最重要的部分。
结果并不意味着:
AI 可以可靠地编写任意组织判断。
这个 prompt、这个模型、在这个小型合成策略上,反复产生了正确标记的记录,覆盖了这六个注册类别。
其他不能自动迁移。
只测试了一个模型配置。
不同的模型可能有不同行为。
prompt 明确要求边界情况。
这可能对天花板结果有很大贡献。
这是一个小型合成策略。
策略有几个阈值、一个成员资格规则、制裁逻辑和一个个人数据条件。
真实的组织策略可能包含:
相互作用的异常
冲突的权限
人工审批要求
这些可能产生非常不同的比率。
镜像不是真实基准
"正确标记"意味着编写的结果与研究的确定性镜像一致。
提供给模型的相同策略在该镜像中实现。
784 / 784
衡量的是与所提供的策略语义的一致性。
它不能独立证明这些语义在现实世界中是正确的。
覆盖不是缺陷检测
Study 011 从未评估突变的 Judgment Pack。
它问的是独立编写的记录是否落在可能暴露注册缺陷的区域。
Study 010 进行了单次缺陷检测抽取。
Study 011 测量了其背后编写覆盖的可重复性。
这些是有意分开的声明。
在这项实验之前,我主要将 AI 辅助编写想象为:
策略
|
v
AI
|
v
候选结构化 artifact
|
v
人工审核
我现在认为更好的模型可能是:
历史评估
|
v
策略 -> AI 编写 -> 候选 artifact
|
v
自动验证
|
v
置信度估计
|
+----------+----------+
| | |
轻度 标准 完整
审核 审核 审核
|
v
授权批准
|
v
版本化 artifact
有趣的问题变得不那么是:
AI 能编写 artifact 吗?
前沿模型越来越能。
更难的问题是:
这个特定生成 artifact 值得多少审核?
这可能是我们能够衡量的。
显然的下一步实验不是这个相同单元的另外 50 次运行。
这一个已经在天花板上了。
有用的下一个变量是这项研究刻意保持不变的变量。
使用具有交互规则和异常的更大策略。
覆盖是否保持在接近天花板的水平?
在多个模型家族上运行相同的注册任务。
边界类别是否保持稳定?
移除边界导向的措辞
如果 prompt 停止明确要求边界情况,类别如:
39 <= risk < 40
会发生什么?
这将有助于将一般语义发现与 prompt 诱导的测试生成分离开来。
当策略本身包含:
不完整的证据要求
描述和可执行条件不一致
会发生什么?
这更接近真实的编写问题。
独立编写者可以覆盖全部六个类别。
Study 011 告诉我更强的东西:
在这个精确的实验设置下,这种覆盖是观察到的典型行为,而不是幸运的单次运行。
但更重要的教训是方法论的。
一次令人印象深刻的 AI 输出是一个逸事。
重复输出给你一个比率。
比率给你不确定性。
而不确定性可以开始告知 AI 生成的 artifact 值得多少人工审核。
50 次调用
49 次有效
49 / 49 次有效运行覆盖了全部六个类别
784 条被接受的记录
0 条观察到标签分歧
49 次不同完成
1 次流水线拒绝
证明 AI 可以在无需审核的情况下安全地编写组织判断?
下一步工作是找到这些数字在哪里不再保持这么干净。
实验、预注册、保留的 artifact、评分器和分析都位于开源 Judgment Pack 评估器实验仓库中。
我特别欢迎你认为会打破这种编写方法的对抗性策略示例。