AB Test Runner
Run structured A/B experiments: hypothesis → design → execute → archive → update findings.
Workflow
CODEBLOCK0
Step 1: Hypothesis
Input from user: a question or claim to test
Your task: Formalize it into the standard format:
CODEBLOCK1
Examples:
- - "自然语言 vs 申论化语言哪个效果好" →
domain: prompt, variable: 语言风格, INLINECODE2 - "语速+15% vs 语速+5%" →
domain: content, variable: TTS语速, INLINECODE5
If the user hasn't specified: Ask 3 questions:
- 1. 你要改变哪个变量?(A 是什么 vs B 是什么)
- 你怎么判断哪个更好?(Cooper 主观评判 / 客观指标 / 两者都有)
- 每组需要多少样本?
Step 2: 操作化定义
Create the experiment manifest before running:
CODEBLOCK2
Rules:
- - 每组样本 ≥10(低于 10 明确标注"方向性信号,非统计显著")
- rubric 多维(3 个维度 + 1 个合规项)比单一分数更抗漂移
- 评分方法必须说明:self(自评)/ cross(交叉评)/ external(独立 agent)
Step 3: 变体设计
Define exactly what each variant receives:
CODEBLOCK3
铁律: 每次只改一个变量。其他所有元素(任务、温度、max_tokens)完全一致。
质量方差: 每个 variant 内的任务要有难度差异,确保输出有高/中/低分布。
Step 4: 执行
并行 subagent 模板
CODEBLOCK4
批量限制: 每次实验最多并发 3 个 subagent,避免 429 限流
交叉评分(如果用 self 评分)
当所有 self 评分完成:
CODEBLOCK5
数据收集
汇总所有结果到 memory/experiments/auto-ab-results.json:
CODEBLOCK6
Step 5: 分析
根据结果判断:
| 条件 | 结论 |
|---|
| A 显著优于 B(效应量大) | INLINECODE7 |
| B 显著优于 A |
refuted(假设方向错误) |
| 部分维度成立 |
partially_confirmed |
| 无差异,样本够 |
inconclusive |
| 样本 <10 |
insufficient_sample |
计算均值差异 + 效应量方向,给出具体结论。
Step 6: 归档
写入 hypotheses registry
INLINECODE12 :追加/更新对应 hyp 条目
写入详细分析
INLINECODE13 :包含完整 rubric、样本统计、结论、后续实验建议
更新模板
INLINECODE14 :
- - 新发现 → 追加到 Section 10 "核心发现"
- 新坑点 → 追加到 Section 11 "已知坑点"
Step 7: 回报给 Cooper
简洁回报格式:
CODEBLOCK7
关键配置
- - 数据文件: INLINECODE15
- 假设注册表: INLINECODE16
- 模板: INLINECODE17
- 坑点:
memory/experiments/AB-test-design-template.md Section 11
已知坑点(执行前必读)
- 1. API token=0: 执行前健康检查,失败立即重试
- 自评膨胀: 不依赖 selfscore 作为唯一指标,用 crossscore 校正
- 迭代拐点: 超过 3 轮迭代质量下降,报告时标注
- 输出非确定性: 每组至少 10 样本抵消随机性
基于 Batch 2(6实验,190样本)+ Hypothesis系列(5假设)实战经验
AB测试运行器
运行结构化A/B实验:假设 → 设计 → 执行 → 归档 → 更新发现。
工作流程
假设 → 操作化定义 → 变体设计 → 执行 → 分析 → 归档 → 模板更新
第一步:假设
用户输入:一个待测试的问题或主张
你的任务:将其规范化为标准格式:
markdown
领域:<提示词|行为|工程|内容>
变量:<你正在改变的内容>
假设:<具体可检验的因果/差异陈述>
示例:
- - 自然语言 vs 申论化语言哪个效果好 → 领域:提示词,变量:语言风格,假设:自然语言比申论化语言产出质量更高
- 语速+15% vs 语速+5% → 领域:内容,变量:TTS语速,假设:语速+15%比+5%完播率更高
如果用户未指定:询问3个问题:
- 1. 你要改变哪个变量?(A是什么 vs B是什么)
- 你怎么判断哪个更好?(Cooper主观评判 / 客观指标 / 两者都有)
- 每组需要多少样本?
第二步:操作化定义
在运行前创建实验清单:
json
{
实验ID: hyp-XXX,
执行时间: ,
领域: ...,
变量: ...,
假设: ...,
每组样本数: <10-30>,
评分标准: {
<维度A>: 0-3 — <标准>,
<维度B>: 0-3 — <标准>,
<维度C>: 0-3 — <标准>,
<篇幅合规>: 0-1 — <标准>
},
成功标准: <假设成立的标准>
}
规则:
- - 每组样本≥10(低于10明确标注方向性信号,非统计显著)
- 评分标准多维(3个维度+1个合规项)比单一分数更抗漂移
- 评分方法必须说明:自评 / 交叉评 / 外部独立评估
第三步:变体设计
精确定义每个变体接收的内容:
变体A — 对照组
- - 提示词:<完整对照提示词>
- 样本任务:<3个代表性任务>
变体B — 实验组
- - 提示词:<只改一个变量的实验提示词>
- 样本任务:<与A完全相同的3个任务>
铁律:每次只改一个变量。其他所有元素(任务、温度、最大令牌数)完全一致。
质量方差:每个变体内的任务要有难度差异,确保输出有高/中/低分布。
第四步:执行
并行子代理模板
生成N个子代理(每组一个,或每个任务一个),任务包含:
- 1. 实验ID+变体标签
- 完整评分标准(让代理知道评分标准)
- 任务描述
- 执行指令:生成输出→按评分标准评分→记录自评分+推理过程
- 输出格式:{ID,变体,输出,自评分,推理过程}
批量限制:每次实验最多并发3个子代理,避免429限流
交叉评分(如果用自评)
当所有自评完成:
再生成1个子代理做盲评:
- - 输入:所有输出的匿名版本(A/B标签打乱)
- 任务:对每个输出按评分标准评分,不知道哪个对应哪个变体
- 输出:{ID,交叉评分,推理过程}
数据收集
汇总所有结果到memory/experiments/auto-ab-results.json:
json
{
实验ID: hyp-XXX,
执行时间: ...,
变体A: { 标签: ..., 样本数: N, 平均分: X.X },
变体B: { 标签: ..., 样本数: N, 平均分: X.X },
胜者: A|B|无,
结论: ...
}
第五步:分析
根据结果判断:
| 条件 | 结论 |
|---|
| A显著优于B(效应量大) | 已确认 |
| B显著优于A |
已反驳(假设方向错误) |
| 部分维度成立 | 部分确认 |
| 无差异,样本够 | 无结论 |
| 样本<10 | 样本不足 |
计算均值差异+效应量方向,给出具体结论。
第六步:归档
写入假设注册表
memory/experiments/auto-ab-hypotheses.json:追加/更新对应假设条目
写入详细分析
memory/experiments/hyp-XXX.md:包含完整评分标准、样本统计、结论、后续实验建议
更新模板
memory/experiments/AB-test-design-template.md:
- - 新发现→追加到第10节核心发现
- 新坑点→追加到第11节已知坑点
第七步:回报给Cooper
简洁回报格式:
实验hyp-XXX | <领域>
假设:<一句话假设>
结果:A胜/B胜/无差异
核心发现:<一句话>
结论:
下一步:<如果要继续,下一步是什么>
关键配置
- - 数据文件:memory/experiments/auto-ab-results.json
- 假设注册表:memory/experiments/auto-ab-hypotheses.json
- 模板:memory/experiments/AB-test-design-template.md
- 坑点:memory/experiments/AB-test-design-template.md第11节
已知坑点(执行前必读)
- 1. API令牌=0:执行前健康检查,失败立即重试
- 自评膨胀:不依赖自评分作为唯一指标,用交叉评分校正
- 迭代拐点:超过3轮迭代质量下降,报告时标注
- 输出非确定性:每组至少10样本抵消随机性
基于第2批(6实验,190样本)+假设系列(5假设)实战经验