From 12eb7018ecfb35c3bec0c25bd74efd6ba9a65816 Mon Sep 17 00:00:00 2001 From: Jesse_Chen Date: Wed, 28 Oct 2026 12:47:06 +0800 Subject: [PATCH] docs(testing): answer-step reasoning effort A/B results (issue #134, #135 data) Co-Authored-By: Claude Opus 5.5 --- docs/testing/answer-effort-ab-20261013.md | 156 ++++++++++++++++------ 1 file changed, 113 insertions(+), 43 deletions(-) diff --git a/docs/testing/answer-effort-ab-20261013.md b/docs/testing/answer-effort-ab-20261013.md index a476c414..27738944 100644 --- a/docs/testing/answer-effort-ab-20261013.md +++ b/docs/testing/answer-effort-ab-20261013.md @@ -1,43 +1,113 @@ -# 答题步推理强度(2026-10-15) - -没有模型钥匙。下面只是本机拦截到的请求体,不是供应商的接受度,也不是耗时和质量。A/B 未跑。 - -命令:在 `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 | - -## 耗时与质量 - -没有数。空答、截断、rubric、人工四项都没做。默认值维持不设。 +# 答题步推理强度(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 秒」主要不在这一步。