Przeglądaj źródła

what 结构分类 2值→3值:子集/多维关系/序列 + 去掉 why 主张标签

- phase1-frame:kind 从 构成/选项 → 子集(并列挑着用)/多维关系(都要无序)/序列(都要有序),加两步判据
- 前端:徽章 🗂子集·并列/🧩多维·组合/🔢序列·有序 + KINDB 映射 + CSS 类 + GLOSSARY 三种;去掉 why 卡『主张』标签(why 划分定义前不挂标签)
- decompose:content 内 kind 字样改『结构:X』
- 重跑:9帖 23颗,kind=子集8/多维关系3/序列3,无旧值,0 ERROR

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
SamLee 3 tygodni temu
rodzic
commit
bd97eb8930

+ 1 - 1
scripts/decompose.py

@@ -323,7 +323,7 @@ def build_content(k: dict) -> str:
     if t == "what":
         head = f"界定:{k.get('界定','')}"
         if k.get("kind"):
-            head += f"({k['kind']})"
+            head += f"(结构:{k['kind']})"
         return "\n".join([head] + _sections(k.get("主体")))
     return "\n".join([f"主张:{k.get('主张','')}"] + _sections(k.get("支撑")))
 

Plik diff jest za duży
+ 421 - 486
web/frameworks.json


+ 10 - 8
web/index.html

@@ -94,7 +94,7 @@
   .cue{font-size:11px;color:#7c2d12;background:#fff7ed;border-left:2px solid #fb923c;padding:3px 7px;margin-top:4px;border-radius:0 4px 4px 0}
   .cue b{color:#9a3412}
   .kindb{font-size:10.5px;font-weight:700;padding:1px 8px;border-radius:9px;margin-right:8px;vertical-align:middle;cursor:help}
-  .kind-选项{background:#dbeafe;color:#1e40af}.kind-构成{background:#dcfce7;color:#166534}
+  .kind-子集{background:#dbeafe;color:#1e40af}.kind-多维关系{background:#dcfce7;color:#166534}.kind-序列{background:#fef3c7;color:#92400e}
   .ksec-f.key{background:#fde68a;color:#92400e;font-weight:700}
   .glossbtn{background:#ede9fe!important;color:#6d28d9!important;border-color:#ddd6fe!important}
   .from{font-size:11px;color:#9ca3af}
@@ -173,6 +173,7 @@ const j=u=>fetch(u,{cache:"no-store"}).then(r=>r.json());
 const SCOPES=[["substance","实质"],["form","形式"],["feeling","感受"],["effect","作用"],["intent","意图"]];
 const SC_CN={substance:"实质",form:"形式",feeling:"感受",effect:"作用",intent:"意图"};
 const TYPECN={how:"How",what:"What",why:"Why"};
+const KINDB={子集:"🗂 子集·并列",多维关系:"🧩 多维·组合",序列:"🔢 序列·有序"};
 const CSTAGE_DOC=`## 创作阶段:写死的 5 个(每步选 1 个)
 how 工序每一步命中其中**一个**;不在这 5 个里的值会被代码丢弃(受控词表,不开放)。
 
@@ -197,10 +198,11 @@ const GLOSSARY=`## 一篇帖子能拆出三种知识(平级的)
 | **是什么** (What) | 某东西由什么组成 / 有哪些种类 | 用**哪些料** |
 | **为什么** (Why) | 背后的道理、标准、平台规则 | 该**留什么、砍什么** |
 
-## 「是什么」分两种
-- **组成·都要用**(构成型):像配方,列出的几样要**全用上**(例:人物 = 生理+社会+心理)。
-- **可选·挑着用**(选项型):像菜单,列出几种**选一种**用(例:7 种叙事结构挑一种)。
-  - 每个选项后面那句 **👉 什么时候用** 就是「**选择线索**」——告诉你哪种情况该挑它。没有它,就只能背、不会选。
+## 「是什么」按结构分三种
+- **🗂 子集·并列**:像菜单,几个**互不隶属**的项,**归其一 or 挑着用**(例:7 种叙事结构挑一种、构图六法按场景挑)。
+  - 每个项后面那句 **👉 什么时候用** 就是「**选择线索**」——告诉你哪种情况该挑它。没有它,就只能背、不会选。
+- **🧩 多维·组合**:像配方,几个部件**都要、合起来才完整、无先后**(例:人物 = 生理+社会+心理)。
+- **🔢 序列·有序**:几个部件**都要、且有前后位置**(例:故事五部分、黄金三段式)。只是位置顺序——后段若**消费**前段产出、换序就崩,那就成 how 工序了。
 
 ## 「为什么」里每条道理的小标签
 说明这条是哪种支撑:
@@ -326,14 +328,14 @@ function KSection({b}){
 }
 function WhatCard({k,onScope,onGloss}){
   return <div>
-    {k.界定&&<div className="def">{k.kind&&<span className={"kindb kind-"+k.kind} title="点开「名词说明」看区别" onClick={()=>onGloss&&onGloss()}>{k.kind==="选项"?"🎯 可选·挑着用":"🧩 组成·都要用"}</span>}界定:{k.界定}</div>}
+    {k.界定&&<div className="def">{k.kind&&<span className={"kindb kind-"+k.kind} title="点开「名词说明」看区别" onClick={()=>onGloss&&onGloss()}>{KINDB[k.kind]||k.kind}</span>}界定:{k.界定}</div>}
     {(k.主体||[]).map((b,i)=><KSection key={i} b={b}/>)}
     <KScopes list={k.作用域} onScope={onScope}/>
   </div>;
 }
 function WhyCard({k,onScope}){
   return <div>
-    {k.主张&&<div className="why-row"><span className="why-lab wl-claim">主张</span><span className="why-txt">{k.主张}</span></div>}
+    {k.主张&&<div className="why-row"><span className="why-txt">{k.主张}</span></div>}
     {(k.支撑||[]).map((b,i)=><KSection key={i} b={b}/>)}
     <KScopes list={k.作用域} onScope={onScope}/>
   </div>;
@@ -408,7 +410,7 @@ function App(){
         </div>
       </details>
       <div className="barhint" style={{display:"flex",gap:8,alignItems:"center"}}>
-        <span>这一帖拆出 <b>{ks.length}</b> 颗知识(how 工序表 / what 构成卡 / why 论点卡);组件颗标「出自某 how 第 N 步」可点跳。</span>
+        <span>这一帖拆出 <b>{ks.length}</b> 颗知识(how 工序表 / what 知识卡 / why 论点卡);组件颗标「出自某 how 第 N 步」可点跳。</span>
         <button className="lbtn glossbtn" onClick={()=>setGloss(true)} style={{marginLeft:"auto"}}>❓ 名词说明</button>
         <button className={"lbtn"+(hl?" on":"")} onClick={()=>setHl(!hl)}>高亮「新值」</button>
       </div>

Plik diff jest za duży
+ 56 - 96
web/payloads.json


+ 12 - 10
创作知识提取-skill/extraction/phase1-frame.md

@@ -60,7 +60,7 @@
 
 > **核心原则:每类知识都要落在它的「决策落点」上**——这是这条知识对下游 AI 的真正价值。
 > - **How**(影响脉络/结构)→ 落点 = **输入→方法→产出 的链**(每步吃什么、吐什么)。
-> - **What**(影响元素选择)→ 落点 = **可选元素 + 选择线索**(选项型每个选项"何时/为何选它")。
+> - **What**(影响元素选择)→ 落点 = **可选元素 + 选择线索**(子集型每个选项"何时/为何选它")。
 > - **Why**(影响取舍判断)→ 落点 = **对创作的取舍**(所以该多写/砍/侧重什么)。
 > 描述部分尽管自由,但**决策落点必须落到**——只描述不落点 = 半成品知识。
 
@@ -76,20 +76,22 @@
 > **每颗都带 `出处`(溯源用)**:How 颗的 `出处` 在每个 step 上(这步来自哪些卡);What/Why 颗在颗级给 `出处`(这颗来自哪些卡,如 ["图3","卡片2"])。出处填卡片号(图N=第N张图,卡片N=视频第N段),让前端能点回原图/原视频段。
 
 ### What(是什么)— role 主 或 组件
-`界定`(**唯一必填**,一句话这是什么,做锚点)+ `kind`(**必填**:`构成` 或 `选项`)+ `主体`:**0..N 个自由小节**,每节 `{小标题, 形式?, 内容?, 条目?}`。无 steps。+ 颗级 `出处`。
+`界定`(**唯一必填**,一句话这是什么,做锚点)+ `kind`(**必填**:`子集` / `多维关系` / `序列`)+ `主体`:**0..N 个自由小节**,每节 `{小标题, 形式?, 内容?, 条目?}`。无 steps。+ 颗级 `出处`。
 
 **先判这颗 What 是哪种(决定要不要选择线索):**
-- **`构成`型**(用**全部**):「X 由 A+B+C 组成」,要素是拼齐的,不是挑的(如 人物三维度=生理+社会+心理、故事五部分)。落点 = 完备性,**条目不需要选择线索**。
-- **`选项`型**(**选其一/几**):「有 A/B/C 几种可选」,要从中挑(如 7 种叙事结构、几种开场公式、几种构图手法)。落点 = **元素选择**——**每个条目必带 `选择线索`:何时/为何选它**(没有选择线索,AI 只能背不能选 = 这颗废了一半)。
+按"部件怎么关联"分三种(两步判:①部件**挑其一/列清单**?→ `子集`;②否则**组合成一个整体**——有前后顺序?有→`序列`,无→`多维关系`):
+- **`子集`型**(**并列·挑着用**):「X 有 A/B/C 几种/几个」,**互不隶属、没有合成整体**,归其一或按需挑(如 7种叙事结构、冲突四类型、构图六法、标题九技巧)。落点 = **元素选择**——**每个条目必带 `选择线索`:何时/为何选它**(没有选择线索,AI 只能背不能选 = 这颗废了一半)。
+- **`多维关系`型**(**都要·无序**):「X = A+B+C,拼齐才完整、无先后」,要素是组合的不是挑的(如 人物三维度=生理+社会+心理、前提=立场+人物+冲突+结论、脚本六要素)。落点 = 完备性,**条目不需要选择线索**。
+- **`序列`型**(**都要·有序**):「X 由 A→B→C 按位置/时间排成,拼齐且有前后」(如 故事五部分、黄金三段式)。⚠️ 只是**位置顺序**,后段**不消费**前段产出——若后段吃前段产出、换序就崩,那是 **how 工序**不是 what。落点 = 完备性+顺序,**条目按序排列、不需要选择线索**。
 
 每节:
 - `形式`(可选·开放提示):清单 / 分类 / 判据 / 对照 / 定义…(从内容判,没把握就省)。
-- `内容`(散文)与 `条目` **二选一或并存**。**选项型**的 `条目` 是 `[{词, 说明, 选择线索}]`;**构成型**的 `条目` 是 `[{词, 说明}]`。
+- `内容`(散文)与 `条目` **二选一或并存**。**子集型**的 `条目` 是 `[{词, 说明, 选择线索}]`;**多维关系/序列型**的 `条目` 是 `[{词, 说明}]`。
 - ⚠️ **保留原文、不转译不脑补(What 的命根)**:`界定 / 说明 / 构成`**尽量照搬原帖原话**——能引原文就引,少改写、少换词;**原帖给了几句就留几句,别压成一句**(这是知识本体,删了就废)。**严禁补原帖没有的内容**:原帖写"生理(性别、年龄、外表)"就只写这些,不许擅自加"遗传";原帖只给公式"作者立场+人物+冲突+结论"就照写,不许替作者给每个词编定义。**宁可保留原帖的口语/不完美措辞,也不要 AI 润色后的"漂亮转译"。**
 - 若某项有**子结构**(如"三幕式"含一幕/二幕/三幕),把**每个子点的原文描述都带进 `说明`**(可分行)。例:三幕式说明应含"一幕交代背景人设、二幕是主体冲突升级、三幕高潮爆发并解决",而不是只写"分一二三幕"。
 - **别套模板**:节数/形态由本帖内容决定。
 > 组件 what:对应某 how 的某一步(那步的产出物),但本身是独立一颗、可单独复用。不对应任何步 → 就是单独的一条(role=主)。
-> ⚠️ 选择线索必须**从原帖抽**,原帖只列了选项没说何时用 → `选择线索` 留空(别编),但仍要标 `kind:选项`。
+> ⚠️ 选择线索必须**从原帖抽**,原帖只列了选项没说何时用 → `选择线索` 留空(别编),但仍要标 `kind:子集`。
 
 ### Why(为什么)— role 主 或 组件
 `主张`(**唯一必填**,核心观点/原理,做锚点)+ `支撑`:**1..N 个自由小节**,每节 `{小标题, 形式?, 内容?, 条目?}`。无 steps。+ 颗级 `出处`。
@@ -108,7 +110,7 @@
 > - **是 → 标 `role=组件, parent={how_id,step}`**(仍是独立一颗,只多一条到 how 的链接)。
 > - **否 → `role=主, parent=null`**(就是单独的一条)。
 > - **反向提醒**:如果某"指令"只是某步一次性的话、脱离那步就不成立、无复用价值 → 它**不该单独成颗**,留在 step 的 directive 里即可。
-> - **N 选 1 并列清单**:一组「X 种结构 / X 种手法 / X 个要素」整体可复用 → 它就是一颗 **What(选项型)**,不是 how 的步骤。
+> - **N 选 1 并列清单**:一组「X 种结构 / X 种手法 / X 个要素」整体可复用 → 它就是一颗 **What(子集型)**,不是 how 的步骤。
 
 > ⚠️ 本文示例(含下方模板里的词)都只是示意结构,**值一律从本帖内容抽,别套用示例里的任何具体词**。
 
@@ -160,10 +162,10 @@
       "id": "k2", "type": "what", "role": "组件", "parent": {"how_id":"k1","step":2},
       "title": "<某 how 步骤产出的、可独立复用的清单/构成名>", "业务阶段": ["<…>"],
       "出处": ["<这颗来自哪些卡片,如 图3 / 卡片2>"],
-      "界定": "<一句话这是什么(必填)>", "kind": "<构成 或 选项(必填)>",
+      "界定": "<一句话这是什么(必填)>", "kind": "<子集 / 多维关系 / 序列(必填)>",
       "主体": [
         {"小标题":"<这节讲什么>","形式":"<清单/分类/判据/对照/定义,可省>",
-         "条目":[{"词":"<要点名>","说明":"<忠实保留原帖描述,几句留几句;有子结构就把各子点描述都带上>","选择线索":"<选项型必填:何时/为何选它;构成型省略>"}]},
+         "条目":[{"词":"<要点名>","说明":"<忠实保留原帖描述,几句留几句;有子结构就把各子点描述都带上>","选择线索":"<子集型必填:何时/为何选它;多维关系/序列型省略>"}]},
         {"小标题":"<另一节,可省>","形式":"对照","内容":"<散文式说明,没有结构化条目时用>"}
       ],
       "作用域": []
@@ -185,7 +187,7 @@
 ## 过关条件 → 进 ③
 - 颗数合理(how 主颗 + 组件颗 + orphan,可混);每颗有 type/role/parent。
 - **每颗 how 都过了 §A2 两道闸**:步骤真有序(后步吃前步)+ 最后一步 output = purpose 收尾名词。并列招式已改 What;半截工序已补收尾或已降 purpose。
-- **决策落点都落到了**:how 每步有 `input`(首步=工序输入,后步指向前步产出);what `kind` 已填,**选项型每条目带 `选择线索`**(原帖没说才留空);why `支撑` 里**有一节 `形式:取舍`**。
+- **决策落点都落到了**:how 每步有 `input`(首步=工序输入,后步指向前步产出);what `kind` 已填,**子集型每条目带 `选择线索`**(原帖没说才留空);why `支撑` 里**有一节 `形式:取舍`**。
 - how 颗:每步 input/directive/output/出处 + 创作阶段 + 动作;what 颗:界定 + kind + 主体小节;why 颗:主张 + 支撑小节(含取舍)。
 - 组件颗有 parent cross-ref;**每颗业务阶段非空(≥1,∈灵感/选题/脚本)**;贴不上三值的非内容创作颗已 drop。
 - 纯软件操作流程 / 非内容创作题材已整颗 drop(§D)。

+ 0 - 80
数据接口与来源/游走图谱.md

@@ -1,80 +0,0 @@
-# 游走图谱(人读说明)
-
-> 机读件:`walk_graph.json`(schema v2)。命名全部复用 `product_documents/抖音游走策略/douyin_walk_strategy.v1.json`(8 节点 + 10 边),**零新造**。
-> 证据:2026-06-11 多平台实测抓包 + `接口台账/*.md`。
-
-## 〇、配置四件套(v2 起,机读配置面闭环)
-
-游走的全部配置拆为四件,各管一层,代码只留一个通用 loop:
-
-| 文件 | 管什么 | 平台相关? |
-|---|---|---|
-| `walk_graph.json` | **拓扑**:10 条边的语义、navigate/reseed、jump_key(canonical)、血缘锚点 | 否(全局唯一) |
-| `platform_profiles/<platform>.json` ×10 | **平台执行**:支持哪些边、真实 endpoint、jump_key 的 raw 字段来源、提取覆写、运行参数(限流 15s/重试/下载头) | 是(每平台一份) |
-| `walk_policy.json` | **护栏 + 通行证**:预算/深度/去重/回灌配额(锚定 v1 真值,V3 待拍板项标 `TBD_V3`)+ `edge_permissions`(判定结果→哪些边放行,取代 `_can_expand_from_decision` 硬编码与原 path_stop/budget 包语义) | 否 |
-| `跨平台字段映射.json` | **归一化**:平台 raw 字段 → canonical 字段 | 是(一张总表) |
-
-运行时语义:loop 出队一个节点 → 查 `walk_graph` 该节点有哪些出边 → 查该平台 `profile` 此边是否 supported(unsupported/blocked 静默跳过,**边不可用不是错误,是该平台地图少一条路**)→ 查 `walk_policy` 预算/通行证放不放行 → 执行,响应按 `字段映射` 归一化。**新平台接入 = 实测一轮接口 + 写一份 profile,零代码改动。**
-
-## 一、一句话模型:单一有界 loop + 异构 frontier
-
-整个游走是**一个有界循环**,不是多条独立管线。一个**统一队列(frontier)**里同时排着三类异构节点 —— `query`(待搜)、`video`(待判/待扩)、`author`(待拉作品),按优先级轮转出队。每出队一个节点,按其类型尝试可走的边,产出的新节点(新 query / 新 video / 新 author / hashtag)再入同一队列。预算/深度耗尽即收敛停止。
-
-8 类节点(id_field):
-`pattern_seed`(policy_run_id)→ `query`(search_query_id)→ `search_page`(search_page_id)→ `video`(platform_content_id)→ `author`(platform_author_id)→ `author_works_page`(author_works_page_id);旁路 `hashtag`(hashtag);终点 `asset`(asset_id)。
-
-## 二、两类边
-
-### 导航边(navigate)= ID 跳转
-拿上一跳的某个 ID/游标,填进下一个请求参数,直接到下一个节点。8 条:
-
-| edge_id | from → to | jump_key(from_field → param) | 翻页 | endpoint |
-|---|---|---|---|---|
-| `query_next_page` | query → search_page | `next_cursor` → `cursor` | 是 | `/crawler/{platform}/keyword` |
-| `search_page_to_content` | search_page → video | `data.data[]` 拆条 | 否 | (同搜索响应) |
-| `video_to_author` | video → author | `platform_author_id` → `account_id` | 否 | — |
-| `author_to_works` | author → author_works_page | `platform_author_id` → `account_id` | 是 | `/crawler/{platform}/blogger` |
-| `author_work_to_content` | author_works_page → video | `data.data[]` 拆条 | 否 | (同 blogger 响应) |
-| `decision_to_asset` | video → asset | `platform_content_id` | 否 | — |
-| `path_stop` | video → video | `content_effect_status` | 否 | — |
-| `budget_downgrade` | video → video | `budget.remaining_actions` | 否 | — |
-
-### 回灌边(reseed)= 文本 → 新 keyword,gate=keep_only
-不靠 ID,靠从内容里**抽文本**生成新种子,且**只对 KEEP(强相关)内容开**:
-
-| edge_id | from → to | 抽取规则 | gate |
-|---|---|---|---|
-| `video_to_hashtag` | video → hashtag | 从 `tags` 抽:结构化(text_extra/topic_list/cha_list/B站 tag split)优先,缺则标题/desc/body_text 正则 `#([^\s#]+)` | keep_only |
-| `hashtag_to_query` | hashtag → query | 用 hashtag 文本生成新 `query`(param=`keyword`),归一化 keyword 去重,不污染 P2 初始 item query | keep_only |
-
-### 采集通吃:回灌不挑来源
-`author_work_to_content` 产出的**也是 `video` 节点**,因此它会**再触发 `video_to_hashtag` 回灌**。也就是说:搜索结果的视频、作者作品的视频,它们的标题与 tag **都能回灌**成新 hashtag → 新 query。回灌对内容来源一视同仁(标题/tag/作者作品的标题与 tag 通吃),只受 `keep_only` 与全局护栏约束。
-
-## 三、全局护栏(单一有界 loop 的边界)
-
-- **单队列**:query / video / author 同进一个 frontier,异构排队、统一调度,不分叉成多管线。
-- **全局预算 + 深度**:`max_total_actions` / `max_depth` / `max_pages` / `max_tag_hops`(见策略 `walk_budget_policy`);耗尽走 `budget_downgrade` 降档或停边。
-- **去重**:query 按**归一化 keyword + 近期 run** 去重(`normalize_exact_and_recent_run`);内容按**已访问 `platform_content_id`** 去重(作者作品须与已发现搜索内容去重,见 commit 1cd1b94)。
-- **回灌仅 KEEP**:`video_to_hashtag` / `hashtag_to_query` 都是 `keep_only` —— 只有判定强相关的内容/tag 才扩散,弱相关/blocked 内容走 `path_stop` 收口。
-- **血缘**:每跳记 `source_path_type`,对齐三类锚点:`pattern_to_search_query`(query_next_page / hashtag_to_query)、`search_query_to_content`(search_page_to_content / author_work_to_content)、`decision_to_asset`(decision_to_asset);其余导航边记 `null`。
-
-## 四、各平台对各边的支持度(实测)
-
-| edge_id | 抖音 | 快手 | 视频号 | 小红书 | B站 | 公众号 | youtube | github |
-|---|---|---|---|---|---|---|---|---|
-| query_next_page | ✅ | 弱(单页) | ✅(需重试) | ✅ | ✅ | ✅ | ✅(长token) | ✅ |
-| search_page_to_content | ✅ | ✅ | ✅(抖动) | ✅(note_card) | ✅ | ✅ | ✅ | ✅(repo) |
-| video_to_author | ✅ | ✅ | ✅ | ✅ | ✅(仅mid标识) | ✅(仅biz/hash) | ✅ | ✅(→owner) |
-| **author_to_works** | ✅(blogger) | ❌无接口 | ⛔blocked25011 | ⛔blocked超时 | ❌无接口 | ❌无接口 | ❌无接口 | ❌ |
-| author_work_to_content | ✅ | ❌ | ⛔ | ⛔ | ❌ | ❌ | ❌ | ❌ |
-| video_to_hashtag | ✅ | 弱(常null) | ✅(title正则) | ✅ | ✅(tag split) | ❌无tag | ✅(仅detail正则) | ✅(topics常空) |
-| hashtag_to_query | ✅ | ✅ | ✅ | ✅ | ✅ | n/a | ✅ | ✅ |
-| decision_to_asset | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
-| path_stop / budget_downgrade | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
-
-> **头条、知乎**:整平台 blocked(`code=10000`/`data=null`),所有边阻断,不接入游走。
-
-### 关键结论
-- **作者作品(`author_to_works`)只有抖音真正可走**(blogger 接口 `code=0`)。快手/B站/公众号/youtube **无独立作者作品接口**;视频号(`code=25011`)、小红书(超时)**接口存在但 blocked**。其余平台的"作者"维度只能落作者标识(`platform_author_id`),无法展开作品列表。
-- **公众号无 hashtag 回灌**(`topic_list` 恒 null),`video_to_hashtag` / `hashtag_to_query` 在公众号不可走。
-- 抖音是唯一**全 10 边可走**的平台,是游走能力的完整参照系。

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików