# 生成题 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//tree.json`、`workspaces/default/harness.db`