Browse Source

feat(web):创作Demo 加「查看筛选提示词」按钮弹窗 + 说明被筛掉的query仍显示

- 后端 /api/filter-prompt 原样返回 acquisition/query_filter.txt。
- 前端 CreationDemo 顶部加按钮,弹窗展示筛选提示词全文(A–E 排除规则),并注明
  "代码只打包调用+解析,判断全靠提示词"。
- sub 文案说明:每家族抽 20 条全显示,✕删除线=被筛掉(不隐藏)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
SamLee 2 weeks ago
parent
commit
fc14bc6c7b

File diff suppressed because it is too large
+ 0 - 0
acquisition/web/app/dist/assets/index-20IGLekw.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-BIZYM4c5.js"></script>
+    <script type="module" crossorigin src="/app/assets/index-20IGLekw.js"></script>
     <link rel="stylesheet" crossorigin href="/app/assets/index-_EYHoleW.css">
   </head>
   <body>

+ 26 - 1
acquisition/web/app/src/pages/CreationDemo.jsx

@@ -62,6 +62,7 @@ function AxisCol({ ax, fam, axisValues }) {
 export default function CreationDemo() {
   const [data, setData] = useState(null)
   const [fi, setFi] = useState(0)
+  const [showFilter, setShowFilter] = useState(false)
   useEffect(() => {
     fetch('/data/queries/creation_demo.json?v=' + Date.now())
       .then(r => r.ok ? r.json() : null).then(setData).catch(() => setData(null))
@@ -76,7 +77,11 @@ export default function CreationDemo() {
   return (
     <div>
       <h1>创作知识 · Query 正交 Demo</h1>
-      <div className="sub">5 套家族机械正交(取分类树创作支)→ LLM 只做排除(query_filter)→ 原串直接可搜(本 demo 不真搜)· 左侧轴列只显示这批 query 实际用到的值</div>
+      <div className="sub">6 套家族机械正交(取分类树创作支)→ LLM 按提示词只做排除(query_filter)→ 原串直接可搜(本 demo 不真搜)· 每家族抽 20 条全显示,✕ 删除线=被筛掉
+        <button className="btn ghost" style={{ marginLeft: 10 }} onClick={() => setShowFilter(true)}>📋 查看筛选提示词</button>
+      </div>
+
+      {showFilter && <FilterPromptModal onClose={() => setShowFilter(false)} />}
 
       <div className="nav">
         {data.families.map((f, i) => (
@@ -104,3 +109,23 @@ export default function CreationDemo() {
     </div>
   )
 }
+
+// 弹窗:展示机械正交后做 keep/排除 的创作筛选提示词(acquisition/query_filter.txt)
+function FilterPromptModal({ onClose }) {
+  const [p, setP] = useState(null)
+  useEffect(() => {
+    fetch('/api/filter-prompt').then(r => r.ok ? r.json() : null).then(setP).catch(() => setP(null))
+  }, [])
+  return (
+    <div className="modal-mask" onClick={onClose}>
+      <div className="modal wide" onClick={(e) => e.stopPropagation()}>
+        <div className="modal-hd"><b>创作 query 筛选提示词</b><span className="x" onClick={onClose}>✕</span></div>
+        <div className="modal-bd">
+          <p className="note">机械正交拼出的每条 query 逐条喂大模型,命中 A–E(语义不通 / 题材本身 / 制作 / 应试学术公务政企 / 作品素材)即排除。
+            代码只负责打包调用 + 解析,判断全靠这条提示词。{p?.file && <code> · {p.file}</code>}</p>
+          <pre className="prompt">{p ? p.text : '加载中…'}</pre>
+        </div>
+      </div>
+    </div>
+  )
+}

+ 10 - 0
acquisition/web_api.py

@@ -46,6 +46,16 @@ def judge_prompts() -> dict:
     return {"prompts": out}
 
 
+@router.get("/filter-prompt")
+def filter_prompt() -> dict:
+    """机械正交出 query 后做 keep/排除 的【创作筛选提示词】(acquisition/query_filter.txt),原样返回供前端弹窗。"""
+    try:
+        text = (_ROOT / "acquisition" / "query_filter.txt").read_text("utf-8")
+    except Exception as exc:
+        text = f"(读取失败: {exc})"
+    return {"name": "创作 query 筛选器(命中 A–E 即排除)", "file": "acquisition/query_filter.txt", "text": text}
+
+
 @router.get("/runs")
 def runs() -> dict:
     conn = store.connect()

Some files were not shown because too many files changed in this diff