Files
yingqing/docs/todo/实体提取解耦-plan.md
T
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

6.7 KiB

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 本轮不做、只记着 —— 确认。