Files
yingqing/docs/todo/实体提取解耦-plan.md
seaislee1209andClaude Opus 4.8 827fa7fa54 feat(ai): 实体提取解耦 — 定稿剧本后独立提取角色/场景 + 商品参考图永远带上
根因:实体跟脚本生成耦合,模型不稳(尤其改稿 revise)常丢实体 → 角色提不出、
参考图全空 → 故事板/视频退化纯文生图(用户 demo 全错的真因)。

- 新 skill ecommerce-entity-extract(按 skill-creator 法写):只提角色+场景,
  角色铁律=穿整套衣服/空手/不带与商品同类物/不暴露;商品不提。4 项目实测稳定产出。
- extract_entities_for_project + /extract-entities 端点:读定稿剧本→提实体→
  落库覆盖 metadata + 回填每镜 entity_refs(提取为唯一权威来源,脚本生成完全不动)。
- 商品参考图永远带上:_storyboard_reference_images(视频继承)改为无条件带
  商品三视图→主图兜底,不再依赖 entity_refs 里有没有商品实体。
- 创建商品后端强制要主图(堵兜底洞:无图商品会让下游参考图彻底落空)。

实测:杂鱼煲(原实体0)→6实体,每镜参考图齐(角色+商品+场景),不再文生图。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 17:37:18 +08:00

64 lines
6.7 KiB
Markdown

# Plan · 实体提取解耦 + 资产页提取入口
> 目标:根治"角色没提取 / 参考图全空 / 退化文生图"。把**实体提取从脚本生成里拆出来**,做成定稿剧本后、进资产页时的独立一步(AI 提角色+场景,商品用预创建的)。脚本只管脚本,随便改不影响。
## 根因回顾(已实测)
脚本 AI 把"实体"和脚本一起吐 → 模型不稳(尤其改稿 revise 会丢实体)→ 最近项目 `实体数=0 / entity_refs=空` → 角色提不出、参考图选 0 张 → 分镜/视频全文生图。**解耦后,提取在定稿剧本上单独跑一次,与改稿无关,稳。**
---
## Phase 1 · 写「提取 skill」(用官方 skill-creator 的方法写)
新建 skill(放 `skills/` 下,如 `ecommerce-entity-extract/`)。契约:
- **输入**:定稿剧本全部分镜(narration/visual/role)+ 商品信息(名称/卖点)。
- **只提 角色 + 场景**(**不提商品**)。商品由代码用预创建商品注入,不从剧本提(避免和上传的不符)。
- **每个实体写 `visual_prompt`**:
- **角色**:① 真人电商模特、**穿着得体、符合剧情的整套衣服**;② 剧本没写穿搭就**按剧情+商品风格设计一套**;③ **空着手 / 不拿任何道具 / 不拎包**;④ **不得出现与商品同类的物件**(商品是包→人身上无包);⑤ 不暴露(除非商品本身是泳装等)。
- **场景**:地点 / 光线 / 风格,干净构图。
- **AI 判定每镜出现哪些角色/场景** → 每个 segment 的 `entity_refs`
- **输出 JSON**:`entities:[{id,type:character|scene,name,visual_prompt}]` + `segment_refs:[{index, refs:[实体id...]}]`
- skill 里把上面"角色铁律"写死。注:`visual_prompt` 只写"中间那段人物/场景描述",外面那层质量模板由代码加(用户看不到)。
## Phase 2 · 后端独立提取步
- **新端点** `POST /api/projects/{id}/extract-entities/`(可带 `generate: none|character|full` 决定提完要不要接着生成)。
- 读定稿(已采用)剧本 → 调提取 skill(一个文本模型,复用现成 `_extract_cast_scene` 升级)→ 得角色/场景 entities + 每镜 refs。
- **商品参考图:三视图优先 → 主图兜底,且无条件带上**。提取只产角色/场景、不碰商品。改 `_storyboard_reference_images` 与视频取参考图:每镜**无条件带一张商品参考** = 优先已采用的**商品三视图**(product 组的 adopted_asset)→ 没有则用**预创建商品主图** `_product_cover_url`。(现状只在"refs 里有商品实体、或一张都没匹配"才带 → 提取后没商品实体会漏,实测确认。)商品不进 entity_refs、不从剧本提、不生成。
- **创建商品强制要主图**(堵兜底的洞):实测 `Product.cover_asset` 可空、后端 create 不校验图、images `required=False` → 能建出一张图都没有的商品,那主图兜底就空了。**后端 ProductSerializer.create / validate 加校验:创建商品必须至少 1 张图**(前端抽屉已校验,后端补上,堵 API/向导路径)。
- 落库:`project.metadata`(cast/cast_prompts/scenes/scene_prompts/**script_entities**)+ 回填每条 `ScriptSegment.entity_refs`。**提取是实体的唯一权威来源**(脚本生成里就算吐了 entities 也以这步为准、被覆盖)。
- **脚本生成那块完全不动**(脚本只管脚本)。我之前提的"改稿保底"补丁因此作废、不需要了。
- `generate=character`:提完顺手生成 **角色 + 场景** 基础资产;`generate=full`:角色 **全身照 + 三视图** + 场景。商品不生成(用主图)。
## Phase 3 · 前端资产页提取入口(蒙版 + 3 按钮)
- 进资产页 + 尚未提取 → 资产区盖**半透明蒙版**(同脚本页风格),中间面板:
- 标题「先从剧本认出角色 / 场景」· 副 `// 生成图会扣费,交给你点,不自动花钱`
- 三按钮(轻→重):
| 按钮 | 主文案 | 角标 | 做什么 |
|---|---|---|---|
| ① | 只提取关键词 | `不出图` | 提角色/场景,出提示词,不生成 |
| ② | 提取 + 生成角色和场景 | `会扣费` | 提完生成角色立绘 + 场景图 |
| ③ | 提取 + 全套资产 | `会扣费·最全` | 角色全身照+三视图 + 场景图 |
- 点 → 蒙版留住 + Loading 转 → 完成取掉蒙版:① 只露提示词卡;②③ 连图摆好。
- **角色卡只显示可改的"描述"(visual_prompt)**,写死的质量模板不展示给用户。
- 加「**重新提取**」按钮(改了脚本可重提,会覆盖)。
## Phase 4 · 兜底弹窗拦截(防"花冤枉钱"·重点)
现状兜底是**静默退化成文生图/文生视频** —— 出来的东西跟用户建的角色/商品完全无关,用户觉得花了冤枉钱、易起纠纷。因为参考图是**自动关联**(没给用户手选),所以**生成前必须检查 + 拦截**,不许静默生成。
- **检查时机**:生成**故事板**、生成**视频**前(消费参考图的步骤;角色/场景基础资产本身是文生图、不在此列)。单镜生成查该镜,整批生成查所有相关镜。
- **检查内容**:对每镜 entity_refs,逐个**角色/场景实体看有没有已采用的基础资产**(商品永远有主图、不算缺)。算出"缺哪几个"(按名字)。
- **不齐就弹窗拦截、不生成**:弹窗列"这镜需要 角色A/角色B/场景X,但【角色B、场景X】还没生成参考图",主按钮「**去补齐**」(跳资产区高亮待生成项)+ 次按钮「仍要生成(可能跟你的角色对不上)」。默认引导补齐;齐了才正常生成。
- 后端原有的文生图兜底保留作"用户执意 仍要生成"时的最后退路,但**默认走前端拦截**。
## (未来待办,现在不做)质量词搬进 Admin
平台暂无 Admin 页面。等做 Admin 页(用户会给参考代码)时,再把各阶段写死的质量/规格词(画面清晰/9:16/镜头稳定…)抽进可配置表 + 编辑入口。**本轮不碰,仅记录。**
## Phase 5 · 真跑验证(不是构建过就算完)
真实流程跑一遍:生成脚本 → 进资产页 → 点①看角色/场景实体和每镜 refs 出来(商品永远带主图)→ 点②③看角色+场景图生成 → **故意留一个角色不生成,验证故事板/视频前弹窗拦截**(列出缺的、不静默生成)→ 补齐后故事板/视频看参考图真接上(不再全文生图)。用 `_storyboard_reference_images` 实测脚本逐镜核 refs 数。
---
## 待你确认
1. **脚本生成完全不动、提取步覆盖为准**(改稿无忧)—— 对吧?
2. **商品永远带主图当参考**(不提取、不进 entity_refs、不生成)—— 对吧?
3. 按钮 ②③ = **角色 + 场景都生成**(商品不生成)—— 对吧?
4. **兜底弹窗拦截**:缺参考图就弹窗让用户去补 —— 要不要保留「仍要生成」强制选项(带警告),还是**硬拦到补齐为止**?
5. 质量词 Admin 本轮不做、只记着 —— 确认。