ContractQA 调参日志 · 2026-05-28 → 05-29 · Entry 0–12
13 次系统调参,把 ContractQA 从一条昂贵的 Opus 基线,做成了一套 更准、更快、便宜 20 倍的 Haiku 默认配置—— 覆盖率、bug 检出率、墙钟时间、成本,四项指标同时拿下新高。
01最终结果
最新默认配置(Haiku 4.5 · docker 并行 · Reflexion · harness-off)跑 WebTestBench 10 个 app, 10/10 全部完成,每一项聚合指标都刷新了 13 条日志里的历史最佳。
把最贵的模型(Opus)换成最便宜的模型(Haiku),靠工程调参反而做出了更好的产品质量——这正是产品价值的核心证明:能力来自方法,不来自烧钱。
02调参之路
Entry 12 不是一次运气。它是把前 12 条日志里每一个被验证有效的杠杆叠在一起的结果。 下面这条流水线,就是产品逐步变强的真实路径。
flowchart LR E0["Entry 0
Opus 基线
53.8% / 35.3%"] L1["① 分类 CoT 提示词
constraint/interaction
+100pp"] L2["② 重试退避
3/10 → 10/10
完成率恢复"] L3["③ Harness 诊断
定位 403 根因
关掉反而更好"] L4["④ Agentic 搜索
SDK 子进程
+22 契约 +72 交互"] L5["⑤ Reflexion
首次 content 类
契约落地"] L6["⑥ Docker 并行
concurrency=3
3.2× 提速"] E12["Entry 12
新默认配置
61.2% / 47.7%"] E0 --> L1 --> L2 --> L3 --> L4 --> L5 --> L6 --> E12 classDef base fill:#F4F4F1,stroke:#D4D4CD,color:#0A0A0B; classDef lever fill:#FFFFFF,stroke:#D4D4CD,color:#0A0A0B; classDef hero fill:#FFF3B0,stroke:#0A0A0B,color:#0A0A0B,stroke-width:2px; class E0 base; class L1,L2,L3,L4,L5,L6 lever; class E12 hero;
Entry 4–9 是一段被服务端 403 / 限流卡住的"黑暗期"——但每一次失败都换来了对系统更精确的诊断,最终让 Entry 10–12 一举打通。
03覆盖率
关键里程碑的平均契约覆盖率。终点 Entry 12 不仅回到高位,而且超过了昂贵的 Opus 起点。
Entry 11 的 25% 是换了模型(MiniMax)的中间实验——数字不直接可比,但它换来了关键突破: 第一次跑出了 Reflexion 的 content 类契约。Entry 12 把这个能力带回 Haiku,结果一举登顶。
04Bug 检出率
覆盖率衡量"测了多少",bug 检出率衡量"真抓到多少"。Entry 12 的 47.7% 是历史最高,比 Opus 基线高 +12.4pp,比上一代 Haiku 高 +17.6pp。
基线 Opus 的单 app 检出范围是 0/3 → 5/8,多个 app 挂零。Entry 12 在 Haiku 上做到 每个 app 都有检出,且 app 0002 抓到 4/5(80%)、0008 抓到 3/4(75%)。
05到底是什么驱动了提升
每一项都不是猜的——都有日志里的对照数据支撑。这正是这套调参方法可复现、可解释的地方。
强制 agent 在生成前先按 4 类不变量(functionality / constraint / interaction / content)枚举。直接让一直挂零的 constraint 和 interaction 两类从 0% 跳到 100%。
generateWithBackoff 给 Stage 1/2 和 scorer 加 3 次重试。把因 SDK 瞬断而崩掉 7 个 app 的批次,恢复到 10/10 完成,并让评分器变得可靠。
用逐项 option bisect 证明 403 来自 cwd/systemPrompt/disallowedTools 三个选项触发的服务端策略,而非限流。把默认 harness 关掉——反而修对了。
三臂 A/B 实测:带 Read/Grep/Glob 工具的 SDK 子进程(Arm B)产出 46 契约 / 72 交互,直接 HTTP(Arm A)只有 24。证明 agentic 探索是真实的额外能力。
Stage 2 后追加 1 次 LLM 调用,专补一直 0% 的 content 类(跨视图一致性、计数匹配)。8 条日志后第一次跑出非零 content 契约,bug 检出 +17.6pp。
每个 app 独立容器 + 随机端口,打破 port-8080 串行瓶颈,concurrency=3 并行跑。墙钟从 ~120min 压到 38min,且消除 app 间的脏数据泄漏。
06关键突破
content 类契约("分类筛选后标题仍是 All Products"、"商品计数与卡片数一致"这类跨视图一致性)
在 Entry 0–10 的每一次运行里都是 0/N——单组件源码推不出跨视图的承诺。
flowchart TD S1["Stage 1
枚举页面交互面"] S2["Stage 2
逐交互生成契约"] RX{"Reflexion 反思
只看已生成的标题
找出缺口"} CT["content 类契约
跨视图一致性 / 计数匹配"] MG["mergeContracts
去重 + 上限"] OUT["最终契约集"] S1 --> S2 --> RX RX -->|"3–5 条 content 提案"| CT CT --> MG S2 --> MG MG --> OUT classDef step fill:#FFFFFF,stroke:#D4D4CD,color:#0A0A0B; classDef rx fill:#FFF3B0,stroke:#0A0A0B,color:#0A0A0B,stroke-width:2px; classDef out fill:#F4F4F1,stroke:#D4D4CD,color:#0A0A0B; class S1,S2,CT,MG step; class RX rx; class OUT out;
app 0001 的 contracts/content/ 里跑出了两条经典 content 不变量:
"Products heading remains All Products when category is filtered"(跨视图一致性)与
"Product count text matches number of article cards"(计数匹配)。
这是整本日志里第一条非零 content 数据。
到 Entry 12,Reflexion 的提案虽然被 Haiku 归到了各功能子目录而非 content/,但
+17.6pp 的 bug 检出提升就是它们作为有效契约落地的实证——一个被卡了 8 个 session 的瓶颈,被一次额外的 LLM 调用打开了。
07更快 · 更便宜
产品最有说服力的地方不只是"更准",而是"更准的同时更快、更便宜"——三件事通常互相冲突,这里却同向。
用便宜 20 倍的模型、三分之一的时间,做出更高的质量——这意味着这套 QA agent 可以高频、低成本地常驻跑,而不是一个昂贵的一次性实验。这是产品能落地的前提。
08完整调参账本
正向里程碑全部列出。中间 Entry 4–9 的"挂零"不是退步——那是定位服务端 403 / 限流根因的过程, 正是这些诊断让 Entry 10–12 得以打通。
| Entry | 配置 | Apps OK | 覆盖率 | Bug 检出 | 意义 |
|---|---|---|---|---|---|
| 0 | Opus 基线 · 串行 | 10/10 | 53.8% | 35.3% | 起点;deep 模式 7.4× 契约产出 |
| 1 | 分类 CoT 提示词 | 单 app | 61.1% | 1/3 | constraint/interaction +100pp |
| 3 | Haiku + 重试退避 | 10/10 | 44.5% | 30.1% | 质量持平 Opus,便宜 20× |
| 4 | Sonnet harness 修复 | 1/10 | 72.2% (单app) | — | 单 app +16.6pp;暴露 403 |
| 10 | 3 臂 A/B (MiniMax) | 单 app | — | — | Arm B 胜:agentic 搜索 +22 契约 |
| 11 | MiniMax docker //3 + Reflexion | 6/10 | 25.0% | 17.0% | 首次 content 类契约落地 |
| 12 ★ | Haiku docker //3 + Reflexion + scorer fix | 10/10 | 61.2% | 47.7% | 每项指标都创新高 → 新默认配置 |
数据来源:qa/eval/tuning-log.md · Entry 0–12 · commit d1f7d7b → 33b0455