Sfoglia il codice sorgente

feat(query):实质/形式 全 demo 统一一批、各族共用同序,方便切页签横向比较

之前每族各自随机抽实质/形式,f1 与 f3 的实质对不上、f2 与 f3 的形式对不上。改为全 demo
统一抽一批(各16个)实质+形式,各族按 query 序号轮转取这同一批,保证每族覆盖整批且首次出现
顺序一致。校验:f1实质≡f3实质、f2形式≡f3形式(同序)。切页签即可逐行横向比对。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
SamLee 2 settimane fa
parent
commit
8b5f2bee9e
1 ha cambiato i file con 18 aggiunte e 6 eliminazioni
  1. 18 6
      scripts/build_creation_demo.py

+ 18 - 6
scripts/build_creation_demo.py

@@ -25,6 +25,7 @@ TREES = ROOT / "scope_trees" / "trees_index.json"
 FILTER_PROMPT = ROOT / "acquisition" / "query_filter.txt"   # 筛选词在 acquisition/
 OUT = ROOT / "data" / "queries" / "creation_demo.json"
 PER = 20
+BATCH_N = 16        # 全 demo 统一抽这么多个「实质 / 形式」,各族共用同一批,方便切页签比较
 KTYPE = ["怎么做", "有哪些", "为什么"]
 MODALITY = ["视频", "图片"]   # 被创作内容的形态(与教学帖本身格式无关),正交进所有家族
 # 创作阶段意图轴(脊柱):灵感/选题/脚本 展开成创作者真会搜的词(query构造.md)。真实数据里
@@ -111,22 +112,33 @@ def main():
     POOL = _leaves(idx, "作用") + _leaves(idx, "感受") + _leaves(idx, "意图")
     print(f"实质 {len(SHI)} / 形式 {len(XING)} / 目的池 {len(POOL)} / 业务阶段 {len(INTENT)}")
 
+    # 全 demo 统一「一批实质 / 一批形式」——各家族都取同一批、且顺序一致,方便切页签横向比较
+    SHI_BATCH = rng.sample(SHI, min(BATCH_N, len(SHI)))
+    XING_BATCH = rng.sample(XING, min(BATCH_N, len(XING)))
+    print(f"统一批: 实质×{len(SHI_BATCH)} 形式×{len(XING_BATCH)}")
+
     def pick(seq):
         return rng.choice(seq)
 
+    def shi(i):    # 按 query 序号轮转,保证每族都覆盖整批、首次出现顺序一致
+        return SHI_BATCH[i % len(SHI_BATCH)]
+
+    def xing(i):
+        return XING_BATCH[i % len(XING_BATCH)]
+
     # 每家族:生成器 + 用到的轴(给前端标列)
     # 业务阶段=脊柱,每族必带;模态+知识类型固定收尾;前面配 实质/形式/目的 之一或组合
     families = [
         {"key": "f1", "name": "实质 × 业务阶段", "axes": ["实质", "模态", "业务阶段", "知识类型"],
-         "gen": lambda: {"parts": {"实质": pick(SHI), "业务阶段": pick(INTENT), "模态": pick(MODALITY), "知识类型": pick(KTYPE)}}},
+         "gen": lambda i: {"parts": {"实质": shi(i), "业务阶段": pick(INTENT), "模态": pick(MODALITY), "知识类型": pick(KTYPE)}}},
         {"key": "f2", "name": "形式 × 业务阶段", "axes": ["形式", "模态", "业务阶段", "知识类型"],
-         "gen": lambda: {"parts": {"形式": pick(XING), "业务阶段": pick(INTENT), "模态": pick(MODALITY), "知识类型": pick(KTYPE)}}},
+         "gen": lambda i: {"parts": {"形式": xing(i), "业务阶段": pick(INTENT), "模态": pick(MODALITY), "知识类型": pick(KTYPE)}}},
         {"key": "f3", "name": "实质 × 形式 × 业务阶段", "axes": ["实质", "形式", "模态", "业务阶段", "知识类型"],
-         "gen": lambda: {"parts": {"实质": pick(SHI), "形式": pick(XING), "业务阶段": pick(INTENT), "模态": pick(MODALITY), "知识类型": pick(KTYPE)}}},
+         "gen": lambda i: {"parts": {"实质": shi(i), "形式": xing(i), "业务阶段": pick(INTENT), "模态": pick(MODALITY), "知识类型": pick(KTYPE)}}},
         {"key": "f4", "name": "(作用/感受/意图) × 业务阶段", "axes": ["作用/感受/意图", "模态", "业务阶段", "知识类型"],
-         "gen": lambda: {"parts": {"目的": pick(POOL), "业务阶段": pick(INTENT), "模态": pick(MODALITY), "知识类型": pick(KTYPE)}}},
+         "gen": lambda i: {"parts": {"目的": pick(POOL), "业务阶段": pick(INTENT), "模态": pick(MODALITY), "知识类型": pick(KTYPE)}}},
         {"key": "f5", "name": "纯业务阶段", "axes": ["模态", "业务阶段", "知识类型"],
-         "gen": lambda: {"parts": {"业务阶段": pick(INTENT), "模态": pick(MODALITY), "知识类型": pick(KTYPE)}}},
+         "gen": lambda i: {"parts": {"业务阶段": pick(INTENT), "模态": pick(MODALITY), "知识类型": pick(KTYPE)}}},
     ]
     # 各部件按固定顺序拼成原串(内容维度在前,模态贴题材后,业务阶段+知识类型收尾)
     order = ["实质", "形式", "目的", "模态", "业务阶段", "知识类型"]
@@ -137,7 +149,7 @@ def main():
     for fam in families:
         seen, items = set(), []
         while len(items) < PER and len(seen) < PER * 40:
-            parts = fam["gen"]()["parts"]
+            parts = fam["gen"](len(items))["parts"]   # 序号轮转实质/形式批
             q = " ".join(parts[k] for k in order if k in parts)
             if q in seen:
                 continue