Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0193vBv6w5MV2cifdTUu9H5P
6.4 KiB
6.4 KiB
决策单(草案,待产品拍板)· 带年月选择题问完之后,用什么方式继续收窄(2026-09-13)
- 基线:
origin/staging@5d54d059(已部署;含 BUG-646~660) - 性质:产品决策单。执行方不得在产品选定方案前开工。
- 关联:
TASK-rectification-narrow-before-deliver-20260911.md(BUG-653/654)、TASK-rectification-targeted-collect-persist-fix-20260911.md(BUG-656~658)
1. 现状(2026-09-13 03:57 真机,代码 5d54d059)
同一序列(两件学业 + 实习入职/离职 + 六道带年月选择题)跑完后,系统按 09-11 的设计做了三步:
| 步 | 结果 | 证据 |
|---|---|---|
| 刷新探针(按剩余 5 个候选 04:51 / 04:53 / 04:59 / 05:00 / 05:06 再向引擎要题) | 没有新题 | inference_state.refresh_attempts[0].result = "no_new_probes",答题数 6,候选集不变 |
| 定向补事 | 已落成活动焦点 | current_question = collect:targeted:relationship:「还有4条线能把 04:51 和 05:06 分开:哪年结婚或订婚、哪年收入明显变过、哪年搬家、家里哪年添丁。记得哪件说哪件,年月大概就行。」 |
| 交付卡 | 未出(等用户回答上一步) | can_offer_range=false;用户答「都没有」即出「目前范围」卡 |
范围 04:48–05:07(20 分钟,5 簇),头名 04:53 占 32%,收敛门未开。流程没有卡住,但用户看到的是一道开放式补事题,而不是选择题,体感「死板」。
2. 为什么引擎给不出更多选择题(结构性原因,不是 bug)
带年月选择题由 scripts/rectification/event_probes.py 在大运换运边界上生成,一道题要同时满足:
- 换运日期在不同候选簇之间至少差 45 天或跨年(
MIN_BOUNDARY_DAYS=45,_boundary_windows)。Vimshottari 边界随出生分钟只移动几天,所以同年内几乎没有可用边界;Narayana 边界随本命上升变,而 04:48–05:07 内本命上升都是巨蟹座,边界完全相同。 - 该年该领域的分盘读数在候选组之间确实不同(
_evaluate_contexts:至少一组「会发生」一组「不会」,且两组各有候选)。 - 该年没问过、也不挨着已知事件(
asked_years_for_domain+EXISTENCE_NEARBY_YEARS:学业 / 感情 / 事业 / 搬家各 ±1 年)。 - 家人「有没有发生」题被 0.85 的先验丢弃,只有月级边界题例外。
六题答完后,事业 2023 / 2024、感情 2023 / 2024、搬家 2015、学业 2016 都已问过,剩余 5 个候选之间的差别(04:52 D9 换升、05:00 D10 / D4 / D12 / D2 换升、05:06 D24 换升)只能变成无年月的分盘题——正是 09-09 产品拍板降级为「仅作参考、不参与淘汰」的那一类(BUG-629),09-11 又决定「不挡在结果前面」(BUG-651 决策 2,执行时按让步做成了完全不问)。于是引擎侧的选择题供给在这里真的用尽了,剩下唯一能收窄的信息源就是用户再给一件带年月的事。定向补事题正是为此设计的(09-11 决策 3.1)。
3. 可选方案
| 方案 | 做法 | 能不能收窄 | 用户体感 | 代价 / 风险 |
|---|---|---|---|---|
| A · 定向补事改成逐条点选(推荐) | 把「4 条线」拆成一次一条的卡:「结过婚或订过婚吗?」有 / 没有 / 记不清;答「有」→ 追问「大概哪年几月」(口述)→ 记事件 → 引擎重算、可能生出新的带年月题;答「没有」→ 下一条;四条都「没有」→ 出「目前范围」卡 | 只有答「有」并给出年月才收窄;「没有」本身不计分(无年月的否定不参与打分,BUG-629 口径) | 像在继续答题;年份仍由用户给 | 前端两步卡 + 焦点状态机;引擎不动。约 1 单 |
| B · 放宽引擎出题规则(仅刷新阶段) | 刷新时允许:挨着已知事件的年份出题(去掉 ±1 年封锁);同一领域同一年按不同事件家族再出一道(入职 vs 升职 vs 离职);MIN_BOUNDARY_DAYS 降到 30;家人月级题按 T2(b) 已放开 |
可能多出 1~3 道题,也可能一道没有;分辨力未经验证 | 继续出选择题 | 必须先在离线 20 例公开 AA 数据上量收益(minute_rectification_fact_ranker_v4_holdout_v3),有提升再上;风险是多问几道没分辨力的题 |
| C · 参考题作为可选追问 | 交付卡下给「再答两道参考题」入口(D9 相处方式 / D10 做事风格),±1 只排序不淘汰 | 不收窄,只调整头名顺序 | 有东西可点 | 已有代码(BUG-629 的 tie_break),只需入口;09-11 决策 2 原意即此 |
| D · 只改文案 | 「还有4条线能把 04:51 和 05:06 分开」改成「现在还剩 04:48–05:07 里 5 个候选;能把它们分开的是这几条线……」,并给每条线一个按钮 + 「都没有,先看结果」 | 不变 | 不再像一句死板的模板 | 半天 |
我的建议:A + D 一起做,C 作为可选入口顺带做;B 单独立一张研究单,先量收益再决定,不与 A 混在一起。
4. 需要产品拍板的问题
- 选 A + D(+ C)还是也要 B?
- A 里每条线答「没有」是否要写进账本作为「该领域近年无事」(不计分,只用于不再问)?建议是。
- 四条线都「没有」之后直接出卡(当前行为)是否接受?
5. 拍板后的任务分解(预案,未定不执行)
- T1(A)
collection-question-pool.tstargetedCollectPool改为逐条产出{domain, existence_prompt};焦点collect:targeted:<domain>改为 choice(有 / 没有 / 记不清);「有」→ 落collect:targeted:<domain>:year口述焦点;「没有 / 记不清」→ 话题记 skipped 并进下一条;全部 skipped → S3。 - T2(D)
rangeNarrowHint/ 定向题干文案;agent-voice-copy-contract禁词不变。 - T3(C) 交付卡下入口 → 性格卡(
tie_break)。 - T4(B,独立研究单) 离线脚本:对 20 例 AA 数据在「六题后剩余 ≤5 候选」的状态下分别按放宽规则再生成题,统计新增题数与真实分钟命中率变化;有提升才进入实现。
- 验收:真机 §1 序列六题答完后出现第一条点选题;答「有 + 年月」后引擎重算并出现新的带年月题或范围变化;四条都「没有」出「目前范围」卡;全程不出现「没有拿到下一个问题」。