Browse Source

Tighten what particle extraction contract

SamLee 1 week ago
parent
commit
4638b562f7

+ 1 - 1
decode_content/contracts.py

@@ -16,7 +16,7 @@ DEFAULT_SKILL_DIR = ROOT / "创作知识提取-skill"
 SCOPE_TREE_DIR = ROOT / "scope_trees"
 
 KNOWLEDGE_TYPES = ("how", "what", "why")
-BUSINESS_STAGES = ("灵感", "选题", "脚本")
+BUSINESS_STAGES = ("灵感", "选题", "脚本", "视觉呈现", "拍摄表达")
 CREATION_STAGES = ("定向", "构思", "结构", "成文", "打磨")
 WHAT_KINDS = ("子集", "多维关系", "序列")
 SCOPE_TYPES = ("substance", "form", "feeling", "effect", "intent")

+ 2 - 1
decode_content/framing.py

@@ -44,7 +44,8 @@ def reshape_nonhow(
     )
     user = (
         "【下面这块原被误判为 how 工序,实为「离散构成 / 原理」,请只拆成 What/Why 主颗——"
-        "每个'是什么/分几类'的构成块拆一颗 What,背后的原理/标准拆一颗 Why;"
+        "同一划分轴/组件库下的并列构成先合并成一颗 What 子集,body 里放各项;"
+        "只有已展开成独立方法、判断框架或完整结构的构成项才单独拆 What;背后的原理/标准拆 Why;"
         "不要 how、不要组件颗,parent 一律 null。作用域字段留空 []。】\n\n"
         f"原标题:{knowledge.get('title', '')}\n{body}\n\n"
         "只输出 JSON:{\"knowledges\":[ ... 仅 what/why,见模板 ... ]}"

+ 1 - 1
tests/test_decode_contracts.py

@@ -28,7 +28,7 @@ def test_load_decode_contracts_covers_skill_prompts_and_cache():
 
 def test_contract_constants_record_formal_business_terms():
     assert KNOWLEDGE_TYPES == ("how", "what", "why")
-    assert BUSINESS_STAGES == ("灵感", "选题", "脚本")
+    assert BUSINESS_STAGES == ("灵感", "选题", "脚本", "视觉呈现", "拍摄表达")
     assert CREATION_STAGES == ("定向", "构思", "结构", "成文", "打磨")
     assert WHAT_KINDS == ("子集", "多维关系", "序列")
     assert SCOPE_TYPES == ("substance", "form", "feeling", "effect", "intent")

+ 17 - 15
创作知识提取-skill/extraction/phase1-frame.md

@@ -4,7 +4,7 @@
 干三件事:**判这帖有几颗、各是什么类型**(how/what/why)→ **按类型把每颗成形** → **顺手打轻标签**。
 **不碰作用域**(留给 ③)。产物:`framework.json` 的 `knowledges[]`(一帖多颗)。
 
-> 核心:**颗是单位,一帖 = N 颗**(可混类型)。what/why 既能独立成颗,也能作为某 how 的「组件颗」单列
+> 核心:**颗是单位,一帖 = N 颗**(可混类型)。What/Why 只有通过「一等知识判断」才独立成颗;若只是同一清单/组件库里的一个 item,放入父级 What 的 body,不单独成颗
 
 ---
 
@@ -20,15 +20,16 @@
    · 影响【取舍判断】(背后的原理 / 标准 / 平台逻辑)            → Why
 3. How 凭「序列为真」上位(A2节 两道闸):只有「后步吃前步 + 走到成品」才算 How;
    并列招式/选项清单 → 其实是 What;单讲道理/取舍 → Why。别因为「看着像步骤」就判 How。
-4. 组件链接(分类之后才做,不是抽取入口):某 What/Why 若【恰好】是某 How 某步的
-   产出(what)或判断依据(why) → 标 role=组件、parent={how_id,step}(既单列成颗、又连回 how);
-   其余 What/Why 是 role=主、parent=null。
+4. 组件链接(分类之后才做,不是抽取入口):先判断 What/Why 是否值得独立成颗;
+   已成颗的 What/Why 若【恰好】是某 How 某步的产出(what)或判断依据(why)
+   → 标 role=组件、parent={how_id,step};其余 What/Why 是 role=主、parent=null。
 ```
 
-> 每个单元都是**独立一颗**;组件只是"分类后顺手连了一条到 how 的链接",**不改变它是独立知识**这件事。三类谁多谁少都正常——一帖可能全 What、也可能 how+what+why 混。
+> 不是每个单元都自动独立成颗。组件关系不是拆颗理由,只是已经成颗后的链接。三类谁多谁少都正常——一帖可能全 What、也可能 how+what+why 混,但每颗都必须够厚、能独立驱动创作决策
 
 **判 step(某动作压进 how 当一步,不单拎)**:①产出半成品 ②被同帖另一块当输入 ③拿走则成品残缺。
-**判组件颗(连回 how 的那条链接该不该建)**:见 C节 判据。
+**判一等 What/Why(能不能单独成颗)**:单独拿出来是否知道「什么时候用 / 解决什么问题 / 判断标准是什么 / 脱离原帖能否复用」。答不上来就不要单独成颗,放进父级 What 的 body 或留在 How step 里。
+**判组件颗(连回 how 的那条链接该不该建)**:先过一等知识判断,再见 C节 判据。
 
 ### A2. how 资格闸 —— 两道硬闸,任一过不了就别当 how
 
@@ -37,10 +38,10 @@
 **闸① 有序性(步骤之间真有「产出→输入」传递吗?)**
 > 后一步是否**消费前一步的具体产出**、换了顺序就跑不通?
 > - 是 → 真有序,可成 how。**且每个后步的 `input` 必须实指它消费的前步产出物原话**(写"← s1 的〈赛道圣经句清单〉",**禁止空泛的"←s1产出"**)——指不出具体消费物 = 不依赖。
-> - **否 → 不是工序**:一组并列招式/途径 → 一颗 **What 清单**;几块"各自是什么"的离散构成 → **各拆一颗 What**(原理拆 Why)。
+> - **否 → 不是工序**:同一划分轴下的一组并列招式/途径/组件/选项 → 一颗 **What(子集型)**;只有某个构成项本身已展开成独立方法、判断框架或完整结构,才单独拆成 What(原理拆 Why)。
 > 识别信号:①相邻 step 的 output 近义/重复;②打乱顺序成品仍成立;③多个 step 的 input 其实都是工序总输入、彼此不喂给;④这些"步骤"各自是"X 是什么/分几类";⑤【定义式拆解】后步产出是前步"方法/产出"里已点名的成分(前提=…人物…冲突…,后步逐个产出"人物""冲突")→ 是把复合体拆开展开、不是加工出新东西。
 > **反驳自检(封 how 前必做)**:逐对说出"s2 用了 s1 产出的什么具体物";再查"s2 的产出是不是 s1 里已点名的成分"——说不出消费物、或产出只是前步成分的展开,就拆成 What,别硬编链。
-> ⚠️ 离散构成例(**应拆 What/Why,不是 how**):「故事 = 前提 + 人物 + 冲突」——前提/人物/冲突各自是"是什么/分几类"、互为定义但**无产出→输入传递**(拟定前提并不消费"切入点")→ 拆成「前提构成」「人物维度」「冲突类型」几颗 What(+「冲突靠势均力敌升级」这类原理拆 Why),别硬串成 step1→2→3。
+> ⚠️ 离散构成例(**应拆 What/Why,不是 how**):「故事 = 前提 + 人物 + 冲突」——前提/人物/冲突各自是"是什么/分几类"、互为定义但**无产出→输入传递**(拟定前提并不消费"切入点")→ 通常合成一颗「故事构成组件」What,在 body 里写前提/人物/冲突;若原帖把某一项展开成可独立复用的选择框架,再单独成 What(+「冲突靠势均力敌升级」这类原理拆 Why),别硬串成 step1→2→3。
 
 **闸② 走到交付物(最后一步的 output = purpose 承诺的成品吗?)**
 > purpose 用什么名词收尾("一篇成稿"/"一个选题"/"一条脚本"),**最后一步的 output 就必须是那个东西**。
@@ -50,7 +51,7 @@
 **铁律**:没工序**别硬造假 how**;一颗 = 一个完整东西,不拆碎,也不把半截工序包装成完整方法论。
 
 > 🌰 跨题材示例(只示意判法,**别套用这里的题材/词**):
-> - 假 how(应改 What 清单):「找选题灵感的 3 个途径:①翻同行评论区 ②看搜索下拉词 ③问目标读者」——三者并列、可换序、做一个就行 → 是一颗 What(途径清单),不是 step1→2→3。
+> - 假 how(应改 What 子集):「找选题灵感的 3 个途径:①翻同行评论区 ②看搜索下拉词 ③问目标读者」——三者并列、可换序、做一个就行 → 是一颗 What(子集型,途径清单),不是 step1→2→3。
 > - 真 how:「腌制 → 下锅 → 收汁」——收汁吃下锅的产出,换序就崩,最后一步出成品 → 合格 how。
 > - 半截 how(应补收尾或降 purpose):purpose 写「写出一篇成稿」,但步骤只到「列大纲、攒素材」就停了 → 缺"把大纲素材写成稿"的收尾步;要么补上,要么把 purpose 降为「成稿前的备料法」。
 
@@ -80,7 +81,8 @@
 
 **先判这颗 What 是哪种(决定 item_desc 要不要带"何时选"):**
 按"部件之间什么关系"分三种(两步判:①部件是**可挑着用的选项/清单(挑一个或多个都行)**?→ `子集`;②否则**多个组成部分/维度并陈、不是挑出来的**——有"从头到尾的时间/线性先后"(换序就读不通)?有→`序列`;没有(只是并列的组成/侧面/大小层级)→`多维关系`):
-- **`子集`型**(**并列·挑着用·可多挑**):「X 有 A/B/C 几种/几个」,**各自独立、不合成一个整体**,按需**挑一个或多个**(如 7种叙事结构、冲突四类型、构图六法、拍照姿势合集、镜头清单、vlog 镜头清单、标题九技巧)。落点 = **元素选择**——**每条 `item_desc` 必须把原帖给的「何时/为何选它」一并写进去**;如果原帖只是姿势/构图/镜头案例图,没写何时/为何,就忠实写“是什么/怎么摆/画面什么样”,不要编造适用条件。
+- **`子集`型**(**并列·挑着用·可多挑**):「X 有 A/B/C 几种/几个」,各选项可被独立选择/组合,但**不因此各自成颗**,按需**挑一个或多个**(如 7种叙事结构、冲突四类型、构图六法、拍照姿势合集、镜头清单、vlog 镜头清单、标题九技巧)。落点 = **元素选择**——**每条 `item_desc` 必须把原帖给的「何时/为何选它」一并写进去**;如果原帖只是姿势/构图/镜头案例图,没写何时/为何,就忠实写“是什么/怎么摆/画面什么样”,不要编造适用条件。
+  - **清单优先合并**:同一划分轴/同一组件库下的 N 个选项,默认是一颗 What 子集的 N 个 body item,**不是 N 颗 What**。动作、姿势、镜头、构图、招式、技巧、公式、元素等都只是例子;真正判据是它们是否属于同一组可选择/可组合的元素。
   - **填 `维度拆分规则`**:先试**单一轴**——套进"**按【X】分,每个选项都是 X 上的一个取值**":
     - 套得进 → 填那**一个短词**,命名"按什么分"的**轴**、**不是分出来的结果/效果**,且**禁用"与/、/及其"拼两个**。✅ 冲突三层面→`冲突范围`(内心/个人/社会);拍摄构图→`构图的几何布局`(**不是**"画面视觉效果");Vlog五公式→`想引发的观众反应`(**不是**"内容驱动目的")。
     - **套不进**(选项是各按不同东西命名的大杂烩、找不到统一轴)→ 老实填 **`类型枚举`**,**别硬拼假轴**。❌ 7种叙事结构(非线性按时间序、多线按线数、嵌套按套层…无统一轴)、9种标题技巧(句式/心理/内容混杂)→ 都填 `类型枚举`,别写"叙事组织逻辑与时间线""心理触发机制/切入视角"这种拼凑。
@@ -94,7 +96,7 @@
 - ⚠️ **保留原文、不转译不脑补(What 的命根)**:`概要 / item_desc`**尽量照搬原帖原话**——能引原文就引,少改写、少换词;**原帖给了几句就留几句,别压成一句**(这是知识本体,删了就废)。**严禁补原帖没有的内容**:原帖写"生理(性别、年龄、外表)"就只写这些,不许擅自加"遗传";原帖只给公式"作者立场+人物+冲突+结论"就照写,不许替作者给每个词编定义。**宁可保留原帖的口语/不完美措辞,也不要 AI 润色后的"漂亮转译"。**
 - 若某点有**子结构**(如"三幕式"含一幕/二幕/三幕),把**每个子点的原文描述都带进 `item_desc`**(可分行)。例:三幕式 item_desc 应含"一幕交代背景人设、二幕是主体冲突升级、三幕高潮爆发并解决",而不是只写"分一二三幕"。
 - **别套模板**:条目数由本帖内容决定。
-> 组件 what:对应某 how 的某一步(那步的产出物),但本身是独立一颗、可单独复用。不对应任何步 → 就是单独的一条(role=主)
+> 组件 what:对应某 how 的某一步(那步的产出物),且本身已通过一等知识判断、可单独复用,才单独成颗并连回 how。若只是该 What 清单里的一个选项,放在 body item,不单独成颗
 > ⚠️ 子集型即使原帖只列了选项没说何时用 → `item_desc` 只写是什么(别编"何时选"),但仍要标 `kind:子集` 并给 `维度拆分规则`。
 
 ### Why(为什么)— role 主 或 组件
@@ -103,20 +105,20 @@
   - ✅ 允许(为通顺):串接、调顺序、加连接词、删重复。
   - ❌ 禁止(守忠实):改实质、补原帖没有的观点、润色成"漂亮转译"、把描述改成祈使("应/必须/严禁")。
 - **只说"是什么+为什么",不延伸"怎么用"**:原帖即便给了创作建议,也按原话留在阐述里、不单独加工成取舍/操作指令——"怎么用"是下游的事。一句话:**AI 只做缝,不做编,不教怎么用。**
-> 组件 why:对应某 how 的某一步(那步的依据/原理),但本身是独立一颗、可单独复用。不对应任何步 → 就是单独的一条(role=主)
+> 组件 why:对应某 how 的某一步(那步的依据/原理),且本身已通过一等知识判断、可单独复用,才单独成颗并连回 how。若只是某步一次性的判断依据,留在 step 的 directive 里,不单独成颗
 > ⚠️ 阐述里**只还原原理本身**(是什么+为什么),原帖即使顺带给了"该怎么做"的建议,也别把它单独拎出来加工成指令——按原话融在阐述里即可。
 
 ---
 
 ## C. 组件链接判据(分类之后才问)
 
-每颗 What/Why 都已是独立一颗(A节)。**定死:只有两态**——要么对应某 how 的某一步(组件),要么单独的一条(主)。没有第三种
+先判断 What/Why 是否值得独立成颗(A节)。**组件关系不是拆颗理由**;只有已经够厚、可独立复用的 What/Why,才进入这里判断它是组件还是主颗
 
 > **这颗 What/Why 对应某 how 的某一步吗?**(what = 那步的产出物;why = 那步的依据/原理)
-> - **是 → 标 `role=组件, parent={how_id,step}`**(仍是独立一颗,只多一条到 how 的链接)。
+> - **是 → 标 `role=组件, parent={how_id,step}`**(这是一颗已通过一等知识判断的独立知识,只多一条到 how 的链接)。
 > - **否 → `role=主, parent=null`**(就是单独的一条)。
 > - **反向提醒**:如果某"指令"只是某步一次性的话、脱离那步就不成立、无复用价值 → 它**不该单独成颗**,留在 step 的 directive 里即可。
-> - **N 选 1 并列清单**:一组「X 种结构 / X 种手法 / X 个要素」整体可复用 → 它就是一颗 **What(子集型)**,不是 how 的步骤
+> - **N 选 1 并列清单**:一组「X 种结构 / X 种手法 / X 个要素」整体可复用 → 它就是一颗 **What(子集型)**,N 个选项写进 body;单个选项只有已经发展成独立方法/判断框架/完整结构时,才单独成颗
 
 > ⚠️ 本文示例(含下方模板里的词)都只是示意结构,**值一律从本帖内容抽,别套用示例里的任何具体词**。
 

+ 12 - 2
创作知识提取-skill/taxonomy/业务阶段.json

@@ -1,5 +1,5 @@
 {
-  "$comment": "业务阶段 受控词表(固定 3,由本项目定)。一整颗框架常跨多个业务阶段——多值。Phase2 读。落到 custom_ext(key=业务阶段, type=str, 多值)。",
+  "$comment": "业务阶段 受控词表(固定 5,由本项目定)。一整颗框架常跨多个业务阶段——多值。Phase2 读。落到 custom_ext(key=业务阶段, type=str, 多值)。",
   "$kind": "taxonomy",
   "$dimension": "业务阶段",
   "$field": "业务阶段",
@@ -20,7 +20,17 @@
       "分类名称": "脚本",
       "分类说明": "帮助组织表达顺序 / 文案 / 镜头 / 结构——选题已定,开始把内容搭出来、写出来。典型:脚本结构、分镜、叙事顺序、文案撰写。判别口诀:这颗知识在帮人『把定了的题组织成具体内容』。",
       "分类性质": "业务环节"
+    },
+    {
+      "分类名称": "视觉呈现",
+      "分类说明": "帮助决定画面如何被看见——构图、景别、机位、画面风格、封面、海报、图片组视觉组织。判别口诀:这颗知识在帮人『把内容变成什么样的画面』。",
+      "分类性质": "业务环节"
+    },
+    {
+      "分类名称": "拍摄表达",
+      "分类说明": "帮助现场拍摄和人物/镜头表达——拍照姿势、人物引导、光线选择、场景调度、运镜、镜头清单、拍摄流程。判别口诀:这颗知识在帮人『怎么拍、怎么引导、怎么组织镜头』。",
+      "分类性质": "业务环节"
     }
   ],
-  "$leaves": ["灵感", "选题", "脚本"]
+  "$leaves": ["灵感", "选题", "脚本", "视觉呈现", "拍摄表达"]
 }

+ 2 - 2
创作知识提取-skill/taxonomy/知识类型.json

@@ -16,14 +16,14 @@
       "分类名称": "what",
       "dim_attributes值": "what",
       "payload形态": "结构化(content 为对象:name + kind + 维度拆分规则(子集) + body[item_name/item_desc];概要入 custom_ext;无 steps)",
-      "分类说明": "这颗知识是『是什么 / 由什么构成』——对某创作对象的界定、要素清单、模板、风格示例,但不讲怎么一步步做。典型:脚本三要素、爆款标题的构成要素、某风格的特征清单。判别口诀:读完主要收获是『了解这东西是什么、由哪几块组成』,是界定性/列举性的。注意:what 始终是独立一颗——定死两态:要么单独的一条(role=主),要么对应某 how 的某一步而成组件颗(role=组件,parent={how_id,step})。二者皆可,不存在『并进 step、不单独成颗』;与 why 完全对称。",
+      "分类说明": "这颗知识是『是什么 / 由什么构成』——对某创作对象的界定、要素清单、模板、风格示例,但不讲怎么一步步做。典型:脚本三要素、爆款标题的构成要素、某风格的特征清单。判别口诀:读完主要收获是『了解这东西是什么、由哪几块组成』,是界定性/列举性的。注意:what 只有通过一等知识判断才单独成颗;同一划分轴/组件库下的并列选项默认合并为一颗 What 子集,写进 body。已成颗的 what 若对应某 how 的某一步,可标 role=组件,parent={how_id,step};否则 role=主。",
       "分类性质": "构成"
     },
     {
       "分类名称": "why",
       "dim_attributes值": "why",
       "payload形态": "简化(content 为一段「阐述」:这条原理是什么+为什么,忠实整合原帖;无 steps;不延伸\"怎么用\")",
-      "分类说明": "这颗知识是『为什么』——解释某种创作做法/判断背后的原理、依据、平台逻辑、读者心理。典型:为什么标题决定打开率、为什么先写冲突、为什么这种结构传播好。判别口诀:读完主要收获是『理解了某件事为什么这样做』,是解释性/原理性的,较少具体步骤。注意:why 始终是独立一颗——定死两态:要么单独的一条(role=主),要么对应某 how 的某一步而成组件颗(role=组件,parent={how_id,step})。二者皆可,不存在『写进步骤指引、不单独成颗』;与 what 完全对称。",
+      "分类说明": "这颗知识是『为什么』——解释某种创作做法/判断背后的原理、依据、平台逻辑、读者心理。典型:为什么标题决定打开率、为什么先写冲突、为什么这种结构传播好。判别口诀:读完主要收获是『理解了某件事为什么这样做』,是解释性/原理性的,较少具体步骤。注意:why 只有通过一等知识判断才单独成颗;若只是某 how 步骤里一次性的判断依据,留在 step 的 directive 里。已成颗的 why 若对应某 how 的某一步,可标 role=组件,parent={how_id,step};否则 role=主。",
       "分类性质": "原理"
     }
   ],