真因(查 dev 库 + 重放真实失败请求 + 真调 ARK 定位):线上提取的 system 提示词长度=0。
core-api 镜像由 `./core/backend` 构建,而 skills/ 在仓库根、不在构建上下文 → 镜像里没有
→ _load_skill_system_prompt 返回空串 → 模型收不到「只输出 JSON」铁律 → 吐 markdown/散文
→ 正则抽不到 {} → 「提取结果解析失败(模型未返回有效 JSON)」。本地有 skills 故一直没复现。
(脚本生成同样受影响,只是它有退化兜底提示词,质量打折但不报错。)
验证:用 dev 库里你那条失败请求的真实脚本重放——空 system→无 JSON;补上 skill 提示词
→ 立即出 JSON(角色/场景齐、商品不提)。
改动:
- skills/ → core/backend/skills/(git mv,进构建上下文,Dockerfile `COPY . .` 自动打包)。
- services._skills_root()/script_agent._skill_dir():优先 BASE_DIR/skills,回落仓库根(双兜底)。
- worker 失败时也落 response_payload(含 content / reasoning 预览 / system_chars),
以后再坏一眼就能定位(本次正是因为失败没存返回,白绕一圈)。
- 回归测试 2 条:skills 必须在 BASE_DIR 内(随镜像走)+ 提取提示词非空且含 JSON 铁律。
- CLAUDE.md 标注 skills 必须放 core/backend 内的原因。
验收:完整 Django 套件 151/151 全绿。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
6.0 KiB
6.0 KiB
实体提取 · 完整样例(多品类)
这些是给提取 agent 看的「标准答卷」。重点示范几个最容易错的地方: ① 绝不输出商品实体;② 角色空着手、身上不带与商品同类的物件(哪怕剧情里在用商品); ③ 同一地点只造一个场景实体;④ 每镜 entity_refs 怎么填。
样例 1 · 商品是「包」——角色绝不能有包
商品信息:轻氧通勤帆布包 / 米色大容量单肩帆布包 / 卖点:能装、百搭、通勤神器
输入脚本(30 秒 · 4 镜)
镜0 role=女主 narration=每天上班包里东西总是装不下,狼狈死了 visual=早高峰拥挤地铁车厢
镜1 role=闺蜜 narration=我也是!化妆包水杯文件全塞不进去 visual=早高峰地铁车厢
镜2 role=女主 narration=换了这个之后,全装进去还很轻 visual=明亮写字楼工位,把东西一件件放进包里
镜3 role=女主 narration=通勤党真的可以闭眼入 visual=写字楼工位,背着包自信出门
正确输出
{
"entities": [
{"id": "c1", "type": "character", "name": "女主", "visual_prompt": "27岁都市通勤女性,利落齐肩短发,自然淡妆,米色针织衫配卡其阔腿裤,气质干练从容,双手自然垂放", "ref_index": 1},
{"id": "c2", "type": "character", "name": "闺蜜", "visual_prompt": "25岁活泼上班族女生,浅棕长卷发,元气淡妆,浅蓝牛仔外套配白色T恤,笑容灿烂", "ref_index": 2},
{"id": "s1", "type": "scene", "name": "地铁车厢", "visual_prompt": "早高峰拥挤地铁车厢内部,冷白车厢灯光,都市通勤氛围,现代金属质感,干净构图", "ref_index": 3},
{"id": "s2", "type": "scene", "name": "写字楼工位", "visual_prompt": "明亮现代写字楼开放工位,落地窗自然光,浅色办公桌与绿植,简洁整洁", "ref_index": 4}
],
"segments": [
{"index": 0, "entity_refs": ["c1", "s1"]},
{"index": 1, "entity_refs": ["c1", "c2", "s1"]},
{"index": 2, "entity_refs": ["c1", "s2"]},
{"index": 3, "entity_refs": ["c1", "s2"]}
]
}
为什么这么写(避坑点评)
- ❌ 没有任何
product实体——包是商品,系统会用真实主图,不在这里出。 - ❌ 女主、闺蜜身上、手上都没有包,连镜3「背着包出门」也不在角色描述里写包:角色立绘是「干净的人」,包到了故事板 / 视频阶段才靠商品参考图合成进去。写「双手自然垂放」强调空手。
- ✅ 剧本没写两人穿什么 → 按「都市通勤 + 百搭帆布包」气质各设计了一套得体穿搭。
- ✅ 地铁出现两镜,只造一个
s1;工位出现两镜,只造一个s2。 - ✅ 镜1 两人对话都在画面 → refs 带 c1+c2+s1。
样例 2 · 商品是「耳机」——剧情在戴,角色也不能戴
商品信息:静界 主动降噪蓝牙耳机 / 白色入耳式 / 卖点:降噪、久戴不累、居家办公神器
输入脚本(15 秒 · 3 镜)
镜0 role=男主 narration=居家办公,楼上装修吵到崩溃 visual=居家书房,捂着耳朵皱眉
镜1 role=男主 narration=戴上它,世界瞬间安静 visual=居家书房,戴上耳机闭眼放松
镜2 role=男主 narration=居家党的救命神器,推荐 visual=居家书房,对镜头比赞
正确输出
{
"entities": [
{"id": "c1", "type": "character", "name": "男主", "visual_prompt": "28岁居家办公男性,清爽短发,干净面容,浅灰休闲卫衣,气质放松自然,双手空着", "ref_index": 1},
{"id": "s1", "type": "scene", "name": "居家书房", "visual_prompt": "温馨居家书房一角,暖黄台灯光与窗外自然光,浅木书桌与书架绿植,安静舒适", "ref_index": 2}
],
"segments": [
{"index": 0, "entity_refs": ["c1", "s1"]},
{"index": 1, "entity_refs": ["c1", "s1"]},
{"index": 2, "entity_refs": ["c1", "s1"]}
]
}
为什么这么写(避坑点评)
- ⭐ 最易错点:镜1 剧情明明是「戴上耳机」,但角色
visual_prompt里绝不写戴耳机。耳机是商品,要靠商品参考图在故事板阶段合成到耳朵上;角色基础资产必须是「没戴耳机的干净的人」,否则两个耳机打架、和真品对不上。 - ❌ 没有
product实体。 - ✅ 只有一个场景(书房贯穿全片),三镜复用同一个
s1。 - ✅ 男主穿搭按「居家办公」设计,写「双手空着」强调空手。
样例 3 · 商品是「护肤品」——角色不拿产品、不暴露
商品信息:水盈 修护精华液 / 30ml 玻璃瓶 / 卖点:补水、修护、敏感肌可用
输入脚本(15 秒 · 3 镜)
镜0 role=女主 narration=换季脸又干又红,烂脸预警 visual=梳妆台前,对镜检查皮肤
镜1 role=女主 narration=坚持用它一周,稳了 visual=梳妆台前,护肤动作
镜2 role=女主 narration=敏感肌姐妹冲 visual=梳妆台前,对镜头露出好皮肤
正确输出
{
"entities": [
{"id": "c1", "type": "character", "name": "女主", "visual_prompt": "24岁清透感女生,素颜裸妆,干净通透皮肤,米白色家居针织衫,气质温柔,双手自然", "ref_index": 1},
{"id": "s1", "type": "scene", "name": "梳妆台", "visual_prompt": "ins风梳妆台一角,柔和自然光,原木桌面与化妆镜,干净简约暖调", "ref_index": 2}
],
"segments": [
{"index": 0, "entity_refs": ["c1", "s1"]},
{"index": 1, "entity_refs": ["c1", "s1"]},
{"index": 2, "entity_refs": ["c1", "s1"]}
]
}
为什么这么写(避坑点评)
- ✅ 女主手里不拿精华液(商品同类物),双手自然——精华瓶靠商品参考图出现。
- ✅ 着装得体(家居针织衫),不因「护肤 / 梳妆台」就往暴露走。
- ✅ 护肤主题对皮肤状态有要求 → visual_prompt 点出「干净通透皮肤、裸妆」贴合卖点,但仍只写人物本身、不写背景光(背景由场景实体和系统模板负责)。