fix(skills): skills 随后端打进镜像,根治线上提取「未返回有效 JSON」(系统提示词为空)
真因(查 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>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
c8cb6d3d51
commit
8dab8b4921
@@ -0,0 +1,55 @@
|
||||
# 分品类话术
|
||||
|
||||
> 全自动 / 一句话模式读。根据商品所属品类,调整语气与卖点侧重。
|
||||
> 不确定品类时,按商品功能就近归类;都不沾就用"通用"原则(讲场景痛点 + 真实使用感)。
|
||||
|
||||
每个品类给:**语气** / **卖点侧重** / **常用露出** / **违规雷区** / **示例旁白**。
|
||||
|
||||
---
|
||||
|
||||
## 美妆护肤
|
||||
|
||||
- **语气**:闺蜜种草、真实分享,带点"亲测"口吻,忌假大空。
|
||||
- **卖点侧重**:上脸质地、即时感受(清爽/水润/不卡粉)、成分通俗化、前后状态对比。
|
||||
- **常用露出**:质地特写、上脸使用中、成分/包装特写。
|
||||
- **违规雷区**:美白/祛斑/抗皱写成医疗功效("淡化""看起来更均匀"可以,"祛斑根治"禁);忌"最/第一/100% 有效"。
|
||||
- **示例**:「上脸是那种水水的,吸收完一点不黏,油皮也能闭眼入。」
|
||||
|
||||
## 食品饮料
|
||||
|
||||
- **语气**:馋、香、解馋,调动味觉想象,节奏轻快。
|
||||
- **卖点侧重**:口感(爆汁/酥脆/拉丝)、配料干净、场景(追剧/早餐/解馋)、分量与价格。
|
||||
- **常用露出**:特写(拉丝/爆浆瞬间)、吃播使用中、包装正面。
|
||||
- **违规雷区**:保健/疗效("降三高""治便秘"禁);"零添加""无糖"等需有据,别乱标。
|
||||
- **示例**:「一口下去芝士直接拉丝,半夜看到真的会饿,我已经囤了三箱。」
|
||||
|
||||
## 3C 数码
|
||||
|
||||
- **语气**:理性测评、参数说人话,给"懂行"的信任感。
|
||||
- **卖点侧重**:核心性能、对比同价位、真实使用场景痛点解决、续航/手感/兼容。
|
||||
- **常用露出**:手持、功能演示使用中、接口/细节特写、对比展示。
|
||||
- **违规雷区**:跑分写成"最强/第一";夸大续航/防水等参数;忌绝对化。
|
||||
- **示例**:「同价位里它的续航是真顶用,我出门一天没带充电宝也没焦虑。」
|
||||
|
||||
## 服饰鞋包
|
||||
|
||||
- **语气**:穿搭分享、身材/场景导向,强调上身效果。
|
||||
- **卖点侧重**:版型显瘦/显高、面料舒适、好搭配、场合适配、尺码建议。
|
||||
- **常用露出**:上身使用中、面料细节特写、多场景/多角度展示。
|
||||
- **违规雷区**:材质成分虚标;"显瘦 20 斤"等夸张数字;绝对化用语。
|
||||
- **示例**:「这个版型是真的藏肉,梨形身材穿上腿一下显直,通勤约会都能穿。」
|
||||
|
||||
## 家居日用
|
||||
|
||||
- **语气**:实用、解决麻烦、相见恨晚的"生活妙招"感。
|
||||
- **卖点侧重**:解决具体家务痛点、省时省力、材质安全、收纳/清洁效率。
|
||||
- **常用露出**:使用中(前后对比)、场景摆放、细节特写。
|
||||
- **违规雷区**:抗菌/除螨率等需有据,别写成医疗;忌"最/唯一"。
|
||||
- **示例**:「以前擦灶台要使劲搓,喷一下擦一擦油污自己化开,懒人狂喜。」
|
||||
|
||||
---
|
||||
|
||||
## 通用原则(品类不明时)
|
||||
|
||||
讲清"**谁、在什么场景、遇到什么麻烦、这个商品怎么帮上忙、现在怎么买**",
|
||||
语气贴近真实用户分享,卖点永远挂在前面铺的痛点上。
|
||||
@@ -0,0 +1,53 @@
|
||||
# 输出前自检清单
|
||||
|
||||
> 输出 JSON 之前必读。**逐条内部过一遍,命中问题先改再输出。** 自检过程不展示给用户。
|
||||
> 任一"硬校验"不通过 = 不合格,必须修。
|
||||
|
||||
---
|
||||
|
||||
## A. 输出契约校验(硬,必须全过)
|
||||
|
||||
- [ ] 最终只输出**一个** JSON 对象,无 schema 外的多余文字/注释。
|
||||
- [ ] `tone` ∈ `{种草, 测评, 剧情, 痛点}`。
|
||||
- [ ] `aspect_ratio` 存在;输入指定了就用输入值,未指定为 `"9:16"`。
|
||||
- [ ] `total_duration` ∈ `{15, 30, 60, 90}`。
|
||||
- [ ] `segment_count == total_duration / 15`,且 `segments` 数组长度等于它。
|
||||
- [ ] 每个 `segment.duration == 15`;`index` 从 0 连续递增无跳号。
|
||||
- [ ] 每个 `segment.role` ∈ `{钩子, 痛点, 卖点, CTA}`。
|
||||
- [ ] 首镜 `role == 钩子`;末镜收 CTA(独立 CTA 镜,或末镜旁白末尾含明确行动指令)。
|
||||
- [ ] `entities` 每项 `type` ∈ `{character, scene, product}`,`id` 全局唯一。
|
||||
- [ ] `entity_refs` 与 `speaker` 引用的 id **都已在 entities 中声明**(无悬空引用)。
|
||||
- [ ] **每个声明的 entity 至少被一个 segment 引用**(无孤儿 entity)。
|
||||
- [ ] **至少声明 1 个 `type==scene` 实体;每个 segment 的 `entity_refs` 恰好引用一个 scene**(同环境复用同一 scene id,换环境才新建;产品特写镜也要绑所处环境的 scene)。
|
||||
- [ ] `speaker` 要么为 `null`,要么指向一个 `type==character` 的 id。
|
||||
- [ ] 必填字段无缺失:顶层 `hook/tone/aspect_ratio/total_duration/segment_count/entities/segments`;
|
||||
每 entity 有 `id/type/name/visual_prompt/ref_index`;
|
||||
每 segment 有 `index/duration/role/narration/visual/product_exposure/entity_refs`。
|
||||
|
||||
## B. 内容质检(钩子 / 结构 / 一致性)
|
||||
|
||||
- [ ] 钩子镜第一句在前 3 秒抛出钩子,套用了 `hook-library.md` 的某个公式。
|
||||
- [ ] 顶层 `hook` 与钩子镜口径一致。
|
||||
- [ ] 卖点镜的卖点**挂在前面铺的痛点上**,不是干罗列参数。
|
||||
- [ ] CTA 给了明确动作(点小黄车/领券/主页链接)。
|
||||
- [ ] 档位映射正确:role 序列符合 `methodology.md`「档位 × 黄金结构映射」表。
|
||||
- [ ] 90s 的多个卖点镜**各有侧重不重复**。
|
||||
- [ ] 同一角色/场景/商品全程复用同一 entity(没有给同一对象写出两份 visual_prompt)。
|
||||
- [ ] 每个 `visual_prompt` 信息足够喂图模型(角色/场景/商品的外观特征写清)。
|
||||
- [ ] 每镜 `product_exposure` 自然、与 role 匹配(参考方法论露出表)。
|
||||
|
||||
## C. 旁白红线扫描(逐镜)
|
||||
|
||||
- [ ] 每镜 `narration` ≤ 55 字(硬上限;目标 ≤50 留缓冲,逐字数一遍,别凭感觉)。
|
||||
- [ ] 每镜 `visual` ≥ 40 字且含「景别/运镜 + 一个画面变化」,不是一句静态动作(撑满 15 秒)。
|
||||
- [ ] 口语化,无书面腔/AI 腔("综上""不仅…而且""值得一提"等已清除)。
|
||||
- [ ] **违规词扫描**:无医疗功效词(治疗/根治/抗癌/消炎/排毒/速效…)。
|
||||
- [ ] **绝对化用语扫描**:无 最/第一/唯一/100%/国家级/永久/绝对/史上 等。
|
||||
- [ ] 无虚假承诺(三天见效/永不反弹/包治…)。
|
||||
|
||||
---
|
||||
|
||||
## 通过标准
|
||||
|
||||
A 区**全部**通过 + B/C 区无红线命中 → 可输出。
|
||||
任何一条不过:先改,再重跑本清单,直到全过,才输出最终 JSON。
|
||||
@@ -0,0 +1,66 @@
|
||||
# 前 3 秒钩子公式库
|
||||
|
||||
> 写"钩子"镜(`role: 钩子`)时读。钩子镜的 `narration` 开头第一句即套用以下任一公式。
|
||||
> 同时把这句钩子提炼进顶层 `hook` 字段。
|
||||
|
||||
钩子的唯一任务:**让用户在 3 秒内停止划走**。手段是制造"和我有关 / 没想到 / 想看下去"。
|
||||
|
||||
---
|
||||
|
||||
## 公式 1 · 痛点提问(最稳,默认首选)
|
||||
|
||||
直接问出用户正在经历的痛点,让人下意识"对,我就是"。
|
||||
|
||||
- 公式:`你是不是也 + [具体痛点场景]?`
|
||||
- 例:「你是不是也一熬夜,第二天脸就垮、暗沉到没法看?」
|
||||
- 例:「天天敷面膜还是干,是不是钱白花了?」
|
||||
|
||||
## 公式 2 · 反差冲击
|
||||
|
||||
先给一个反直觉的结论或前后对比,制造认知落差。
|
||||
|
||||
- 公式:`别再 [常见做法] 了,其实 [反差真相]` / `[A] 和 [B] 的差距,全在这一步`
|
||||
- 例:「别再狂涂面霜了,越涂越干的真相在这。」
|
||||
- 例:「同样熬夜,她第二天像没事人,差别就这一瓶。」
|
||||
|
||||
## 公式 3 · 数字冲击
|
||||
|
||||
用具体数字制造可信的强刺激(数字要真实、不踩绝对化红线)。
|
||||
|
||||
- 公式:`[数字] + [结果/对比]`
|
||||
- 例:「3 秒上脸,毛孔像被一键磨皮。」
|
||||
- 例:「一瓶顶我以前三瓶,算下来一天不到一块钱。」
|
||||
|
||||
## 公式 4 · 身份代入
|
||||
|
||||
直接点名目标人群,让"自己人"瞬间锁定。
|
||||
|
||||
- 公式:`[身份/人群] 必看 / 给 [人群] 的 [品类]`
|
||||
- 例:「熬夜党救星来了,做夜班的姐妹蹲一下。」
|
||||
- 例:「油皮看过来,夏天再也不用一天补三次妆。」
|
||||
|
||||
## 公式 5 · 悬念留白
|
||||
|
||||
抛出结果但藏起原因,逼用户看下去。
|
||||
|
||||
- 公式:`[惊人结果],关键是 [先不说]` / `我做了一件事,结果……`
|
||||
- 例:「闺蜜以为我去医美了,其实我只换了它。」
|
||||
- 例:「就因为睡前多做这一步,第二天状态稳了。」
|
||||
|
||||
## 公式 6 · 场景代入
|
||||
|
||||
把镜头放进一个高共鸣的具体生活瞬间,让人"我也这样"。
|
||||
|
||||
- 公式:`[具体时间/场景] + [尴尬或困扰瞬间]`
|
||||
- 例:「早高峰挤地铁,妆花一半还冒油,太崩溃了。」
|
||||
- 例:「加班到凌晨,照镜子那一刻自己都吓一跳。」
|
||||
|
||||
---
|
||||
|
||||
## 钩子自检(写完钩子镜后内部过一遍)
|
||||
|
||||
- [ ] 第一句是否在前 3 秒(约 15 字内)就抛出钩子?
|
||||
- [ ] 是否和目标人群"有关",能让人对号入座?
|
||||
- [ ] 是否制造了"想继续看"的理由(痛点/反差/悬念)?
|
||||
- [ ] 是否避开了违规词(最/第一/100%/治疗…)?
|
||||
- [ ] 顶层 `hook` 字段是否与钩子镜口径一致?
|
||||
@@ -0,0 +1,86 @@
|
||||
# 电商带货脚本 · 核心方法论
|
||||
|
||||
> 每次生成都读。本文件是脚本的"骨架 + 红线",钩子句式见 `hook-library.md`。
|
||||
|
||||
---
|
||||
|
||||
## 一、黄金结构:钩子 → 痛点 → 卖点 → CTA
|
||||
|
||||
带货短视频的灵魂是**前 3 秒留人 + 结尾促转化**。四个功能镜各司其职:
|
||||
|
||||
| role | 功能 | 它要做的事 | 旁白要点 |
|
||||
| ---- | ---- | ---- | ---- |
|
||||
| **钩子** | 3 秒留人 | 第一句话/第一帧就让人停下不划走 | 用 `hook-library.md` 的公式,制造痛点共鸣或反差冲击 |
|
||||
| **痛点** | 共鸣 | 把用户"对,我就这样"的处境讲出来 | 具体场景化,不抽象,让人对号入座 |
|
||||
| **卖点** | 商品解决 | 商品如何**恰好**解决上面的痛点 | 卖点落到痛点上,给"凭什么信"的理由(成分/效果/对比/口碑) |
|
||||
| **CTA** | 转化行动 | 临门一脚,告诉用户现在做什么 | 明确动作 + 紧迫感(点下方小黄车 / 主页领券 / 限时) |
|
||||
|
||||
**铁原则:**
|
||||
- **首镜永远是钩子**——3 秒内必须抛出钩子,否则用户划走。
|
||||
- **末镜永远收 CTA**——可以是独立 CTA 镜,也可以是末镜旁白末尾收一句行动指令。
|
||||
- **卖点必须挂在痛点上**——不是罗列参数,是"这个痛点 → 商品这样解决"。
|
||||
|
||||
---
|
||||
|
||||
## 二、档位 × 黄金结构映射(关键)
|
||||
|
||||
时长由输入给定(15/30/60/90 四档),每 15 秒一镜,`segment_count = total_duration / 15`。
|
||||
镜数变了,四个功能要**压缩或扩展**,按下表分配 `role`:
|
||||
|
||||
| 档位 | 镜数 | role 序列(index 0→N) | 压缩/扩展说明 |
|
||||
| ---- | ---- | ---- | ---- |
|
||||
| **15s** | 1 | `[钩子]` | 一镜到底:开头 3 秒钩子 → 中段一句卖点 → 末尾一句 CTA,全压进这 15 秒旁白里 |
|
||||
| **30s** | 2 | `[钩子, 卖点]` | 镜0 钩子里带出痛点;镜1 讲卖点并在旁白末尾收一句 CTA |
|
||||
| **60s** | 4 | `[钩子, 痛点, 卖点, CTA]` | 标准黄金结构,一镜一功能 |
|
||||
| **90s** | 6 | `[钩子, 痛点, 卖点, 卖点, 卖点, CTA]` | 痛点后给 3 个卖点镜:核心卖点 / 场景化演示 / 信任背书(口碑·数据);末镜 CTA |
|
||||
|
||||
说明:
|
||||
- `role` 字段只能取 `钩子|痛点|卖点|CTA` 四个枚举值。"信任背书""场景演示"等都归入 `卖点`。
|
||||
- 短档位(15/30s)靠**旁白内压缩多功能**达成"留人+转化",不要因为镜少就丢掉 CTA。
|
||||
- 90s 的 3 个卖点镜要**各有侧重、不重复**(核心功效 / 真实使用场景 / 别人为什么买)。
|
||||
|
||||
---
|
||||
|
||||
## 三、entity 一致性原则
|
||||
|
||||
`entities` 是全脚本共享的角色 / 场景 / 商品池,保证**多镜同一角色是同一张脸、同一商品是同一个包装**。
|
||||
|
||||
- **一个角色/场景/商品 = 一个 entity = 一份 `visual_prompt`**。多镜复用同一 id,**绝不为同一对象写两份 visual_prompt**(会导致下游生图人脸/包装漂移)。
|
||||
- `visual_prompt` 由你**自动生成**(小白不打字):写清外观特征(角色:性别/年龄段/发型/穿着/气质;场景:地点/光线/风格;商品:品类/包装/颜色/摆放),用于直接喂图模型。
|
||||
- `type` 三选一:`character`(人) / `scene`(环境) / `product`(商品)。一份脚本通常至少 1 个 `product`、**至少 1 个 `scene`**。
|
||||
- **场景与镜头一一对应(可复用)**:**每个 segment 的 `entity_refs` 必须恰好引用一个 `scene`**——它就是这一镜画面所处的环境。多镜同环境就复用同一个 scene id(如全程宿舍 → 只一个「宿舍书桌」scene,4 镜都引用它);真正换了地点才新建另一个 scene。纯产品特写镜也要绑它所处环境的 scene(无明确环境则复用主场景)。这样下游「场景」基础资产能成图、且同环境背景一致。
|
||||
- `ref_index` 是该 entity 在图集里的参考序号(从 1 递增,供下游三视图/参考图对齐)。
|
||||
- `voice_ref`(二期,可选):角色音色参考,用于锁音色;无则 `null`。
|
||||
- **每个声明的 entity 至少被一个 segment 的 `entity_refs` 引用**,不留孤儿。
|
||||
- `segments[].speaker` 指向某 `character` 的 id 表示该镜由角色开口说;`null` = 画外旁白。
|
||||
|
||||
---
|
||||
|
||||
## 四、商品露出规范(`product_exposure`)
|
||||
|
||||
每镜都要规划商品怎么自然出现,避免生硬插入。按 role 给推荐露出方式:
|
||||
|
||||
| role | 推荐露出 | 说明 |
|
||||
| ---- | ---- | ---- |
|
||||
| 钩子 | 可弱露出或不露 | 钩子先抓人,商品可作悬念,第 1 镜末尾闪一下也行 |
|
||||
| 痛点 | 不露 / 反面对照 | 展示"没有它"的糟糕状态,商品先按住 |
|
||||
| 卖点 | **特写 / 使用中** | 商品成为主角:成分特写、质地特写、上脸/上手使用中 |
|
||||
| CTA | 手持 / 包装正面 | 手持商品对镜头,包装正面清晰,配合行动指令 |
|
||||
|
||||
露出方式词汇统一用:`手持` / `特写` / `使用中` / `包装正面` / `场景摆放` / `对比展示`(可组合,如"手持+特写")。
|
||||
|
||||
---
|
||||
|
||||
## 五、旁白红线(硬规则,违反即不合格)
|
||||
|
||||
- **口语化**:像真人对着镜头唠嗑,不准书面腔 / 不准 AI 腔("综上所述""不仅…而且""值得一提的是"全禁)。
|
||||
- **每镜 `narration` ≤ 55 字**:Seedance 在 15 秒内直接发声,55 字是可懂语速**硬上限**。
|
||||
**写作目标 ≤ 50 字**,留 5 字缓冲——宁可短、不要卡满;短档位(15/30s)一镜要装多功能时尤其要狠删,先保 CTA 不被砍。
|
||||
- **不浮夸、不空喊**:卖点要给具体理由,不堆形容词。
|
||||
- **违规词禁令**(电商广告法红线,一律不写):
|
||||
- **医疗功效类**:治疗 / 根治 / 疗效 / 抗癌 / 消炎 / 杀菌(无证) / 排毒 / 速效 / 抑制 ××病 …
|
||||
- **绝对化用语**:最 / 第一 / 顶级 / 唯一 / 100% / 国家级 / 世界级 / 永久 / 绝对 / 史上 …
|
||||
- **虚假承诺**:包治 / 三天见效 / 立刻变白 / 永不反弹 …
|
||||
- 替换策略:用"帮助""更""不少人反馈""上脸清爽"等柔性、主观化表达替代。
|
||||
|
||||
> 自检阶段必须逐镜扫一遍违规词,命中即改写。详见 `checklist.md`。
|
||||
@@ -0,0 +1,47 @@
|
||||
# 平台调性
|
||||
|
||||
> 全自动 / 一句话模式读。根据投放平台(前置条件给定)调整节奏与风格。
|
||||
> 未指定平台时,默认按"抖音"通用带货节奏。
|
||||
|
||||
每个平台给:**节奏** / **风格** / **钩子偏好** / **tone 倾向** / **一句话定调**。
|
||||
|
||||
---
|
||||
|
||||
## 抖音
|
||||
|
||||
- **节奏**:快、强钩子、信息密集,前 3 秒定生死,反转/爽点前置。
|
||||
- **风格**:高能、口播感强、配合小黄车,直给卖点。
|
||||
- **钩子偏好**:痛点提问、数字冲击、反差。
|
||||
- **tone 倾向**:`种草` / `痛点`。
|
||||
- **定调**:开门见山抓人,节奏别拖,CTA 干脆("点下方小黄车")。
|
||||
|
||||
## 快手
|
||||
|
||||
- **节奏**:偏生活化、接地气,信任感和性价比优先。
|
||||
- **风格**:实在、像熟人推荐、强调"便宜大碗/老铁信得过"。
|
||||
- **钩子偏好**:身份代入、场景代入、价格冲击。
|
||||
- **tone 倾向**:`种草` / `测评`。
|
||||
- **定调**:朴实可信,突出实惠和真实使用,少花活。
|
||||
|
||||
## 小红书
|
||||
|
||||
- **节奏**:偏慢、重质感、像写笔记/真实测评。
|
||||
- **风格**:精致、审美在线、第一人称"我亲测",软种草不硬推。
|
||||
- **钩子偏好**:悬念留白、反差、身份代入(细分人群)。
|
||||
- **tone 倾向**:`种草` / `测评`。
|
||||
- **定调**:真诚分享感,画面要美,卖点融进使用体验,CTA 柔("主页有链接/评论区扣")。
|
||||
|
||||
## 视频号
|
||||
|
||||
- **节奏**:适中,受众偏成熟、家庭场景多。
|
||||
- **风格**:温和、可信、强调实用与口碑,社交裂变属性强。
|
||||
- **钩子偏好**:痛点提问、场景代入。
|
||||
- **tone 倾向**:`种草` / `剧情`。
|
||||
- **定调**:稳重可信,讲清实用价值,适合家庭/品质向商品。
|
||||
|
||||
---
|
||||
|
||||
## 用法提示
|
||||
|
||||
- 平台调性影响 **节奏(旁白语气松紧)** 与 **tone 选择**,但不改变黄金结构与输出契约。
|
||||
- 平台 × 品类叠加时,以"商品适配"为先:例如 3C 上小红书仍偏测评质感,上抖音则更直给。
|
||||
Reference in New Issue
Block a user