# 生成题 vs Video-MME 校准差异根因分析（五题型，两轮验证）

- **日期**: 2026-07-11
- **数据**: `workspaces/default/harness.db`，run `infer_adhoc`（benchmark 902 题，73.2%）vs `infer_gen240`（生成 240 题，77.5%）
- **第一轮**: 5 个并行分析 agent 按题型逐题核对题面、Agent 推理轨迹与树源节点
- **第二轮（独立验证）**: 盲复现（无先验中性重分析）+ 全量定量证伪（240 题全量指标）+ 跨模型错题复核（Codex/GPT-5.4 复核 IS+CP，独立 Claude 复核 SR）+ 设计层归因（代码+设计文档通读）+ 混杂因素检验
- **状态**: 第一轮结论经第二轮修正，见 §六；修正后的根因模型见 §七（以 §七 为准）

## 一、总览

| 题型 | bench | gen | Δ | 表面结论 | 实际根因 |
|------|-------|-----|---|---------|---------|
| Action Reasoning | 73.3% | 100.0% | +26.7% | 偏简单 | 答案泄漏 + 干扰项异质，"搜到即抄" |
| Action Recognition | 65.1% | 85.0% | +19.9% | 偏简单 | 同上；9/20 题干扰项一眼假 |
| Counting Problem | 50.0% | 65.0% | +15.0% | 偏简单 | 20/20 单节点出题，数字直读非计数 |
| Information Synopsis | 81.6% | 60.0% | −21.6% | 偏难 | **假难**：8/8 错题为题目缺陷（作用域不可解析） |
| Spatial Reasoning | 100.0% | 60.0% | −40.0% | 偏难 | **假难**：8/8 错题为良定性缺陷；且与 bench 构念不匹配 |

**核心洞察：偏简单与偏难是同一组出题缺陷的两面。** 出题范式为"单节点生成 + 干扰项取自其他节点"：当题干锚定明确时，Agent 语义搜索一跳命中、异质干扰项整排排除（偏简单）；当题干用相对指代（this segment/this frame/this clip）时，出题时的作用域上下文对答题 Agent 不可见，其他节点来的干扰项在全视频读法下同样为真，多个选项皆真甚至标注答案为假（假偏难）。

## 二、跨题型系统性缺陷

| # | 缺陷 | 机制 | 波及 |
|---|------|------|------|
| 1 | **闭环泄漏**：题从树节点文本生成，Agent 又在同一批文本上语义搜索 | 题干实词与节点原文重合度平均 45%，正确选项重合度 51%（最高 100%，逐字照抄）；生成题平均 8.3-8.8 步 vs benchmark 13.3 步 | AR、ARec、CP 全部；"开卷考自己的教材" |
| 2 | **干扰项策略错误**：prompt 明文规定"干扰选项应来自其他节点"（synthesizer.py:532） | 锚定型题干 → 异质干扰秒排；指代型题干 → 干扰项皆为视频真实事实，无法排除 | 全部五题型，双向破坏难度 |
| 3 | **相对指代不可解析**：this segment / this frame / this clip / the first shot | 出题时指源节点，推理管线（inference.py `_run_single_question`）不传作用域，Agent 只能按全视频理解 | IS 8/8 错题、SR 8/8 错题、CP 3/7 错题 |
| 4 | **选项无 shuffle**：`parse_vlm_response`（synthesizer.py:626）原样透传 VLM 输出 | 全 240 题答案分布 A=137(57%)/B=68/C=30/D=5(2%)；benchmark 均匀。实测 Agent 位置偏好弱（bench 上 A 73.5% vs D 70.5%），影响约 1-2pp，但污染一切位置敏感评估 | 全部 |
| 5 | **元问题与内部术语泄漏**：题面出现 "the frame summary" / "the scene summary" / "event description 里描述了几个事件" | 考的是树构建产物措辞而非视频内容 | CP、SR、IS 各 1-2 题 |
| 6 | **题型漂移**：prompt 对题型约束只有裸 `f"题型: {task_type}"` | AR 中约 3 题实为事实回忆，ARec 中 4 题不考动作 | AR、ARec |
| 7 | **标注幻觉/答案不唯一**：卡片无数字时出题 LLM 编造；比分类量随时间变化 | CP：dXBREPP1hfo-004 标注 7、帧中实为 6；rVPDIRSyS34-010 平局分数 7 和 8 都成立 | CP、ARec 个别 |

## 三、各题型要点

### Action Reasoning（100% 全对）
题干直接引用 visible_text/字幕原句甚至时间戳（如 "Red side stole the Voidgrubs!"），正确答案是节点原文摘录；Agent reasoning 自曝排除逻辑——"这个选项属于别的片段"。真题用时间窗/序数定位、答案不在任何一句字幕中显式出现。一句话：**真题考"看懂后想"，生成题考"搜到后抄"**。TaskTypeSpec 定义为单 L2 节点，结构上不可能产生跨片段因果推理。

### Action Recognition（85%）
干扰项质量三档：一眼假 9/20、跨场景 5/20、接近 benchmark 水准 6/20。3 道错题全部落在质量最高一档，且错因是题目缺陷（多解、标注争议、指代不清）——即对 Agent 构成真实挑战的题几乎为零。benchmark 难点（哪只耳朵戴耳机、两两组合选项）恰是树摘要不编码的细节。

### Counting Problem（65%）
20/20 单 source_node；benchmark 错题 83% 要求跨全片枚举实例。生成题 10/20 数字直接写在字幕/屏幕文字里（"we got 10 infrared cameras"），Agent 是"定位后读数"不是"数"。7 道错题中 6 道是题目缺陷（指代错位 3、元问题 1、标注幻觉 1、答案不唯一 1），剔除后有效正确率 ≈ 93%——**实际比 65% 显示的更简单**。

### Information Synopsis（60%，假难）
8/8 错题为题目缺陷：单 L1 段落出题，题干"this segment"不可解析 + 干扰项为其他段落真实事实 → 全视频读法下多选项皆真（tslKtm6Le1s-007 四个选项全部属实），甚至标注答案为假（lw3_W5X1t54-017 的"NOT included"项实际出现在 L1_000）。含 segment/scene 指代的 11 题错 7 道（64%），无指代的 9 题只错 1 道（11%）。benchmark 163 题仅 1 题提 segment。Agent 检索与证据链本身高质量，**修复作用域后差距预计大部分消失**。

### Spatial Reasoning（60%，假难 + 构念不匹配）
意外正面发现：树的 L3 节点有专门 `spatial_layout` 字段，8 道错题标注答案全部能在源节点逐字找到依据，"文本树丢失空间信息"的预设风险未发生。真正缺陷是帧级问题抛到视频级作答："this frame" 无时间锚，长视频多个帧满足题干，干扰项又是其他帧的真实布局 → 每个选项都在某帧为真。另外 benchmark 的 11 道"Spatial Reasoning"实为视频级粗粒度题（哪个大洲/哪国），与生成题的帧级布局题考的不是同一能力，**p=0.028 的对比在构念上不成立**。

## 四、修复建议（按优先级）

| 级 | 措施 | 位置 |
|----|------|------|
| P0 | 解析后代码级 shuffle 选项并重映射 answer（勿指望 prompt） | synthesizer.py:626 |
| P0 | 干扰项策略反转：删除"来自其他节点"，改为"与正确答案同场景最小扭曲（换实体/数量/方向），且须在全视频范围内可证伪" | synthesizer.py:532 |
| P0 | 题干指代黑名单：禁 this segment/frame/clip、the frame summary 等；必须携带全片可定位锚（时间段用 L1 time_range 现成字段） | prompt |
| P1 | **verifier 回环**（拦截力最强）：出题后让不带 source_nodes 提示的 Agent 在全树作答，非唯一收敛即拒题；本次五题型的缺陷题几乎全部会被拦截 | 新增验证步 |
| P1 | 反泄漏 gate：题干/正确选项 vs 源节点文本 n-gram 或 embedding 重合度门控 | 新增验证步 |
| P1 | Counting 强制 source_nodes≥3 跨 L1 段，标注答案数字出现在任一源节点文本中即判"直读题"退回 | synthesizer.py TaskTypeSpec |
| P1 | Information Synopsis 强制全视频作用域（source_nodes=全部 L1） | 同上 |
| P2 | 题型定义注入 prompt（1-2 句判据），替代裸 `f"题型: {task_type}"` | synthesizer.py:529 |
| P2 | 感知计数双重验证（VLM 对原帧重数）；答案唯一性检查（时变量全树扫描） | 新增验证步 |

## 五、对当前 240 题的处置判断

当前题集**不宜直接用作进化训练信号**：偏简单题型的"正确"不代表能力，偏难题型的"错误"是标注/良定性噪声——diagnose 阶段会把 Agent 的正确行为归因为缺陷。建议按 P0-P1 修复出题管线后重新生成并重跑校准。

## 六、第二轮独立验证：对第一轮的修正

| 第一轮结论 | 第二轮判定 | 依据 |
|-----------|-----------|------|
| AR/IS/SR 差异显著 | **成立**（AR p=0.004、IS p=0.020、SR p<0.001，二项检验） | 统计复核 |
| ARec (+19.9%)、CP (+15%) 偏简单 | **降级为统计噪声**（p=0.064 / p=0.263，n=20 置信区间过宽）；逐题缺陷仍真实存在，但差异幅度不作为证据 | 盲复现 + 统计复核 |
| 答案泄漏是偏简单主因 | **修正**：泄漏现象成立（题干+正确项 containment gen 显著高于 bench，p=1.7e-20；过半生成题正确项实词可在单一节点 100% 找到），但**泄漏程度不预测逐题表现**（答对/答错组正确项泄漏度 p=0.97）。有预测力的是**题干检索可定位性**（p=0.006，三分位准确率 67.8%→81.5%→85.2%）。纯文本捷径仅得 44% vs Agent 77.5%，泄漏解释力有限 | 全量定量证伪 |
| 干扰项异质可"不看视频排除" | **修正**：异质性成立（embedding gap p=5.6e-07，bench 无此偏差），但"直接排除"不成立（题干相似度启发式仅 41.7%） | 全量定量证伪 |
| IS 8/8、CP 6/7 错题是"题目缺陷" | **归因口径修正**：跨模型复核（Codex）判 11/15 为"Agent 作用域漂移"——但机制一致：题目绑定的源段落作用域**不随题传递**，Agent 无从锁定。是"出题作用域与答题作用域不对齐"的管线缺陷，双方各执一端。另确认 2 题标注无出处（E 类幻觉）、1 题多解、1 题真难 | Codex 复核 |
| SR 8/8 错题是良定性缺陷 | **修正为 5B + 3C**：5 题确为多解（干扰项在其他帧逐字成立），但 **3 题是 Agent 真实检索失败**——其中 2 题 Agent 断言"无证据"的内容逐字存在于源帧 spatial_layout。Agent 有真实的检索漏检失败模式，这是自进化的有效信号 | 独立 SR 复核 |
| 视频子集/管线/位置偏好等混杂 | **全部排除**：157 视频上 bench 73.8% vs 其余 72.5%；每题型分布在 19-20 个视频无集中；Agent 无位置先验（bench 上 A 73.5% vs D 70.5%）。注意事项：两 run git_sha 不同（超时 120s→300s、Redis 修复），adhoc 有 5 道空预测（0.55%），影响可忽略但应记录 | 混杂检验 |
| 修 prompt 可解决 | **强否定**：设计层归因确认 7 类症状中仅"无 shuffle"是实现事故；"复用节点原文"与"干扰项取自其他节点"是设计文档（synth-design §3.5）明文规定方案的结构必然。纯 prompt 补丁下 5 类缺陷换形复发 | 设计层归因 |

## 七、修正后的根因模型（最终版）

四层因果链，上游到下游：

| 层 | 根因 | 证据强度 | 修复对象 |
|----|------|---------|---------|
| **L0 结构** | 出题与答题共享同一封闭信息源（树 card 文本），且单遍生成零逐题验证——可答性/唯一性/难度/防泄漏是全树+答题环境的全局函数，出题 LLM 对其观测为零比特 | 强（设计文档+代码+信息论论证） | 出题架构 |
| **L1 设计规定** | (i) 单节点采样规格：240/240 单 source_node，无一道跨节点整合题——偏简单最结构性的来源；(ii) 干扰项取自其他节点（§3.5 原文）：锚定题秒排、全局题多真 | 强（全量统计+代码+盲复现独立收敛） | TaskTypeSpec + 干扰项策略 |
| **L2 传递缺口** | 出题作用域不随题传递："this segment/frame" 悬空指代 → 多解。含悬空指代题错误率 35% vs 干净题 18%；IS 8 错题 7 道、SR 5/8 道属此 | 强（三路独立收敛：Claude 判"题目缺陷"、Codex 判"Agent 漂移"，机制同一） | 题干自包含化（嵌 L1 time_range） |
| **L3 表面工件** | 无 shuffle（答案 57% 在 A、2% 在 D）；正确项最长（53% vs bench 39%）；标注幻觉（≥2 题数字无出处）；题型漂移 | 强（全量统计） | 后处理+验证器 |

附带发现（Agent 侧）：SR 复核确认 3 道错题是 Agent 真实检索失败（含 2 道"断言无证据但证据逐字存在"），这类漏检模式是 diagnose/evolve 的有效训练信号，与题目缺陷应严格区分。

## 八、一次性修复架构（第二轮设计结论，替代 §四优先级表）

纯 prompt 补丁被明确否决（5/7 缺陷类换形复发）。推荐组合三件套，每题约 4 次轻量 LLM 调用（240 题约 1000 次，离线预处理，Runner 零改动）：

| # | 组件 | 杀死的缺陷类 | 成本 |
|---|------|-------------|------|
| 1 | **确定性后处理层**：代码 shuffle+answer 重映射、悬空指代正则黑名单、题干/选项 vs 全树 card 的 n-gram verbatim 检测拒题 | L3 全部 + 显式指代 | ~100 行纯函数，0 LLM 调用 |
| 2 | **信息不对称化 + 采样规格改造**：L3 题从帧的未入摘要视觉细节出题；Counting/IS 采样规格改跨 ≥2 个 L2（IS 全部 L1）；题干强制嵌入 L1 time_range 时间锚；泄漏 gate=文本-only 试答（给 LLM 全部相关 card 文本，能答对即拒） | L0/L1 结构病根（唯一触及信息重合的方案）；迫使 Agent 走 observe_frame 下探与多跳聚合——正是训练目标 | 改 TASK_TYPE_LEVEL_MAP + prompt + 1 调用/题 |
| 3 | **轻量三验证器**：键验证（VLM 拿锚点证据判 key 成立否→杀标注幻觉）、盲答测试（无视频信息裸答，答对即拒→杀常识/秒排）、多真测试（拿全部干扰素材判 >1 选项可真否→杀歧义多解） | L2 残留 + 标注幻觉；保护 diagnose 信号纯度（错键题=有毒梯度） | 3 调用/题 |
| 锦上添花 | 全量盲 Agent 试答作准入抽检 + 难度标签（喂 mini-batch 构建）；对抗式加难留到自进化跑通后（须固定出题对手版本保分布平稳） | 难度校准 | 一次完整 infer |

**注意**：作用域修复方式选"题干嵌时间锚"而非"推理时传 source_nodes"（Codex 曾建议后者）——传 source_nodes 等于泄漏答案位置，搜索训练失效；Video-MME 真题的做法正是把时间锚写进题面（"At the 06:00 mark..."）。

## 相关文件

- 出题逻辑：`app/question_gen/synthesizer.py`（TaskTypeSpec:67-83、干扰项采样:201-208/289-295/372-373/443、prompt:507-600、parse:626）
- 唯一质量门（现状）：`tools/generate_questions.py:758-765`（仅 JSON 格式+embedding 去重）
- 答题侧作用域缺失：`app/search/prompt.py:79-107`（只传 question/options/L1 根列表）
- 设计文档规定处：`research-wiki/designs/2026-07-09-question-gen-synth-design.md` §3.5（干扰项来自其他节点）、§6（校准为聚合级非逐题门）
- 定量分析脚本与逐题指标：scratchpad `leakage_analysis.py`、`metrics.json`（会话级临时目录）
- 数据：`store/questions/generated/`、`store/videos/<video_id>/tree.json`、`workspaces/default/harness.db`
