Files
Video-Tree-TRM5/research-wiki/designs/2026-07-11-question-gen-v2-design.md
T

7.5 KiB
Raw Blame History

Spec-3:出题管线 v2(失败机理靶向 + 逐题质量门)

  • 日期: 2026-07-11
  • 状态: 已批准(用户确认:双标签体系、轻量档全量 + 重量档 15% 抽检)
  • 依据: 三轮分析——findings/2026-07-11-question-gen-calibration-analysis.md(生成题缺陷与根因)、findings/2026-07-11-benchmark-failure-taxonomy.md(242 错题机理分类与 11 种题型规格)
  • 系列: Spec-1/2/3 三件套之一;Spec-1 修好的推理环境是本 spec 重量抽检的前置

1. 目标重定义

出题目标从"难度与 benchmark 一致"改为:覆盖已证实的失败机理(M1-M5)+ 逐题质量门

决策 内容
calibrate 降级 仅作观测性报表,不再是验收门
评分协议不变 标准四选一按字母判分;harness/推理侧零改动。题型规格中"附证据节点 id"等要求降级为构造时验证材料,存题目元数据供 diagnose 分析
双标签体系 主标签 task_typeVideo-MME 12 类,进化循环 mini-batch/gate/skills/diagnose 零改动)+ 附加字段 skill_target(M1-M5/题族,仅用于出题配比、质检、覆盖率统计)
质检两档 轻量四门全量逐题;重量档(盲 Agent 全树试答)15% 抽检 + 难度标签

2. 流水线架构

重构 app/question_gen/synthesizer.py + tools/generate_questions.py generate 子命令:

graph LR
    S[采样器<br/>按题族选素材] --> G[生成器<br/>题族 prompt 模板<br/>双标签输出]
    G --> P[确定性后处理<br/>shuffle+答案重映射<br/>指代黑名单<br/>verbatim 检测]
    P --> Q{轻量四门 全量}
    Q -->|拒| R[带拒因重出<br/>同 slot 最多 3 次]
    R --> G
    Q -->|过| H[重量抽检 15%<br/>盲 Agent 试答→difficulty_steps]
    H --> W[入库 generated-v2]

2.1 五题族(11 种题型的落地归并)

每族一个采样器 + 一个 prompt 模板,题型(shape)作为模板参数:

题族 覆盖题型 采样约束 治什么 默认配比
检索族 证据埋深/反"不存在"、ASR 实体对齐、属性辨析 证据取自 entities/visible_entities/visible_text/长字幕单句;配镜像题(真不存在) M1 负证据幻觉(最大杠杆) 30%
推理族 转述还原、NOTA 校准对 从字幕单句做一步语义变换(蕴含/虚拟语气/序数映射);NOTA 成对生成(半正解半陷阱) M2 字面匹配 25%
枚举族 多实例锚定、序数枚举、覆盖率权重 source_nodes ≥ 3 跨 L1;同类事件 ≥2 次;首个表面匹配必须是错的 M3 锚定/盘点 20%
视觉族 状态演化多帧、实例消歧数字 证据仅在帧内、不在任何 card 文本;多时刻真实读数做干扰项 M4 视觉验证 15%
空间族 参照系空间 spatial_layout 字段 + 时间锚;摄像机/被摄者双参照系 T5 空间 10%

2.2 确定性后处理(零 LLM 成本,通用硬约束)

  1. 选项 shuffle + 答案字母重映射(修复 v1 答案 57% 在 A 的偏斜)
  2. 指代黑名单(正则):禁 this segment / this frame / this clip / the current frame / the scene / frame summary 等;题干必须含 L1 time_range 时间锚("between 10:52 and 21:44"式)或全局限定语("in the entire video"
  3. verbatim 检测:题干+正确项 vs 源节点文本的 n-gram 重合门(检索族豁免正确项检测——其证据本来就在文本,见 2.3)
  4. 出题禁区:不出 T1 类素材题(瞬时动作/记分牌时序/无对白因果);不复刻 T7 噪声模式(选项重复、口径含糊的计数边界)

2.3 轻量四门(全量逐题,约 4 次单轮 LLM 调用/题)

判定 杀什么
键验证 拿出题依据(source_nodes 原文)判标注答案是否成立 标注幻觉(v1 CP 组 2 例无出处)
盲答测试 不给任何视频信息裸答,答对即拒 常识可解题、干扰项秒排题
多真测试 拿全树素材判是否 >1 选项可为真 歧义多解题(v1 SR 组 5/8
泄漏测试 按题族条件化(见下) 一跳检索捷径

泄漏门的题族捷径画像("信息不对称化"的落地):

题族 捷径画像(该捷径必须失败才放行)
检索族 top-5 语义搜索片段裸答必须失败(全树 card 文本裸答允许成功——考的是检索深度)
视觉族 全树 card 文本裸答必须失败(逼 observe_frame
推理/枚举/空间族 锚点节点文本裸答必须失败(需变换/跨节点)

2.4 重出循环与重量抽检

  • 拒题 → 拒因回填到生成 prompt → 同 slot 重出,最多 3 次;3 次仍拒则该 slot 换素材重采样
  • 通过四门的题按 15% 抽样跑盲 Agent 全树试答(复用 Spec-1 修复后的推理管线):验证真实可答性,产出 difficulty_steps 难度标签

3. 数据与版本

决策
旧 240 题 原地保留 store/questions/generated/infer_gen240 run 引用它,保可复现)
新题集 store/questions/generated-v2/workspace 以 --questions generated-v2 指向
题目元数据新增 skill_targetsource_nodes(已有)、gate_report(四门判定)、difficulty_steps(抽检题)
规模 默认 240 题;task_type 均匀(20/类)为硬约束(进化循环分层需要),族配比为软目标(±5%——采样器按"族 × task_type 兼容矩阵"(如枚举族→Counting/Temporal 类)分配每题的双标签;YAML 可扫

4. 配置归属(D7 规则)

  • 科研配置per-experiment YAML):族配比、门阈值(n-gram 窗口、多真判定温度)、抽检率、重出上限、规模
  • 工程配置.env):LLM/VLM 端点、超时、熔断——沿用现有

5. 运行时数据

每题的门判定记录(哪门拒、拒因文本、重出轮次、最终状态)落 SQLite。表结构在设计批准后走 structured-logging skill 单独设计(本 spec 只约定:记录必须逐题可追溯、可聚合出各门拦截率报表)。

6. 不做什么(YAGNI

  • 不改判分协议、不改 harness/推理侧、不改 mini-batch/gate/diagnose 的 task_type 分组
  • 不做对抗式加难迭代(留到自进化循环跑通后,须固定出题对手版本)
  • 不做 T1 树增强(用户已确认本次不做)
  • 不引入树外信息源(原始视频重新抽帧出题)——视觉族用现有帧缓存即可

7. 验证

  1. Smoke:12 个视频 × 每族 2-3 题,验证四门拦截率、重出收敛(≤3 轮)、双标签与元数据完整性
  2. 全量:生成 240 题 → bash scripts/infer_generated.sh(指向 generated-v2)→ calibrate 报表观测
  3. 回归断言:新题集答案位置分布均匀(卡方检验);指代黑名单零命中;泄漏门画像全部通过
  4. 单测:后处理层纯函数(shuffle 重映射、黑名单、n-gram 门)

8. 被否方案

  • 纯 prompt 补丁:第二轮设计层分析证明 7 类缺陷中 5 类会换形复发(信息闭环是结构问题)
  • 失败机理作为主标签:进化循环全链改造,收益不明确;先以元数据形式观察其价值
  • 重量档全量:240 题 ≈ 一次完整推理实验(4-5 小时),轻量四门已拦截三轮发现的全部缺陷类型
  • 难度一致性作为验收门:三轮分析证明分数一致性是坏代理指标(假难/假易双向失真)