Files
Video-Tree-TRM5/research-wiki/findings/2026-07-14-ar30-too-easy-analysis.md
T

128 lines
16 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.
# 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 核对依据)