# 出题质量 v2 诊断与重构策略：Phase A 为何不够、四层病灶、锁定方向

- **日期**: 2026-07-15
- **触发**: Phase A（grounded selector）落地并生成 30 道 AR 题后，Claude 三 agent + Codex 独立质量抽检均判"未真正过关"；遂精读已下载 6 篇论文，定位根因并锁定 v2 重构方向。
- **前序**: [2026-07-14-ar30-too-easy-analysis.md]（96.7% 太简单诊断）、[2026-07-14-hard-distractor-literature.md]（首轮文献调研）、[2026-07-14-grounded-question-gen-phaseA-design.md]（Phase A 设计）。

## 一、质量抽检结论：Phase A 部分奏效，但没解决真问题

对 Phase A 生成的 12 道新题 + 8 道旧 baseline 做了两次独立抽检：

| | Claude 三 agent | Codex（独立） |
|---|---|---|
| 负空间干扰项 | 基本消灭（12 道仅 1 处） | 减少但 grounding **不可审计** |
| 仍可 shortcut | 4/12 | **8/12** |
| 严格 grounded | 多数 | **仅 1/12** |
| 双正解高风险 | 3 处 | **4/12** |

机制层证据：干扰项视觉分落 [0.05,0.35] 甜区 90%——**但这是 selector 用自己的 VLM 给自己打分（循环自证）**，Codex 一针见血："视觉可信分包装过的、不可审计的近似答案"。

## 二、四层病灶（根因）

| 层 | 病 | 证据 |
|----|----|----|
| **① grounding 来源** | 用**同一个 VLM 生成+打分**，且是"生成式 judge 打分"而非跨模态度量 → 循环自证、不可审计 | 抽检；GroundAttack 对照 |
| **② 题型结构** | **1-vs-3 单共识 + 自由编辑**天然可被：逐槽多数投票、最模糊/子串项获胜（A⊃B）、最长项获胜 | 抽检逐题 |
| **③ 歧义控制** | Phase A **松绑了 multi_true**——方向反了，放进更多近双正解 | 抽检 4 道双正解 |
| **④ 对抗信号位置** | 只做后置过滤（Phase B）；过滤天生分不清"难"和"歧义"，且产量靠反复补生成 | AFLite 自认局限 |

## 三、文献回挖（6 篇，对症三缺口）

### GroundAttack（grounding 的正解 + 关键纠偏）
- **三个独立冻结模型**：Qwen2.5VL 描述 / DeepSeek-V3（纯文本 LLM）生成候选 / **SigLIP(CLIP) 打分**。生成候选的模型**看不到视频**，结构上无法自评。
- **打分是跨模态 embedding 相似度**（候选文本嵌入 vs 真实帧视觉嵌入的 cos），**不是 VLM 生成一个分**。Clustering+CLIP：K-means 聚类 → 每簇取与真实帧 argmax。
- **纠偏**：只把自评 VLM 换成第二个 VLM（MiniMax-M3）只解决"同模型循环"，**仍不是 GroundAttack 机制**（那是 embedding 度量）。且 bge 是纯文本、算不了跨模态，跨模态必须 CLIP/SigLIP。
- GroundAttack 独立验证了"grounded"，**没独立验证"wrong"**——这是它的短板，正好留给 MiniMax-M3 补。

### TempCompass / VITATECS / Vinoground（题型 + 歧义）
- **放弃 1-vs-3，改对称 1-vs-1 对比对**：VITATECS 五条约束（禁蕴含=杀子串、等信息量=杀最长项、只改单维）；Vinoground **正负选项同词不同序**（bag-of-words 相同 → 长度/具体度线索结构上不存在）+ **双向 AND 评分**（问 A 问 B 都对才算，杜绝蒙）。
- **text-only 盲答过滤**：Vinoground 0 帧探针 / VITATECS NLI 蕴含过滤——去视频只喂选项，高于随机就剔。
- **歧义靠收紧不靠松绑**：全用"人在环 + 一致性 κ + 高精度过滤器（宁杀错勿放歧义）"。VITATECS 原话"更在乎 precision 而非 recall"。
- 警钟：随机换词/名词替换干扰项极易被解（74.5–90.3%），动作反事实必须落在**动词/事件结构** + 等信息量 + 禁蕴含。

### AFLite / AdVQA（对抗信号位置）
- AFLite 作者**自认**：模型化过滤**分不清"题难"和"题烂/歧义"**（过滤后人类正确率反降）。我们的作弊者门是其单模型无集成弱化版，**必然继承并放大盲点**。
- AFLite 不解决产量，靠超大池剔剩 1/3 糊弄；无补生成。
- AdVQA 正解：**对抗前移到生成端**（出题当下让活模型试答）+ **独立于求解器的多裁判答案一致性门**（10 人，<6 confident 或无共识→剔）。自动对抗（无一致性校验）会制造歧义/标签漂移——同我们盲点。

## 四、两个把方案串起来的洞察

1. **Phase B 翻转门 = Vinoground 双向对比**：机制对，但**用错层**——应把"对称 before/after 对"做成**生成格式**，而非先生成 1-vs-3 再事后翻转检验。
2. **MiniMax-M3 定位不是 grounding scorer，是独立"错误性/歧义核验器"**：补 GroundAttack 缺的"wrong"验证 + 堵"歧义当难度"盲点。

## 五、锁定的 v2 重构方向（用户已拍板：三个都选治本重构）

| 岔路 | 决定 |
|------|------|
| **题型** | **全面转对称 1-vs-1 对比对**（改 4 选项契约，评测/训练侧跟着动） |
| **grounding** | **引入独立 CLIP/SigLIP 依赖**（跨模态 embedding 相似度，最贴 GroundAttack 原意） |
| **对抗位置** | **对抗信号前移到生成端**（作弊者门降为第二道网；主信号生成时产生） |

目标架构（待 brainstorming 细化）：
```
生成: 出"正解 + 单维反事实"对称对（等信息量/禁蕴含/尽量同词不同序）
grounding: 独立 CLIP/SigLIP 对真实帧算相似度选负项（不是 VLM 自评）
歧义门: MiniMax-M3 独立核验"确实错、非双正解" + NLI 禁蕴含 + text-only 盲答过滤（收紧）
对抗: 主信号前移生成端; 作弊者门 = 第二道网; 双向 AND 评分
```

**下一步**：brainstorming 定 question-gen v2 设计（重点解决：对比对如何进 inference/eval/training 的 4 选项契约、CLIP 适配器如何装配、生成端对抗的反馈环怎么设计、Phase A/B 既有代码如何取舍）→ Codex 审 → writing-plans → 实现。

## 相关
- 论文：`reference/papers-distractor-gen/`（GroundAttack/TempCompass/VITATECS/Vinoground/AFLite/AdVQA）
- 现有实现：`app/question_gen/distractor_selector.py`（VLM 自评，待换 CLIP）、`adversarial_filter.py`（Phase B 翻转门，待前移为生成格式）
- 独立 VLM：`.env` 的 `M3_VL_LLM_*`（MiniMax-M3，异于生成用的 qwen3.6-plus）
