feat: 知识库笔记工坊立项 + contributor 功能 + Fable5 视角文档

- 知识库笔记工坊子项目立项:PRD v1.0 + 寄存条 + CLAUDE.md 登记
- 后端:知识库上传记录 contributor、新增 /contributors 接口
- 前端:知识库列表支持按贡献人筛选
- 新增 Fable5 视角模式库/案例集/建议文档

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
simonkoson
2026-07-10 18:06:42 +08:00
parent db9d10a795
commit 8be51ebbde
12 changed files with 836 additions and 57 deletions
+8 -4
View File
@@ -13,8 +13,8 @@
## 🔖 状态栏(每次结束 session 前必须更新这三行)
- **最后更新**Claude Opus(顾问)| 2026-07-08
- **当前状态一句话****知识库语义搜索基本可用**——Obsidian 知识库 164 篇批量导入完成(总计 186 条含 doco 22 篇),搜索体验三项改进已落地(智能摘要/相关度阈值/展开全文),中文分词 snippet bug 已修。下一步:搜索体验微调 + 进入 Phase 4a 对话式 TPS。
- **最后更新**Claude Opus(顾问)| 2026-07-09
- **当前状态一句话****知识库笔记工坊子项目立项完成**——PRD v1.0 就绪(查看/编辑 + AI 加工新建 + 审核制,四刀分期),知识库升级为全组共建模式。下一步:排期开发 or 进入 Phase 4a 对话式 TPS。
- **下一个动手的人从这里开始**:见下方「⏩ 交接备注」
---
@@ -39,6 +39,7 @@
- **Doco 文稿整理**`寄存条_doco子项目已外迁.md`):关键词——doco / 文稿整理 / 三方融合 / 视频双路拆分 / A·B 稿 / ASR / 讯飞 / DeepSeek Vision / 终版文稿 / 差异报告 / 段落对齐。**⚡ 2026-06-26 已交付:22 期融合A稿成品在 `doco/deliverables/`(按播出顺序命名),缺第01期(无A稿)。下一步:批量导入知识库(走 Phase 3 上传/embedding 链路)。**
- **CCA 唱词助手**`寄存条CCA唱词助手子项目已外迁.md`):关键词——cca / 唱词助手 / changci / SRT 字幕 / 拍词规则 / 编导审稿台 / 唱词校对 / ASR 转字幕 / 大洋字幕格式 / 折行规则。**⚡ 2026-07-04 立项:编导 A 稿+人声音频 → ASR+AI 校对+编导审稿 → 大洋格式 SRT。先部署 lanhao 配音 2.0 测试,成熟后并入 TPS。**
- **期次一条龙录入**`寄存条期次一条龙录入子项目已外迁.md`,目录 `episode-intake/`):关键词——一条龙 / 期次录入流水线 / 流水线状态点 / 文稿回联期次 / transcript_item_id / 005 迁移 / AI 处理按钮 / 标签审核台 / draft-reviewed 流转 / 责编录入抽屉。**⚡ 2026-07-07 立项:责编录入页升级为每期任务清单(收视→文稿入库→AI打标+摘要卡→制片人审核→进看板),让收视分析持续生长。PRD v1.0 就绪,暂不开发;实施时落主干、走主干纪律。已拍板:文稿口径=doco 融合A稿(doco 转常态运行)、22 期导入时回联期次、责编可触发 AI 处理。**
- **知识库笔记工坊**`寄存条知识库笔记工坊子项目已外迁.md`,目录 `new_notemd/`):关键词——笔记工坊 / 新建笔记 / AI 加工笔记 / 编导上传知识库 / 知识库审核流程 / pending/approved/rejected 状态 / 006 迁移 / 笔记编辑抽屉 / 文本提取 / PDF OCR / 网页抓取入库 / 编导共建知识库。**⚡ 2026-07-09 立项:知识库升级为全组共建——编导可查看/编辑笔记、自助提交多格式素材(文本/PDF/Word/链接/md)经 AI 加工成规范笔记、制片人/责编审核后入搜索池。PRD v1.0 就绪,暂不开发;实施时落主干、走主干纪律。已拍板:不做独立软件(网页端解决)、五种输入类型、审核制防污染、AI 加工复用 MST 规则。**
**主干仍管**:Phase 03 主干代码、全部 backend schema/API/迁移、全部前端 React 实施、主干 bug/性能/新需求、Cline 的全部 Plan+Act。
@@ -77,14 +78,15 @@
## 3. 当前进度(动态,核心交接区 — 以最新快照为准)
- **已完成至**:收视分析看板 L1-L4 + 知识库语义搜索(Obsidian 164 篇 + doco 22 篇批量导入,搜索体验三项改进)。
- **正在做**语义搜索体验微调(中文 snippet 已修,待制片人复测),准备进入 Phase 4a 对话式 TPS。
- **正在做**知识库笔记工坊子项目已立项(PRD v1.0 就绪),待排期开发。准备进入 Phase 4a 对话式 TPS。
- **卡点/待解**:无硬卡点。
- **Schema 状态**episodes 表已通过 003+7 AI 标签列)和 004+content_digest JSONB)迁移。知识库两表不再改
- **Schema 状态**episodes 表已通过 003+7 AI 标签列)和 004+content_digest JSONB)迁移。知识库两表暂不改(006 迁移属笔记工坊子项目第二刀)
---
## 4. 已完成(只追加,最新在上)
- [2026-07-09] **知识库笔记工坊子项目立项(只立项不开发)**:① PRD v1.0 写入 `new_notemd/PRD_知识库笔记工坊_v1.md`(查看/编辑抽屉 + AI 加工新建笔记 + 审核制、五种输入类型、四刀分期+七条验收);② 制片人四项拍板:不做独立软件(网页端解决)、五种输入类型(文本/PDF/Word/链接/md)、审核制防污染、AI 加工复用 MST 规则;③ 子项目 CLAUDE.md + 寄存条建立。
- [2026-07-08] **Obsidian 知识库批量导入 + 语义搜索体验升级**:① `parse_md_file` 补强 6 项("来源"→source_detail fallback、"相关装备/应用领域"实体提取、Obsidian 双链 `[[]]` 去括号、原始类别存 metadata、源文件路径预埋、SOURCE_TYPE_MAP 扩充含"军报文章/装备/技术/动态/术语/厂商/索引");② 脚本 `backend/scripts/import_obsidian_kb.py`(递归遍历、跳过 .obsidian+原始素材+空文件+无 frontmatter、按相对路径查重、支持 --limit/--dry-run/--dir),成功导入 164 篇(7+157),知识库从 22 → 186 条;③ 搜索体验三项改进:`search_similar` 返回完整 content_md + 智能摘要 `_extract_smart_snippet`(中文 2-gram 拆词+加权段落匹配+关键词加粗)+ min_similarity=0.3 过滤 + top_k 5→10;④ 前端搜索卡片升级(展开全文 Set 状态管理、`renderSnippet` 加粗渲染、相关度分档样式:≥70%蓝左边框/<50%半透明灰底)。
- [2026-07-07] **知识库冷启动:doco 22 期融合A稿批量导入**:脚本 `backend/scripts/import_doco_transcripts.py`,docx → 提取纯文本 → 包 YAML frontmatter → 调 `store_md_file()` 入库(自动算 MiniMax embo-01 embedding)。22 篇全部成功(第02期~第23期,缺第01期无A稿),source_type=manuscript,知识库从 0 → 22 条节目文稿。
- [2026-07-07] **期次一条龙录入子项目立项(只立项不开发)**:① PRD v1.0 写入 `episode-intake/PRD_期次一条龙录入_v1.md`(每期任务清单模式、4 状态点、抽屉四区块、6 个新 API、005 迁移只加 transcript_item_id 一列、看板只用 reviewed 期次、四刀分期+七条验收);② 制片人三项拍板:文稿口径=doco 融合A稿(CCA 是播出前工具不算终稿,doco 转常态运行)、22 期批量导入时回联期次、责编可触发 AI 处理;③ 子项目 CLAUDE.md + 寄存条建立,CCA 寄存条清单表同步更新。
@@ -108,6 +110,7 @@
- [x] ~~200+ Obsidian md 批量录入~~ → 已完成(2026-07-08),164 篇导入成功,知识库 186 条
- [ ] **下一刀**Phase 4a 对话式 TPS 选题策划助手(左对话右报告、脚注式引用、知识库检索底座已就绪)。
- [ ] **期次一条龙录入开发**(子项目已立项 2026-07-07PRD 就绪在 `episode-intake/`,等制片人排期;四刀分期,第二刀含 doco 22 期导入回联)。
- [ ] **知识库笔记工坊开发**(子项目已立项 2026-07-09PRD 就绪在 `new_notemd/`,等制片人排期;四刀分期——查看编辑/AI加工新建/审核流程/打磨,006 迁移在第二刀)。
- [ ] PDF 大文件存储:**大文件不入库,单独文件仓库,DB 只存地址指针**(md 正文+向量留库参与检索;pdf 仅按需调阅)。地基一次定对,避免上云返工。Obsidian 导入时已把源文件路径存入 `metadata["source_files"]` 预埋。
- [ ] 「按编导看稿」独立筛选视图(路线 A 重构时一并处理,从来源树里迁出来)。
- [ ] 操作留痕 schemaepisodes 等加 created_by/updated_by/updated_at;涉 schema 须 Opus 审)。
@@ -144,6 +147,7 @@
## 7. ⏩ 交接备注(换人/换账号 0 摩擦续上)
- **知识库笔记工坊已立项**(2026-07-09):子项目目录 `new_notemd/`PRD v1.0 含查看/编辑抽屉 + AI 加工新建笔记(五种输入:文本/PDF/Word/链接/md)+ 审核制(编导提交→制片人/责编审批→入搜索池)。四刀分期,006 迁移在第二刀(knowledge_items +status/submitted_by/reviewed_by 等)。寄存条 `note/寄存条知识库笔记工坊子项目已外迁.md`
- **知识库语义搜索已可用**2026-07-08):186 条知识库条目(doco 22 篇 + Obsidian 164 篇),搜索链路完整(MiniMax embo-01 query embedding → pgvector 余弦检索 → 智能摘要 + 关键词加粗 + 展开全文)。新增文件:`backend/scripts/import_obsidian_kb.py`(批量导入脚本)。`knowledge_service.py``parse_md_file` 已补强支持全部 Obsidian frontmatter 字段。搜索结果返回 `content_md` 完整正文供展开查看。Obsidian 源文件路径已存入 `metadata["source_files"]` 预埋 PDF 关联。
- **收视分析看板 L1-L4 全部完成**。页面布局:指标卡 → 走势图 → AI 诊断报告(摘要块) → 双引擎象限图 → 双列对比(左:季度+编导, 右:题材)。
- **L4 AI 诊断报告新增文件**:后端 `backend/app/api/analytics.py`POST 端点);前端 `DiagnosisSummary.jsx`(摘要块)+ `DiagnosisReport.jsx/.css`(详情页);Prompt 文件 `ai-labeling/prompts/prompt4_content_digest.md` + `prompt5_diagnosis_report.md`;批量脚本 `ai-labeling/scripts/gen_content_digest.py` + `scripts/import_content_digests.py`
+182
View File
@@ -0,0 +1,182 @@
# Fable 5 对 Phase 4a(对话式 TPS)的评审建议
> 来源:2026-07-09 制片人刘通 × Claude Fable 5 评审对话。
> 用途:交接给 Opus 4.6 继续细化 Phase 4a 时的输入材料。
> 状态:九条全部经制片人逐条拍板。第 9 条经 2026-07-09 两轮讨论收敛,已从讨论稿升级为拍板方向。
---
## 1. 历史查重的数据地基与措辞红线(制片人已拍板修正方案)
**问题**episodes 表目前只有 25 期数据,编导问"做过没有"时系统极易给出错误的"没做过"(假阴性),一旦编导采信,比没有此功能更糟。
**已否决的方案**:回填"节目名+播出日期+编导"最小目录。原因(制片人指出):《军事科技》节目名笼统宽泛(如《重走战争老路的武器装备》看不出讲了日向级护卫舰),光有标题对查重无帮助,**查重必须靠文稿全文语义检索**。
**拍板方案**
- 制片人承诺补齐 **2025 年全年 52 期完整内容**:收视成绩 + doco 融合A稿全文。
- 查重回答的措辞红线:**永远说"自 2025 年以来未出现相关选题",绝不说"没做过"**。此措辞写进 Prompt 约束 + 前端固定文案双保险。
- 联动提醒:52 期 vs 现有 22 期,多出 30 期的 doco 加工量与"期次一条龙"子项目的回联规则需在排期时统筹。
---
## 2. 报告区块与数据表启用节奏对齐
模块 A 右栏报告承诺五类依据,其中审片意见(review_comments)、外拍资源(shooting_resources)两表 Phase 4b 才灌数据。
- 制片人决定:系统全部做完才给编导看,无提前内测,故不构成第一印象风险。
- 实施仍建议:4a 开发时报告先只做三区块(历史查重+收视 / 可参考节目 / 知识库脚注),4b 数据就位后再加区块,**代码里不留空壳区块**。
---
## 3. 脚注防幻觉的三道工程防线(制片人已同意,实施时写死)
**风险**:LLM 生成报告时可能编造不存在的脚注,或把 A 期节目的结论挂到 B 篇文稿上(张冠李戴)。脚注制的公信力一次穿帮全组就不信了。
**三道防线(给 Cline 的实施要求,缺一不可)**
1. **编号约束进 Prompt**:每次检索到的知识库条目/期次,带编号 [1][2][3]… 连同元信息(标题、期次、来源)一起喂给模型;Prompt 明确规定"只允许引用给定编号,禁止引用编号之外的任何来源,无法支撑的论断不挂脚注"。
2. **后端校验引用编号**:模型返回报告后,后端解析所有脚注标记,逐个核对编号是否在本次检索结果集内;不在的**直接剥掉该脚注**(保留正文句子),并记一条日志供排查。
3. **宁裸奔不假装**:挂不上依据的句子就不挂脚注。UI 上有脚注的句子和没脚注的句子视觉上可区分,编导一眼知道哪些话"有出处"、哪些是 AI 的综合分析。
**配套**:检索结果沿用语义搜索已有的 min_similarity 阈值过滤(当前 0.3),低相关条目不进候选池,避免"硬凑脚注"。
---
## 4. 报题单生成:结构化 JSON 直填模板,禁止文本解析(制片人已同意)
**前车之鉴**2026-07-06 修过的 bug——AI 诊断摘要因 DeepSeek 返回标题格式不一致导致正则提取失败、内容不显示。
**要求**:模块 G 生成报题单时,让模型输出**结构化 JSON**(示意):
```json
{
"title": "选题名",
"intro": "引子段,200-300字",
"points": [
{"keyword": "加粗关键词1", "content": "该条内容"},
{"keyword": "加粗关键词2", "content": "该条内容"}
]
}
```
- JSON 字段直接对应 docxtpl 模板变量,**中间不做任何自由文本解析/正则提取**。
- 后端校验 JSON 结构(字段齐全、points 条数 3-5),不合格自动重试一次,再失败报错给用户而不是塞坏数据进 docx。
- 双段结构(引子+列举)红线不变,纯叙述式仅编导明确指定时切换另一套 JSON 结构。
---
## 5. 右栏报告改"手动更新"按钮(制片人已同意)
编导聊,报告不动;编导点 **「更新策划报告」** 按钮,才根据到目前为止的全部对话重新生成报告。一个设计同时解决三件事:
1. 符合红线 1"求助式不投喂"——展开与深入的主动权在编导手里;
2. 省成本——不是每轮对话都烧一次完整报告生成;
3. 报告稳定不跳动——编导阅读中途内容不会突变,"沉淀感"更强。
细节:按钮旁可显示"自上次更新后已新增 N 轮对话"作温和提示,但**绝不自动刷新**。
---
## 6. 对话会话从第一天落库 + 轮数硬上限(制片人已同意)
- **落库**:对话记录随 topics 表(或独立会话表)入库,编导关页面后随时回来接着聊。这同时是第十一章成本机制"按人+选题归因"的技术前提——每次调用天然隶属于一个选题会话。
- **轮数上限(制片人拍板)**:**每个选题会话最多保留 20 轮对话**,且此限制要在界面显眼位置标注(如对话框顶部常驻提示"本选题对话保留最近 20 轮")。理由:一个选题实际用不到更多轮讨论,同时防止 token 滚雪球。
- **上下文策略**:调模型时只带最近 N 轮 + 一段前情摘要(朴素做法即可,严禁上重型记忆框架),既省钱又防对话跑偏。
---
## 7. 对话主力模型:先测再定 + 候选名单
**测试方法**(照搬 L4 诊断报告选型的成功经验):3-5 个真实选题灵感同题对比,其中至少含一个"帮我找角度"任务(见第 9 条)。
**四个考点**:① 多轮对话稳定性;② 脚注纪律(会不会引用给定编号之外的来源);③ JSON 格式服从性;④ 创意角度质量。外加成本对比。
**候选名单(均可从腾讯云访问,开测时以各家当时最新旗舰为准)**
| 候选 | 入选理由 | 重点考察 |
|---|---|---|
| DeepSeek V4 Pro | L4 诊断卫冕者,分析深度已验证 | 多轮稳定、JSON 纪律 |
| Kimi(月之暗面)最新 K 系列 | 中文创意写作口碑最好,"开智"潜在黑马 | 角度卡质量 |
| GLM(智谱)最新旗舰 | 结构化输出/工具调用纪律好,将来联网生态最顺 | 脚注编号服从性 |
| Qwen-Max 最新版 | 综合稳,L4 时测过有基础分 | 综合 |
| MiniMax M2.7(基线) | 账号现成(与 embedding 同家)、便宜 | 成本性价比垫底对照 |
腾讯混元不建议占测试名额(综合能力弱于上列)。日欧无遗珠:欧洲仅法国 Mistral 算准一线但中文弱、国内访问不稳;日本无自研一线模型。第一梯队就在中美,国产池子里选即可。
---
## 8. Phase 4a 切四刀(+可选第五刀)
> 原则:风险最高的部分(脚注防幻觉、报告质量)放第一刀最先暴露;每刀有独立验收,验收不过不开下一刀。
**第一刀:单轮版"灵感→报告"(无对话)**
- 输入一段灵感文字 → 语义检索(复用 Phase 3 底座)→ 生成一份带脚注的策划参考报告(三区块:历史查重+收视 / 可参考节目 / 知识库脚注)。
- 实现第 3 条的三道脚注防线 + 第 1 条的措辞红线。
- 验收:制片人拿 5 个真实灵感实测,逐个点开脚注核对真伪,**零张冠李戴**才算过。
**第二刀:多轮对话 + 会话落库 + 手动更新按钮**
- 左右双栏成型;对话入库(20 轮上限 + 显眼标注);「更新策划报告」按钮(第 5 条);topics 表启用(建表含会话字段,schema 走 Cline Plan + Opus 审 + 制片人批准流程)。
- 验收:关浏览器重开能接着聊;连续 10 轮对话后更新报告,内容仍贴合且脚注全真。
**第三刀:报题单生成(模块 G**
- 聊定后一键生成:结构化 JSON(第 4 条)→ docxtpl → docx 下载。双段结构、只规范化不代写立意。
- 验收:连续生成 5 份报题单,docx 格式全部正确、无解析失败;内容全部来自编导聊定的东西,AI 无添油加醋。
**第四刀:成本记账 + 额度**
- 一张用量表(谁、何时、烧多少 token、为哪个选题),管理员页面看汇总;每人月度保守上限 + 超额提醒制片人。严禁 AI 网关/可观测性框架。
- 验收:制片人页面能看到按人、按选题的用量汇总;模拟超额能触发提醒。
**第五刀(可选,或并入第二刀):视角开智"帮我找角度"**——见第 9 条。
---
## 9. 视角开智:"帮我找角度"(制片人最关注,已拍板)
### 需求本质
制片人指出:TPS 最核心的价值不是"聚焦某一型装备"的资料辅助,而是**提供视角**。栏目公认的金牌选题——《武器装备的颜值洼地》(美丑切入)、《失败的"王者"》(昙花一现但影响深远)、《接过雷锋的枪》(节日钩子勾连 50 年代轻武器)、《空天之上的分层绝杀》《海平面之下的分层较量》(仅以高度/深度为主线)——共性是:**一个大众零门槛的"组织原则",把一堆本不相干的装备串成一条线**。参照系还有纪录片《地球之劫后重生》(一集一场灭绝级灾难 + 霸主物种命运的故事化讲述)。诉求:AI 不只继承往期经验,还要有"开智"能力,帮编导扩展思路。
### 可行性判断(Fable 5 结论:能做到,且是 LLM 强项)
分三层:
1. **模式复用——确定能做**。把金牌选题提炼成有名字的"视角模式"(审美反差 / 量纲主线 / 失败遗产 / 节日勾连……),AI 拿模式套新题材("量纲主线套速度线、温度线、重量线行不行?")。类比迁移是 LLM 最擅长的事。
2. **跨域借鉴——能做,且 4a 不需要联网**。关键判断:模型迁移的是**叙事手法**,不是某部具体片子——"一集一场灭绝级灾难 + 霸主物种命运"这类组织原则是纪录片行业的成熟手法(如 Netflix《我们星球上的生命》、BBC《与恐龙同行》),全世界纪录片/科普/历史叙事的手法都在训练数据里。制片人实测验证过:模型**不知道**近期新发布的具体作品内容(这正常,知识有截止日期),但新作品的"资讯"由看过片子的编导一句话带进对话即可,"迁移"由 AI 完成——人带资讯、AI 做迁移,分工恰好符合创作主权哲学。联网搜索搜回来的是"资讯"(装备新动态,那是 Phase 4c 热点雷达的活),不是"视角"。**结论:4a 开智不联网,实时互联网借鉴留 2.0**,省一套工程和一笔运行成本。
- **配套防线(制片人实测后新增)**:开智 Prompt 必须写明"不知道的作品明说不知道,禁止编造具体作品/纪录片的分集内容"——防幻觉纪律与报告脚注区一致,不留裸奔角落。
3. **命中率——要管理期望**。AI 发散 10 个角度,约 1-2 个眼前一亮、5-6 个平庸、2-3 个不着调,头脑风暴的正常成绩。产品定位:**"打火石"不是"军师"**——火花 AI 打,火编导点。
### 产品形态(四项拍板,2026-07-09 两轮讨论收敛)
**拍板 ①——输入模式:1.0 只做"带题材来"**。编导带着题材("我想做潜艇")点「帮我找角度」;"空手来"(这周想不出报什么题)的全开放发散模式发散空间太大、命中率更低,留 2.0。
**拍板 ②——角度卡自带"查重角标"**。每张卡生成后自动做一次语义查重,卡上带一行小字:"自 2025 年以来未出现相似选题" 或 "与第X期《XX》视角相近"。开智与查重咬合,编导拿到的是过了第一道筛的角度。成本为每卡一次 embedding 检索(几厘钱量级,可忽略)。
**拍板 ③——角度卡三层结构 + 红线位置(制片人修正后定稿)**。制片人指出:团队编导多为广电编导/导演/编剧出身,**不是军迷**,知识库本就是为补齐军事知识短板——只给视角不给素材方向,他们想不到有什么内容可以支撑。故角度卡定为三层:
1. **组织原则**(视角模式名 + 来源标注:往期模式复用 / 跨域类比 / AI 原创);
2. **一句话方向**
3. **3-5 条候选装备/素材**——**必须来自知识库语义检索命中**,每条带脚注(哪篇文稿/哪篇军报),走第 3 条同一套编号校验防线;库内检索不到支撑素材的,卡上如实标"库内暂无支撑资料",**严禁 AI 空口编装备**。
红线退守到真正该守的位置:**有出处的素材候选可以给(这是"摆牌");故事编排、分集结构、立意结论不写(这是"出牌")**。角度卡原文不自动进报题单——从角度到立意的发展,永远由编导在对话中完成。附带好处:能被知识库支撑的角度天然比空想的靠谱,角度卡质量自我筛选。
**拍板 ④——收藏/忽略动作从第一天记录**。一张朴素动作表:谁、哪张卡(含卡内容快照)、收藏还是忽略、时间、**topic_id(必须带,预埋"卡→选题→期次→收视成绩"四表链路,与期次一条龙子项目衔接)**。数据量无忧:一行不足 1KB,按 6 编导正常使用估算一年一万多行、几个 MB。1.0 **只存不分析、不做任何人员维度展示**;半年后可回答"哪类视角模式收藏率高、收藏的卡最终成片后收视如何",是迭代 Prompt 策略库的唯一依据(制片人确认:纯业务数据,不存在监控顾虑)。
- 其余形态不变:一次输出 5-8 张角度卡;编导可"收藏 / 忽略",收藏的角度带入后续对话深聊;AI 不排序不推荐"最佳",编导自选(摆牌不出牌)。
### 落地三件事
1. **【制片人任务,只有您能做】整理"金牌视角案例集"**:10-20 条历史公认好选题,每条格式"选题名 + 视角一句话 + 好在哪(为什么零门槛/反差在哪)"。这是 AI few-shot 学习的弹药,作用等同看板项目的 ground-truth 25 期,比任何算法都值钱。
2. **跨域叙事策略库写进 Prompt**:十来条从纪录片/科普/历史叙事归纳的组织原则,作为 AI 发散的脚手架,防止发散退化成泛泛而谈。**冷启动底稿已备好:`视角模式库冷启动_Fable5.md`(21 条模式、甲至戊五类,含跨域参照与套用示意),制片人增删后精选 10-15 条入 Prompt。**
3. **工程量修正**:主体仍是 Prompt 工程 + 复用语义检索底座,不联网;因拍板 ④ 需加**一张动作记录表**(朴素单表,schema 走 Cline Plan + Opus 审 + 制片人批准流程)。可作为 4a 第五刀,或并入第二刀(对话)一起做。
### 模型选型联动
"角度卡质量"列入第 7 条模型对比测试的四考点之一;创意发散能力各家差异大,Kimi 是潜在黑马,以实测为准。测试题中的"找角度"任务应按三层结构出题(含候选素材是否只来自给定检索结果的纪律考察)。
---
## 附:本次评审中被制片人否决/修正的建议(留痕防重提)
- ❌ "回填历史期次最小目录(节目名+日期+编导)"——节目名笼统,对查重无用。改为补 2025 全年 52 期完整文稿(第 1 条)。
- ℹ️ 空壳区块风险降级——系统整体完工才交付编导,无提前内测(第 2 条)。
- 🔄 "角度卡只给方向不给素材"(Fable 原方案)——制片人修正:编导非军迷出身,只给视角想不到内容支撑。改为三层结构(组织原则+方向+知识库有据素材候选),红线移至"不写故事编排/分集结构/立意结论"(第 9 条拍板 ③)。
+11 -1
View File
@@ -37,7 +37,7 @@ async def upload_md_files(
continue
try:
content = await f.read()
item = svc.store_md_file(content, f.filename)
item = svc.store_md_file(content, f.filename, contributor=current_user.display_name or current_user.username)
results.append({
"id": item.id,
"title": item.title,
@@ -93,6 +93,16 @@ def list_distinct_sources(
return [{"source": s} for s in sources]
@router.get("/contributors")
def list_distinct_contributors(
session: Session = Depends(get_session),
current_user: User = Depends(require_role(UserRole.zhipianren, UserRole.zebian, UserRole.biandao)),
):
svc = KnowledgeService()
contributors = svc.get_distinct_contributors()
return [{"contributor": c} for c in contributors]
@router.get("/grouped")
def get_grouped_knowledge_items(
session: Session = Depends(get_session),
+19 -2
View File
@@ -187,12 +187,16 @@ class KnowledgeService:
import re
return re.findall(r"\[\[([^\]]+)\]\]", text)
def store_md_file(self, file_content: bytes, file_name: str) -> KnowledgeItem:
def store_md_file(self, file_content: bytes, file_name: str, contributor: Optional[str] = None) -> KnowledgeItem:
"""
读取一篇 md 内容,调用 embo-01 拿到向量,写入 knowledge_items + knowledge_embeddings
"""
parsed = self.parse_md_file(file_content, file_name)
metadata = parsed["metadata"] or {}
if contributor:
metadata["contributor"] = contributor
# 调用 embeddingtype="db" 表示存入知识库)
embedding_list = self.embedder.embed_single(parsed["content_md"], embed_type="db")
@@ -204,7 +208,7 @@ class KnowledgeService:
source_file_name=parsed["source_file_name"],
author=parsed["author"],
publish_date=parsed["publish_date"],
tags=parsed["metadata"],
tags=metadata if metadata else None,
related_entities=parsed["related_entities"],
)
session.add(item)
@@ -244,6 +248,7 @@ class KnowledgeService:
# 从 tags(JSONB) 取 source_detail
tags = item.tags or {}
source_detail = tags.get("source_detail") if isinstance(tags, dict) else None
contributor = tags.get("contributor") if isinstance(tags, dict) else None
results.append({
"id": item.id,
"title": item.title,
@@ -252,6 +257,7 @@ class KnowledgeService:
"source_type": item.source_type,
"source_file_name": item.source_file_name,
"source_detail": source_detail,
"contributor": contributor or "栏目冷启动",
"created_at": item.created_at,
})
return results
@@ -267,6 +273,17 @@ class KnowledgeService:
sources.add(tags["source_detail"])
return sorted(list(sources))
def get_distinct_contributors(self) -> list[str]:
"""返回库里所有不重复的贡献人(从 JSONB 提取),供筛选下拉用。"""
with Session(engine) as session:
items = session.exec(select(KnowledgeItem)).all()
contributors = set()
for item in items:
tags = item.tags or {}
c = tags.get("contributor") if isinstance(tags, dict) else None
contributors.add(c or "栏目冷启动")
return sorted(list(contributors))
def search_similar(self, query_text: str, top_k: int = 10, min_similarity: float = 0.3) -> list[dict]:
"""
语义检索:查询句转为向量,用 SQL 余弦距离(<=>)在数据库层检索
@@ -5,12 +5,10 @@ import useAuthStore from '../../stores/authStore'
import knowledgeService from '../../services/knowledgeService'
import KnowledgeTree from '../../components/KnowledgeTree/KnowledgeTree'
// 渲染 snippet 中的 **keyword** 加粗标记(不使用 dangerouslySetInnerHTML
function renderSnippet(text) {
if (!text) return null
const parts = text.split(/\*\*(.+?)\*\*/g)
return parts.map((part, i) => {
// 奇数索引是被 ** 包裹的关键词
if (i % 2 === 1) {
return <strong key={i} style={{ color: '#1677ff' }}>{part}</strong>
}
@@ -20,7 +18,6 @@ function renderSnippet(text) {
const { Dragger } = Upload
// source_type 枚举值(固定五类,不写死但供 Select 用)
const SOURCE_TYPE_OPTIONS = [
{ label: '全部类型', value: '' },
{ label: '杂志文章', value: 'military_report' },
@@ -28,7 +25,6 @@ const SOURCE_TYPE_OPTIONS = [
{ label: '报题单', value: 'baoti' },
]
// source_type 中文标签
const SOURCE_TYPE_LABEL = {
military_report: '杂志文章',
manuscript: '节目文稿',
@@ -42,18 +38,18 @@ export default function KnowledgeBase() {
const [treeData, setTreeData] = useState([])
const [loading, setLoading] = useState(false)
const [uploading, setUploading] = useState(false)
const [sources, setSources] = useState([]) // 出处下拉选项
const [sources, setSources] = useState([])
const [contributors, setContributors] = useState([])
const [sourceTypeFilter, setSourceTypeFilter] = useState('')
const [sourceDetailFilter, setSourceDetailFilter] = useState('')
const [selectedTreeNode, setSelectedTreeNode] = useState(null) // { type, detail }
const [contributorFilter, setContributorFilter] = useState('')
const [selectedTreeNode, setSelectedTreeNode] = useState(null)
// 搜索状态
const [searchQuery, setSearchQuery] = useState('')
const [searchResults, setSearchResults] = useState([])
const [searchLoading, setSearchLoading] = useState(false)
const [expandedIds, setExpandedIds] = useState(new Set()) // 展开全文的卡片 id 集合
const [expandedIds, setExpandedIds] = useState(new Set())
// 切换卡片展开/收起
const toggleExpand = (id) => {
setExpandedIds(prev => {
const next = new Set(prev)
@@ -90,20 +86,28 @@ export default function KnowledgeBase() {
const fetchSources = async () => {
try {
const data = await knowledgeService.listSources()
// 接口返回 [{source: "航空知识 2026年第1期"}, ...],提取 source 字段
setSources(data.map(s => s.source).filter(Boolean))
} catch {
// ignore
}
}
const fetchContributors = async () => {
try {
const data = await knowledgeService.listContributors()
setContributors(data.map(c => c.contributor).filter(Boolean))
} catch {
// ignore
}
}
useEffect(() => {
fetchItems()
fetchTree()
fetchSources()
fetchContributors()
}, [sourceTypeFilter])
// 上传
const handleUpload = async (file) => {
if (!file.name.endsWith('.md')) {
message.warning('仅支持 .md 文件')
@@ -117,6 +121,7 @@ export default function KnowledgeBase() {
message.success(`成功入库 ${uploaded.length}`)
fetchItems()
fetchTree()
fetchContributors()
}
if (errors.length > 0) {
errors.forEach(e => message.error(`${e.file}: ${e.error}`))
@@ -126,10 +131,9 @@ export default function KnowledgeBase() {
} finally {
setUploading(false)
}
return false // 阻止默认上传行为
return false
}
// 删除
const handleDelete = async (id) => {
try {
await knowledgeService.deleteItem(id)
@@ -141,7 +145,6 @@ export default function KnowledgeBase() {
}
}
// 搜索处理
const handleSearch = async () => {
if (!searchQuery.trim()) {
setSearchResults([])
@@ -159,42 +162,39 @@ export default function KnowledgeBase() {
}
}
// 清空搜索 → 恢复树形浏览(不丢树状态)
const handleClearSearch = () => {
setSearchQuery('')
setSearchResults([])
}
// 树节点选中 → 联动过滤
const handleNodeSelect = (node) => {
setSelectedTreeNode(node)
}
// 根据树节点过滤列表
const displayedItems = (() => {
let result = items
// 树节点过滤优先(覆盖原有 Select 筛选)
if (selectedTreeNode) {
const { type, detail } = selectedTreeNode
result = result.filter(i => {
if (i.source_type !== type) return false
if (detail !== null) {
// 按大类决定用哪个字段比对(节目文稿=author,杂志文章=source_detail
if (type === 'manuscript') {
if (i.author !== detail) return false
} else {
// 杂志文章等用 source_detail
if (i.source_detail !== detail) return false
}
}
return true
})
} else if (sourceDetailFilter) {
// 保留原有的 source_detail 筛选逻辑
result = result.filter(i => i.source_detail === sourceDetailFilter)
}
if (contributorFilter) {
result = result.filter(i => i.contributor === contributorFilter)
}
return result
})()
@@ -203,47 +203,52 @@ export default function KnowledgeBase() {
title: '标题',
dataIndex: 'title',
key: 'title',
width: 280,
ellipsis: true,
render: (text) => (
<span style={{ fontWeight: 500, color: '#3b4a3b', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', display: 'block' }}>{text}</span>
<span style={{ fontWeight: 500, color: '#3b4a3b' }}>{text}</span>
),
},
{
title: '作者',
dataIndex: 'author',
key: 'author',
width: 100,
render: (val) => val || '-',
},
{
title: '播出/发表时间',
dataIndex: 'publish_date',
key: 'publish_date',
width: 160,
width: 80,
render: (val) => val || '-',
},
{
title: '出处',
dataIndex: 'source_detail',
key: 'source_detail',
width: 200,
width: 160,
ellipsis: true,
render: (val) => val || '-',
},
{
title: '类型',
dataIndex: 'source_type',
key: 'source_type',
width: 96,
width: 90,
render: (val) => (
<Tag color="default" style={{ borderRadius: 8 }}>
{SOURCE_TYPE_LABEL[val] || val}
</Tag>
),
},
{
title: '贡献人',
dataIndex: 'contributor',
key: 'contributor',
width: 100,
render: (val) => (
<span style={{ color: val === '栏目冷启动' ? '#aaa' : '#3b4a3b', fontSize: 13 }}>
{val || '栏目冷启动'}
</span>
),
},
{
title: '操作',
key: 'action',
width: 90,
width: 80,
render: (_, record) => (
<Popconfirm
title="确认删除"
@@ -262,14 +267,14 @@ export default function KnowledgeBase() {
]
return (
<div style={{ maxWidth: 1200, padding: '12px 16px' }}>
<div style={{ padding: '12px 0' }}>
{/* 标题栏 */}
<div style={{ marginBottom: 10 }}>
<h2 style={{ margin: 0, fontSize: 20, fontWeight: 600, color: '#3b4a3b' }}>知识库</h2>
<p style={{ margin: '4px 0 0', fontSize: 13, color: '#888' }}>上传 md 笔记 · 语义检索 · 报题参考</p>
</div>
{/* 上传区(收小为一行按钮) */}
{/* 上传区 */}
<div style={{ display: 'flex', alignItems: 'center', gap: 10, marginBottom: 12 }}>
<Dragger
accept=".md"
@@ -285,7 +290,7 @@ export default function KnowledgeBase() {
<span style={{ fontSize: 12, color: '#aaa' }}>支持批量上传系统自动解析 yaml frontmatter 并生成语义向量</span>
</div>
{/* 搜索栏(搜索模式/浏览模式互斥,清空恢复树形浏览不丢状态) */}
{/* 搜索栏 */}
<div style={{ display: 'flex', alignItems: 'center', gap: 8, marginBottom: 12 }}>
<Input
placeholder="输入一段文字,语义搜索知识库…"
@@ -320,7 +325,7 @@ export default function KnowledgeBase() {
)}
</div>
{/* 搜索结果列表(搜索模式显示,浏览模式隐藏) */}
{/* 搜索结果 */}
{searchQuery && searchResults.length > 0 && (
<div style={{ marginBottom: 12 }}>
<div style={{ fontSize: 13, color: '#666', marginBottom: 8, fontWeight: 500 }}>
@@ -376,7 +381,6 @@ export default function KnowledgeBase() {
>
{renderSnippet(item.snippet)}
</div>
{/* 展开全文区域 */}
{isExpanded && item.content_md && (
<div
style={{
@@ -396,7 +400,6 @@ export default function KnowledgeBase() {
{item.content_md}
</div>
)}
{/* 展开/收起按钮 */}
{item.content_md && (
<div style={{ marginTop: 6 }}>
<span
@@ -433,11 +436,11 @@ export default function KnowledgeBase() {
</div>
)}
{/* 主体:左侧树 + 右侧列表flex 左右并列,宽度稳定) */}
{/* 主体:左侧树 + 右侧列表 */}
<div style={{ display: 'flex', gap: 12, alignItems: 'flex-start' }}>
{/* 左侧树 */}
<Card
style={{ borderRadius: 14, width: 280, flexShrink: 0 }}
style={{ borderRadius: 14, width: 220, flexShrink: 0 }}
bodyStyle={{ padding: 0, height: '100%' }}
>
<KnowledgeTree
@@ -450,15 +453,15 @@ export default function KnowledgeBase() {
{/* 右侧列表 + 筛选栏 */}
<div style={{ flex: 1, minWidth: 0 }}>
{/* 筛选栏 */}
<Card style={{ borderRadius: 14, marginBottom: 12 }}>
<Card style={{ borderRadius: 14, marginBottom: 12 }} bodyStyle={{ padding: '12px 16px' }}>
<Space size="middle" wrap>
<span style={{ fontSize: 14, color: '#666' }}>筛选</span>
<Select
placeholder="按类型"
options={SOURCE_TYPE_OPTIONS}
value={sourceTypeFilter}
onChange={val => { setSourceTypeFilter(val); setSourceDetailFilter(''); setSelectedTreeNode(null) }}
style={{ width: 140 }}
onChange={val => { setSourceTypeFilter(val); setSourceDetailFilter(''); setContributorFilter(''); setSelectedTreeNode(null) }}
style={{ width: 130 }}
allowClear
/>
<Select
@@ -466,12 +469,20 @@ export default function KnowledgeBase() {
options={[{ label: '全部出处', value: '' }, ...sources.map(s => ({ label: s, value: s }))]}
value={sourceDetailFilter}
onChange={val => { setSourceDetailFilter(val); setSelectedTreeNode(null) }}
style={{ width: 200 }}
style={{ width: 180 }}
allowClear
/>
<Select
placeholder="按贡献人"
options={[{ label: '全部贡献人', value: '' }, ...contributors.map(c => ({ label: c, value: c }))]}
value={contributorFilter}
onChange={val => setContributorFilter(val)}
style={{ width: 130 }}
allowClear
/>
<Button
icon={<ReloadOutlined />}
onClick={() => { fetchItems(); fetchTree() }}
onClick={() => { fetchItems(); fetchTree(); fetchContributors() }}
size="small"
>
刷新
@@ -480,14 +491,15 @@ export default function KnowledgeBase() {
</Card>
{/* 列表 */}
<Card style={{ borderRadius: 14 }}>
<Card style={{ borderRadius: 14 }} bodyStyle={{ padding: '8px 16px' }}>
<Table
columns={columns}
dataSource={displayedItems}
rowKey="id"
loading={loading}
pagination={{ pageSize: 10, size: 'small' }}
pagination={{ pageSize: 12, size: 'small' }}
locale={{ emptyText: '暂无知识库条目,上传 md 文件开始入库' }}
size="small"
/>
</Card>
</div>
@@ -48,6 +48,11 @@ const knowledgeService = {
/**
* 获取按来源分组的树形结构(含「全部」根节点)
*/
async listContributors() {
const resp = await http.get('/knowledge/contributors')
return resp.data
},
async getGroupedItems() {
const resp = await http.get('/knowledge/grouped')
return resp.data
+72
View File
@@ -0,0 +1,72 @@
# 项目协作主控文件 (new_notemd/CLAUDE.md)
<!--
知识库笔记工坊子项目主控文件。
通用协作原则、主项目技术栈、角色定位、Git 红线等
已在上一级 tps-dashboard/CLAUDE.md 中覆盖,不重复。
维护原则:增量更新,不整篇重写。
-->
---
## 状态栏(每次结束 session 前必须更新这三行)
- **最后更新**Claude Opus(顾问)| 2026-07-09
- **当前状态一句话**:**已立项,PRD v1.0 完成(含制片人四项拍板),未开发。** 等制片人排期后按 PRD §8 四刀实施。
- **下一个动手的人从这里开始**:读本文件 + `PRD_知识库笔记工坊_v1.md` 全文。开发时严格按 PRD §8 分四刀。
---
## 1. 子项目概览
- **项目名**:知识库笔记工坊(new_notemd)— 知识库从"制片人单人维护"升级为"全组共建"
- **目标**:三件事——① 笔记可点开查看/编辑;② 编导可自助提交多格式素材,AI 加工成规范笔记;③ 审核制防污染。
- **落点页面**:知识库页面(`frontend/src/pages/KnowledgePage/KnowledgePage.jsx`
- **完整方案**:见同目录 `PRD_知识库笔记工坊_v1.md`
### 与主干的关系
本子项目**实施时全部落在主干**(知识库前端页面 + backend API/服务 + 006 迁移),不是独立部署的应用。外迁的是**方案讨论和 PRD 迭代**;动代码时走主干纪律:Cline Plan + Opus 审 + 制片人批准 Act006 迁移前必须 pg_dump 备份。
---
## 2. 关键决策(制片人已拍板,2026-07-09)
1. **不做独立软件**:笔记生成做在网页端知识库页面内,编导零安装成本。
2. **五种输入类型**:粘贴文本 / PDF 上传 / Word 上传 / 网页链接 / md 文件。
3. **审核制**:编导提交 → 制片人/责编审核通过 → 才进入正式搜索池。未审核笔记对搜索不可见。设计哲学红线延伸。
4. **AI 加工复用现有规则**MiMo + MST_knowledge_base prompt,不另起炉灶。
### 设计要点(PRD 核心结论,防跨 session 丢失)
- **查看用抽屉**:点标题 → Drawer 打开,上方 md 渲染预览,下方元信息卡片,可切编辑模式(左编辑右预览)。
- **新建笔记分三步**:选输入方式提交素材 → AI 加工(loading 10-30s)→ 编导预览修改后提交审核。
- **四状态流转**draft → pending → approved / rejected。搜索只检索 approved。
- **006 迁移**knowledge_items +status / submitted_by / reviewed_by / reviewed_at / review_note 五列。存量标 approved。
- **编辑后自动重算向量**:PATCH 保存时后端调 MiniMax embo-01 重算 embedding。
- **权限三档**:编导(看/编辑自己的/新建)、责编(+审核)、制片人(+删除)。
---
## 3. 待办(按 PRD §8 四刀)
- [ ] **第一刀(查看+编辑)**:标题可点击 → 查看抽屉 + 编辑模式 + PATCH 保存重算向量。不涉及 schema。
- [ ] **第二刀(新建笔记)**006 迁移(先 pg_dump+ 文本提取接口(PDF/Word/链接)+ AI 加工接口 + 前端新建流程。
- [ ] **第三刀(审核流程)**:提交审核 / 审核操作接口 + 待审核列表 + 搜索过滤 status=approved + 权限校验。
- [ ] **第四刀(打磨)**"我的笔记"视图 + 驳回退回流程 + 网页抓取健壮性 + 编辑权限细化。
- 每刀独立验收(PRD §7 七条验收标准,制片人真实点页面逐条验)
---
## 4. 已完成(只追加,最新在上)
- [2026-07-09 Claude Opus] 立项:PRD v1.0 完成(含制片人四项拍板写入 §9)、子项目文件夹建立、主项目寄存条与 CLAUDE.md 登记。
---
## 5. 交接备注
- **开发未启动**,等制片人排期。启动时从 PRD §8 第一刀开始。
- **第一刀不涉及 schema 变更**,纯前端 + 1 个 PATCH 接口,可以先做起来。
- **依赖提醒**:第二刀需 PDF 解析库(推荐 PyMuPDF 或 pdfplumber)、网页抓取(requests + BeautifulSoup);python-docx 已有。LLM 调用复用 MiMo 接口(需确认 backend/.env 有 MIMO 相关 key)。
- **关联**:搜索过滤与主干 `knowledge_service.py``search_similar()``get_all_items()` 紧密相关,第三刀改动时需注意。
+246
View File
@@ -0,0 +1,246 @@
# PRD:知识库笔记工坊(new_notemdv1.0
> 制片人刘通 × Claude Opus 顾问 2026-07-09 立项
---
## §1 背景与目标
### 现状
知识库已有 189 条(doco 22 篇 + Obsidian 164 篇 + 零散上传),但存在三个问题:
1. **只能看标题列表,不能点开看内容**——编导无法阅读和修改已入库的笔记
2. **入库门槛高**——需要手写 yaml frontmatter + md 格式,只有制片人跑脚本才能批量导入
3. **只有制片人能操作**——6 名编导各有专长领域的素材,无法自助贡献
### 目标
把知识库从"制片人单人维护的静态仓库"升级为"全组 8 人共建的活知识库":
- 编导能**浏览、编辑**已有笔记
- 编导能**自助提交**新素材(多种输入格式),AI 加工成规范笔记
- 制片人/责编**审核把关**,防止质量污染
- 知识库持续生长,为 Phase 4a 对话式选题策划提供更丰富的检索底座
---
## §2 用户角色与权限
| 操作 | 制片人 (zhipianren) | 责编 (zebian) | 编导 (biandao) |
|------|:---:|:---:|:---:|
| 浏览笔记(点标题看全文) | ✅ | ✅ | ✅ |
| 编辑已有笔记 | ✅ | ✅ | ✅(仅自己提交的,或制片人授权的) |
| 新建笔记(AI 加工流程) | ✅ | ✅ | ✅ |
| 审核(通过/驳回) | ✅ | ✅ | ❌ |
| 删除 | ✅ | ❌ | ❌ |
---
## §3 功能模块
### 3.1 笔记查看与编辑(在现有知识库列表页增强)
**交互方式**:点击标题 → 打开右侧抽屉(Drawer)
抽屉内容:
- **上半部分**:渲染后的 md 预览(react-markdown,与诊断报告详情页复用渲染器)
- **下半部分**:元信息卡片(作者、来源、类型、入库时间、审核状态)
- **操作按钮**:「编辑」→ 切换为编辑模式(左编辑右预览双栏);「保存」→ 写回数据库 + 自动重算 embedding 向量
编辑模式:
- 左栏:md 文本编辑区(textarea,等宽字体)
- 右栏:实时预览
- 元信息字段用表单编辑(标题、作者、来源等)
- 保存时后端自动调 MiniMax embo-01 重算向量
### 3.2 新建笔记(AI 加工流程)——核心新功能
**入口**:知识库页面新增「新建笔记」按钮(与「上传 md 文件入库」并列)
#### 步骤一:选择输入方式 + 提交素材
支持五种输入类型:
| 输入类型 | 操作方式 | 后端处理 |
|---------|---------|---------|
| 粘贴文本 | 文本框粘贴文章内容 | 直接传给 LLM |
| PDF 上传 | 上传 .pdf 文件 | OCR 提取文字(PyMuPDF/pdfplumber |
| Word 上传 | 上传 .docx 文件 | python-docx 提取正文 |
| 网页链接 | 输入 URL | 后端抓取正文(requests + BeautifulSoup |
| md 文件 | 上传 .md 文件 | 直接读取(现有功能增强) |
编导还需填写:
- **素材类型**(下拉选择:杂志文章 / 军报文章 / 装备资料 / 技术文献 / 节目文稿 / 动态消息 / 其他)
- **来源说明**(如"航空知识 2026 年第 3 期")——选填,有则 AI 会参考
#### 步骤二:AI 加工
后端调用 LLMMiMo,复用现有 MST_knowledge_base 规则),自动:
- 生成规范的 yaml frontmattertitle / author / date / source_type / source_detail / tags / related_entities
- 整理正文格式(分段、去噪、提取关键信息)
- 生成内容摘要
加工过程显示 loading 状态("AI 正在整理笔记..."),预计 10-30 秒。
#### 步骤三:编导预览 & 修改
AI 加工完成后展示结果:
- 上方:表单形式展示 frontmatter 字段(可改)
- 下方:左编辑右预览双栏(可改正文)
- 底部:「提交审核」按钮
编导可以:
- 修改 AI 生成的标题、标签、摘要
- 修改正文内容
- 觉得 AI 加工不好可以点「重新加工」
#### 步骤四:提交审核
编导点「提交审核」→ 笔记以 `pending` 状态入库(算向量,但不参与正式搜索)
#### 步骤五:审核(制片人/责编)
审核入口:知识库页面新增「待审核」标签页(或筛选项),显示待审核笔记列表
审核操作:
- **通过**:状态改为 `approved`,进入正式搜索池
- **驳回 + 理由**:状态改为 `rejected`,退回编导修改(编导在"我的笔记"里能看到驳回理由)
- **通过并编辑**:审核人可以直接改完再通过
---
## §4 数据模型变更
### knowledge_items 表新增字段(006 迁移)
```sql
ALTER TABLE knowledge_items
ADD COLUMN status VARCHAR(20) DEFAULT 'approved' NOT NULL,
ADD COLUMN submitted_by INTEGER REFERENCES users(id),
ADD COLUMN reviewed_by INTEGER REFERENCES users(id),
ADD COLUMN reviewed_at TIMESTAMP,
ADD COLUMN review_note TEXT;
-- 存量数据全部标记为 approved(制片人历史导入,已审核)
UPDATE knowledge_items SET status = 'approved' WHERE status = 'approved';
-- status 枚举:draft / pending / approved / rejected
-- draft: 编导编辑中未提交
-- pending: 已提交待审核
-- approved: 审核通过,参与搜索
-- rejected: 驳回,需修改
```
### 搜索过滤
现有 `search_similar()` 和列表查询增加 `WHERE status = 'approved'` 过滤(编导查看自己的笔记不受此限制)。
---
## §5 新增 API
| 方法 | 路径 | 说明 | 权限 |
|------|------|------|------|
| GET | `/api/knowledge/{id}` | 获取笔记详情(含 content_md | 全角色 |
| PATCH | `/api/knowledge/{id}` | 编辑笔记(保存后重算向量) | 见 §2 权限表 |
| POST | `/api/knowledge/extract-text` | 上传文件/链接 → 提取纯文本 | 全角色 |
| POST | `/api/knowledge/ai-process` | 纯文本 → AI 加工成规范笔记 | 全角色 |
| POST | `/api/knowledge/submit-review` | 提交审核(status → pending | 全角色 |
| PATCH | `/api/knowledge/{id}/review` | 审核操作(通过/驳回) | zhipianren + zebian |
| GET | `/api/knowledge/pending` | 获取待审核列表 | zhipianren + zebian |
| GET | `/api/knowledge/my-notes` | 获取"我的笔记"列表 | 全角色 |
---
## §6 前端页面结构
### 知识库页面改动(KnowledgePage.jsx
```
知识库
├── 搜索栏(不变)
├── 操作栏
│ ├── [上传 md 文件入库](现有)
│ ├── [新建笔记](新增,打开新建流程)
│ └── [待审核 (N)](新增,仅制片人/责编可见,显示待审数量角标)
├── 左侧树形视图(不变)
├── 右侧列表
│ ├── 标题可点击 → 打开查看抽屉
│ ├── 状态列(新增:已审核/待审核/已驳回)
│ └── 操作列:查看 | 编辑 | 删除(按权限显示)
└── 查看/编辑抽屉(新增)
├── 查看模式:md 渲染 + 元信息
└── 编辑模式:左编辑右预览 + 元信息表单
```
### 新建笔记流程页(NoteWorkshop.jsx 或 Modal
```
新建笔记
├── Step 1:输入方式选择 + 素材提交
│ ├── Tab 切换:粘贴文本 | PDF | Word | 网页链接 | md 文件
│ ├── 素材类型下拉
│ └── [开始加工] 按钮
├── Step 2AI 加工中(loading
├── Step 3:预览 & 修改
│ ├── frontmatter 表单(标题/作者/来源/标签等)
│ ├── 正文编辑(左编辑右预览)
│ └── [提交审核] / [重新加工] 按钮
└── 完成提示:"已提交审核,等待制片人/责编审批"
```
---
## §7 验收标准
1. **能看**:点击任意笔记标题,抽屉打开显示完整 md 渲染内容和元信息
2. **能改**:编辑模式下修改内容并保存,搜索结果反映修改后的内容(向量已更新)
3. **能建**:通过粘贴文本创建笔记,AI 加工后 frontmatter 字段完整、正文格式规范
4. **能传**PDF / Word / 网页链接均能成功提取文字并进入 AI 加工流程
5. **能审**:编导提交后制片人能看到待审核列表,通过后笔记出现在搜索结果中,驳回后编导能看到理由
6. **不污染**:未审核的笔记不出现在语义搜索结果中
7. **权限正确**:编导不能审核、不能删除、不能编辑他人笔记(除非被授权)
---
## §8 分刀实施计划
### 第一刀:查看 + 编辑(纯前端 + 1 个 PATCH 接口)
- 列表标题可点击 → 打开查看抽屉(GET `/api/knowledge/{id}`
- 抽屉内 md 渲染 + 编辑模式切换
- PATCH 接口保存 + 重算向量
- 不涉及 schema 变更
### 第二刀:新建笔记 AI 加工流程
- 006 迁移(加 status / submitted_by / reviewed_by 等字段,先 pg_dump
- 文本提取接口(PDF / Word / 链接)
- AI 加工接口(调 LLM
- 前端新建笔记流程页
### 第三刀:审核流程 + 权限
- 提交审核 / 审核操作接口
- 前端待审核列表 + 审核操作
- 搜索过滤 `status = 'approved'`
- 权限校验(编导不能审核/删除)
### 第四刀:打磨 + 边界
- "我的笔记"视图
- 驳回理由展示 + 退回修改流程
- 网页链接抓取的健壮性(超时/编码/反爬)
- 编辑权限细化(编导仅编辑自己的笔记)
每刀独立验收,制片人真实点页面逐条验。
---
## §9 制片人拍板记录
1. [2026-07-09] **不做独立软件**:笔记生成功能做在网页端,编导打开浏览器就能用,不增加安装成本。
2. [2026-07-09] **五种输入类型**:粘贴文本 / PDF / Word / 网页链接 / md 文件。
3. [2026-07-09] **审核制**:编导提交 → 制片人/责编审核 → 通过才进搜索池。AI 设计哲学红线的延伸。
4. [2026-07-09] **AI 加工复用 MST 规则**:沿用现有 MiMo + MST_knowledge_base prompt 规则,不另起炉灶。
@@ -68,3 +68,4 @@
| Doco 文稿整理 | 2026-06-12 | `寄存条Doco文稿整理子项目已外迁.md` | 开发收尾(2026-07-03),转常态运行(每期播出后跑) |
| CCA 唱词助手 | 2026-07-04 | `寄存条CCA唱词助手子项目已外迁.md` | 已部署腾讯云,内测中(2026-07-05 |
| 期次一条龙录入 | 2026-07-07 | 本文件 | **立项,PRD 就绪,待开发** |
| 知识库笔记工坊 | 2026-07-09 | `寄存条知识库笔记工坊子项目已外迁.md` | **立项,PRD 就绪,待开发** |
@@ -0,0 +1,71 @@
# 寄存条:知识库笔记工坊子项目已外迁
> 留在主 project,让未来的 Claude 一眼知道:知识库笔记工坊(编导共建知识库)已单独立项。
> 外迁时间:2026-07-09
---
## 外迁了什么
**知识库笔记工坊**(new_notemd)作为子项目,目录 `new_notemd/`
聚焦:知识库从"制片人单人维护的静态仓库"升级为"全组 8 人共建的活知识库"——编导能查看/编辑笔记、自助提交多格式素材(文本/PDF/Word/链接/md)经 AI 加工成规范笔记、制片人/责编审核后入搜索池。
目的:丰富知识库内容、降低入库门槛、为 Phase 4a 对话式选题策划提供更丰富的检索底座。
**状态:已立项,PRD v1.0 完成(含制片人四项拍板),未开发。** 方案全文见 `new_notemd/PRD_知识库笔记工坊_v1.md`
---
## 主 project 不再讨论的话题
聊到下面这些词,**先问一句"这是知识库笔记工坊子项目的事还是主 project 的事?"**——是子项目的事,提醒制片人切到对应 chat。
关键词:笔记工坊 / 新建笔记 / AI 加工笔记 / 编导上传知识库 / 知识库审核流程 / pending/approved/rejected 状态 / 006 迁移 / 笔记编辑抽屉 / 文本提取 / PDF OCR / 网页抓取入库 / 编导共建知识库
---
## 主 project 仍在管什么
- 知识库**现有功能**的 bug/维护(语义搜索、树形视图、md 上传、embedding 链路)
- Phase 0-3 已落地的主干代码、全部 backend schema/API/迁移、全部前端 React 实施
- 其他子项目(看板升级 / doco / CCA / 期次一条龙)
---
## 特殊说明:本子项目实施时落在主干
与 doco/CCA 不同,本子项目**没有独立部署物**——外迁的是方案讨论和 PRD 迭代,实施时直接改主干(KnowledgePage 前端 + backend + 006 迁移)。因此实施阶段纪律:
- 走主干规矩:Cline Plan + Opus 审 + 制片人批准 Act
- **006 迁移前必须 pg_dump 备份**
- 分四刀实施(见 PRD §8),每刀独立验收,制片人真实点页面
## 已拍板决定(2026-07-09,别翻案)
1. **不做独立软件**:笔记生成功能做在网页端知识库页面内,编导零安装成本。
2. **五种输入类型**:粘贴文本 / PDF 上传 / Word 上传 / 网页链接 / md 文件。
3. **审核制**:编导提交 → 制片人/责编审核 → 通过才进搜索池。AI 设计哲学红线延伸。
4. **AI 加工复用 MST 规则**:沿用现有 MiMo + MST_knowledge_base prompt。
---
## 开局口径
进主 project 新 chat
> "续接 TPS 主项目。读 `寄存条知识库笔记工坊子项目已外迁.md` 和其他寄存条。当前要做 [具体任务]。"
启动本子项目开发:
> "续接知识库笔记工坊子项目。读 `new_notemd/CLAUDE.md` 和 PRD。从第 N 刀开始。"
---
## 当前外迁的子项目清单(随更新)
| 子项目 | 外迁日期 | 寄存条文件 | 状态 |
|---|---|---|---|
| TPS 看板分析升级 | 2026-06-12 | `寄存条看板升级已外迁.md` | 原型收工,L1-L4 已在主干实现(2026-07-06 |
| Doco 文稿整理 | 2026-06-12 | `寄存条Doco文稿整理子项目已外迁.md` | 开发收尾(2026-07-03),转常态运行 |
| CCA 唱词助手 | 2026-07-04 | `寄存条CCA唱词助手子项目已外迁.md` | 已部署腾讯云,内测中(2026-07-05 |
| 期次一条龙录入 | 2026-07-07 | `寄存条期次一条龙录入子项目已外迁.md` | 立项,PRD 就绪,待开发 |
| **知识库笔记工坊** | **2026-07-09** | **本文件** | **立项,PRD 就绪,待开发** |
+140
View File
@@ -0,0 +1,140 @@
# 视角模式库(冷启动版)——TPS 开智功能的跨域叙事策略库底稿
> 来源:2026-07-09 Claude Fable 5 应制片人刘通要求整理。
> 用途:作为 Phase 4a 开智功能「跨域叙事策略库」的冷启动素材(见 Fable5suggestion.md 第 9 条落地三件事之 2)。
> 使用方式:制片人在此基础上增删、结合往期金牌选题总结后,精选 10-15 条写进开智 Prompt。
> 作业纪律:所有参照作品均为 Fable 5 训练数据内确知作品(截止 2026-01),使用前建议抽查核实;无把握的作品未写入。
> 每条格式:**模式名** | 一句话定义 | 跨域参照 | 军事科技套用示意(仅为说明模式,非选题建议)。
---
## 甲类:栏目已验证模式(从金牌选题提炼,最可靠)
**1. 审美反差**
以大众的审美直觉(美/丑/怪)评判装备,横向串联"出格"者。
参照:栏目《武器装备的颜值洼地》已验证。
套用扩展:不止美丑——"笨拙感""萌感""威慑感"等任何审美维度都可开线。
**2. 量纲主线**
沿一个单一物理量从小到大(或从低到高)排布装备,量纲本身就是叙事线。
参照:栏目《空天之上的分层绝杀》《海平面之下的分层较量》已验证(高度/深度)。
套用扩展:速度、温度、重量、口径、航程、服役年限、造价——每个量纲都是一期潜在节目。
**3. 失败遗产**
盘点昙花一现的"实验品",讲它们如何深远影响后世设计。
参照:栏目《失败的"王者"》已验证。
套用扩展:可细分为"生不逢时型""技术超前型""方向错误但副产品伟大型"。
**4. 日历钩子**
借节日/纪念日的公共注意力,勾连一段装备史。
参照:栏目《接过雷锋的枪》已验证(学雷锋纪念日 → 50 年代中国轻武器)。
套用扩展:任何纪念日都可反查"当年的装备横截面"。
---
## 乙类:事件与时间类(借纪录片最成熟的时间叙事手法)
**5. 灾难/转折事件切片**
一期聚焦一场"改变格局的大事件",讲事件前后"霸主"的命运兴衰。
参照:灭绝事件类自然纪录片的通用结构(如 Netflix《我们星球上的生命》:五次大灭绝、每次讲称霸物种的荣枯)。
套用示意:一场改变战争形态的战役/事故为切片——某型装备在此役登基或退位。
**6. 横截面断代("某一年"结构)**
选定一个年份做横截面,看那一年全世界的装备都在发生什么,彼此呼应成时代画像。
参照:史学名著《万历十五年》的横截面写法;"一年史"类历史纪录片通用结构。
套用示意:"1957:一枚卫星让所有武器过时"——同一年各国军备的连锁反应。
**7. 分水岭结构("X 之前 / X 之后"**
以一件划时代装备或技术为界碑,对比它出现前后的战争规则。
参照:科技史纪录片讲"印刷术前后""电力前后"的通用手法。
套用示意:无畏舰之前/之后、雷达之前/之后、精确制导之前/之后。
**8. 时间显微镜(一次任务/一天实时化)**
把叙事压缩到极短时间内(一次拦截的 180 秒、航母的 24 小时),用近乎实时的节奏展开。
参照:PBS 纪录片《Carrier》(航母生活跟拍);"一日体"城市纪录片通用结构。
套用示意:一枚导弹从预警到拦截的完整时间轴,每一秒都有装备登场。
**9. 事故剥洋葱(调查式倒叙)**
从一场事故/失败的结果出发,层层回溯原因链,装备知识在破案过程中自然带出。
参照:《空中浩劫》(Mayday / Air Crash Investigation)——空难调查类最成熟的叙事模板。
套用示意:一次著名试验失败的调查复盘,每剥一层讲透一项技术。
**10. 残骸考古(从遗物倒推)**
从一件打捞/发掘的残骸出发,倒推它背后的整场战事与技术时代。
参照:沉船考古类纪录片(泰坦尼克号探索类节目)的通用结构。
套用示意:一艘打捞出水的沉舰,就是一整场海战和一个造舰时代的钥匙。
---
## 丙类:器物与人物类(给冷冰冰的装备装上"人"的叙事)
**11. 器物传记(装备一生作传)**
以单一装备的"生老病死"作传:立项—首飞/下水—高光—衰老—退役/传承。
参照:《如果国宝会说话》(一集一件文物、拟人化短叙事);人物传记片三幕结构。
套用示意:一架服役六十年的老飞机,祖孙三代飞行员开过同一个机身。
**12. 幕后之人**
不讲装备讲人:设计师、试飞员、车间女工、计算员——宏大装备背后的具体面孔。
参照:央视《军工记忆》(国防工业型号研制亲历者口述);《我在故宫修文物》(以匠人带器物)。
套用示意:一型明星装备的总师访谈线 + 型号研制史双线并进。
**13. 未走之路(败者方案)**
盘点竞标落选者、纸面武器、被砍项目——"历史差点拐向另一边"。
参照:科技史"失落的发明"类纪录片通用手法;与甲类"失败遗产"相邻但更侧重"未发生"。
套用示意:那些输掉竞标却技术惊艳的方案,落选理由本身就是一堂装备课。
**14. 连锁因果(小物件勾连大历史)**
从一件日常小物出发,沿因果链追到宏大军事史(或反向:军事发明如何流入日常)。
参照:BBC 经典《Connections》(James Burke,科技史连锁叙事的开山之作)。
套用示意:从一口压缩罐头/一部手机里的 GPS,追到它背后的战争起源。
---
## 丁类:对照与反差类(结构自带戏剧张力)
**15. 双雄对决(矛与盾)**
两件宿命对手装备(或攻防两个体系)的螺旋竞赛史,你升级我反制。
参照:Discovery《Greatest Tank Battles》等对抗复盘类节目;体育"双雄叙事"通用模板。
套用示意:潜艇与声呐的百年猫鼠游戏;坦克装甲与破甲弹药的军备螺旋。
**16. 仿生对照(自然界的平行答案)**
装备与生物演化的趋同对照:同一个物理问题,工程师和大自然各自的解法。
参照:BBC 自然纪录片(《蓝色星球》《七个世界,一个星球》)的生物策略叙事 + 仿生学科普通用结构。
套用示意:蝙蝠与声呐、鲸与潜艇、猛禽与无人机——每对都是一次"两种智慧"的对谈。
**17. 尺寸极端(吉尼斯结构)**
只取谱系两端:最大与最小、最重与最轻,极端本身就是奇观。
参照:工程奇观类纪录片(超级工程/巨型机械题材)的通用卖点结构。
套用示意:巨炮与微型无人机同台——大到极致与小到极致各自付出的代价。
**18. 价格标尺(经济学切口)**
以钱为主线:最贵的一克、造价悬殊的对抗、穷办法击败贵武器。
参照:经济学科普节目"用价格讲万物"的通用手法。
套用示意:"一发多少钱"排一条线——拦截弹与被拦截物的成本倒挂困局。
---
## 戊类:感官与环境类(大众体感零门槛)
**19. 看不见的战争(感官缺席)**
以"看不见/听不见"为主线:隐身、静音、电子战、夜视——较量发生在感官之外。
参照:自然纪录片拍摄"不可见世界"(红外/超声)的通用手法迁移。
套用示意:一期只讲"安静"——潜艇静音竞赛里,分贝就是生死。
**20. 极限环境主场(环境当主角)**
以一种极端环境为主角(极寒/深海/沙漠/高原/太空),看装备如何被环境逼出形态。
参照:BBC《行星》《七个世界,一个星球》按环境/大洲组织的结构。
套用示意:高原主场——所有装备到了这里都要重新设计一遍。
**21. 地理走线(沿一条线走)**
沿一条地理线(边境线、航线、海峡、河流)走一遍,串起沿途的装备与工事。
参照:《航拍中国》(按省份地理线组织);行走式人文纪录片通用结构。
套用示意:沿一条海上咽喉要道,历数百年来在此对峙过的舰与炮。
---
## 使用备注
1. **组合使用威力更大**:模式可叠加,如"量纲主线 × 双雄对决"(同一高度层的攻与防)、"日历钩子 × 幕后之人"(纪念日 + 亲历者)。开智 Prompt 里可明示允许 AI 做模式组合。
2. **与金牌案例集的关系**:本库是"跨域脚手架"(乙丙丁戊类),制片人整理的金牌案例集是"栏目基因"(甲类的扩充)。两者在 Prompt 里分开摆放:前者教 AI 发散,后者教 AI 什么叫"我们栏目的好"。
3. **核实提醒**:参照作品名均出自 Fable 5 训练知识(截止 2026-01),个别译名可能与国内通行译法有出入,写进正式 Prompt 前建议制片人抽查。
+19
View File
@@ -0,0 +1,19 @@
**【制片人任务,只有您能做】整理"金牌视角案例集"**:10-20 条历史公认好选题,每条格式"选题名 + 视角一句话 + 好在哪(为什么零门槛/反差在哪)"。这是 AI few-shot 学习的弹药,作用等同看板项目的 ground-truth 25 期,比任何算法都值钱。
| 播出日期 | 节目名称 | 视角一句话 | 好在哪 |
| -------- | ------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
| 20260609 | 武器装备的颜值洼地 | 用美丑作为主线盘点那些在竞标中落败、影响了作战性能的装备。 | 美丑这个评判标准很主观,同时也很好理解。主观正加强了该期节目的话题性,谁都可以发表两句看法;好理解降低了军事科普节目的收视门槛。节目还创新加入了街采,用普通人视角增强了节目的真实感。最终收视份额1.227。 |
| 20260616 | 巨舰砺锋:解锁福建舰硬核竣工密码 | 正值福建舰下水四周年(6月17日)梳理福建舰从立项、研制、下水、海试的心路历程。展现中国智慧和中国力量。 | 这期节目播出时间恰巧是福建舰下水四周年纪念日的前一天,具备一定的实效性。虽然当时舆论热点并不突出,但也取得了1.149收视份额的好成绩。结合福建舰下水4周年纪念日,梳理福建舰从立项建造到形成战斗力远超国际平均水平。最终收视份额1.149。 |
| 20251104 | 武器进化论:陆战颠覆者 | 纵向梳理陆战武器装备的螺旋式发展脉络。节目处处呈现魔高一尺道高一丈的装备对比反差。 | 节目以一种矛与盾此消彼长的演进关系推进剧情,例如坦克催生了反坦克武器和直升机;直升机称霸战场又催生了防空步战车。这种螺旋式主线演进。最终收视份额1.350。 |
| 20250902 | 见证:从历届阅兵看武器装备的跃迁 | 在2025年9月3日胜利日大阅兵前一天播出,具有非常强的时效性。盘点历届阅兵首次亮相的武器装备。 | 胜利日大阅兵前夕,舆论关注度非常强,虽然不能取得此次胜利日阅兵的素材画面。但通过盘点历届阅兵,带领观众感受国防力量的突飞猛进,最后留有悬念,期待明天的阅兵会有什么样的崭新装备亮相。最终收视份额1.860。 |
| 20240507 | 钢雨制造者 | 梳理火箭炮的前世今生和当前最先进的箱式火箭炮的能力。 | 2024年是纪念抗美援朝战争胜利90周年。在抗美援朝战场上发挥非常重要作用的一款武器装备就是当时苏联援助的喀秋莎火箭炮。本期节目梳理了火箭炮的诞生和发展,其中重点讲了喀秋莎。也讲到了远箱火现在的发展程度。符合当时的舆论环境期待。最终收视份额1.643。 |
| 20240305 | 接过雷锋的枪 | 以不同时期雷锋和枪的合影作为主线,盘点上世纪50年代我国轻武器的发展。 | 3月5日是学雷锋纪念日,本来雷锋精神和《军事科技》栏目定位相距很远。但该期节目顺应了节日氛围和舆论走势。巧妙地用雷锋与枪的合影作为主线,盘点雷锋使用过的轻武器,反映出当时国防建设的缩影。最终收视份额1.82。 |
| 20250218 | 兵器空域的分层绝杀 | 以高度这一尺度为主线,盘点武器装备进行对抗的不同空域。 | 高度是日常生活中非常贴近普通观众的度量衡。以高度为主线演进,从地面几米到万米高空的临近空间,不断升高高度,盘点武器装备的对抗空域。让该期节目收视门槛非常低,又提供了足够的社交货币。最终收视份额0.98。 |
| 20250715 | 装备界的“寿星”与“流星” | 有很多服役几十年的祖父级装备,又有刚服役就退役的不成熟装备。横向对比这些装备寻找背后的共性与差异。 | 本期节目也长项在降门槛,长寿与短命是观众非常好理解的概念。以此为主线,交叉对比不同领域的装备寿星与流星。视角独特,无专业知识壁垒。最终收视份额1.12。 |
| 20250415 | 历久弥新的螺旋桨战机 | 在高空高速、隐身等各种高科技战斗机成为主流的今天,为何还有螺旋桨战机的生存空间? | 在节目开始就提出悬念,当今战场已是高空高速、隐身、短距起降等高科技战机的天下,螺旋桨战机如何还能占有一席之地?节目盘点了从飞行者1号螺旋桨战机是飞机的起源,到直升机,直至今天仍旧采用螺旋桨作为全部动力来源,再到超远距离投送的战略轰炸机都采用螺旋桨驱动。这当中各有各的原因。本期节目通过一个意想不到的问题切入,进行主线演进,盘点各领域仍然以螺旋桨作为动力来源的战机。最终收视份额1.35。 |
| 20230822 | 失败的“王者”:解析昙花一现的武器装备 | 盘点最激进的设计,外形怪异,虽然因为各种原因纷纷下马,但对后世的武器装备设计留下深远影响。 | “失败”和“王者”本身就是一对反义词,贴在一起造成反差和悬念。能够牵动观众看看为什么激进的设计不被军方接受?既然被称为王者肯定在某些方面有吊打其他装备的能力,但又为何迎来失败?它们是如何影响后世武器装备设计制造的?节目视角独特,天然带有悬念,能够牵引观众一步步探索知识。最终收视份额1.574。 |
| 20230418 | 驶向深蓝 | 盘点人民海军创造过无数个第一的划时代战舰。人民海军的第一艘驱逐舰、第一艘护卫舰、第一艘两栖攻击舰等等。 | 在人民海军成立74周年纪念日前夕播出,本期节目压中了节点,顺应了舆论热点。通过盘点人民海军发展历程中的多个第一,反映出人民海军国防力量发展的脉络。最终收视份额1.506。 |
| 20231107 | 蓝天砺剑:加力奋飞的闪亮升级 | 盘点回顾人民空军在历史转折点上其武器装备的精彩故事。 | 在人民空军成立74周年纪念日前夕播出,本期节目压中了节点,顺应了舆论热点。通过盘点人民空军发展历程中的代表性武器装备,反映出人民空军国防力量发展的脉络。最终收视份额1.393。 |
| 20230919 | 恐怖的蘑菇云 | 从电影《奥本海默》出发,梳理人类历史上制造出来的原子弹。解析原子弹的产生恐怖摧毁能力的原理。 | 当时电影《奥本海默》热映,节目通过电影切入,透视历史原型讲述了奥本海默创造原子弹的历程和战后成为一名积极的反战人士的转变。这点形成反差。核武器是当今世界最强大的杀伤性武器,也只有联合国五常具备核武器的制造能力。本身核武器就是明星装备,加之电影热映,让本期节目顺应了舆论热点。最终收视份额1.112。 |
| 20230307 | 军事仿生技术探秘 | 从仿性、仿形等方面梳理武器装备向自然界、生物界学到了什么? | 当时电影《流浪地球2》热映,节目通过电影切入,从不同角度梳理了武器装备与自然界生物间的联系。电影拉近了科普节目与观众的距离,另外生物也辅助了节目降门槛的需求。在零门槛的基础上,节目主要介绍现代新型武器装备和战术战法,包括蜂群作战、空气动力学等,让节目既有深度又与观众产生勾连。最终收视份额1.163。 |