Просмотр исходного кода

feat(query):创作Demo 加第六家族「形式×阶段×动作×作用(老正交·去实质)」

按最老正交方案、去掉实质:形式×阶段(灵感/选题/脚本)×动作(构思/策划/组织/撰写/改编/润色)×作用×知识类型,
query 形如「句式辞格 灵感构思 直述开篇 怎么做」。仍过 query_filter 筛选。
- build_creation_demo:引入老轴(ACTIONS/OLD_STAGES/_nonleaf_d4)生成 f6,循环支持家族自带 query 串;
  axis_values 增 阶段/动作/作用 池。
- 前端 CreationDemo:PARTS_KEY/POOL_KEY 认得 阶段/动作/作用 三个新轴列。
- scripts/build_family6.py:同方案的命令行预览脚本。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
SamLee 2 недель назад
Родитель
Сommit
6fc30369de

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
acquisition/web/app/dist/assets/index-BIZYM4c5.js


+ 1 - 1
acquisition/web/app/dist/index.html

@@ -4,7 +4,7 @@
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
     <title>创作知识 · 找帖子</title>
-    <script type="module" crossorigin src="/app/assets/index-B38eQxy6.js"></script>
+    <script type="module" crossorigin src="/app/assets/index-BIZYM4c5.js"></script>
     <link rel="stylesheet" crossorigin href="/app/assets/index-_EYHoleW.css">
   </head>
   <body>

+ 2 - 0
acquisition/web/app/src/pages/CreationDemo.jsx

@@ -6,6 +6,7 @@ import React, { useEffect, useState } from 'react'
 const PARTS_KEY = {       // 家族 axes 里的轴名 → 每条 query 的 parts 里的键
   '实质': '实质', '形式': '形式', '作用/感受/意图': '目的',
   '业务阶段': '业务阶段', '模态': '模态', '知识类型': '知识类型',
+  '阶段': '阶段', '动作': '动作', '作用': '作用',   // 第六家族(老正交)的轴
 }
 const AXIS_LABEL = {      // 列头显示用的标注(取值层级)
   '实质': '实质(3-4层)', '形式': '形式(3-4层)',
@@ -13,6 +14,7 @@ const AXIS_LABEL = {      // 列头显示用的标注(取值层级)
 const USED_ONLY = new Set(['实质', '形式'])   // 仅这两轴只显示这批 query 用到的去重值;其余轴显示完整池
 const POOL_KEY = {                            // 完整池轴名 → axis_values 键
   '作用/感受/意图': '目的池', '模态': '模态', '知识类型': '知识类型',
+  '阶段': '阶段', '动作': '动作', '作用': '作用',   // 第六家族(老正交)的轴,显示完整池
 }
 
 // 该家族 query 在某轴上实际用过的去重值(按首次出现顺序)

+ 25 - 3
scripts/build_creation_demo.py

@@ -16,6 +16,8 @@ import json
 import random
 from pathlib import Path
 
+from acquisition.query import ACTIONS, _nonleaf_d4   # 第六家族(老正交)用的动作轴 + 4级非叶子取节点
+from acquisition.query import STAGES as OLD_STAGES   # 老的裸阶段 灵感/选题/脚本
 from acquisition.query_filter import filter_queries   # 共享筛选器(query_filter.txt)
 from core.config import Settings
 
@@ -102,6 +104,21 @@ def main():
     def xing(i):
         return XING_BATCH[i % len(XING_BATCH)]
 
+    # 第六家族(最老正交方案·去实质):形式 × 阶段 × 动作 × 作用 × 知识类型。
+    # 形式/作用 取分类树4级非叶子,阶段=灵感/选题/脚本,动作=ACTIONS(+无动作变体),query 形如「叙事组织 脚本撰写 趣味互动 有哪些」
+    F6_FORMS = _nonleaf_d4("形式", 10, under="架构")
+    F6_ZY = _nonleaf_d4("作用", 10)
+    F6_STAGE_ACT = [(s, a) for s in OLD_STAGES for a in ACTIONS] + [("", "")]   # +「无动作」=老方案的 /
+
+    def gen6(i):
+        f_ = F6_FORMS[i % len(F6_FORMS)]
+        st, ac = F6_STAGE_ACT[i % len(F6_STAGE_ACT)]
+        zy_ = F6_ZY[i % len(F6_ZY)]
+        suf = KTYPE[i % len(KTYPE)]
+        seg = (st + ac) if ac else ""                       # 脚本撰写 / 空(动作=/ 时连阶段一起省)
+        q = " ".join([f_] + ([seg] if seg else []) + [zy_, suf])
+        return {"parts": {"形式": f_, "阶段": st or "/", "动作": ac or "/", "作用": zy_, "知识类型": suf}, "query": q}
+
     # 每家族:生成器 + 用到的轴(给前端标列)
     # 业务阶段=脊柱,每族必带;模态+知识类型固定收尾;前面配 实质/形式/目的 之一或组合
     families = [
@@ -115,18 +132,23 @@ def main():
          "gen": lambda i: {"parts": {"目的": pick(POOL), "业务阶段": pick(INTENT), "模态": pick(MODALITY), "知识类型": pick(KTYPE)}}},
         {"key": "f5", "name": "纯业务阶段", "axes": ["模态", "业务阶段", "知识类型"],
          "gen": lambda i: {"parts": {"业务阶段": pick(INTENT), "模态": pick(MODALITY), "知识类型": pick(KTYPE)}}},
+        {"key": "f6", "name": "形式 × 阶段 × 动作 × 作用(老正交·去实质)",
+         "axes": ["形式", "阶段", "动作", "作用", "知识类型"], "gen": gen6},
     ]
     # 各部件按固定顺序拼成原串(内容维度在前,模态贴题材后,业务阶段+知识类型收尾)
     order = ["实质", "形式", "目的", "模态", "业务阶段", "知识类型"]
 
     # 业务阶段值存「分组结构」(STAGE_INTENT),前端按 灵感/选题/脚本 分组+缩进展示;其余轴是扁平数组
-    out = {"axis_values": {"实质": SHI, "形式": XING, "目的池": POOL, "业务阶段": STAGE_INTENT, "模态": MODALITY, "知识类型": KTYPE},
+    out = {"axis_values": {"实质": SHI, "形式": XING, "目的池": POOL, "业务阶段": STAGE_INTENT,
+                           "模态": MODALITY, "知识类型": KTYPE,
+                           "阶段": OLD_STAGES, "动作": ACTIONS, "作用": F6_ZY},   # 第六家族的老轴
            "families": []}
     for fam in families:
         seen, items = set(), []
         while len(items) < PER and len(seen) < PER * 40:
-            parts = fam["gen"](len(items))["parts"]   # 序号轮转实质/形式批
-            q = " ".join(parts[k] for k in order if k in parts)
+            g = fam["gen"](len(items))                # 序号轮转实质/形式批
+            parts = g["parts"]
+            q = g.get("query") or " ".join(parts[k] for k in order if k in parts)   # f6 自带 query 串
             if q in seen:
                 continue
             seen.add(q)

+ 52 - 0
scripts/build_family6.py

@@ -0,0 +1,52 @@
+"""第六家族(最老正交方案去掉实质):形式 × 阶段 × 动作 × 作用 × 知识类型 → 组合 query,过 query_filter。
+
+沿用 query.py 的老轴:形式/作用 取分类树(4级非叶子),阶段=灵感/选题/脚本,动作=构思/策划/组织/
+撰写/改编/润色(+无动作变体),知识类型=怎么做/有哪些/为什么。query 形如「叙事组织 脚本撰写 趣味互动 有哪些」。
+只产 query + LLM 筛选,打印看效果。用法:PYTHONPATH=. CK_ENV_FILE=.env python scripts/build_family6.py [n]
+"""
+from __future__ import annotations
+
+import sys
+
+from acquisition.query import ACTIONS, KTYPE_SUFFIX, STAGES, _nonleaf_d4
+from acquisition.query_filter import filter_queries
+from core.config import Settings
+
+N = int(sys.argv[1]) if len(sys.argv) > 1 else 24
+
+
+def build(n: int) -> list[dict]:
+    xs = _nonleaf_d4("形式", 10, under="架构")          # 创作手法(架构支)
+    zy = _nonleaf_d4("作用", 10)                          # 作用
+    ktypes = list(KTYPE_SUFFIX.items())                   # [(what,有哪些),…]
+    stage_act = [(s, a) for s in STAGES for a in ACTIONS] + [("", "")]  # +「无动作」变体(=老方案的 /)
+    rows = []
+    for i in range(n):
+        f_ = xs[i % len(xs)]
+        st, ac = stage_act[i % len(stage_act)]
+        zy_ = zy[i % len(zy)]
+        kt, suf = ktypes[i % len(ktypes)]
+        seg = (st + ac) if ac else ""                     # 脚本撰写 / 空(动作=/ 时连阶段一起省)
+        parts = [f_] + ([seg] if seg else []) + [zy_, suf]
+        rows.append({"形式": f_, "阶段": st or "/", "动作": ac or "/", "作用": zy_,
+                     "知识类型": kt, "query": " ".join(parts)})
+    return rows
+
+
+def main() -> None:
+    settings = Settings.from_env()
+    rows = build(N)
+    verdicts = filter_queries([r["query"] for r in rows], settings)
+    kept = 0
+    print(f"第六家族 形式×阶段×动作×作用×知识类型(去实质):{len(rows)} 条\n")
+    print(f"{'留/扔':<4} {'query':<34} 轴(形式/阶段/动作/作用)         理由")
+    for r, v in zip(rows, verdicts):
+        kept += 1 if v["keep"] else 0
+        mark = "✓留" if v["keep"] else "✕扔"
+        axes = f"{r['形式']}/{r['阶段']}/{r['动作']}/{r['作用']}"
+        print(f"{mark:<4} {r['query']:<34} {axes:<22} {v['reason']}")
+    print(f"\n保留 {kept} / {len(rows)}(排除 {len(rows) - kept})")
+
+
+if __name__ == "__main__":
+    main()

Некоторые файлы не были показаны из-за большого количества измененных файлов