"""四种打法生成 query 的 demo:只到「生成 query」,写 data/queries/demo.json(不落库)。 用法:PYTHONPATH=. python scripts/build_query_demo.py ③ 联想 + ④ LLM 走真实接口,须在能访问 crawler.aiddit.com / OpenRouter 的环境跑。 """ from __future__ import annotations import json import time from pathlib import Path from acquisition.query import ( ACTIONS, BLOCK, CARRIER_POS_GROUPED, DEMAND, KTYPE_SUFFIX, MODALITIES, STAGES, sample_nodes, tactic2_form_llm, tactic4_llm, tactic_multiaxis, ) from core.config import Settings ROOT = Path(__file__).resolve().parent.parent OUT = ROOT / "data" / "queries" / "demo.json" def main() -> None: settings = Settings.from_env() topics = sample_nodes("实质", depths=(3,), limit=12, under="理念") # 实质:理念分支(事件/知识/情感…) forms = sample_nodes("形式", depths=(4,), limit=20, under="架构") # 形式:架构分支(叙事/修辞/创意…) print(f"实质 {len(topics)}: {topics}") print(f"形式 {len(forms)}: {forms}") t2 = tactic2_form_llm(forms, settings) # ③ 暂留空:小红书/抖音无真·搜索联想接口(keyword_v2 返回的是帖子不是联想词),待接入真 sug 再补 print(f"① LLM 实质: {topics[:5]}") t4 = tactic4_llm(topics[:5], settings) t5 = tactic_multiaxis(n=36) # ④ 机械多轴组合(无 LLM) data = { "generated_at": int(time.time()), "block": BLOCK, "tactic1": {"name": "实质 × 创作阶段 × 需求", "需求点": DEMAND, "items": t4}, "tactic2": {"name": "形式 + 载体位置", "载体位置": CARRIER_POS_GROUPED, "items": t2}, "tactic3": {"name": "搜索词sug扩展", "items": [], "待接入": "小红书/抖音都没有真正的「输入框搜索联想」接口;keyword_v2 名字像联想、实际返回的是帖子。此页暂空,待接入真 sug 接口后再补。"}, "tactic4": {"name": "多轴正交组合", "items": t5, "人工轴": {"阶段": STAGES, "动作": ACTIONS, "知识类型": KTYPE_SUFFIX, "模态": MODALITIES}}, } OUT.parent.mkdir(parents=True, exist_ok=True) OUT.write_text(json.dumps(data, ensure_ascii=False, indent=1), encoding="utf-8") print(f"\n① {len(t4)} 条 ② {len(t2)} 条 ③ 待接入 ④ {len(t5)} 条(机械组合) → {OUT}") if __name__ == "__main__": main()