Files
Video-Tree-TRM5/research-wiki/findings/2026-07-11-question-gen-calibration-analysis.md
T

115 lines
15 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.
# 生成题 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 编造;比分类量随时间变化 | CPdXBREPP1hfo-004 标注 7、帧中实为 6rVPDIRSyS34-010 平局分数 7 和 8 都成立 | CP、ARec 个别 |
## 三、各题型要点
### Action Reasoning100% 全对)
题干直接引用 visible_text/字幕原句甚至时间戳(如 "Red side stole the Voidgrubs!"),正确答案是节点原文摘录;Agent reasoning 自曝排除逻辑——"这个选项属于别的片段"。真题用时间窗/序数定位、答案不在任何一句字幕中显式出现。一句话:**真题考"看懂后想",生成题考"搜到后抄"**。TaskTypeSpec 定义为单 L2 节点,结构上不可能产生跨片段因果推理。
### Action Recognition85%
干扰项质量三档:一眼假 9/20、跨场景 5/20、接近 benchmark 水准 6/20。3 道错题全部落在质量最高一档,且错因是题目缺陷(多解、标注争议、指代不清)——即对 Agent 构成真实挑战的题几乎为零。benchmark 难点(哪只耳朵戴耳机、两两组合选项)恰是树摘要不编码的细节。
### Counting Problem65%
20/20 单 source_nodebenchmark 错题 83% 要求跨全片枚举实例。生成题 10/20 数字直接写在字幕/屏幕文字里("we got 10 infrared cameras"),Agent 是"定位后读数"不是"数"。7 道错题中 6 道是题目缺陷(指代错位 3、元问题 1、标注幻觉 1、答案不唯一 1),剔除后有效正确率 ≈ 93%——**实际比 65% 显示的更简单**。
### Information Synopsis60%,假难)
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 Reasoning60%,假难 + 构念不匹配)
意外正面发现:树的 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.263n=20 置信区间过宽);逐题缺陷仍真实存在,但差异幅度不作为证据 | 盲复现 + 统计复核 |
| 答案泄漏是偏简单主因 | **修正**:泄漏现象成立(题干+正确项 containment gen 显著高于 benchp=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-07bench 无此偏差),但"直接排除"不成立(题干相似度启发式仅 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`