Files
Jyotisha/docs/testing/answer-effort-ab-20261013.md
T
Jesse_ChenandClaude Opus 5.5 12eb7018ec
Independent Staging Quality Gate / validate (push) Successful in 22m59s
Independent Staging Quality Gate / publish (push) Successful in 4m55s
docs(testing): answer-step reasoning effort A/B results (issue #134, #135 data)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 14:28:35 +08:00

6.8 KiB
Raw Blame History

答题步推理强度(2026-10-15;2026-10-28 补跑 A/B,issue #134)

2026-10-15 那次没有模型钥匙,只拦截了请求体。2026-10-28 产品提供了临时钥匙(只存在本机 0600 文件里,没有进仓库、日志或 issue),按任务书 T0 第 2 步、T2、T3 跑完了,结果见文末「2026-10-28 实测」。

命令:在 frontend 目录执行 node node_modules/tsx/dist/cli.mjs tests/answer-effort-probe.mts --dry-run。假请求不离开这台机器。模型对象与产品相同:providerId: deepseek,modelId: deepseek-flash,带 url 和假的 apiKey。2026-10-15 起脚本在 frontend/tests/,不再放在 frontend/scripts/research/。

请求体里实际有什么

形状 thinking reasoning_effort max_tokens
今天的答题设置,第 0 步和第 1 步 { type: enabled } 无 24576
旧的低强度设置(没有产品调用方) { type: enabled, reasoningEffort: low } 无 10240
新开关 low / medium / high / max(只在答题步) { type: enabled } 与开关相同 24576
续写 { type: disabled } 无 16384

旧的低强度写在 thinking 里面,请求体没有 reasoning_effort。这证实了任务书 §2.3。记为 BUG-1354,状态 investigating。原先写成 BUG-1351,该号已被数据层占用。线上不用这处设置。

新开关写在供应商选项的最外层。兼容通道把它写成 reasoning_effort。开关不设时,两步请求体与改前逐字节一致,样本在 frontend/tests/fixtures/answer-effort-switch-20261013.json。

供应商接受度

未跑。没有 DS_KEY / BACKTEST_MODEL_KEY。low、medium、high、max 哪几档能用,要等验收时用临时钥匙跑探针的后半段。

固定 10 题

脚本已能按 --cases 跑下面这 10 题,并能按 --efforts unset,low,medium 把同一题的几档挨着跑。多档同时跑时并发降为 1,因为强度读的是进程里的环境变量,并行会串档。本机没有钥匙,这 10 题没有跑。

# 盘 领域
1 steve_jobs career
2 barack_obama parents
3 elizabeth_taylor marriage
4 marilyn_monroe parents
5 judy_garland health
6 edith_piaf marriage
7 frida_kahlo health
8 george_w_bush career
9 zinedine_zidane career
10 marilyn_monroe marriage

耗时与质量

2026-10-15:没有数。2026-10-28 的结果见下一节。

2026-10-28 实测(issue #134)

代码基线:staging 16fcb8c2(本单不改代码)。脚本:供应商接受度用本机一次性脚本直连 https://api.deepseek.com/chat/completions,请求形状与产品相同(thinking: enabled,只改 reasoning_effort);A/B 用仓库里的 frontend/scripts/research/consult-biography-backtest.mts(产品的真实提示词、工具、答题设置与流式处理,引擎结果换成公开名人 golden 盘)。回答原文只留在本机 scratch/(不入库)。

T0 · 供应商接受度

  • 两个模型 deepseek-flash、deepseek-v4-pro,reasoning_effort 不设 / low / medium / high / max 各 3 次,全部 HTTP 200,没有一档被拒。

  • 短问题(推理只有一两百 token)看不出差别。换成一道要多步推理的长问题(deepseek-flash,每档 3 次,推理 token 中位数 / 用时中位数):

    档 推理 token 用时
    不设 5,979 45.9 s
    low 2,820(−53%) 25.9 s
    medium 6,199(+4%) 42.8 s
    high 6,450(+8%) 48.4 s
  • 判定(任务书 T0 规则):medium、high 与不设的差在 10% 以内,视为被忽略,A/B 去掉;只跑「不设」对「low」。

T2 / T3 · 10 题 × 3 次(deepseek-flash)

两组各一个进程同时跑(并发 3),供应商时段波动两组一样。

指标(30 份回答) A 不设 B1 low
答题步推理 token 中位数 5,749 3,159(−45%)
端到端用时中位数 34.1 s 21.6 s(−37%)
端到端用时平均 34.3 s 23.2 s
失败 / 空答 / 截断 / 非正常结束 0 / 0 / 0 / 0 0 / 0 / 0 / 0
rubric must_not 原文命中 0 0
确定性禁句命中 0 1(retrograde_repeat:「逆行,所以这条路走得慢一些」)
正文可见字数中位数 11,627 11,523
第 0 步(选工具)用时中位数 0.70 s 0.69 s
第 0 步选到与问题一致的领域 30 / 30 30 / 30

整场推理 token 合计 172,899 → 105,149。

人工读稿:10 题的第 1 次两组并排全读(20 份);第 2、3 次只有上面的自动检查,没有逐份读,这里如实写明。

人工四项(10 题 × 第 1 次) A B1
缺事实(卡里有、与问题直接相关却没说) 0 0
跑题 0 0
重复 0 0
空答 0 0

短评:两组结构一样(结论 → 宫位与宫主 → 分盘 → 大运时间 → 一句追问),引用的宫位、宫主、九分盘和大运区间基本相同;B1 有几题多写了一层小运或分盘细节,没有因为想得少而漏掉要点。B1 另有一处措辞小毛病(一份回答里多了个「这」字)。

deepseek-v4-pro 抽样(第 1、4、6 题 × 3 次)

指标(9 份) A 不设 B1 low
推理 token 中位数 6,569 3,361(−49%)
端到端用时中位数 80.1 s 46.7 s(−42%)
失败 / 空答 / 截断 0 / 0 / 0 0 / 0 / 0
must_not / 禁句 0 / 0 0 / 0

判定(任务书 T3 五条门槛)

  1. 推理 token 中位数降 ≥ 30%、端到端降 ≥ 20%:flash −45% / −37%,v4-pro −49% / −42% → 满足。
  2. 空答、截断为 0:两组都是 0 → 满足。
  3. must_not 命中 ≤ A:0 = 0 → 满足。(确定性禁句 B1 多 1 处,记在这里。)
  4. 人工四项 ≤ A:读过的 10 题第 1 次都是 0 = 0 → 在读过的范围内满足;第 2、3 次未逐份读。
  5. v4-pro 抽样不出现 A 没有的空答或截断:满足。

提议:答题步默认 low,即部署配置设 CONSULT_ANSWER_REASONING_EFFORT=low。按任务书,默认值由产品负责人拍板后另一个小提交写进部署配置;本单不改代码。

顺带:第 0 步要不要关思考(issue #135 的数据)

同一批 60 次运行里,第 0 步(只决定调哪个工具)用时中位数 0.70 s(最长 1.42 s),推理 token 中位数约 30(最多 159),60 次全部选对了领域。所以第 0 步关思考最多省约半秒,而且 DeepSeek 思考模式下历史里的工具调用必须带回 reasoning_content(本机实测缺了会 HTTP 400,BUG-282 / 937 一类风险)。体检估的「首字前多 3~5 秒」主要不在这一步。