真因(查 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>
2.6 KiB
2.6 KiB
前 3 秒钩子公式库
写"钩子"镜(
role: 钩子)时读。钩子镜的narration开头第一句即套用以下任一公式。 同时把这句钩子提炼进顶层hook字段。
钩子的唯一任务:让用户在 3 秒内停止划走。手段是制造"和我有关 / 没想到 / 想看下去"。
公式 1 · 痛点提问(最稳,默认首选)
直接问出用户正在经历的痛点,让人下意识"对,我就是"。
- 公式:
你是不是也 + [具体痛点场景]? - 例:「你是不是也一熬夜,第二天脸就垮、暗沉到没法看?」
- 例:「天天敷面膜还是干,是不是钱白花了?」
公式 2 · 反差冲击
先给一个反直觉的结论或前后对比,制造认知落差。
- 公式:
别再 [常见做法] 了,其实 [反差真相]/[A] 和 [B] 的差距,全在这一步 - 例:「别再狂涂面霜了,越涂越干的真相在这。」
- 例:「同样熬夜,她第二天像没事人,差别就这一瓶。」
公式 3 · 数字冲击
用具体数字制造可信的强刺激(数字要真实、不踩绝对化红线)。
- 公式:
[数字] + [结果/对比] - 例:「3 秒上脸,毛孔像被一键磨皮。」
- 例:「一瓶顶我以前三瓶,算下来一天不到一块钱。」
公式 4 · 身份代入
直接点名目标人群,让"自己人"瞬间锁定。
- 公式:
[身份/人群] 必看 / 给 [人群] 的 [品类] - 例:「熬夜党救星来了,做夜班的姐妹蹲一下。」
- 例:「油皮看过来,夏天再也不用一天补三次妆。」
公式 5 · 悬念留白
抛出结果但藏起原因,逼用户看下去。
- 公式:
[惊人结果],关键是 [先不说]/我做了一件事,结果…… - 例:「闺蜜以为我去医美了,其实我只换了它。」
- 例:「就因为睡前多做这一步,第二天状态稳了。」
公式 6 · 场景代入
把镜头放进一个高共鸣的具体生活瞬间,让人"我也这样"。
- 公式:
[具体时间/场景] + [尴尬或困扰瞬间] - 例:「早高峰挤地铁,妆花一半还冒油,太崩溃了。」
- 例:「加班到凌晨,照镜子那一刻自己都吓一跳。」
钩子自检(写完钩子镜后内部过一遍)
- 第一句是否在前 3 秒(约 15 字内)就抛出钩子?
- 是否和目标人群"有关",能让人对号入座?
- 是否制造了"想继续看"的理由(痛点/反差/悬念)?
- 是否避开了违规词(最/第一/100%/治疗…)?
- 顶层
hook字段是否与钩子镜口径一致?