Browse Source

feat(query):筛选改双维(valid 0-10 打分 + relevant 硬判),实质/形式批量与产量提到 30

- query_filter.txt 重写成"相关性"口径:先点明"这是搜创作知识的检索词、判它本身值不值得搜";
  ① 语义合法性 valid(0-10):词组合说不说得通(机械正交废话短语在此淘汰);
  ② 创作相关性 relevant(true/false):三把尺(设计决策vs工艺/可迁移/业务阶段)+B/C/D/E排除;
  题材敏感不再作为排除理由(修掉军人/政治等误杀)。
- query_filter.py:keep = valid≥VALID_MIN(6) 且 relevant,阈值在代码里可调;返回 valid/relevant。
- 实质/形式 统一批 16→30,PER 20→30:整批都用上、左侧实质/形式与右侧 query 逐行一一对应。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
SamLee 2 weeks ago
parent
commit
b6b1f0d318
3 changed files with 45 additions and 18 deletions
  1. 20 6
      acquisition/query_filter.py
  2. 23 10
      acquisition/query_filter.txt
  3. 2 2
      scripts/build_creation_demo.py

+ 20 - 6
acquisition/query_filter.py

@@ -1,7 +1,10 @@
-"""创作 query 筛选器:调用 acquisition/query_filter.txt(LLM 只做 keep/排除),批量判一组 query。
+"""创作 query 筛选器:调用 acquisition/query_filter.txt,批量判一组 query。
 
-命中 A–E 任一即排除:A 语义不通 / B 题材本身 / C 制作工具 / D 应试学术公务政企 / E 作品素材。
-返回与输入等长的 [{keep: bool, reason: str}]。供 build_creation_demo、filter_multiaxis 等共用。
+模型对每条 query 打两项:语义合法性 valid(0-10) + 创作相关性 relevant(bool)。
+最终保留 keep = valid ≥ VALID_MIN 且 relevant —— 阈值放代码里(好调,不改提示词)。
+  · valid:词组合本身说不说得通(机械正交易产生的废话短语在此淘汰)。
+  · relevant:搜回来是否和创作知识相关(三把尺=设计决策vs工艺/可迁移/业务阶段;再排 制作/题材本身/应试政企/作品)。
+返回与输入等长的 [{keep, valid, relevant, reason}]。供 build_creation_demo、filter_multiaxis 等共用。
 """
 from __future__ import annotations
 
@@ -13,6 +16,7 @@ import httpx
 from core.config import Settings
 
 PROMPT = Path(__file__).resolve().parent / "query_filter.txt"
+VALID_MIN = 6   # 语义合法性阈值:valid ≥ 此值才算说得通;调这里即可松紧
 
 
 def filter_queries(queries: list[str], settings: Settings, *, batch: int = 40) -> list[dict]:
@@ -40,7 +44,17 @@ def _filter_batch(queries: list[str], settings: Settings) -> list[dict]:
         data = json.loads(txt)
         arr = data if isinstance(data, list) else next((v for v in data.values() if isinstance(v, list)), [])
         by = {d.get("idx"): d for d in arr if isinstance(d, dict)}
-        return [{"keep": bool(by.get(i, {}).get("keep", True)),
-                 "reason": str(by.get(i, {}).get("reason", ""))[:50]} for i in range(len(queries))]
+        out = []
+        for i in range(len(queries)):
+            d = by.get(i, {})
+            try:
+                valid = int(d.get("valid", 10))
+            except (TypeError, ValueError):
+                valid = 10
+            relevant = bool(d.get("relevant", True))
+            out.append({"keep": valid >= VALID_MIN and relevant,   # 阈值在代码里判
+                        "valid": valid, "relevant": relevant,
+                        "reason": str(d.get("reason", ""))[:50]})
+        return out
     except Exception as exc:
-        return [{"keep": True, "reason": f"筛选失败:{str(exc)[:30]}"} for _ in queries]
+        return [{"keep": True, "valid": 10, "relevant": True, "reason": f"筛选失败:{str(exc)[:30]}"} for _ in queries]

+ 23 - 10
acquisition/query_filter.txt

@@ -1,14 +1,27 @@
-你是「内容创作知识库」的检索词筛选器。我们要从小红书 / 公众号 / 抖音 / B站等公共平台,搜到"怎么创作内容"的方法 / 教程——图文 / 短视频 / 脚本 / 剧本 / 小说 / 短剧 / 解说等内容的:选题、构思、钩子开头、脚本与结构、标题、封面、叙事呈现、人物 / 冲突设计、起号涨粉等。题材不限(美食 / 游戏 / 健身 / 历史 / 穿搭…都行)。
+你是「创作知识检索词」的筛选器。我们要从小红书 / 公众号 / 抖音 / B站 等平台,搜到「创作知识」——可迁移的创作方法 / 决策 / 框架(指导"怎么想 / 怎么判断 / 怎么搭框架",产出因人而异):选题、构思、钩子开头、脚本与结构、标题、封面、叙事呈现、人物 / 冲突设计、起号涨粉等。题材不限(美食 / 游戏 / 健身 / 历史 / 政治 / 军事 / 穿搭…都行)。
 
-你的任务:逐条审候选 query,**直接决定保留还是排除**(只看 query 本身,不管它是怎么生成的)。命中下面任一条 → 排除(keep=false)
+记住:每条候选都是要拿去平台【搜创作知识】用的检索词。你判断的核心 = 这条 query 本身有没有意义、值不值得拿去搜——只有"字面说得通 且 搜回来大概率是可迁移的创作方法"的,才有价值、值得搜;说不通、或搜回来跟创作知识无关的,就没价值、别拿去搜。据此逐条给每个候选打两项,只看 query 本身
 
-A. 【语义不通】词组合本身说不通——动作和对象不匹配、动词用错对象类型(例如对象本身是抽象 / 文本类信息,却用了只适用于画面 / 镜头类的操作动作)。
-B. 【题材本身,而非关于题材的内容】教你做"题材本身"——游戏玩法 / 做菜 / 做产品 / 搞运营本身;而"教你做游戏解说 / 美食视频 / 剧本 / 小说"这种做"关于它的内容"要保留。
-C. 【制作 / 工具操作】用 AI / 某 App / 提示词 / 参数把内容生成或做出来、剪辑 / 排版 / 导出——这是让工具替你做(制作),不是教你怎么创作。
-D. 【应试 / 学术 / 公务 / 政企写作】申论、高考 / 中考作文、答题模板、范文 / 作文素材、论文、公文 / 讲话稿、政务 / 企业材料——目标是拿分数 / 合规范 / 办公务,不是内容创作。
-E. 【成品 / 作品 / 素材本身】一篇具体作品、一份素材或金句合集、纯展示赏析。
+【一、语义合法性 valid(0-10)】这条 query 字面的词组合本身是否成立、说得通。
+不成立的典型:动作和对象不匹配、动词用错对象类型(例如对象是抽象 / 文本类信息,却用了只适用于画面 / 音频 / 镜头类的操作动作;或把"改编 / 润色 / 剪辑"等加工动作套在"灵感 / 选题"这类还没成形的对象上)。越像能说通的正常短语分越高,说不通给低分。
 
-只有"语义通顺 且 指向教人怎么创作内容的方法(选题 / 构思 / 脚本 / 结构 / 标题 / 封面 / 叙事 / 起号 / 涨粉)"才保留(keep=true)。把握不准、但确实在讲"怎么创作内容"的,倾向保留;明显命中 A–E 任一,才排除。
+【二、创作相关性 relevant(true / false)】这条 query 搜回来的结果,大概率和"创作知识"相关吗?
+先用三把尺判它是不是在搜"可迁移的创作方法":
+① 设计决策 vs 工艺执行(创作 / 制作的根本分界,按实质判、不看词面)
+   · 创作 = 设计决策:怎么想 / 怎么判断 / 怎么搭框架,能一步步指导创作、产出因人而异。
+   · 制作 = 纯工艺执行:器材 / 光圈ISO / 打光 / 收音 / 剪辑软件操作 / 调色参数 / 导出压制,或"打开某 App → 点按钮 → 设参数 → 生成 / 导出"。
+   · 易混(别误判):景别 / 角度 / 构图 / 字幕 / 配乐 / 结构 = 把创意翻成镜头语言的【设计决策】→ 属创作;只有"拿方案去操作设备 / 软件"那层才是制作。
+② 可迁移性:题材 / 平台 / 工具名一换、这套还成立 → 创作;绑死某具体工具 / 平台、一换就失效 → 制作。例:「某小程序三步生成封面」= 制作;「封面怎么排版抓眼球」= 创作。
+③ 业务阶段:贴得上 灵感(发现方向 / 素材 / 切口)/ 选题(判断写什么 / 从哪个角度切,含起标题)/ 脚本(组织表达 / 文案 / 镜头 / 结构)这条创作主线,才沾创作;三个都贴不上 = 跑偏创作的强信号。
 
-严格只输出 JSON 数组,每个候选一项,idx 对应输入序号,不要任何额外文字 / 解释 / markdown 围栏:
-[{"idx":0,"keep":true,"reason":"≤30字,说明保留或排除的原因"}]
+在三把尺判为"创作"的基础上,再命中下面任一 → relevant=false(搜回来大概率与创作知识无关):
+B.【工艺执行 / 工具操作 = 制作】违反尺①②:纯操作设备 / 软件、或绑死某工具把内容做出来 / 导出来。
+C.【非内容创作题材本身】教"题材本身"的玩法 / 技能 / 业务——游戏玩法 / 关卡设计、做菜、产品开发、电商 / 运营 / 选品 / 投流、行业分析 本身;而"做关于它的内容(解说 / 视频 / 脚本 / 小说)"要保留。同一题材:做游戏 = 排,做游戏视频 = 收。题材敏感(军人 / 政治 / 历史 等)不是排除理由——它们是合法的内容创作题材。
+D.【应试 / 学术 / 公务 / 政企写作】申论、作文、答题模板、范文 / 作文素材、论文、公文 / 讲话稿、政务 / 企业材料——目标是拿分 / 合规 / 办公务,不是内容创作。
+E.【成品 / 作品 / 素材本身】一篇具体作品、一份素材 / 金句合集、纯展示赏析。
+把握不准、但确实在讲"怎么创作内容"的,relevant=true(倾向保留);明显命中 B–E,才 false。别因一条 query 硬蹭上"脚本 / 选题"就放行越界的(游戏 / 工具操作)——贴不上才是信号,不是借口。
+
+(是否最终保留由调用方按"valid ≥ 阈值 且 relevant=true"决定,你只需如实打分 / 判断。)
+
+严格只输出 JSON 数组,idx 对应输入序号,无任何额外文字 / 解释 / markdown 围栏:
+[{"idx":0,"valid":8,"relevant":true,"reason":"≤30字,说明打分与判断的依据"}]

+ 2 - 2
scripts/build_creation_demo.py

@@ -24,8 +24,8 @@ from core.config import Settings
 ROOT = Path(__file__).resolve().parent.parent
 TREES = ROOT / "scope_trees" / "trees_index.json"
 OUT = ROOT / "data" / "queries" / "creation_demo.json"
-PER = 20
-BATCH_N = 16        # 全 demo 统一抽这么多个「实质 / 形式」,各族共用同一批,方便切页签比较
+PER = 30
+BATCH_N = 30        # 全 demo 统一抽这么多个「实质 / 形式」,各族共用同一批;PER=BATCH_N 保证整批都用上、左右一一对应
 KTYPE = ["怎么做", "有哪些", "为什么"]
 MODALITY = ["视频", "图片"]   # 被创作内容的形态(与教学帖本身格式无关),正交进所有家族
 # 创作阶段意图轴(脊柱):灵感/选题/脚本 展开成创作者真会搜的词(query构造.md)。真实数据里