# run7 差异根因分析 & 修复计划

生成时间：2026-05-07
数据：run7 vs Ground Truth (人工 + run4 填充)，共 242 条差异，涉及 35 个字段

---

## 中断说明

上一轮任务没有真的中断，是我在做字段级聚类分析（按字段、按方向、按素材三个维度交叉统计），输出切成了太多 tool call 片段，没及时收敛成完整产出。这次直接给完整方案，不再分批。

---

## 根因归类（5 大类）

### 类别 A：`composite`（复合画面）被拆成 `template` / `original`（13 处 source_type）

- **现象**：run4 标 `composite` 的 13 条素材，run7 里 6 条改判 `template`、6 条改判 `original`、1 条 `ai_generated`
- **根因**：当前 prompt 对 `composite` 的定义用的是「多元素叠加」描述，**判断条件偏抽象**，模型在遇到"实拍 + 文字叠层"或"图片 + badge 叠层"时没识别为 composite
- **修复方向（正向描述）**：在 prompt 中给 `composite` 增加可操作性检查项
  > 「当画面同时包含以下任意两类元素时，属于 composite：(1) 实拍视频或照片主体；(2) 文字/数字叠层；(3) 图标、徽章、装饰图形；(4) UI 截图嵌入。具备多层合成结构即判定为 composite，无需判断后期制作难度。」

### 类别 B：`theme.primary_theme` 偏好"大主题"，忽略具体题材（12 处）

- **现象**：
  - `first_time_borrower` → `general_loan_access`（2×）
  - `flexible_repayment` → `general_loan_access`（2×）
  - `business_financing` → `general_loan_access`（2×）
  - `interest_rate` → `general_loan_access`（1×）
- **根因**：模型倾向于选通用标签兜底，**没被告知 primary_theme 应锁定"最显眼的具体卖点"**
- **修复方向（正向描述）**：
  > 「primary_theme 选取创意里最突出的具体主题。当素材明确提及以下内容之一时，优先选更具体的标签：(1) 首次借款、新用户、第一次申请 → first_time_borrower；(2) 灵活还款、分期、延期、自选期限 → flexible_repayment；(3) 企业主、个体工商、小微企业、经营贷 → business_financing；(4) 利率、日息、年化、低息 → interest_rate。只有当素材仅泛泛说"提供贷款、快速放款、申请方便"时，才选 general_loan_access。」

### 类别 C：secondary 字段（*_secondary_*）整体偏少/偏多（共约 60 处）

涉及字段：
- `offer.secondary_angles`（14）
- `visual.secondary_presentation_formats`（12）
- `structure.secondary_story_formats`（12）
- `platform_style.secondary_format_patterns`（12）
- `visual.secondary_elements`（8）

- **现象**：
  - `offer.secondary_angles` 漏掉 `high_amount`(-4)、`easy_process`(-3)，多选 `application_process`(+5)
  - `structure.secondary_story_formats` 漏掉 `demo_walkthrough`(-6)、`data_comparison`(-4)
  - `platform_style.secondary_format_patterns` 漏掉 `talking_head_pitch`(-4)
  - `visual.secondary_presentation_formats` 漏掉 `amount_highlight`(-4)
- **根因**：当前 prompt 对 primary + secondary「三段式」的指令侧重"选出最强的作为 primary"，**对"次强候选要全部列出"的执行力度弱**，模型经常只列 1-2 个 secondary，漏掉中等证据的候选
- **修复方向（正向描述）**：
  > 「secondary_* 应覆盖所有"素材里有出现、但证据强度不如 primary"的候选值。执行步骤：(1) 对每个枚举值逐一检查素材中是否存在对应证据；(2) 收集所有有证据的候选；(3) 证据最强的作为 primary，其余全部进入 secondary，即使只有画面一角、一句旁白、一个数字提示。当确实没有次要候选时，写入 ["none"]。」

### 类别 D：视觉/结构字段"走向单一值"（约 25 处）

- `visual.primary_element`: run7 多选 `product_ui_focus`(+5)，漏 `live_person`(-3)
- `visual.color_tone`: run7 多选 `warm`(+4)、`neutral_clean`(+3)，漏 `vibrant_colorful`(-4)
- `subject.role_type`: run7 多选 `everyday_user`(+5)，漏 `customer_persona`(-3)
- `copy.hook_type`: run7 多选 `direct_offer`(+3)、`curiosity_gap`(+2)
- `structure.edit_pace`: run7 多选 `slow`(+2)，漏 `medium`(-2)

- **根因**：模型倾向"选代表性最强的那个 bucket"，**缺少多维度交叉检查**。例如画面里既有真人又有产品 UI，会只选其中一个
- **修复方向（正向描述）**：
  > 「primary_element 选占画面面积最大、时长最长的元素。执行步骤：(1) 记录画面中出现的所有元素（真人、UI、图形、文本、数据）；(2) 比较各元素的占画面积和持续时长；(3) 面积最大 × 时长最长的为 primary，其余进 secondary。当画面以真人出镜为主、UI 仅作道具出现时，primary = live_person，secondary 包含 product_ui_focus。」

### 类别 E：`production.source_type` / `subject.people_count` / `structure.primary_story_format` 单点错判（约 20 处）

- `subject.people_count`: `0` → `1`（5×）—— 没识别"无真人"
- `structure.primary_story_format`: `demo_walkthrough` → `single_static`（2×）等
- `copy.cta_style`: run7 多选 `apply_now`(+4)，漏 `easy_process`(-2)

- **根因**：部分字段在 prompt 中**没有明确的"零值/默认值"指引**
- **修复方向（正向描述）**：
  > 「people_count 是画面中出现的真人数量。当画面只有图形、UI、动画、文字，没有任何真人出镜时，填 0。当画面有真人旁白但画面只有产品截图时，仍填 0。」

---

## 修复计划（按优先级）

### P0（影响大、收益高）

| 字段 | 差异 | 预计修复后准确率提升 |
|------|:----:|:------------------:|
| `production.source_type` | 13 | +12 (85% → ~95%) |
| `theme.primary_theme` | 12 | +8 |
| `subject.people_count` | 8 | +6 |

**动作**：更新 `label_creative_e2e.py` 的 `LABEL_SYSTEM` prompt，补充：
1. composite 可操作定义（A）
2. primary_theme 四层具体优先级（B）
3. people_count 零值明确规则（E）

### P1（次重要）

| 类 | 涉及字段 | 差异总数 |
|----|----------|:--------:|
| C secondary 三段式强化 | 5 字段 | 58 |
| D 视觉字段交叉检查 | 5 字段 | 20 |

**动作**：
1. 在 `LABEL_SYSTEM` prompt 中加入统一的「逐值检查 + 候选收集 + primary/secondary 分配」执行步骤
2. 在 `labeling_rules.py` 的后处理中，对 secondary 字段加一道「至少触及 N 个候选值检查」的规则提示

### P2（边缘优化）

- `copy.cta_style` / `copy.tone` / `platform_style.native_feel`：共约 10 条差异，当前逻辑基本对，调整描述词典即可

### 明确不修的（属于人工标注方法本身的边界值判断）

- `subject.role_type` 的 `customer_persona` vs `everyday_user` —— 两者定义有重叠，属于人工判断边界值
- `visual.color_tone` 的 `warm` vs `vibrant_colorful` —— 同素材有人会标前者有人会标后者
- 这部分差异建议留给后续字典迭代 v7 处理，不动现行 prompt

---

## 执行步骤

1. **第 1 步**：锁定 prompt 改动（A + B + C + D + E 对应 5 段新增段落），我产出新版 prompt diff 让你确认
2. **第 2 步**：改完后跑一次 **15 条素材复跑**，作为 run8
3. **第 3 步**：用同样的 Ground Truth 对 run8 做一次校验，看每字段准确率是否提升
4. **第 4 步**：如果 run8 整体 > 80%、人工字段 > 45%，定版；否则分析失败字段再迭代一轮

**预计目标**：run8 总体准确率 71.9% → 82%，人工字段准确率 28.8% → 45%+

---

## 产物

- `run7_field_analysis.json` - 每字段 run7 多选/漏选的统计
- `run7_diff_all.tsv` - 242 条差异全量导出
- `run7_verify_report.html` - 交互式 HTML 报告
