From 33367fb0812ef547880ff04e8e3cf2aa91a31890 Mon Sep 17 00:00:00 2001 From: Jesse_Chen Date: Sat, 19 Sep 2026 12:12:24 +0800 Subject: [PATCH] =?UTF-8?q?docs(tasks):=20Jev=20=E6=84=8F=E5=9B=BE?= =?UTF-8?q?=E5=88=86=E7=B1=BB=E4=BF=AE=E5=A4=8D=E8=BD=AE=E9=AA=8C=E6=94=B6?= =?UTF-8?q?=E2=80=94=E2=80=94=E7=BB=93=E8=AE=BA=E7=BC=BA=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E9=87=87=E7=BA=B3=EF=BC=8C=E6=8A=A5=E5=91=8A=E8=A1=A5=E6=BC=8F?= =?UTF-8?q?=E5=8D=95=20fix2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 红线 1–8 与 F1/F2/F5 通过;F3/F4 部分未通过:现行模型在来源 B 上跑了没报、 来源 B 上 Jev 高置信错误 6.4% 没进 MD、层差没到标签;复核提示≈生产提示且同模型, 采集层相对门槛不可判。不重造语料、不重跑、不立 BUG。 Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8 --- docs/tasks/README.md | 2 +- ...ntent-classifier-research-fix2-20260919.md | 131 ++++++++++++++++++ 2 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 docs/tasks/TASK-rectification-jev-intent-classifier-research-fix2-20260919.md diff --git a/docs/tasks/README.md b/docs/tasks/README.md index c3a13467..115e54cf 100644 --- a/docs/tasks/README.md +++ b/docs/tasks/README.md @@ -234,7 +234,7 @@ | `TASK-rectification-open-collect-invite-20260914.md` | `PROGRESS-rectification-open-collect-invite-20260914.md` | **P0**:固定七条采集线问完后只说「能问的都问完了」,用户不知道还能补经历、也不知道补了有用;而两轮研究证明补带年月经历是唯一有效手段。产品拍板:交付卡照出 + 卡上给不限领域的补充邀请(先要确切日期,再退年月;举七条线之外的例子),补完必须可见生效(BUG-689) | 待验收 | `codex/rectification-open-collect-invite-20260914` | | `TASK-rectification-cluster-width-research-20260914.md` | `PROGRESS-rectification-cluster-width-research-20260914.md` | **研究单**:上一轮证明调权重改不动交付区间宽度——所有方案宽度中位数都等于整个搜索窗。先确认 sweep 的宽度口径是否含淘汰(M0),再画簇结构像(M1),最后量三个改法:放宽簇上限、按分差决定是否合并、交付区间改分位覆盖(M2)。真值覆盖率不得下降 | 待验收 | `codex/rectification-cluster-width-research-20260914` | -| `TASK-rectification-jev-intent-classifier-research-20260919.md` | `PROGRESS-rectification-jev-intent-classifier-research-20260919.md` | **研究单**:TypeSafe Jev(只做 Choice/Score/Noul 的校准判断模型,$0.042/Mtok)能否接管校正流的意图分类。产品 09-19 授权评估(推翻 09-15「分类只用贵模型」需重新拍板)。Agent 模拟校正流造 ≥900 条中文语料(标签先定、独立复核)+ 真机样本做代表性锚,量准确率 / 高置信错误率 / 低置信召回 / 延迟;只离线测,不改线上 | **待验收**(修复轮已交,结论 **缺数据**) | 修复单 `TASK-rectification-jev-intent-classifier-research-fix-20260919.md` 已做完。来源 C 由 DeepSeek Flash 生成+复核(900 条,争议率 2.85%);来源 B 157 条已人工标注。Jev 无焦点层 vs 真人差 17.2pp > 10pp。落点分支 `codex/rectification-jev-intent-research-fix-20260919` | +| `TASK-rectification-jev-intent-classifier-research-20260919.md` | `PROGRESS-rectification-jev-intent-classifier-research-20260919.md` | **研究单**:TypeSafe Jev(只做 Choice/Score/Noul 的校准判断模型,$0.042/Mtok)能否接管校正流的意图分类。产品 09-19 授权评估(推翻 09-15「分类只用贵模型」需重新拍板)。Agent 模拟校正流造 ≥900 条中文语料(标签先定、独立复核)+ 真机样本做代表性锚,量准确率 / 高置信错误率 / 低置信召回 / 延迟;只离线测,不改线上 | 修复轮已验收:结论 **缺数据** 采纳,不上线;报告补漏单 `TASK-rectification-jev-intent-classifier-research-fix2-20260919.md` 待领取 | 红线 1–8、F1/F2/F5 通过;F3/F4 部分未通过:现行模型在来源 B 157 条上跑了没报、来源 B 上 Jev 高置信错误 6.4%(无焦点 12.1%)没进 MD、无焦点层差没到标签;复核提示 ≈ 生产提示且同模型,采集层相对门槛不可判 | | `TASK-rectification-minute-resolution-research-20260914.md` | `PROGRESS-rectification-minute-resolution-research-20260914.md` | **研究单**:候选分不开的根因是打分尺度——窗口内恒定项 11.5 分 vs 随分钟变化项 2.125 分(≈5:1)。先修封存基准(v3 每例仅 3 件事且被标 invalidated)出 v4,再离线量五个改法:分盘除数、去底座、**KP 宫头子主计分(产品 09-14 拍板,推翻 BUG-325 一条红线)**、年精度事件改边际似然、聚类签名层对齐。有收益才立实现单 | 待验收 | `codex/rectification-minute-resolution-research-20260914` | diff --git a/docs/tasks/TASK-rectification-jev-intent-classifier-research-fix2-20260919.md b/docs/tasks/TASK-rectification-jev-intent-classifier-research-fix2-20260919.md new file mode 100644 index 00000000..153c53ce --- /dev/null +++ b/docs/tasks/TASK-rectification-jev-intent-classifier-research-fix2-20260919.md @@ -0,0 +1,131 @@ +# TASK · Jev 意图分类研究修复单 2:把已跑未报的数字补进报告(2026-09-19) + +- 基线:`origin/staging` @ `eb8f5147`(含 `c2ecbc74` 修复轮) +- 原单:`TASK-rectification-jev-intent-classifier-research-20260919.md`;修复单 1:`TASK-rectification-jev-intent-classifier-research-fix-20260919.md` +- 分支:`codex/rectification-jev-intent-research-fix2-20260919`(从 `origin/staging` 新建) +- 性质:报告补漏;**不重造语料、不重跑 Jev、不改线上代码、不立 BUG**。除 F1 第 3 条外全部可离线从 `.cache/jev_intent/` 出,不消耗 token。 + +## 1. 修复轮验收结论(对照修复单 1 逐条) + +| 项 | 结论 | 证据(验收方在 `origin/staging` @ `eb8f5147` 独立重算) | +| --- | --- | --- | +| 红线 1 · 不改线上 | 通过 | `git diff --stat d6fc4fb8..c2ecbc74` 只有 `scripts/research/**`、`tests/test_jev_intent_research.py`、`docs/**`、`BLOCKED.md` | +| 红线 2 · key 不进仓库 | 通过 | 全仓 grep 无 token;脚本只读环境变量 | +| 红线 3 · 真实消息不提交 | 通过 | 报告 JSON 里 `"source": "B"` 0 行,只有聚合数;`.cache/jev_intent/` 不在仓库 | +| 红线 4 · sha256 固化 | 通过 | 三份 sha256 与提交文件实算一致;报告 `meta.sha256` 同值;`id_check_ok = true`,`rows` 的 C 类 id 集合与 `simulated.jsonl` 完全相等 | +| 红线 5 · 快速门 | 通过(Python 定向)/ 环境缺口 | `python3 -m unittest tests.test_jev_intent_research`:11 passed;本机无 `.venv`,`run_quality_gate.py --profile quick` 未跑 | +| 红线 6 · 真实模型生成与复核 | 通过 | `complete_chat` 走 DeepSeek Chat Completions;`GENERATOR_NAME` / `REVIEWER_NAME` = `deepseek-flash`;README 有生成 / 复核提示原文;`review_sample` 无正则;源码无 `bank = {` | +| 红线 7 · 语料三项统计 | 通过 | 去重 825 / 900、单条最多重复 5、八种人设最少 48(点选+采集)、惜字如金+方言 = 20.0%(≤ 20% 的边界值)、长度 P25 / 中位 / P75 = 16 / 20 / 24(P25 落在 8–16 的上沿) | +| 红线 8 · 现行对照全量 | 通过 | 来源 C 现行 400 / 400 / 100 全量一次,第二次 133 / 133 / 33 | +| F1 语料重造 | 通过 | 争议率 2.85%(36 / 1261),三层 400 / 400 / 100,配额偏差 ≤ 4.5% | +| F2 重跑 T2 | 通过 | Jev×2、现行×1 + 1/3;`unavailable = 0`;报告表内每个数字与我从 `rows` 重算一致 | +| F3 报告 | **部分未通过** | 结论「缺数据」成立;但 §2 列出的已跑未报数字缺席 | +| F4 来源 B | **部分未通过** | 157 条人工标注、Jev×2、现行×1 都跑了;现行在来源 B 上的准确率**没有出现在任何文件里**;T3 要求「写明差在哪一类标签」只写到层,没到标签 | +| F5 记录 | 通过 | PROGRESS 修复轮段、BLOCKED 三条划掉、README 状态行、token 分列齐全 | + +**结论「缺数据」采纳,产品不据此上线。** 未通过项只影响「下一步该补什么」的判断,不影响本轮结论。 + +## 2. 事故实证 + +### 2.1 现行模型在来源 B 上跑了、没报(P1) + +- `scripts/research/jev_intent_probe.py` `main()`:`if source_b: run_batch(source_b, …, run_id="current_1", call_fn=call_current_retry)` —— 现行模型确实在 157 条真人样本上跑了一次;PROGRESS token 表也计了「B 一次」。 +- 报告 JSON `metrics` 只有 `source_b` / `source_b_by_layer` 两项,且全是 `jev_1` 的数;没有 `current` 在来源 B 上的任何聚合。MD、PROGRESS 同样没有。 +- 后果:无焦点层 Jev 78.8%(26 / 33)是「Jev 不行」还是「这 33 条本身难 / 标注有争议」,现在无法判断;而这是真人 + 人工标注 + 线上模型三者齐备的**唯一**一组数,也是产品下一步决策最需要的数。 + +### 2.2 来源 B 上 Jev 的高置信错误没进报告(P1) + +报告 JSON 里已有、MD 没写的数: + +| 来源 B(Jev) | 全集 n=157 | 点选 n=17 | 采集 n=107 | 无焦点 n=33 | +| --- | ---: | ---: | ---: | ---: | +| intent 准确率 | 91.1% | 94.1% | 94.4% | 78.8% | +| 三题全对 | 81.5% | 82.4% | 89.7% | 54.5% | +| 高置信错误率(≥0.8 且错) | **6.4%** | 0.0% | 5.6% | **12.1%** | +| 低置信召回 | 24.1% | 66.7% | 18.2% | 20.0% | +| dated 准确率 | 91.7% | 88.2% | 97.2% | 75.8% | + +高置信错误的绝对门槛是 ≤ 3%;真人样本上全集 6.4%、无焦点 12.1%,比来源 C 的 0–2.8% 差得多。这是比「层差 17.2pp」更直接的不可接证据,报告必须写。 + +### 2.3 无焦点层差在哪一类标签没写(P2,原单 T3 明文要求) + +原单 T3:「报告必须写明差在哪一类标签」。现报告只到层。来源 B 无焦点层 7 条错,gold 与 Jev 各是什么、是否集中在 `provide_new_evidence` ↔ `unclear`,要按标签给混淆表(只给计数,不给原文)。 + +### 2.4 复核模型 = 对照模型 + 复核提示 ≈ 生产提示(P2,方法学限制,写进报告即可) + +- `REVIEW_RUBRIC`(`jev_intent_corpus_build.py`)与生产 `COLLECT_INSTRUCTIONS` 逐句对应:「没有/没发生/这方面没什么 → no」「记不清/…/以后再说 → unsure」「不要把「没有」或「记不清」标成 yes」「不要按 A/B/C/D 位置猜」「既明确否定又补充新经历 → answer_current_focus + no」。 +- 复核与对照都是 `deepseek-flash`。于是进入 `simulated.jsonl` 的 900 条,是「Flash 用近生产提示能答对目标标签」的那 900 条;被剔的 36 条恰是 Flash 不同意的。 +- 后果:现行模型在来源 C 上的 97.5% / 98.8% / 94.0% 是构造出来的上界,「采集层 Jev 92.2% 未过相对门槛 94.5%」不能当作 Jev 输给现行的证据。修复单 1 允许同一模型生成 + 复核,但没预见复核提示与对照提示同源;本单不要求换模型重复核(产品未拍板再花 token),只要求报告写明这条限制并把相对门槛那一行标「不可判」。 + +### 2.5 Jev 采集层 31 条 intent 错例里有标签争议(P2,写进错例画像即可) + +验收方逐条看了 Jev 在采集层的 intent 错例(gold → Jev):`provide_new_evidence → answer_current_focus` 17 条、`unclear → answer_current_focus` 9 条、`stop → unclear` 4 条、`ask → unclear` 1 条。 + +- 17 条 pne 错例几乎全是「另外 2019 年我换工作搬了家」句式;其中若干条尾句直接落在当前题域(例:题问感情,答「…感情那会儿真没细想」;题问工作,答「工作那摊子反而没顾上细想」),按生产提示读是 `answer_current_focus + unsure`,Jev 的判法有依据。 +- 9 条 unclear 错例的句子是「一时半会儿真捋不明白」「这事我一时真说不上来」,按生产提示「记不清/想不起来 → unsure」读也是 `answer_current_focus + unsure`;现行模型自己也在其中 3 条上判了 `answer_current_focus`。 +- 这两类合计 ≥ 20 条,占 Jev 采集层 intent 错例的 2/3。它们的 gold 由「生成目标 + Flash 复核同意」得来,不等于人工真值。 + +### 2.6 语料像真人的程度(观察项,不判失败) + +修复单 1 只把长度和人设写成硬红线,三项都过;原单 T0 还要求按来源 B 的标点 / 语气词比例约束生成,没进红线,实测差距如下: + +| 指标 | 来源 B(真人) | 来源 C(模拟) | +| --- | ---: | ---: | +| 含标点 | 13% | 98.9% | +| 含语气词 | 4% | 25.6% | +| 含年份或月份 | 81% | 47.8% | +| 带年份句里写「2019」 | — | 236 / 429 = 55% | +| `provide_new_evidence` 里是搬家/换工作 | — | 152 / 157 | + +根因在 `ALT_EVENT_HINTS`:七个领域的「另一件事」提示全是「搬家 / 换工作」两种,年份没约束,模型就收敛到「另外 2019 年搬过家」。这解释了「模拟语料不代表真人」的一部分,也解释了 2.5 的错例为何长得一样。不在本单修,写进报告「限制」一节,留给产品决定是否再造一轮。 + +## 3. 决策记录 + +1. 本轮结论「缺数据」采纳。**不上线、不影子双跑**,直到 2.1 的数字出来后产品再拍板下一步(补真机样本 / 再造语料 / 关单)。 +2. 本单不新增任何模型调用(F1 第 3 条例外见下),全部从 `.cache/jev_intent/` 已有结果聚合;执行方若发现 cache 里没有来源 B 的 `current_1` 结果,按让步 1 处理。 +3. 不换复核模型、不重造语料;2.4 / 2.6 只写限制。 + +## 4. 硬红线 + +原单 §4 与修复单 1 §5 全部继续生效。另加: + +9. 来源 B 仍只写聚合与混淆计数,**不得**出现任何一条真人原文、id、时间戳。 +10. 不得为让来源 B 的数字好看而改 gold;标注争议只能写成「争议 n 条」并列出争议类型。 + +## 5. 任务分解 + +### F1 · 报告补齐来源 B 三组数(P1) + +1. `jev_intent_probe.py` 的指标段增加 `current_source_b` / `current_source_b_by_layer`(口径与 `source_b` 相同;现行无置信度,置信度三列记 `null`),MD「代表性检验」一节改成一张表:行 = 三层 + 全集,列 = n / Jev intent / 现行 intent / Jev 高置信错误 / Jev 低置信召回 / Jev 自洽(jev_1 vs jev_2 在来源 B 上)。 +2. 无焦点层按标签给 gold × Jev 与 gold × 现行两张混淆计数表(4 × 4,只有计数)。 +3. 若 cache 里没有来源 B 的现行结果,允许只为这 157 条跑一次现行(约 16 万 input token),PROGRESS 记明。 +4. 验收:MD 表里每个数能从报告 JSON 重算;`tests/test_jev_intent_research.py` 新增一条断言:报告 JSON 的 `metrics` 含 `current_source_b` 且 `n == meta.source_b_n`。 + +### F2 · 报告增加「限制」一节(P2) + +写三条:复核 ≈ 生产提示且同模型(2.4)、采集层错例的标签争议(2.5,给计数与 3 条改写示例)、语料风格差距表(2.6)。「现行模型对照」一节的采集层「未过」改成「不可判(复核与对照同源)」。 + +### F3 · 记录 + +- PROGRESS 追加「修复轮 2」段。 +- `docs/tasks/README.md` 状态行改为本单结论。 +- 不立 BUG。 + +## 6. 让步顺序 + +1. cache 里没有来源 B 现行结果且产品不再给 key:F1 第 1 条只填 Jev 列,现行列标 `unavailable`,PROGRESS 写明;F1 第 2 条照做。 +2. 无焦点层 7 条错例里有执行方自己都拿不准的标注:写「标注争议 n 条」,不改 gold。 + +## 7. 开工前置命令 + +```bash +git fetch origin --prune +git worktree add -b codex/rectification-jev-intent-research-fix2-20260919 .worktrees/rectification-jev-intent-research-fix2-20260919 origin/staging +cd .worktrees/rectification-jev-intent-research-fix2-20260919 +ls .cache/jev_intent/ # 确认 source_b.jsonl 与 runs cache 在 +python3 -m unittest tests.test_jev_intent_research +``` + +## 8. BUG 编号 + +不立 BUG。`docs/BUG_HISTORY.md` 当前最大号 BUG-970。