docs: register Phase A plan in research wiki

This commit is contained in:
2026-07-14 14:41:53 -04:00
parent e64c26e578
commit eaab865d84
9 changed files with 271 additions and 4 deletions
@@ -0,0 +1,127 @@
# AR30 靶向题"太简单"根因分析(baseline 29/30 = 96.7%
- **日期**: 2026-07-14
- **目的**: 30 道用 `ActionRecognitionStrategy` 6 个 SubPattern 靶向生成的 Action Recognition 题,本意复现 Agent 在 Video-MME AR 上的 6 种失败子模式(原生 AR 正确率约 65%),但 baseline 正确率 96.7%。逐题核实为何失败模式未被触发。
- **数据**: `scratchpad/ar30_baseline_analysis.json`30 题 × question/options/reasoning+ `store/questions/generated-ar30/accepted_questions.json`source_nodes/difficulty
- **对照**: [2026-07-11-benchmark-failure-taxonomy.md]M1M5 失败机理)
- **代码**: `app/question_gen/strategy_action_recognition.py`6 SubPattern)、`store/prompts/question_gen/action_recognition.md`(出题 prompt)、`store/prompts/question_gen/gate_multi_true.md`(去歧义门)
## 一、结论摘要
**单一系统性根因:干扰项是"负空间"(视频中根本不存在的事件),而非"易混正例"(真实发生过、需辨析的近似动作)。** Agent 的工具箱(`search_similar`×3 → 判定不存在)恰好擅长确认"不存在",于是每道题坍缩成一次**检索存在性核对**——"哪个选项能搜到证据,其余三个搜不到就排除"——而非动作理解。这与靶向的失败模式(M1 负证据幻觉、M3 多实例锚定、M4 视觉粒度)**正好相反**:靶向想让 Agent 的坏启发式(搜不到就断言不存在)害它出错,但因为干扰项真的不存在,这个坏启发式反而变成了对的。
| 量化证据 | 数值 |
|---------|------|
| reasoning 通过"干扰项无证据/未出现"排除法定位答案 | **24 / 3080%** |
| 时序题直接读取树内显式时间戳排序(无需时序推理) | **9 / 30** |
| source_nodes = 6(单个小 L2 子树即含全部答案) | **13 / 30** |
| 唯一答错题 [29] 的失败原因 | 树内**缺**证据(T1),非靶向失败模式 |
| SubPattern 归属是否持久化到 accepted_questions | **否**(诊断盲区,见 §五) |
## 二、根因一:干扰项质量——"负空间"干扰项使排除法万能
出题 prompt 的 `distractor_rules` 与全局约束共同把干扰项推向"视频中不存在的动作"。典型 reasoning 结构是"正解有证据 + 其余三项全网搜不到":
| 题 | 正解证据 | 干扰项性质 | reasoning 片段 |
|----|---------|-----------|---------------|
| [2] 0kRsiSdDFYg | 举起/黑盒/PS5 三帧确认 | 跨域捏造 | "B: 全视频搜索无任何 bicycle kick 或 goalkeeper hug 场景,排除" |
| [22] 068rdc75mHM (John Bell) | 三重确认 | 完全无关物件 | "B: coffee cup/city skyline/satellite dishes 完全未出现…C: dice/cups with lights 无任何节点提及" |
| [0] 0ncLRRLvdfk (金融) | 3 个 L1 一致 | 异域动作(写代码/电视直播) | "D: 全视频无任何软件编码或自动交易算法相关内容" |
| [9] 5WIdIs3A9Ok (美洲豹) | 凯门鳄/牛尸独立证据 | 未发生的捕食 | "B:无任何伏击鹿或牧场睡觉的证据。D:未发现跟踪水豚或猎杀活牛的证据" |
| [23] 4IenX7OHumk | 鸟起飞/雄狮穿行两帧 | 未发生 | "C: 鸟类俯冲向水坑和狮子爬树在整个视频中均无任何证据" |
干扰项区分度过大:Agent 无需理解"发生了什么动作",只需确认正解选项能被检索命中、其余三项检索空返回。**Video-MME 原生题之所以难,是错误选项都是"可能发生/部分发生"的近似物**,逼真辨析;而这里错误选项是可证伪的缺席,`search_similar` 三次空返回即高置信排除。
### 门控是"负空间干扰项"的制度性推手(smoking gun
`gate_multi_true.md`**"≥2 个选项 plausibly correct → verdict fail"**。任何把干扰项做成"真实近似正例"的题,天然会让≥2 选项都合理,被此门直接毙掉。出题 prompt(`action_recognition.md`)末条同样写死 **"Do NOT write questions where multiple options could reasonably be correct"**。二者联合导致:**只有"1 个清晰正解 + 3 个明显缺席"的安全题能通过门控**,恰好把复现 M2/M3/M4 所需的易混题全部过滤掉。去歧义门在为"合法"服务时,杀死了"有用"。
## 三、根因二:证据集中度——答案在树摘要里,不需要跨段/多帧推理
- **时序题的正确顺序被写成树内时间戳,排序退化为数值比大小。** [15] "指地图(437s)→锤木板(478s)→行军(519s)→骑兵(539s),时间戳完全匹配"[18] "sandwich(2504s)→chocolate(2667s)→soda(2691s)→eat(2761s)"[25] "1576s→1747s→1897s→2046s 升序"。设计意图是"打乱时序即答错",但正确时序在 L2/L3 摘要里以时间戳明写,Agent 读出来排序即可,**时序推理环节被树旁路**。9/30 属此类。
- **跨段题的合并已由 L1 摘要代劳。** `cross_segment_entity_tracking` 采样在 L1`sampling_level_override=1`),而 L1 摘要本身就是跨段聚合后的高层描述。[0] "三个 L1 节点一致支持"、5 步作答——树替 Agent 完成了跨段合并,`cross_segment` 的"漏读某段"失败无从发生。
- **13/30 题 source_nodes=6**(单个带帧的小 L2 子树),正解在头 1–2 次 `view_node` 即到手。步数中位数≈11 的高步数([26]=20、[28]=18、[23]=15)几乎全花在**反复检索确认干扰项缺席**这种冗余动作上,而非构建正解——空转仍稳落正确。
## 四、6 个 SubPattern 逐一复现失败分析
| SubPattern | 靶向失败 | 为何未触发(题例) |
|-----------|---------|-------------------|
| premature_evidence_anchoring | 找到首个证据就停搜 | 干扰项是缺席事件而非"前段的强局部匹配"。[8] 赛果题正解=官方成绩表,"首段诱饵"根本不存在,无从过早锚定 |
| temporal_reasoning_failure | 排错序/数错第 N 次 | 正确顺序=树内时间戳,读数即排序([15][16][18][24][25]);干扰项是时序全反的排列,一眼可判 |
| semantic_rigidity | 要求字面匹配拒同义词 | 同义改写太浅、且干扰项仍是缺席动作。[5] 吸管"缠绕"直接命中字幕,[4] 释义题靠排除异域项即中 |
| fine_grained_visual_action | 分不清"怎么做" | 干扰项换成了缺席的执行方式而非"同动词的另一种真实做法"。[19] 墨镜"摘下 vs 推头顶/放鼻梁"——后两者视频无证据,非真实近似;[21][28] 同理 |
| cross_segment_entity_tracking | 无法跨段合并实体 | L1 摘要已聚合(§三);干扰项混入的是"未发生动作"而非"另一实体的真实动作"[3][14][22] 排除法即中 |
| evidence_gap_confabulation | 缺证据时编造因果 | 反被利用:正解是"仅旁白暗示/描述未展示"的诚实项,干扰项是缺席因果链,Agent 排除缺席项即选中诚实项。[20][12] 均一次命中 |
**共性**:每个 `distractor_rules` 名义上要求"近似/合理但错",但都留了"未出现/缺乏证据支持"的口子(如 fine_grained 的"确保都是合理执行方式"未被 VLM 落实),VLM 一律取"捏造缺席动作"这条最省力且最不会触发 multi_true 门的路径。
## 五、VLM + 门控的系统性偏差
VLM 面对采样素材被要求写 3 个错项,**最省力且最安全的路径是编造素材里没有的动作**:保证"错"、gate_key_verify 不会误判正解、且绝不触发 multi_true 门。反之,"错但有部分真实证据支撑"的近似干扰项需要 VLM 在素材里挖真实近似事件(更难),还有被 multi_true 门判歧义毙掉的风险。于是**出题目标函数(过门率最大化)与靶向目标(复现失败模式)直接冲突**:门控奖励"唯一清晰答案"=奖励"容易"。
附带缺陷:`build_prompt_context` 记录了 `sub_pattern`,但 `accepted_questions.json` 未持久化该字段(§一表);不过 `run_store` 的 DB`logs/question_gen_ar30.db`)落了 `sub_pattern` 列,可据此做真实归属核对(见 §5.5)——**产物 JSON 未落盘 sub_pattern 仍是可观测性盲区,需从 DB 补齐到 JSON**。
## 5.5 归属核对:题目内容 vs 声称的 SubPattern(用 DB 真实归属)
前节靠题面反推有偏差。改用 `logs/question_gen_ar30.db``sub_pattern` 列(真实归属)逐题核对接受题(30 道),发现**近一半题目内容与其声称的失败结构脱节**。
| SubPattern | 接受/生成 | 过门率 | 靶向意图 | 题目实际内容 | 名副其实? |
|-----------|----------|--------|---------|-------------|----------|
| temporal_reasoning_failure | 5/44 | 11% | 排错序/定位第 N 次 | 5 道全是明确 "correct chronological order" 排序题 | ✅ 是(但顺序在时间戳里明写,故太简单) |
| cross_segment_entity_tracking | 7/26 | 27% | 无法跨段合并实体 | 6/7 确跨段追踪同一实体(替补球员、white skirt、jaguar 跨段对比) | ✅ 基本是(但 L1 摘要已聚合) |
| fine_grained_visual_action | 4/8 | 50% | 分不清"怎么做" | 3/4 是 how/manner 细粒度(handle sunglasses、manipulate straws、cat's manner | ✅ 匹配最好 |
| evidence_gap_confabulation | 3/31 | 10% | 缺证据时编造因果 | 仅 1/3 真涉证据缺口(predation evidence),另 2 道泛序列题 | ⚠️ 部分跑偏 |
| premature_evidence_anchoring | 5/34 | 15% | 首个证据即停搜 | 几无一体现"前段诱饵→过早锚定"结构,全是普通结局/序列题 | ❌ 基本跑偏 |
| semantic_rigidity | 6/24 | 25% | 字面匹配拒同义词 | 几无一是真正"同义改写 vs 字面原文"辨析,退化成通用 "which sequence/description accurate" | ❌ 基本跑偏 |
**结论**:DB 忠实记录了每题"打算"针对哪个子模式,但 11 道(semantic_rigidity 6 + premature_anchoring 5)严重跑偏,另 2 道(evidence_gap)部分跑偏。
**跑偏机制**`instruction` 注入到 prompt 的 `## Special Focus:` 段后,VLM 未贯彻特异的失败结构,**回退到最省力的"哪个序列/描述准确"通用模板**。尤其 semantic_rigidity(需"正解同义改写 + 干扰项字面原文语义错"这种精巧结构)被直接忽略。
**佐证**:过门率越是靠"易混"取胜的模式越低——temporal 11%、evidence_gap 10%、premature 15%,说明真正尝试做易混的题大量被 multi_true 门杀掉,能通过的都是退化后的安全题。这与 §二"负空间干扰项"是同一病的两面:过门率压力下,VLM 既把干扰项做成缺席事件,也把题型拉平成通用序列题,两头都丢特异性。
## 六、Action Items
### A. 改 SubPattern`app/question_gen/strategy_action_recognition.py`
1. **全部 `distractor_rules` 增加硬约束**:"每个干扰项必须对应视频中真实发生过的动作/实体,仅在时点、主体、执行方式或对象上与正解不同;严禁使用视频中不存在的动作作为干扰项。" 落实"负空间干扰项"禁令。
2. **temporal**`distractor_rules` 增加"正确顺序不得可由单一时间戳字段线性读出;采用同一 L2 段内、时间戳接近(<Δ 秒)的多个真实事件,迫使逐帧核对而非读数排序"。
3. **fine_grained**:强制"4 选项为同一动词的 4 种真实执行方式(如顺/逆时针、单手/双手),其中≥2 种在视频不同片段真实出现过"。
4. **cross_segment**`sampling_level_override` 由 1 改回 **2L2**,避免 L1 摘要预聚合;`distractor_rules` 要求"强干扰项=只包含部分片段真实动作的合法子序列"。
5. **premature_anchoring**:强制"前段必须存在一个与某干扰项字面吻合的真实局部匹配"(诱饵必须真实存在,当前是缺席)。
6. **持久化 `sub_pattern`**:在候选落盘时写入 accepted_questions(补 `metadata.sub_pattern`),供后续诊断按模式分层统计(DB 已有,需同步到产物 JSON)。
6b. **修复归属跑偏(semantic_rigidity / premature_anchoring**:这两类 instruction 太抽象,VLM 回退成通用序列题(见 §5.5)。改法:instruction 内嵌 1-2 个"必须长这样"的具体题型模板 + few-shot 正例,并加一个"结构符合度"额外 gateextra_gates),校验题目是否含该模式的必要成分(如 semantic_rigidity 必须有一个字面复用素材原文的干扰项),不符则退回重生成。
### B. 改出题管线 / 门控
7. **`gate_multi_true` 松绑为分级**:区分"两个选项都完全正确"(应毙)与"两个选项都部分沾边、需辨析"(应留)。当前二元门是易混题的主要杀手,需改为"仅当≥2 选项完全满足题干时 fail"。
8. **`action_recognition.md` 删除/改写** "Do NOT write questions where multiple options could reasonably be correct" —— 改为"错误选项应是视频中真实发生、但在时点/主体/方式/对象上与正解不同的近似动作(near-miss),而非视频中不存在的动作"。
9. **新增"负空间干扰项"检出门**:对每个干扰项做一次 `search_similar`/树核实,若某题≥2 个干扰项在树中零命中 → 判定为"负空间安全题",退回重生成(把"能被排除法秒杀"变成显式失败信号)。
10. **新增难度基线门(观测性)**:出题后用当前 baseline agent 试答,正确率>85% 的批次触发告警——把"太简单"从事后发现变成管线内的可观测指标。
## 七、独立审查修正(Codex,只读核实原始数据/代码/门控)
Codex 独立重数了 reasoning、查了 DB 拒绝原因、读了门控与管线代码,**证实主病但修正三处夸大、补三处遗漏根因**。整体可信度:诊断 7/10、action items 7/10。
### 被修正的原结论(本报告更新为以下)
| 原结论 | 修正 |
|--------|------|
| §一"80% 靠负证据排除"24/30 | 排除式 reasoning 约 23/30 成立;但**纯"负空间"事件**严格计只 1821/30——原数把"错序/错主体/表格反证"也混入了负空间 |
| §二 multi_true 是完整 smoking gun | multi_true 确是首因拒绝最多的门(137 拒中约 63 次首因),**但大量 multi_true='fail' 的实际原因是 "No source material provided",源于下方 gate 树错配 bug,而非"两真实近似选项都合理"**——smoking gun 被此 bug 污染,不能全算门控之过 |
| §5.5 evidence_gap "仅 1/3 贴合" | 实为 **2/3 贴合**#12 描述未展示、#20 展示 vs 旁白暗示均属 evidence gap),仅 #10 跑偏 |
### 遗漏的根因(新增,均已核实)
1. **gate 树错配 bug(真代码 bug,最高优先级)**`pipeline_v2.py` retry 换视频后用 `current_tree` 采样/生成(370/391 行),但 `run_gates(tree=tree,...)` 仍传**原始 tree**(471 行)。换视频重试的题门控用错树验证→大量"无 source material"假拒绝,**污染了 DB 拒绝原因统计**。需先修此 bug 再重估门控归因。
2. **gate_key_verify 过宽**:只要"文本或帧任一支持正解"即 pass,不校验错误选项是否 near-miss,故放行"1 正解+3 缺席动作"。
3. **OCR/静态文本泄漏未挡**#1 gym visible_text、#8 最终成绩表、#26 board/Spanish labels 本质是读屏字非动作识别。
### Action items 评估修正
- **纯改 `distractor_rules` 文案不够**(A1/A3 等):当前失败正是 VLM 不落实抽象规则,必须配"真实动作候选池"或结构 gate。
- **松绑 multi_true 有风险**:需把 rubric 精确为"错误选项可有局部证据,但在题干限定的主体/时点/方式/对象下必须为假",否则放进真歧义坏题。
- **A9 负空间检出门用 search_similar 成本高、误判多**(同义/视觉细节/字幕缺漏会误判):更优是**先从素材抽真实动作库存,再由库存组合 near-miss 干扰项**(从源头杜绝负空间,而非事后检出)。
- **新增更优改法**:①先修 tree bug;②建"真实动作候选池"(实体/动作/时点/对象/方式)供 near-miss 构造;③per-pattern 结构验证器(semantic 必含"同义正解+字面陷阱"、premature 必含"前段真实诱饵");④AR 加 OCR/静态文本惩罚门;⑤"树可见性"难度评估——用完整树/去时间戳树/L2-only/frame-only 分别测,定位到底是视频理解难还是摘要泄漏。
## 相关文件
- 6 SubPattern 定义:`app/question_gen/strategy_action_recognition.py:26-212`
- 出题 prompt`store/prompts/question_gen/action_recognition.md`
- 去歧义门(根因制度推手):`store/prompts/question_gen/gate_multi_true.md`
- 数据:`store/questions/generated-ar30/accepted_questions.json``scratchpad/ar30_baseline_analysis.json`
- SubPattern 真实归属(DB):`logs/question_gen_ar30.db``question_gen_items``sub_pattern`(§5.5 核对依据)