Explorar o código

解构引擎 decompose.py + 全量重抽 5 帖产多颗数据

- decompose.py:把 skill 的 phase 文档当 prompt 喂 LLM(唯一真源);
  ① extractor 真读图 → ② 判颗成形 → ③ 作用域火山回扣 → ⑤ 按类型组装;
  含守卫:组件颗 parent 必须指向同帖 how,否则降级 orphan
- rebuild_payloads.py:从 frameworks.json 确定性重建 payloads(不调 LLM)+ 同款守卫
- 重抽 5 帖 → 20 颗(how5/what11/why4,主12/组件8),lint 0 ERROR/0 WARN

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
SamLee hai 1 mes
pai
achega
ccdccebd40
Modificáronse 4 ficheiros con 1698 adicións e 101 borrados
  1. 191 0
      scripts/decompose.py
  2. 85 0
      scripts/rebuild_payloads.py
  3. 347 101
      web/frameworks.json
  4. 1075 0
      web/payloads.json

+ 191 - 0
scripts/decompose.py

@@ -0,0 +1,191 @@
+"""创作知识解构引擎 v2:一帖 → N 颗(how/what/why,含组件颗)→ frameworks.json + payloads.json。
+
+编排全流程,把 skill 的 phase 文档当 prompt 喂给 LLM(skill 是唯一真源):
+  ① 读懂:extractor 读图 → 完整文字(vision, OpenRouter)
+  ② 判颗+类型闸+三lane成形+轻标签:system = phase1-frame.md
+  ③ 作用域:system = phase2-scope.md → 候选 → scope_link 回扣(火山)
+  ⑤ 组装:代码 → 每颗一个 ingest payload(按类型分拼)
+须在云端跑(OpenRouter vision + 火山 可达)。用法:PYTHONPATH=. python scripts/decompose.py
+"""
+from __future__ import annotations
+
+import json
+from pathlib import Path
+
+from creation_knowledge.integrations.crawler import parse_detail_response
+from creation_knowledge.integrations.extractor import GeminiExtractor
+from creation_knowledge.integrations.llm import chat_json
+from scripts.scope_link import ScopeLinker
+
+ROOT = Path(__file__).resolve().parent.parent
+FIX = ROOT / "tests" / "fixtures"
+SKILL = ROOT / "创作知识提取-skill"
+PHASE1 = (SKILL / "extraction" / "phase1-frame.md").read_text(encoding="utf-8")
+PHASE2 = (SKILL / "extraction" / "phase2-scope.md").read_text(encoding="utf-8")
+
+CIDS = ["699308fa0000000016009697", "698481e1000000000a02a7c1",
+        "67e2e39b0000000003028ff0", "680659e8000000001a007a11",
+        "67e4bdf50000000006028a59"]
+SRC2CN = {"substance": "实质", "form": "形式", "feeling": "感受", "effect": "作用", "intent": "意图"}
+TYPE2ATTR = {"how": "how工序", "what": "what构成", "why": "why原理"}
+REUSE_THRESHOLD = 0.90
+
+
+# ---------- ① 读懂 ----------
+def read_post(cid: str, extractor: GeminiExtractor):
+    resp = json.loads((FIX / f"xhs_case_{cid}.json").read_text("utf-8"))
+    post = parse_detail_response(resp, fallback_content_id=cid)
+    if not post.url:
+        post.url = f"https://www.xiaohongshu.com/explore/{cid}"
+    ec = extractor.extract(post)
+    parts = [ec.text]
+    if ec.from_image:
+        parts.append("【图片要点】\n" + ec.from_image)
+    parts += [f"【卡片{c.index}】{c.content}" for c in ec.cards if c.content]
+    return post, "\n\n".join(p for p in parts if p)
+
+
+# ---------- ② 判颗+成形+轻标签 ----------
+def shape(post, read: str) -> list[dict]:
+    user = (f"原帖标题:{post.title or '(无)'}\n\n读懂后的完整内容:\n{read}\n\n"
+            "按上面规则拆颗+判类型+成形+轻标签。作用域字段一律留空 []。"
+            "只输出 JSON:{\"knowledges\":[ ... 见模板 ... ]}")
+    out = chat_json(PHASE1, user, timeout=120)
+    return out.get("knowledges") or []
+
+
+# ---------- ③ 作用域候选 + 回扣 ----------
+def _slim(knowledges: list[dict]) -> list[dict]:
+    slim = []
+    for k in knowledges:
+        e = {"id": k.get("id"), "type": k.get("type"), "title": k.get("title")}
+        if k.get("type") == "how":
+            e["steps"] = [{"id": s.get("id"), "intent": s.get("intent"),
+                           "directive": (s.get("directive") or "")[:500], "output": s.get("output")}
+                          for s in k.get("steps", [])]
+        else:
+            e["内容"] = {x: k.get(x) for x in ("界定", "构成", "主张", "依据", "对创作的影响") if k.get(x)}
+        slim.append(e)
+    return slim
+
+
+def scope_candidates(knowledges: list[dict]) -> dict:
+    user = ("给下面每颗知识标作用域候选(how 逐步:每个 step 一组;what/why 颗级:整颗一组)。\n"
+            "只输出 JSON:{\"scopes\":[{\"knowledge_id\":\"k1\",\"step_id\":\"s1\",\"items\":[{\"scope_type\":\"substance\",\"value\":\"赛道共识\"}]},"
+            "{\"knowledge_id\":\"k2\",\"step_id\":null,\"items\":[...]}]}\n\n"
+            + json.dumps(_slim(knowledges), ensure_ascii=False))
+    out = chat_json(PHASE2, user, timeout=120)
+    return out.get("scopes") or []
+
+
+def link_scope(linker: ScopeLinker, scope_type: str, value: str) -> dict:
+    try:
+        hits = linker.link(value, source_type=SRC2CN.get(scope_type, scope_type), top_k=3)
+    except Exception:
+        hits = []
+    top = hits[0] if hits else {}
+    score = float(top.get("score", 0.0))
+    reuse = score >= REUSE_THRESHOLD and top.get("name")
+    return {"scope_type": scope_type, "value": top["name"] if reuse else value,
+            "candidate": value, "link": "复用" if reuse else "新建", "score": round(score, 4),
+            "top": [{"name": h["name"], "score": h["score"], "path": h.get("path", "")} for h in hits]}
+
+
+def apply_scopes(knowledges: list[dict], scopes: list[dict], linker: ScopeLinker) -> None:
+    by_k = {k.get("id"): k for k in knowledges}
+    for sc in scopes:
+        k = by_k.get(sc.get("knowledge_id"))
+        if not k:
+            continue
+        linked = [link_scope(linker, it["scope_type"], it["value"])
+                  for it in (sc.get("items") or []) if it.get("scope_type") and it.get("value")]
+        if k.get("type") == "how" and sc.get("step_id"):
+            for s in k.get("steps", []):
+                if s.get("id") == sc["step_id"]:
+                    s["作用域"] = linked
+        else:
+            k["作用域"] = (k.get("作用域") or []) + linked
+
+
+# ---------- ⑤ 组装 payload ----------
+def build_content(k: dict) -> str:
+    t = k.get("type")
+    if t == "how":
+        lines = [f"目标:{k.get('purpose','')}"]
+        for i, s in enumerate(k.get("steps", []), 1):
+            lines += [f"步骤{i}(目的:{s.get('intent','')})",
+                      f"  指引:{s.get('directive','')}", f"  产出:{s.get('output','')}"]
+        return "\n".join(lines)
+    if t == "what":
+        lines = [f"界定:{k.get('界定','')}", "构成:"]
+        lines += [f"- {c.get('要素','')}:{c.get('说明','')}" for c in k.get("构成", [])]
+        return "\n".join(lines)
+    return f"主张:{k.get('主张','')}\n依据:{k.get('依据','')}\n对创作的影响:{k.get('对创作的影响','')}"
+
+
+def build_payload(post, k: dict, how_titles: dict | None = None) -> dict:
+    how_titles = how_titles or {}
+    t = k.get("type")
+    scopes, seen = [], set()
+    def add(lst):
+        for sc in lst:
+            key = (sc["scope_type"], sc["value"])
+            if key not in seen:
+                seen.add(key); scopes.append({"scope_type": sc["scope_type"], "value": sc["value"]})
+    if t == "how":
+        for s in k.get("steps", []):
+            add(s.get("作用域", []))
+    else:
+        add(k.get("作用域", []))
+    ext = [{"key": "业务阶段", "type": "str", "value": v} for v in (k.get("业务阶段") or [])]
+    if t == "how":
+        cs, cseen = [], set()
+        for s in k.get("steps", []):
+            c = s.get("创作阶段")
+            if c and c not in cseen:
+                cseen.add(c); cs.append(c)
+        ext += [{"key": "创作阶段", "type": "str", "value": v} for v in cs]
+        ext += [{"key": "动作", "type": "str", "value": s["动作"]} for s in k.get("steps", []) if s.get("动作")]
+    if k.get("role") == "组件" and k.get("parent"):
+        p = k["parent"]
+        ext.append({"key": "出自", "type": "str",
+                    "value": f"{how_titles.get(p.get('how_id'), p.get('how_id'))} 第{p.get('step')}步"})
+    return {"source": {"id": f"xhs_{post.content_id}", "source_type": "post", "title": post.title or "",
+                       "author": post.author_name or "", "source_metadata": {"platform": post.platform, "url": post.url}},
+            "title": k.get("title"), "content": build_content(k),
+            "dim_creations": ["创作"], "dim_attributes": [TYPE2ATTR.get(t, "how工序")],
+            "scopes": scopes, "custom_ext": ext}
+
+
+def main() -> None:
+    extractor = GeminiExtractor.from_env()
+    linker = ScopeLinker()
+    posts_out, payloads = [], []
+    for cid in CIDS:
+        print(f"\n=== {cid[:8]} ===")
+        post, read = read_post(cid, extractor)
+        print(f"  ① 读懂 {len(read)} 字")
+        knowledges = shape(post, read)
+        # 守卫:组件颗 parent 必须指向同帖一个 how,否则降级为 orphan 主颗
+        how_ids = {k.get("id") for k in knowledges if k.get("type") == "how"}
+        how_titles = {k.get("id"): k.get("title") for k in knowledges if k.get("type") == "how"}
+        for k in knowledges:
+            if k.get("role") == "组件" and (k.get("parent") or {}).get("how_id") not in how_ids:
+                k["role"] = "主"
+                k["parent"] = None
+        print(f"  ② {len(knowledges)} 颗:" + ", ".join(f"{k.get('type')}/{k.get('role')}" for k in knowledges))
+        apply_scopes(knowledges, scope_candidates(knowledges), linker)
+        print("  ③⑤ 作用域回扣 + 组装")
+        posts_out.append({"post_id": cid, "title": post.title or "", "platform": post.platform,
+                          "url": post.url, "img_base": f"/data/demo/xiaohongshu/xhs_{cid}",
+                          "img_count": len(post.image_urls), "knowledges": knowledges})
+        payloads += [build_payload(post, k, how_titles) for k in knowledges]
+    (ROOT / "web/frameworks.json").write_text(
+        json.dumps({"count": len(posts_out), "posts": posts_out}, ensure_ascii=False, indent=1), encoding="utf-8")
+    (ROOT / "web/payloads.json").write_text(
+        json.dumps(payloads, ensure_ascii=False, indent=2), encoding="utf-8")
+    print(f"\nwrote {len(posts_out)} posts, {len(payloads)} payloads")
+
+
+if __name__ == "__main__":
+    main()

+ 85 - 0
scripts/rebuild_payloads.py

@@ -0,0 +1,85 @@
+"""从 web/frameworks.json 重建 web/payloads.json(不调 LLM)——确定性。
+
+顺带两个守卫修正:
+  · 组件颗的 parent.how_id 必须指向同帖一个 how 颗,否则降级为 orphan 主颗(role=主, parent=null)。
+  · 组件颗 payload 的「出自」用所属 how 的 title(而非裸 id)。
+用法:python3 scripts/rebuild_payloads.py
+"""
+from __future__ import annotations
+
+import json
+from pathlib import Path
+
+ROOT = Path(__file__).resolve().parent.parent
+FW = ROOT / "web/frameworks.json"
+PL = ROOT / "web/payloads.json"
+TYPE2ATTR = {"how": "how工序", "what": "what构成", "why": "why原理"}
+
+
+def content(k: dict) -> str:
+    t = k["type"]
+    if t == "how":
+        L = [f"目标:{k.get('purpose','')}"]
+        for i, s in enumerate(k.get("steps", []), 1):
+            L += [f"步骤{i}(目的:{s.get('intent','')})",
+                  f"  指引:{s.get('directive','')}", f"  产出:{s.get('output','')}"]
+        return "\n".join(L)
+    if t == "what":
+        return "\n".join([f"界定:{k.get('界定','')}", "构成:"]
+                         + [f"- {c.get('要素','')}:{c.get('说明','')}" for c in k.get("构成", [])])
+    return f"主张:{k.get('主张','')}\n依据:{k.get('依据','')}\n对创作的影响:{k.get('对创作的影响','')}"
+
+
+def main() -> None:
+    d = json.loads(FW.read_text(encoding="utf-8"))
+    payloads = []
+    demoted = 0
+    for p in d["posts"]:
+        ks = p["knowledges"]
+        how_ids = {k["id"] for k in ks if k["type"] == "how"}
+        how_titles = {k["id"]: k.get("title") for k in ks if k["type"] == "how"}
+        for k in ks:
+            if k.get("role") == "组件" and (k.get("parent") or {}).get("how_id") not in how_ids:
+                k["role"] = "主"
+                k["parent"] = None
+                demoted += 1
+        for k in ks:
+            t = k["type"]
+            scopes, seen = [], set()
+            def add(lst):
+                for sc in lst:
+                    key = (sc["scope_type"], sc["value"])
+                    if key not in seen:
+                        seen.add(key)
+                        scopes.append({"scope_type": sc["scope_type"], "value": sc["value"]})
+            if t == "how":
+                for s in k.get("steps", []):
+                    add(s.get("作用域", []))
+            else:
+                add(k.get("作用域", []))
+            ext = [{"key": "业务阶段", "type": "str", "value": v} for v in (k.get("业务阶段") or [])]
+            if t == "how":
+                cs, cseen = [], set()
+                for s in k.get("steps", []):
+                    c = s.get("创作阶段")
+                    if c and c not in cseen:
+                        cseen.add(c)
+                        cs.append(c)
+                ext += [{"key": "创作阶段", "type": "str", "value": v} for v in cs]
+                ext += [{"key": "动作", "type": "str", "value": s["动作"]} for s in k.get("steps", []) if s.get("动作")]
+            if k.get("role") == "组件" and k.get("parent"):
+                par = k["parent"]
+                ext.append({"key": "出自", "type": "str",
+                            "value": f"{how_titles.get(par.get('how_id'), par.get('how_id'))} 第{par.get('step')}步"})
+            payloads.append({
+                "source": {"id": f"xhs_{p['post_id']}", "source_type": "post", "title": p.get("title", ""),
+                           "author": "", "source_metadata": {"platform": p.get("platform"), "url": p.get("url")}},
+                "title": k.get("title"), "content": content(k), "dim_creations": ["创作"],
+                "dim_attributes": [TYPE2ATTR.get(t, "how工序")], "scopes": scopes, "custom_ext": ext})
+    FW.write_text(json.dumps(d, ensure_ascii=False, indent=1), encoding="utf-8")
+    PL.write_text(json.dumps(payloads, ensure_ascii=False, indent=2), encoding="utf-8")
+    print(f"rebuilt {len(payloads)} payloads; 降级组件→orphan: {demoted}")
+
+
+if __name__ == "__main__":
+    main()

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 347 - 101
web/frameworks.json


+ 1075 - 0
web/payloads.json

@@ -0,0 +1,1075 @@
+[
+  {
+    "source": {
+      "id": "xhs_699308fa0000000016009697",
+      "source_type": "post",
+      "title": "真正能爆的选题,往往是你写完后感觉羞耻的",
+      "author": "",
+      "source_metadata": {
+        "platform": "xiaohongshu",
+        "url": "https://www.xiaohongshu.com/explore/699308fa0000000016009697"
+      }
+    },
+    "title": "爆款选题的羞耻感原理",
+    "content": "主张:好选题的特征是让创作者感到羞耻或冒犯。\n依据:羞耻感源于触碰了真实但平时不敢公开说的公共痛点,或撕裂了人人点头但没人真信的“圣经句”。这种情绪压力证明踩到了大众神经,而并非输出正确但无感的干货。\n对创作的影响:放弃追求内容的“正确性”和“安全感”,优先选择那些令人犹豫、产生心理负担、能引发情绪共鸣的选题。",
+    "dim_creations": [
+      "创作"
+    ],
+    "dim_attributes": [
+      "why原理"
+    ],
+    "scopes": [
+      {
+        "scope_type": "feeling",
+        "value": "羞耻感"
+      },
+      {
+        "scope_type": "substance",
+        "value": "公共痛点"
+      },
+      {
+        "scope_type": "effect",
+        "value": "撕裂共识"
+      }
+    ],
+    "custom_ext": [
+      {
+        "key": "业务阶段",
+        "type": "str",
+        "value": "选题"
+      }
+    ]
+  },
+  {
+    "source": {
+      "id": "xhs_699308fa0000000016009697",
+      "source_type": "post",
+      "title": "真正能爆的选题,往往是你写完后感觉羞耻的",
+      "author": "",
+      "source_metadata": {
+        "platform": "xiaohongshu",
+        "url": "https://www.xiaohongshu.com/explore/699308fa0000000016009697"
+      }
+    },
+    "title": "寻找选题“裂缝”实操法",
+    "content": "目标:通过撕开共识裂缝找到具有爆发力的痛点选题\n步骤1(目的:寻找正确共识的失灵瞬间)\n  指引:列出赛道大号反复讲的“正确共识”(圣经句),如『自律即自由』。反问:『什么情况下,一个人严格按这句话做,反而越做越差?』由此得出新选题。\n  产出:反共识选题视角\n步骤2(目的:挖掘竞品爆款的未满足需求)\n  指引:前往竞品爆款视频的评论区,寻找带有『但是……』关键词的评论。\n  产出:真实痛点选题",
+    "dim_creations": [
+      "创作"
+    ],
+    "dim_attributes": [
+      "how工序"
+    ],
+    "scopes": [
+      {
+        "scope_type": "substance",
+        "value": "赛道共识"
+      },
+      {
+        "scope_type": "effect",
+        "value": "反向推导"
+      },
+      {
+        "scope_type": "intent",
+        "value": "差异化定位"
+      },
+      {
+        "scope_type": "form",
+        "value": "评论区调研"
+      },
+      {
+        "scope_type": "substance",
+        "value": "负面反馈"
+      },
+      {
+        "scope_type": "intent",
+        "value": "挖掘痛点"
+      }
+    ],
+    "custom_ext": [
+      {
+        "key": "业务阶段",
+        "type": "str",
+        "value": "选题"
+      },
+      {
+        "key": "创作阶段",
+        "type": "str",
+        "value": "定向"
+      },
+      {
+        "key": "动作",
+        "type": "str",
+        "value": "反思共识失灵"
+      },
+      {
+        "key": "动作",
+        "type": "str",
+        "value": "评论区溯源"
+      }
+    ]
+  },
+  {
+    "source": {
+      "id": "xhs_699308fa0000000016009697",
+      "source_type": "post",
+      "title": "真正能爆的选题,往往是你写完后感觉羞耻的",
+      "author": "",
+      "source_metadata": {
+        "platform": "xiaohongshu",
+        "url": "https://www.xiaohongshu.com/explore/699308fa0000000016009697"
+      }
+    },
+    "title": "圣经句(伪共识)",
+    "content": "界定:指那些在行业内被广泛认可、听起来极其正确、但由于过于空泛导致观众无感的通用型真善美口号。\n构成:\n- 表现形式:人人点头但没人真信,如『内容为王』、『勤奋致富』。\n- 传播弱点:没有情绪触发,不具备转发驱动力。",
+    "dim_creations": [
+      "创作"
+    ],
+    "dim_attributes": [
+      "what构成"
+    ],
+    "scopes": [
+      {
+        "scope_type": "substance",
+        "value": "伪共识"
+      },
+      {
+        "scope_type": "effect",
+        "value": "情绪屏蔽"
+      }
+    ],
+    "custom_ext": [
+      {
+        "key": "业务阶段",
+        "type": "str",
+        "value": "选题"
+      },
+      {
+        "key": "出自",
+        "type": "str",
+        "value": "寻找选题“裂缝”实操法 第1步"
+      }
+    ]
+  },
+  {
+    "source": {
+      "id": "xhs_698481e1000000000a02a7c1",
+      "source_type": "post",
+      "title": "7种编剧常用的叙事结构,写剧不用愁!",
+      "author": "",
+      "source_metadata": {
+        "platform": "xiaohongshu",
+        "url": "https://www.xiaohongshu.com/explore/698481e1000000000a02a7c1"
+      }
+    },
+    "title": "剧本叙事结构选型与设计工序",
+    "content": "目标:根据创作题材需求从七种经典模型中选择并构建剧本底层结构\n步骤1(目的:评估题材适配性并选定叙事模型)\n  指引:依据题材特征从七种结构中选型。如:常规线性选「三幕式」;成长蜕变选「英雄之旅」;群像戏选「多线叙事」;悬疑科幻选「环形」或「非线性」;实验/文艺片选「反结构」。\n  产出:选定的叙事模型框架\n步骤2(目的:按照所选模型拆解并排布情节节点)\n  指引:根据选定模型的要求填充关键位。例:『三幕式需界定开端、发展、高潮结局三个阶段』;『英雄之旅需设定启程、考验、归来节点』。\n  产出:带有结构锚点的情节大纲",
+    "dim_creations": [
+      "创作"
+    ],
+    "dim_attributes": [
+      "how工序"
+    ],
+    "scopes": [
+      {
+        "scope_type": "substance",
+        "value": "题材特征"
+      },
+      {
+        "scope_type": "form",
+        "value": "叙事模型架构"
+      },
+      {
+        "scope_type": "intent",
+        "value": "题材适配性评价"
+      },
+      {
+        "scope_type": "form",
+        "value": "情节节点排布"
+      },
+      {
+        "scope_type": "effect",
+        "value": "锚定叙事阶段"
+      }
+    ],
+    "custom_ext": [
+      {
+        "key": "业务阶段",
+        "type": "str",
+        "value": "脚本"
+      },
+      {
+        "key": "创作阶段",
+        "type": "str",
+        "value": "构思"
+      },
+      {
+        "key": "创作阶段",
+        "type": "str",
+        "value": "结构"
+      },
+      {
+        "key": "动作",
+        "type": "str",
+        "value": "结构选型"
+      },
+      {
+        "key": "动作",
+        "type": "str",
+        "value": "情节拆解"
+      }
+    ]
+  },
+  {
+    "source": {
+      "id": "xhs_698481e1000000000a02a7c1",
+      "source_type": "post",
+      "title": "7种编剧常用的叙事结构,写剧不用愁!",
+      "author": "",
+      "source_metadata": {
+        "platform": "xiaohongshu",
+        "url": "https://www.xiaohongshu.com/explore/698481e1000000000a02a7c1"
+      }
+    },
+    "title": "编剧常用的7种叙事结构清单",
+    "content": "界定:涵盖了从经典线性到实验破碎化的七种主流剧本架构模型。\n构成:\n- 三幕式结构:最经典线性逻辑,分为开端(交代背景冲突)、发展(冲突升级与成长)、高潮与结局(解决矛盾)。\n- 英雄之旅结构:坎贝尔模型,核心是平凡人到英雄的蜕变,含启程-考验-归来节点。\n- 非线性结构:通过闪回、插叙、倒叙、多视角等打破时间规律,制造悬念。\n- 环形结构:结尾与开端呼应形成闭环。分为非循环类(场景呼应)和带循环类(重复经历以达成目标)。\n- 多线叙事结构:多条独立故事线并在节点交汇,提升剧情密度,适配群像戏。\n- 嵌套式结构:套层结构(如戏中戏),故事里套故事,探讨虚实交织主题。\n- 反结构:碎片化结构,抛弃线性逻辑与完整结局,注重氛围营造和情绪表达。",
+    "dim_creations": [
+      "创作"
+    ],
+    "dim_attributes": [
+      "what构成"
+    ],
+    "scopes": [
+      {
+        "scope_type": "form",
+        "value": "叙事结构模型"
+      },
+      {
+        "scope_type": "substance",
+        "value": "剧本架构清单"
+      },
+      {
+        "scope_type": "effect",
+        "value": "界定故事时空"
+      }
+    ],
+    "custom_ext": [
+      {
+        "key": "业务阶段",
+        "type": "str",
+        "value": "脚本"
+      },
+      {
+        "key": "出自",
+        "type": "str",
+        "value": "剧本叙事结构选型与设计工序 第1步"
+      }
+    ]
+  },
+  {
+    "source": {
+      "id": "xhs_67e2e39b0000000003028ff0",
+      "source_type": "post",
+      "title": "剧本创作:理解前提、人物、冲突",
+      "author": "",
+      "source_metadata": {
+        "platform": "xiaohongshu",
+        "url": "https://www.xiaohongshu.com/explore/67e2e39b0000000003028ff0"
+      }
+    },
+    "title": "依据《编剧的艺术》将灵感转化为故事的创作框架",
+    "content": "目标:通过明确前提、塑造人物和设计冲突,将初步灵感转化为逻辑严密的剧本故事。\n步骤1(目的:确立剧本前提)\n  指引:依据“作者立场+人物+冲突+结论”公式提炼剧本目标。需结合基本情感(如欲望、恐惧)来决定前提方向。例:『……』\n  产出:剧本前提(包含结论的简明概括)\n步骤2(目的:构建三维人物)\n  指引:从生理、社会、心理三个维度完善人物性格,确立由内在/外在需求驱动的“主使人物”,并设计与其势均力敌的“对立人物”。\n  产出:三维人物志及人物对立关系\n步骤3(目的:设计冲突序列推动情节)\n  指引:以“攻击—反击”的形式编排冲突。利用“过渡(小冲突)”改变人物状态,从切入点引发危机,最终推向高潮与结局。\n  产出:冲突发展链条及结构点",
+    "dim_creations": [
+      "创作"
+    ],
+    "dim_attributes": [
+      "how工序"
+    ],
+    "scopes": [
+      {
+        "scope_type": "substance",
+        "value": "剧本前提"
+      },
+      {
+        "scope_type": "effect",
+        "value": "确立目标"
+      },
+      {
+        "scope_type": "intent",
+        "value": "意图明确"
+      },
+      {
+        "scope_type": "substance",
+        "value": "三维人物"
+      },
+      {
+        "scope_type": "form",
+        "value": "人物对立"
+      },
+      {
+        "scope_type": "effect",
+        "value": "动力驱动"
+      },
+      {
+        "scope_type": "form",
+        "value": "冲突序列"
+      },
+      {
+        "scope_type": "effect",
+        "value": "推动情节"
+      },
+      {
+        "scope_type": "intent",
+        "value": "推向结局"
+      }
+    ],
+    "custom_ext": [
+      {
+        "key": "业务阶段",
+        "type": "str",
+        "value": "脚本"
+      },
+      {
+        "key": "创作阶段",
+        "type": "str",
+        "value": "定向"
+      },
+      {
+        "key": "创作阶段",
+        "type": "str",
+        "value": "结构"
+      },
+      {
+        "key": "动作",
+        "type": "str",
+        "value": "提炼前提公式"
+      },
+      {
+        "key": "动作",
+        "type": "str",
+        "value": "三维度建模"
+      },
+      {
+        "key": "动作",
+        "type": "str",
+        "value": "设计攻击反击链码"
+      }
+    ]
+  },
+  {
+    "source": {
+      "id": "xhs_67e2e39b0000000003028ff0",
+      "source_type": "post",
+      "title": "剧本创作:理解前提、人物、冲突",
+      "author": "",
+      "source_metadata": {
+        "platform": "xiaohongshu",
+        "url": "https://www.xiaohongshu.com/explore/67e2e39b0000000003028ff0"
+      }
+    },
+    "title": "人物性格的三大维度",
+    "content": "界定:人物性格建立在三个相互影响的维度之上,决定了人物在冲突中的发展。 \n构成:\n- 生理维度:性别、年龄、外表等肉体特征\n- 社会维度:阶层、职业、家庭等社会属性\n- 心理维度:道德标准、志向、性格倾向等内在属性",
+    "dim_creations": [
+      "创作"
+    ],
+    "dim_attributes": [
+      "what构成"
+    ],
+    "scopes": [
+      {
+        "scope_type": "substance",
+        "value": "性格维度"
+      },
+      {
+        "scope_type": "form",
+        "value": "三维模型"
+      }
+    ],
+    "custom_ext": [
+      {
+        "key": "业务阶段",
+        "type": "str",
+        "value": "脚本"
+      },
+      {
+        "key": "出自",
+        "type": "str",
+        "value": "依据《编剧的艺术》将灵感转化为故事的创作框架 第2步"
+      }
+    ]
+  },
+  {
+    "source": {
+      "id": "xhs_67e2e39b0000000003028ff0",
+      "source_type": "post",
+      "title": "剧本创作:理解前提、人物、冲突",
+      "author": "",
+      "source_metadata": {
+        "platform": "xiaohongshu",
+        "url": "https://www.xiaohongshu.com/explore/67e2e39b0000000003028ff0"
+      }
+    },
+    "title": "冲突的四种表现类型",
+    "content": "界定:冲突是剧本发展的动力,根据其逻辑和节奏分为四种形态。\n构成:\n- 静态冲突:无明显发展或停滞不前的对立\n- 跳跃冲突:缺乏逻辑支撑的、不合常理的突兀行动\n- 缓慢升级冲突:逻辑清晰、紧张感不断加强的理想冲突形式\n- 预示:即张力,作为对未来冲突的承诺",
+    "dim_creations": [
+      "创作"
+    ],
+    "dim_attributes": [
+      "what构成"
+    ],
+    "scopes": [
+      {
+        "scope_type": "substance",
+        "value": "冲突形态"
+      },
+      {
+        "scope_type": "feeling",
+        "value": "紧张感"
+      }
+    ],
+    "custom_ext": [
+      {
+        "key": "业务阶段",
+        "type": "str",
+        "value": "脚本"
+      },
+      {
+        "key": "出自",
+        "type": "str",
+        "value": "依据《编剧的艺术》将灵感转化为故事的创作框架 第3步"
+      }
+    ]
+  },
+  {
+    "source": {
+      "id": "xhs_67e2e39b0000000003028ff0",
+      "source_type": "post",
+      "title": "剧本创作:理解前提、人物、冲突",
+      "author": "",
+      "source_metadata": {
+        "platform": "xiaohongshu",
+        "url": "https://www.xiaohongshu.com/explore/67e2e39b0000000003028ff0"
+      }
+    },
+    "title": "剧本结构的核心环节",
+    "content": "界定:故事从开始到完整结局必须经历的关键转折节点。\n构成:\n- 过渡:通过小冲突使人物精神状态发生转换\n- 切入点:引发转折的决定性瞬间\n- 危机:产生决定性改变的关键时刻\n- 高潮:冲突爆发至顶峰的生成过程\n- 结局:最终的结果呈现",
+    "dim_creations": [
+      "创作"
+    ],
+    "dim_attributes": [
+      "what构成"
+    ],
+    "scopes": [
+      {
+        "scope_type": "form",
+        "value": "结构节点"
+      },
+      {
+        "scope_type": "effect",
+        "value": "转折转换"
+      }
+    ],
+    "custom_ext": [
+      {
+        "key": "业务阶段",
+        "type": "str",
+        "value": "脚本"
+      },
+      {
+        "key": "出自",
+        "type": "str",
+        "value": "依据《编剧的艺术》将灵感转化为故事的创作框架 第3步"
+      }
+    ]
+  },
+  {
+    "source": {
+      "id": "xhs_67e2e39b0000000003028ff0",
+      "source_type": "post",
+      "title": "剧本创作:理解前提、人物、冲突",
+      "author": "",
+      "source_metadata": {
+        "platform": "xiaohongshu",
+        "url": "https://www.xiaohongshu.com/explore/67e2e39b0000000003028ff0"
+      }
+    },
+    "title": "人物性格与冲突辩证原理",
+    "content": "主张:人物性格不是静态的,而是冲突的产物。\n依据:人物必须随环境和冲突的发展而变化。只有当人物具备足够的意志力(主使vs对立)且势均力敌时,冲突才能通过“攻击-反击”实现真正的升级。\n对创作的影响:应避免设计软弱或无行动意向的人物;在设计情节时,需确保环境挤压能迫使人物性格产生必然的质变。",
+    "dim_creations": [
+      "创作"
+    ],
+    "dim_attributes": [
+      "why原理"
+    ],
+    "scopes": [
+      {
+        "scope_type": "substance",
+        "value": "性格与冲突"
+      },
+      {
+        "scope_type": "effect",
+        "value": "冲突升级"
+      },
+      {
+        "scope_type": "intent",
+        "value": "性格质变"
+      }
+    ],
+    "custom_ext": [
+      {
+        "key": "业务阶段",
+        "type": "str",
+        "value": "脚本"
+      }
+    ]
+  },
+  {
+    "source": {
+      "id": "xhs_680659e8000000001a007a11",
+      "source_type": "post",
+      "title": "故事设计原理拆解学习",
+      "author": "",
+      "source_metadata": {
+        "platform": "xiaohongshu",
+        "url": "https://www.xiaohongshu.com/explore/680659e8000000001a007a11"
+      }
+    },
+    "title": "场景详细分析五步法",
+    "content": "目标:通过分析连续时空中的冲突,诊断并优化场景逻辑与情感转换\n步骤1(目的:确定冲突)\n  指引:明确场景目标与对抗力量。例:『主角想拿走文件,但保安守在门口』\n  产出:场景核心矛盾点\n步骤2(目的:标注开篇价值)\n  指引:判断场景开始时人物所处的情感或处境价值(正面或负面)。\n  产出:初始价值状态\n步骤3(目的:分解节拍)\n  指引:将场景拆解为细小的“动作/反应”交流单元。\n  产出:节拍清单\n步骤4(目的:标注结局价值并比较转化)\n  指引:对比开篇与结局的价值差异,确保发生了有效的情感或处境转化。\n  产出:价值转化曲线\n步骤5(目的:概述节拍并标注转折点)\n  指引:快速梳理节拍流,确定转折点发生的具体位置。\n  产出:转折点定位图",
+    "dim_creations": [
+      "创作"
+    ],
+    "dim_attributes": [
+      "how工序"
+    ],
+    "scopes": [
+      {
+        "scope_type": "substance",
+        "value": "人物冲突"
+      },
+      {
+        "scope_type": "effect",
+        "value": "明确对抗"
+      },
+      {
+        "scope_type": "substance",
+        "value": "情感状态"
+      },
+      {
+        "scope_type": "form",
+        "value": "初始价值"
+      },
+      {
+        "scope_type": "form",
+        "value": "场景节拍"
+      },
+      {
+        "scope_type": "form",
+        "value": "交流单元"
+      },
+      {
+        "scope_type": "form",
+        "value": "价值转化"
+      },
+      {
+        "scope_type": "effect",
+        "value": "情感转化"
+      },
+      {
+        "scope_type": "form",
+        "value": "转折点定位"
+      },
+      {
+        "scope_type": "effect",
+        "value": "确定转折"
+      }
+    ],
+    "custom_ext": [
+      {
+        "key": "业务阶段",
+        "type": "str",
+        "value": "脚本"
+      },
+      {
+        "key": "创作阶段",
+        "type": "str",
+        "value": "结构"
+      },
+      {
+        "key": "创作阶段",
+        "type": "str",
+        "value": "打磨"
+      },
+      {
+        "key": "动作",
+        "type": "str",
+        "value": "明确目标对抗"
+      },
+      {
+        "key": "动作",
+        "type": "str",
+        "value": "价值锚定"
+      },
+      {
+        "key": "动作",
+        "type": "str",
+        "value": "拆解单元"
+      },
+      {
+        "key": "动作",
+        "type": "str",
+        "value": "对比度量"
+      },
+      {
+        "key": "动作",
+        "type": "str",
+        "value": "定位转折"
+      }
+    ]
+  },
+  {
+    "source": {
+      "id": "xhs_680659e8000000001a007a11",
+      "source_type": "post",
+      "title": "故事设计原理拆解学习",
+      "author": "",
+      "source_metadata": {
+        "platform": "xiaohongshu",
+        "url": "https://www.xiaohongshu.com/explore/680659e8000000001a007a11"
+      }
+    },
+    "title": "转折点的四个构成要素",
+    "content": "界定:转折点是在场景内通过冲突表现出的改变方向的关键节点。\n构成:\n- 惊奇:打破观众预期\n- 增强好奇心:引导观众关注后续发展\n- 见识:揭示角色或世界的新信息\n- 新方向:人物行为或剧情逻辑发生偏移",
+    "dim_creations": [
+      "创作"
+    ],
+    "dim_attributes": [
+      "what构成"
+    ],
+    "scopes": [
+      {
+        "scope_type": "substance",
+        "value": "叙事转折"
+      },
+      {
+        "scope_type": "feeling",
+        "value": "惊奇感"
+      },
+      {
+        "scope_type": "feeling",
+        "value": "好奇心"
+      },
+      {
+        "scope_type": "effect",
+        "value": "偏移逻辑"
+      }
+    ],
+    "custom_ext": [
+      {
+        "key": "业务阶段",
+        "type": "str",
+        "value": "脚本"
+      },
+      {
+        "key": "出自",
+        "type": "str",
+        "value": "场景详细分析五步法 第5步"
+      }
+    ]
+  },
+  {
+    "source": {
+      "id": "xhs_680659e8000000001a007a11",
+      "source_type": "post",
+      "title": "故事设计原理拆解学习",
+      "author": "",
+      "source_metadata": {
+        "platform": "xiaohongshu",
+        "url": "https://www.xiaohongshu.com/explore/680659e8000000001a007a11"
+      }
+    },
+    "title": "故事叙事弧线的五部分构成",
+    "content": "界定:构成一个完整故事宏观叙事弧线的五个关键阶段。\n构成:\n- 阐述:交代背景、人物及世界观\n- 上升动作/进展纠葛:冲突渐进式升级,包含内心、个人、外界三个层面\n- 情节突转/危机:置人物于两难之境的终极抉择点\n- 问题解决/高潮:产生价值剧变,满足观众情感预期\n- 下降动作/结局:处理次情节、展示影响或创造归于真理的效果",
+    "dim_creations": [
+      "创作"
+    ],
+    "dim_attributes": [
+      "what构成"
+    ],
+    "scopes": [
+      {
+        "scope_type": "form",
+        "value": "叙事弧线"
+      },
+      {
+        "scope_type": "substance",
+        "value": "冲突升级"
+      },
+      {
+        "scope_type": "effect",
+        "value": "解决问题"
+      },
+      {
+        "scope_type": "intent",
+        "value": "达成结局"
+      }
+    ],
+    "custom_ext": [
+      {
+        "key": "业务阶段",
+        "type": "str",
+        "value": "脚本"
+      }
+    ]
+  },
+  {
+    "source": {
+      "id": "xhs_680659e8000000001a007a11",
+      "source_type": "post",
+      "title": "故事设计原理拆解学习",
+      "author": "",
+      "source_metadata": {
+        "platform": "xiaohongshu",
+        "url": "https://www.xiaohongshu.com/explore/680659e8000000001a007a11"
+      }
+    },
+    "title": "真正选择的“两难之择”原理",
+    "content": "主张:真正的性格选择必须发生在压力之下的两难困境中。\n依据:简单的对错选择无法揭示深层性格;只有在‘不可调和的两善取其一’或‘两恶取其轻’时,人物的真实内核才会显现。\n对创作的影响:要求作者构建冲突时避免单一对立,应使用“三方框架”构建复杂冲突,迫使人物进行高压抉择。",
+    "dim_creations": [
+      "创作"
+    ],
+    "dim_attributes": [
+      "why原理"
+    ],
+    "scopes": [
+      {
+        "scope_type": "substance",
+        "value": "两难困境"
+      },
+      {
+        "scope_type": "substance",
+        "value": "真实性格"
+      },
+      {
+        "scope_type": "effect",
+        "value": "揭示内核"
+      },
+      {
+        "scope_type": "form",
+        "value": "三方框架"
+      }
+    ],
+    "custom_ext": [
+      {
+        "key": "业务阶段",
+        "type": "str",
+        "value": "脚本"
+      }
+    ]
+  },
+  {
+    "source": {
+      "id": "xhs_680659e8000000001a007a11",
+      "source_type": "post",
+      "title": "故事设计原理拆解学习",
+      "author": "",
+      "source_metadata": {
+        "platform": "xiaohongshu",
+        "url": "https://www.xiaohongshu.com/explore/680659e8000000001a007a11"
+      }
+    },
+    "title": "激励事件的特征与定位",
+    "content": "界定:激励事件是打破主角生活平衡并激发其欲望的决定性事件。\n构成:\n- 类型:分为随机发生的‘巧合’或人物主观决定的‘有因’\n- 发生时段:通常定位在主情节的前四分之一时段内\n- 核心功能:打破现有平衡、激发角色欲望",
+    "dim_creations": [
+      "创作"
+    ],
+    "dim_attributes": [
+      "what构成"
+    ],
+    "scopes": [
+      {
+        "scope_type": "substance",
+        "value": "激励事件"
+      },
+      {
+        "scope_type": "form",
+        "value": "情节定位"
+      },
+      {
+        "scope_type": "effect",
+        "value": "打破平衡"
+      },
+      {
+        "scope_type": "intent",
+        "value": "激发欲望"
+      }
+    ],
+    "custom_ext": [
+      {
+        "key": "业务阶段",
+        "type": "str",
+        "value": "脚本"
+      }
+    ]
+  },
+  {
+    "source": {
+      "id": "xhs_67e4bdf50000000006028a59",
+      "source_type": "post",
+      "title": "只要学会这几样,写短视频脚本真的不难❗️",
+      "author": "",
+      "source_metadata": {
+        "platform": "xiaohongshu",
+        "url": "https://www.xiaohongshu.com/explore/67e4bdf50000000006028a59"
+      }
+    },
+    "title": "视频脚本创作三步法",
+    "content": "目标:从确定选题到完成细节完善的标准化脚本产出流程\n步骤1(目的:确定选题)\n  指引:明确拍摄的主题与核心内容。\n  产出:明确的主题\n步骤2(目的:搭建框架)\n  指引:确定视频的人物、场景、事件,形成初步叙事骨架。\n  产出:脚本骨架\n步骤3(目的:细节完善)\n  指引:进行镜号排序,细化画面构思(景别/角度/构图/运镜)、文案/旁白、音效及字幕。\n  产出:完整脚本执行单",
+    "dim_creations": [
+      "创作"
+    ],
+    "dim_attributes": [
+      "how工序"
+    ],
+    "scopes": [
+      {
+        "scope_type": "substance",
+        "value": "选题方向"
+      },
+      {
+        "scope_type": "intent",
+        "value": "明确主题"
+      },
+      {
+        "scope_type": "form",
+        "value": "叙事骨架"
+      },
+      {
+        "scope_type": "substance",
+        "value": "人物场景"
+      },
+      {
+        "scope_type": "form",
+        "value": "分镜执行单"
+      },
+      {
+        "scope_type": "substance",
+        "value": "视听细节"
+      }
+    ],
+    "custom_ext": [
+      {
+        "key": "业务阶段",
+        "type": "str",
+        "value": "脚本"
+      },
+      {
+        "key": "创作阶段",
+        "type": "str",
+        "value": "定向"
+      },
+      {
+        "key": "创作阶段",
+        "type": "str",
+        "value": "构思"
+      },
+      {
+        "key": "创作阶段",
+        "type": "str",
+        "value": "打磨"
+      },
+      {
+        "key": "动作",
+        "type": "str",
+        "value": "确定主题"
+      },
+      {
+        "key": "动作",
+        "type": "str",
+        "value": "设人设景"
+      },
+      {
+        "key": "动作",
+        "type": "str",
+        "value": "参数配画"
+      }
+    ]
+  },
+  {
+    "source": {
+      "id": "xhs_67e4bdf50000000006028a59",
+      "source_type": "post",
+      "title": "只要学会这几样,写短视频脚本真的不难❗️",
+      "author": "",
+      "source_metadata": {
+        "platform": "xiaohongshu",
+        "url": "https://www.xiaohongshu.com/explore/67e4bdf50000000006028a59"
+      }
+    },
+    "title": "脚本黄金结构",
+    "content": "界定:一种通用的视频节奏构建框架,包含引子、主题和结尾三部分。\n构成:\n- 引子:利用视觉冲击、反常设计或奇特镜头,开门见山点名主题或提出疑问戳中痛点。\n- 内容主题:包含有起伏的故事线、平衡艺术与节奏把握,给出具体方法或观点。\n- 结尾:印象点总结、情感共鸣或引导行动,可抛出后续问题引出下期。",
+    "dim_creations": [
+      "创作"
+    ],
+    "dim_attributes": [
+      "what构成"
+    ],
+    "scopes": [
+      {
+        "scope_type": "form",
+        "value": "通用视频节奏"
+      },
+      {
+        "scope_type": "effect",
+        "value": "节奏构建"
+      },
+      {
+        "scope_type": "feeling",
+        "value": "情感共鸣"
+      }
+    ],
+    "custom_ext": [
+      {
+        "key": "业务阶段",
+        "type": "str",
+        "value": "脚本"
+      },
+      {
+        "key": "出自",
+        "type": "str",
+        "value": "视频脚本创作三步法 第2步"
+      }
+    ]
+  },
+  {
+    "source": {
+      "id": "xhs_67e4bdf50000000006028a59",
+      "source_type": "post",
+      "title": "只要学会这几样,写短视频脚本真的不难❗️",
+      "author": "",
+      "source_metadata": {
+        "platform": "xiaohongshu",
+        "url": "https://www.xiaohongshu.com/explore/67e4bdf50000000006028a59"
+      }
+    },
+    "title": "vlog脚本公式及要素",
+    "content": "界定:针对vlog视频的特定内容组合模式,通过五个维度确保内容吸引力。\n构成:\n- 引起共鸣:通过人物+状态+情感唤起观众同理心。\n- 引发好奇:描述时间或观点时预埋悬念。\n- 引发互动:结合主题与情景设计问句。\n- 干货输出:展示具体的情景、怎么做以及发生的事件。\n- 综合热点:结合当下流行或平台热度内容。",
+    "dim_creations": [
+      "创作"
+    ],
+    "dim_attributes": [
+      "what构成"
+    ],
+    "scopes": [
+      {
+        "scope_type": "substance",
+        "value": "Vlog内容维度"
+      },
+      {
+        "scope_type": "feeling",
+        "value": "同理心"
+      },
+      {
+        "scope_type": "effect",
+        "value": "预埋悬念"
+      },
+      {
+        "scope_type": "intent",
+        "value": "引导互动"
+      }
+    ],
+    "custom_ext": [
+      {
+        "key": "业务阶段",
+        "type": "str",
+        "value": "脚本"
+      }
+    ]
+  },
+  {
+    "source": {
+      "id": "xhs_67e4bdf50000000006028a59",
+      "source_type": "post",
+      "title": "只要学会这几样,写短视频脚本真的不难❗️",
+      "author": "",
+      "source_metadata": {
+        "platform": "xiaohongshu",
+        "url": "https://www.xiaohongshu.com/explore/67e4bdf50000000006028a59"
+      }
+    },
+    "title": "长短视频注意力维持策略",
+    "content": "主张:根据视频总时长调整核心信息呈现的时机。\n依据:长视频注意力维持约为15秒,短视频注意力仅为3秒(黄金3秒效应)。\n对创作的影响:短视频需在3-5秒内呈现主题;长视频需在开头10-15秒展示重点以防流失。",
+    "dim_creations": [
+      "创作"
+    ],
+    "dim_attributes": [
+      "why原理"
+    ],
+    "scopes": [
+      {
+        "scope_type": "effect",
+        "value": "注意力维持"
+      },
+      {
+        "scope_type": "intent",
+        "value": "防止流失"
+      },
+      {
+        "scope_type": "form",
+        "value": "信息时机"
+      }
+    ],
+    "custom_ext": [
+      {
+        "key": "业务阶段",
+        "type": "str",
+        "value": "脚本"
+      }
+    ]
+  },
+  {
+    "source": {
+      "id": "xhs_67e4bdf50000000006028a59",
+      "source_type": "post",
+      "title": "只要学会这几样,写短视频脚本真的不难❗️",
+      "author": "",
+      "source_metadata": {
+        "platform": "xiaohongshu",
+        "url": "https://www.xiaohongshu.com/explore/67e4bdf50000000006028a59"
+      }
+    },
+    "title": "常用视觉构图法",
+    "content": "界定:在脚本细节完善阶段用于规划画面视觉效果的方法论。\n构成:\n- 水平线构图:体现平稳广阔的感觉。\n- 对角线构图:增加画面的动感与吸引力。\n- 中心构图:使主体突出且画面平衡。\n- 框式构图:营造穿越感与神秘感。\n- 九宫格/三分法:排列主体,简化复杂画面。",
+    "dim_creations": [
+      "创作"
+    ],
+    "dim_attributes": [
+      "what构成"
+    ],
+    "scopes": [
+      {
+        "scope_type": "form",
+        "value": "视觉构图"
+      },
+      {
+        "scope_type": "feeling",
+        "value": "画面美感"
+      },
+      {
+        "scope_type": "effect",
+        "value": "主体突出"
+      }
+    ],
+    "custom_ext": [
+      {
+        "key": "业务阶段",
+        "type": "str",
+        "value": "脚本"
+      },
+      {
+        "key": "出自",
+        "type": "str",
+        "value": "视频脚本创作三步法 第3步"
+      }
+    ]
+  }
+]

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio