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

114 lines
6.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 答题步推理强度(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 秒」主要不在这一步。