diff --git a/.claude/skills/parse-book/SKILL.md b/.claude/skills/parse-book/SKILL.md index a53a6f4..5c8d66e 100644 --- a/.claude/skills/parse-book/SKILL.md +++ b/.claude/skills/parse-book/SKILL.md @@ -33,13 +33,25 @@ disable-model-invocation: true **M3 直调形态(创始人 2026-07-13 拍板,现行)**:循环体不再派 opus/haiku 子代理,改为 `scripts/parse_llm.py` 直调 New-API `MiniMax-M3`(经 llm skill)——脚本自己取数(正文/前文实体/已积累卡名录内联进 prompt)→ M3 两 pass(脚手架→范式)→ `parse_ingest` 机械校验入库(比例硬顶/归型/字段越合同/15连字泄漏)。断点续跑按 example_parse_task 状态机逐章跳过已 done 的 pass。 +**放量全流程(每书四步,均 M3)**: + ```bash -# 逐章两 pass 拆一本书的指定章区(断点续跑,重跑自动补失败章) -.venv/bin/python .claude/skills/parse-book/scripts/parse_llm.py --work-id 4 --from 1 --to 3 +# ① 逐章两 pass(脚手架→范式;断点续跑,重跑自动补失败章) +.venv/bin/python .claude/skills/parse-book/scripts/parse_llm.py --work-id 4 --from 1 --to 50 +# ② 窗级大纲聚合(每 5–10 万字:多章细纲+正文→阶段大纲;单章对大纲层可能零贡献,不做章内比例强制) +.venv/bin/python .claude/skills/parse-book/scripts/parse_outline.py window --work-id 4 +# ③ 全书拆完:终检(逐窗细纲对账大纲 + 跨段连贯性纵览) +.venv/bin/python .claude/skills/parse-book/scripts/parse_outline.py check --work-id 4 +# ④ 公共卡三角色审核(番茄作家/起点作家/主编,M3 常设步骤;见 review-cards skill) +.venv/bin/python .claude/skills/review-cards/scripts/review_cards.py review --batch <批次> --work-id 4 # 进度 .venv/bin/python .claude/skills/parse-book/scripts/parse_ingest.py progress ``` +审核纪律:常设审核=M3(已用 opus 金标准校准,偏差 0.45 达标);fable/opus 只做起量前校准与起量后一次总审核(门禁与优化,不进流程循环)。 + +试拆实测病理档(放量前须知):M3 细纲按比例会写超(治=绝对字数上限+压缩重试);type 一律标 craft 且串型混填(prompt 矫正无效,治=B4 环按金标准清单改造 prompt/schema);重跑自噬(治=判重名录排除本章+0 卡不软删);source 偷懒(治=机械回填)。 + ## 步骤(自底向上,与创作期规划的自顶向下互为镜像) 1. 静态分章:import skill(规则,LLM 不参与); diff --git a/.claude/skills/review-cards/SKILL.md b/.claude/skills/review-cards/SKILL.md new file mode 100644 index 0000000..ebd4196 --- /dev/null +++ b/.claude/skills/review-cards/SKILL.md @@ -0,0 +1,45 @@ +--- +name: review-cards +description: 公共知识卡三角色审核(番茄作家/起点作家/主编)——拆书流程的常设步骤,MiniMax-M3 执行;检查内容成立性、AI 创作可用性、跨书可参考性,判定 pass/revise/reject 写回卡片。fable/opus 只做起量前校准与起量后总审核。 +--- + +# review-cards —— 公共知识卡三角色审核(M3 常设) + +创始人拍板(2026-07-13):审核是**流程内可复用资产**,不是每批都请 claude 角色扮演—— +- **常设执行**:MiniMax-M3 扮三角色(番茄作家=爽点商业性 / 起点作家=结构工艺 / 主编=资产 vs 噪声),每批拆书产出的卡过一遍; +- **fable/opus 职责**:起量前出金标准校准本 skill(golden/),起量后做一次总审核; +- 判定写回 `draft_payload.审核` 节(批次/均分/判定/三角色分与判词),可追溯可复审。 + +## 用法 + +```bash +# 审核(全部或指定书的活卡;三角色各一次 M3 调用) +.venv/bin/python .claude/skills/review-cards/scripts/review_cards.py review --batch <批次> [--work-id N] [--dry-run] + +# 校准:与 golden/scores.json(opus 金标准)对照(换模型/改 prompt 后必跑) +.venv/bin/python .claude/skills/review-cards/scripts/review_cards.py calibrate --batch <批次> +``` + +判定阈值:三角色九维均分 ≥3.5 pass / ≥2.5 revise / 其余 reject。 + +## 统一判定闸(自 opus 金标准三评审蒸馏,内嵌于审核 prompt) + +换书测试(抹专名换题材仍成立?)· 命名黑话检测 · 装置标签判定(信息差/契诃夫之枪/身份错认各有硬定义)· 伪精确检测(编造的间隔数字)· 同功重复(family 换皮)· 干货位检查(失败模式比手法值钱=手法空洞)· 专名泄漏。 + +## 校准记录 + +| 日期 | 批次 | 结果 | +|---|---|---| +| 2026-07-13 | cal-001(19 卡试拆批) | 平均绝对偏差 **0.45**(合格线 ≤0.5)、平均偏差 -0.08(无系统倾向)、最大背离 1.33<1.5;8 卡偏差 ≤0.11。M3 三角色总评独立复现金标准全部四大系统病(同功撞车/命名黑话/伪精确/专名污染)。**已知弱点**:对「场景级走位 vs 可复用范式」辨别偏松(《路人搭讪道具借用式情报截流》金 2.67 → M3 4.0)。 | + +金标准:`golden/金标准-{番茄作家,起点作家,主编}-2026-07-13.md` + `golden/scores.json`(19 卡九维均分)。 + +## 金标准对拆书 prompt 的改进清单(B4 优化环的输入,未实施) + +1. 技法指纹先行+跨章聚类去重(母卡+多出处实例,消灭 family 换皮); +2. 换书测试闸门+强制占位符(专名/数字打回); +3. 两类卡模板:结构型伏笔卡(埋点/回收点/隔章记忆维持三件套)vs 场景型手法卡(复用节奏/异质化/每章上限)——不再硬套埋设/履约框架; +4. 装置类型闭合枚举+判定测试;禁「信息差」当万能主标签; +5. 翻转重心:每卡强制可迁移因果原则「当X做Y因为读者会Z」+触发条件+滥用反例;砍编造数字; +6. 补「读者收益」字段(代入/掌控/期待/打脸/意外);命名用作者短语(「先知降压」),长名降副标题; +7. 采样扩到中段爽点章(打脸/升级/反转),别只啃前三章。 diff --git a/.claude/skills/review-cards/golden/scores.json b/.claude/skills/review-cards/golden/scores.json new file mode 100644 index 0000000..aaac8af --- /dev/null +++ b/.claude/skills/review-cards/golden/scores.json @@ -0,0 +1,21 @@ +{ + "延时应答式洗脑成功伪装": 3.0, + "面瘫外化式心绪对冲可视化": 3.22, + "未来时态回望式处境降险": 3.11, + "筹码挂嘴边式第三方威慑锚定": 3.56, + "拟人化道具独白式规则灌注": 3.78, + "新闻播报式闹剧事件确认": 3.11, + "宿主梦境式欲望外泄落点": 2.0, + "亲密搭档冒充家长式谎言托管": 3.44, + "计划外变量即时消解式伏笔偷换": 3.33, + "剧透先知式选项四象限抉择可视化": 3.33, + "路线研究借口式职务身份脱敏注入": 3.44, + "面部肌肉即时复位式警觉伪装": 2.67, + "敌意阈值即时外化式内心杀意标定": 3.11, + "路人搭讪道具借用式情报截流": 2.67, + "首镜胖瘦差式肉身身份确认": 3.33, + "数字自算式减重目标具象化": 3.22, + "数值面板首秀式身份自证": 4.0, + "苦主自嘲式绝境降压对冲": 3.67, + "回望式时间线降维处境评估": 3.33 +} \ No newline at end of file diff --git a/.claude/skills/review-cards/golden/金标准-主编-2026-07-13.md b/.claude/skills/review-cards/golden/金标准-主编-2026-07-13.md new file mode 100644 index 0000000..54f1e56 --- /dev/null +++ b/.claude/skills/review-cards/golden/金标准-主编-2026-07-13.md @@ -0,0 +1,42 @@ +# 金标准评审 · 资深主编视角(opus,2026-07-13,对象=试拆 19 卡) + +> 校准基准。视角=可复制性与指导价值:这卡进知识库是资产还是噪声。 + +## 逐卡(卡名 | 成立性 | 可用性 | 可参考性 | 判词) + +1. 延时应答式洗脑成功伪装 | 4 | 3 | 2 | 内核"给敌人一个他愿意信的解释"真本事;被场景焊死,名字像黑话 +2. 面瘫外化式心绪对冲可视化 | 3 | 2 | 2 | 烂大街手法包装成术语;照着写只会更套路,与12/13撞车 +3. 未来时态回望式处境降险 | 3 | 2 | 2 | 与19同书重复;AI学了会写出没有风险感的软场面 +4. 筹码挂嘴边式第三方威慑锚定 | 3 | 3 | 2 | "人质当悬而未发的枪"起了唬人名字;"隔两章以上"数字是编的 +5. 拟人化道具独白式规则灌注 | 4 | 4 | 3 | 少见的好卡——反 info-dump 真手艺,能跨题材 +6. 新闻播报式闹剧事件确认 | 4 | 4 | 3 | 真手艺+这批最好的摘要(通用机制而非剧情复述) +7. 宿主梦境式欲望外泄落点 | 2 | 2 | 1 | 一次性搞笑桥段供成范式,纯噪声,垫底 +8. 亲密搭档冒充家长式谎言托管 | 3 | 3 | 2 | 真价值是堵叙事硬伤;卡名让检索找不到它解决的问题 +9. 计划外变量即时消解式伏笔偷换 | 3 | 3 | 2 | 内核对;卡名绕到没人读得懂,好东西埋在黑话里 +10. 剧透先知式选项四象限抉择可视化 | 4 | 3 | 3 | 真手艺但"四象限"名不副实 +11. 路线研究借口式职务身份脱敏注入 | 3 | 3 | 2 | 内核简单却起了数据脱敏式黑话名,检索灾难 +12. 面部肌肉即时复位式警觉伪装 | 2 | 2 | 2 | 面瘫内心戏第三次分身,一秒僵硬供成范式 +13. 敌意阈值即时外化式内心杀意标定 | 3 | 3 | 2 | 有点东西但名字中二,与2/12撞 +14. 路人搭讪道具借用式情报截流 | 3 | 3 | 2 | 藏了真规矩"借的道具必须场景内还清";整卡被具体场景焊死 +15. 首镜胖瘦差式肉身身份确认 | 4 | 3 | 3 | 价值在"别念体检报告"的失败模式不在手法本身 +16. 数字自算式减重目标具象化 | 3 | 3 | 3 | 真原理被减肥场景锁死,卡名太窄埋没通用价值 +17. 数值面板首秀式身份自证 | 4 | 4 | 3 | 分析扎实失败模式真干货——这批的资产卡 +18. 苦主自嘲式绝境降压对冲 | 3 | 3 | 2 | 失败模式(吐槽带优越感让主角失温)比手法本身值钱;与2重叠 +19. 回望式时间线降维处境评估 | 2 | 3 | 2 | 第3卡分身;唯一增量"先知必须逐步失灵"是真规律,可惜埋在重复卡里 + +**资产卡**:5、6、17(其次 10、15、16)。**噪声卡**:7、12(毙掉或降级用例),3/19、2/18 需合并。 + +## 系统性问题 + +1. 命名黑话化+场景焊死=检索死:"XX式YY化ZZ"堆叠既非行业术语检索者又猜不到用途;一句话摘要多复制"定位"=剧情复述而非通用手法陈述——资产变噪声头号原因 +2. 把偶然当规律+伪精确:一句带过的桥段抬成装置,配编造的间隔数字写得像铁律——false precision 最危险 +3. 同一手法反复分身冒充多个范式:19 张去重后只有 10–12 个独立技法 +4. "公共范式"名不副实:5 本全是男频穿越/系统/机甲一条赛道,很多是子类型语气癖;多张语气卡照做会主动泄掉紧张感——可用性为负 +5. 卡里最值钱的是"失败模式"不是"手法":干货几乎都在失败模式字段,说明拆书 prompt 抓错重心——擅长复述发生了什么,不擅长提炼可迁移原则 +(附 schema 问题:埋设/履约/间隔是伏笔专用框架,半数卡不是伏笔,硬塞=拿一种规范套另一种规范) + +## prompt 改进建议 + +1. 强制"迁移测试"砍场景专名:先写出"这技法在完全不同题材(都市悬疑/古装宫斗)怎么用",写不出=不是范式,打回或降级"用例";摘要固定模板「何时用+怎么做+读者得到什么」且禁止复制"定位" +2. 两阶段产卡先聚类去重再出卡;整顿装置类型标签(禁"信息差"这种覆盖 11/19 的万能标签当主标签;标签词表与卡名解耦) +3. 翻转重心:每卡强制 (a)可迁移因果原则「当X做Y因为读者会Z」(b)触发条件(什么场景该检索到它)(c)至少一个滥用反例;砍掉编造的章节数字(数不出真实间隔就只许定性) diff --git a/.claude/skills/review-cards/golden/金标准-番茄作家-2026-07-13.md b/.claude/skills/review-cards/golden/金标准-番茄作家-2026-07-13.md new file mode 100644 index 0000000..5dfc347 --- /dev/null +++ b/.claude/skills/review-cards/golden/金标准-番茄作家-2026-07-13.md @@ -0,0 +1,40 @@ +# 金标准评审 · 顶级番茄作家视角(opus,2026-07-13,对象=试拆 19 卡) + +> 校准基准:M3 审核 skill 的评分应与此对齐。视角=爽点节奏/读者留存/商业性。 + +## 逐卡(卡名 | 成立性 | 可用性 | 可参考性 | 判词) + +1. 延时应答式洗脑成功伪装 | 3 | 3 | 2 | 真招被埋在原书剧情里,一次性妙笔换本书用不上 +2. 面瘫外化式心绪对冲可视化 | 4 | 4 | 3 | 面瘫吐槽是真手艺,节奏能落笔——可惜和第13张严重重叠 +3. 未来时态回望式处境降险 | 4 | 4 | 4 | 穿越者先知降压成立且通用——但与第19张同招换皮 +4. 筹码挂嘴边式第三方威慑锚定 | 4 | 4 | 3 | 硬通货范式,但字段塞了"海拉/探望权"专名泄漏 +5. 拟人化道具独白式规则灌注 | 4 | 4 | 3 | 反设定灌输真经验——"千亿夸克"原书数字漏进字段 +6. 新闻播报式闹剧事件确认 | 3 | 3 | 3 | 路子对但摘要与字段各说各话,绑死原书梗 +7. 宿主梦境式欲望外泄落点 | 2 | 2 | 2 | 过度解读典型,"YY指标"没法指导落笔 +8. 亲密搭档冒充家长式谎言托管 | 4 | 3 | 3 | 解决"少年主角没人管"真痛点,但名字绕口核心没提干净 +9. 计划外变量即时消解式伏笔偷换 | 3 | 3 | 3 | 伏笔术成立但绑在换婴情节上,自造装置分类 +10. 剧透先知式选项四象限抉择可视化 | 3 | 3 | 3 | "四象限"是AI硬套的伪精确,先知系列扎堆 +11. 路线研究借口式职务身份脱敏注入 | 4 | 3 | 4 | 通用谍战范式迁移性好——名字像技术黑话 +12. 面部肌肉即时复位式警觉伪装 | 3 | 3 | 2 | 与第1张同族,攒一起就是灌水 +13. 敌意阈值即时外化式内心杀意标定 | 4 | 3 | 3 | "留白本身成为信息"真手艺——装置类型自曝与第2张重复 +14. 路人搭讪道具借用式情报截流 | 2 | 2 | 2 | 场景小动作拆成理论,过度解读 +15. 首镜胖瘦差式肉身身份确认 | 4 | 4 | 4 | 套路但真好用,本批少见能直接抄 +16. 数字自算式减重目标具象化 | 4 | 4 | 3 | 内核(量化驱动行动感)能迁移 +17. 数值面板首秀式身份自证 | 5 | 4 | 4 | 最硬的通用范式,契约意识专业 +18. 苦主自嘲式绝境降压对冲 | 5 | 4 | 4 | 齐佩甲招牌+留人利器+给了频控——本批最值钱 +19. 回望式时间线降维处境评估 | 4 | 4 | 4 | 比第3张好(先知逐步失灵制造反压)——留这张删第3张 + +## 系统性问题 + +1. 近义卡没去重,检索自我稀释(先知降压 3/19/10、面瘫外化 2/12/13、微表情复位 1/12) +2. 把"一次性妙笔"误当"可复用范式"(7/14/1)——红线:换一本书还成立、还能指导落笔吗 +3. 命名和字段全是 AI 黑话且信息冗余(埋设手法与履约方式互相复述摘要) +4. 出处细节漏进抽象层破坏跨书复用(海拉/千亿夸克/我老大天老二/专名数字梗) +5. 只见文学装置不见读者爽感 + 采样偏科开局(打脸/升级/扮猪吃虎/反转中段引擎零覆盖) + +## prompt 改进建议 + +1. 先建"技法指纹"再出卡强制归并:指纹相同合并成母卡+多出处实例;全书拆完跑跨章聚类去重 +2. 加"换书测试"闸门+强制占位符:抹掉专名数字还成立才进公共库;字段只许占位符(角色A/敌方/某设定) +3. 补"读者收益"栏(代入/掌控/期待/打脸/意外/装逼)+采样扩到中段爽点 +4. 命名用作者黑话短名("先知降压""面瘫吐槽""照镜确认""面板开局"),长名降级副标题 diff --git a/.claude/skills/review-cards/golden/金标准-起点作家-2026-07-13.md b/.claude/skills/review-cards/golden/金标准-起点作家-2026-07-13.md new file mode 100644 index 0000000..46f27d6 --- /dev/null +++ b/.claude/skills/review-cards/golden/金标准-起点作家-2026-07-13.md @@ -0,0 +1,43 @@ +# 金标准评审 · 起点白金作家视角(opus,2026-07-13,对象=试拆 19 卡) + +> 校准基准。视角=长篇结构工艺:伏笔埋收距离/信息差维护成本/装置与主线耦合度。 + +## 逐卡(卡名 | 成立性 | 可用性 | 可参考性 | 判词) + +1. 延时应答式洗脑成功伪装 | 4 | 3 | 3 | "伪装挂在敌方已知标签反面"真高级工艺;失败模式表述拧巴,命名太贴设定 +2. 面瘫外化式心绪对冲可视化 | 4 | 4 | 3 | 表里双轨反差真本事;但是场景级跑梗不是埋收装置,硬套伏笔框架 +3. 未来时态回望式处境降险 | 4 | 3 | 2 | 工艺真实;与 #19 几乎同卡、与 #18 同源,间隔建议自相矛盾 +4. 筹码挂嘴边式第三方威慑锚定 | 5 | 4 | 4 | 全批最扎实之一——"不兑现的持续威慑",两条失败模式都真,可迁移 +5. 拟人化道具独白式规则灌注 | 4 | 4 | 4 | 对治 AI 设定倾倒很有用;但"信息差"标签不成立(主角读者同步获知) +6. 新闻播报式闹剧事件确认 | 3 | 2 | 3 | 真喜剧工艺但卡自相打架(定位与摘要矛盾、现编标签、两对埋收混一团) +7. 宿主梦境式欲望外泄落点 | 3 | 2 | 2 | 唯一真货"用意象承载内心状态";间隔纪律照抄原文段落结构换书即废 +8. 亲密搭档冒充家长式谎言托管 | 5 | 4 | 4 | 真结构工——"谎言必须有到期日"是白金级提醒 +9. 计划外变量即时消解式伏笔偷换 | 5 | 4 | 4 | 高级货:埋近收远双层伏笔+"反对旁白补完",全是真伏笔纪律 +10. 剧透先知式选项四象限抉择可视化 | 4 | 4 | 3 | "被放弃的选项作伏笔总账"真巧思;命名撒谎(没有象限) +11. 路线研究借口式职务身份脱敏注入 | 4 | 4 | 4 | 直击信息差维护成本;命名黑话拖后腿 +12. 面部肌肉即时复位式警觉伪装 | 4 | 3 | 3 | "微表情伏笔+别用独白填死留白"真本事;身份错认标签乱贴 +13. 敌意阈值即时外化式内心杀意标定 | 4 | 3 | 3 | "未执行本身成为信息"高级;拿别的卡名当装置分类,标签近亲繁殖 +14. 路人搭讪道具借用式情报截流 | 4 | 3 | 3 | 真调度技巧;但是场景走位不是伏笔装置,"间隔纪律"只是单场闭环 +15. 首镜胖瘦差式肉身身份确认 | 3 | 3 | 2 | 反面警告有用;装置类型自打耳光(卡名"确认"标签"错认") +16. 数字自算式减重目标具象化 | 3 | 3 | 3 | "清单即承诺"内核成立;信息差标签硬错(算自己体重哪来信息差) +17. 数值面板首秀式身份自证 | 5 | 4 | 3 | 最强之一——"面板首秀=为后续数值机制铺契约",三条失败模式全干货,标签少见全对 +18. 苦主自嘲式绝境降压对冲 | 5 | 4 | 3 | 降压 family 最好一张:失败模式全锋利+给了节奏;与 #3 #19 三卡同功 +19. 回望式时间线降维处境评估 | 5 | 3 | 3 | "先知逐步失灵制造反压"是全批最锋利一句、真白金结构;但与 #3 同卡且粒度错(全书级决策塞进场景卡) + +## 系统性问题 + +1. 去重失败同书同功卡扎堆:超神独占 7 张(3/18/19 三卡同功);12/13 同章同族;15/16 同书同题——应按功能合并,取各卡最锋利的失败模式并入 +2. 装置类型标签体系混乱通胀乱贴:信息差滥用到不成立处、现编标签、拿卡名当分类——标签集合没有闭合定义 +3. 框架硬套:场景级语气/走位技巧塞进"埋设—履约—间隔"伏笔框架,逼出照抄原文的伪纪律——伏笔卡和场景手法卡应用不同字段模板 +4. 抽象度两极分化:贴死情节换书即废的偏多;可迁移内核被埋在书专属外壳下,检索命不中 +5. 伏笔卡普遍缺"回收点+记忆维持"(reminder 节奏)这一环——长篇伏笔的真正成本所在;失败模式质量参差说明该字段没有统一检验标准 + +## prompt 改进建议 + +1. 装置类型闭合枚举+每类一句判定测试(信息差=必须存在角色A知道而B/读者不知道的明确落差;契诃夫之枪=预先可见放置+后续引爆,一次性道具不算;身份错认=必须有人把A当成B)——不满足任何一类宁可标"场景手法(非装置)" +2. 拆成两类卡模板:结构型伏笔卡强制三件套(埋点/回收点/隔章记忆维持);场景型手法卡改填(复用节奏/异质化要求/每章上限) +3. 命名强制"手法内核在前、书专属外壳只进出处";拆完一本跑一次同书按功能去重关 + +## 一句话总结 + +强的极强(4/8/9/17 白金货),弱的贴死原书(6/7/15 换书即废),中间一大批被"标签乱贴+同功重复+框架硬套"拖累。先修标签判定和去重,整体抬一个档。 diff --git a/.claude/skills/review-cards/scripts/review_cards.py b/.claude/skills/review-cards/scripts/review_cards.py new file mode 100644 index 0000000..a5f8e61 --- /dev/null +++ b/.claude/skills/review-cards/scripts/review_cards.py @@ -0,0 +1,153 @@ +#!/usr/bin/env python3 +"""review-cards skill:公共知识卡三角色审核(拆书流程常设步骤,MiniMax-M3 执行)。 + +创始人拍板(2026-07-13):审核是流程内可复用资产——放量时每批卡由 M3 扮演 +番茄作家/起点作家/主编三角色审核;fable/opus 只在起量前校准本 skill 质量 +(金标准见 golden/),起量后做一次总审核。 + +流程:三角色各一次 M3 调用(全批卡)→ 三组评分汇总 → 判定(pass/revise/reject) +→ 写回 draft_payload.审核 节(可追溯)。--calibrate 与 golden 金标准对照输出一致性。 +""" +import json +import pathlib +import statistics +import sys + +import click +import psycopg + +sys.path.insert(0, str(pathlib.Path(__file__).resolve().parents[2] / "llm" / "scripts")) +from llm import chat, extract_json # noqa: E402 + +DSN = ("postgresql://root:f6710e2d0294eb1c10e26a805a64bc54@100.64.0.8:5433/muse-example" + "?keepalives=1&keepalives_idle=15&keepalives_interval=5&keepalives_count=3") +TENANT, ACTOR = 1, "1" +GOLDEN = pathlib.Path(__file__).resolve().parents[1] / "golden" + +# 三角色身份(与金标准评审同源) +ROLES = { + "番茄作家": "番茄小说网顶级畅销作家(多本10亿+在读爆款)。独特视角:爽点节奏、读者留存、商业性——这卡能不能帮 AI 写出让人上头的东西。", + "起点作家": "起点中文网白金作家(以结构工艺著称)。独特视角:长篇结构工艺——伏笔埋收距离、信息差维护成本、装置与主线耦合度。", + "主编": "头部网文平台资深主编(二十年审稿)。独特视角:可复制性与指导价值——这卡进知识库是资产还是噪声;最懂垃圾写作课的套路话术。", +} + +# 统一判定闸(自 opus 金标准三评审蒸馏的共性红线) +CRITERIA = """审查判定要点(每张卡都过一遍): +1. 换书测试:抹掉书名/专名/具体数字,换一个完全不同题材(都市悬疑/古装宫斗),这卡还成立、还能指导落笔吗?不成立=一次性妙笔而非范式; +2. 命名黑话检测:卡名是"作者会说的话"还是"XX式YY化ZZ"的 AI 修饰语堆叠?摘要是通用手法陈述还是原书剧情复述? +3. 标签判定:装置类型是否乱贴(信息差=必须存在角色A知道而B/读者不知道的落差;契诃夫之枪=预先可见放置+后续引爆;身份错认=必须有人把A当成B); +4. 伪精确检测:"隔两章以上"这类数字是从原文数出来的还是编的?编的=危险的 false precision; +5. 同功重复:与本批其他卡是否同一手法换皮(先知降压/面瘫外化这类 family); +6. 干货位检查:失败模式字段是否比手法本身更值钱(是→说明手法总结空洞); +7. 专名泄漏:字段里出现原书人名/地名/数字/梗=破坏跨书复用。""" + +REVIEW_PROMPT = """你是{role_desc} + +背景:muse 是 AI 长篇创作系统,从经典网文拆出「公共范式卡」,未来 AI 写新书时检索这些卡作写作参考。你负责质量审核:内容是否成立、AI 创作时是否可用、是否可参考(跨书复用)。 + +{criteria} + +下面是本批 {n} 张卡(JSON)。逐卡评分(1-5 整数)并给一句毒舌判词。 +输出规则(只输出一个 JSON 对象): +{{"reviews": [{{"name": "卡名", "cheng": 成立性, "yong": 可用性, "can": 可参考性, "verdict": "一句话判词"}}], "overall": "本批系统性问题一句话"}} + +【卡片】 +{cards}""" + + +def load_cards(conn, work_id=None): + sql = """SELECT id, draft_payload FROM muse_knowledge_draft + WHERE tenant_id=%s AND source_type='parse_book' AND deleted=FALSE""" + args = [TENANT] + if work_id: + sql += " AND source_id=%s" + args.append(work_id) + return conn.execute(sql + " ORDER BY id", args).fetchall() + + +@click.group() +def cli(): + """公共知识卡三角色审核(M3 常设步骤)""" + + +@cli.command() +@click.option("--work-id", type=int, help="只审该书的卡;不给则全部") +@click.option("--batch", required=True, help="审核批次号") +@click.option("--model", default="MiniMax-M3", show_default=True) +@click.option("--dry-run", is_flag=True, help="只打印不写库") +def review(work_id, batch, model, dry_run): + """三角色审核并写回 draft_payload.审核 节。判定:均分≥3.5 pass / ≥2.5 revise / 其余 reject。""" + with psycopg.connect(DSN) as conn: + rows = load_cards(conn, work_id) + if not rows: + click.echo("无待审卡") + return + cards_json = json.dumps([r[1] for r in rows], ensure_ascii=False, indent=1) + all_reviews = {} + for role, desc in ROLES.items(): + content, usage = chat(REVIEW_PROMPT.format( + role_desc=desc, criteria=CRITERIA, n=len(rows), cards=cards_json), model=model) + data = extract_json(content) + all_reviews[role] = {r["name"]: r for r in data.get("reviews", [])} + click.echo(f"[{role}] 评 {len(data.get('reviews', []))} 卡 " + f"(in={usage.get('prompt_tokens')}) 总评: {data.get('overall', '')[:80]}") + # 汇总判定并写库 + stats = {"pass": 0, "revise": 0, "reject": 0} + for cid, payload in rows: + name = payload.get("名称") + scores, per_role = [], {} + for role in ROLES: + r = all_reviews[role].get(name) + if r: + s = [r.get("cheng", 0), r.get("yong", 0), r.get("can", 0)] + scores += s + per_role[role] = {"分": s, "判词": r.get("verdict", "")} + if not scores: + continue + avg = round(statistics.mean(scores), 2) + verdict = "pass" if avg >= 3.5 else ("revise" if avg >= 2.5 else "reject") + stats[verdict] += 1 + click.echo(f" {verdict:6s} {avg} 《{name}》") + if dry_run: + continue + payload["审核"] = {"批次": batch, "模型": model, "均分": avg, + "判定": verdict, "角色": per_role} + conn.execute("UPDATE muse_knowledge_draft SET draft_payload=%s, updater=%s WHERE id=%s", + (json.dumps(payload, ensure_ascii=False), ACTOR, cid)) + if not dry_run: + conn.commit() + click.echo(f"审核完成: pass {stats['pass']} / revise {stats['revise']} / reject {stats['reject']}" + + ("(dry-run 未写库)" if dry_run else "")) + + +@cli.command() +@click.option("--work-id", type=int, help="限定书") +@click.option("--batch", required=True, help="要对照的审核批次号(先跑 review)") +def calibrate(work_id, batch): + """与 golden/scores.json 金标准对照:输出逐卡偏差与整体一致性(起量前校准用)。""" + golden = json.loads((GOLDEN / "scores.json").read_text()) # {卡名: 金标准均分} + with psycopg.connect(DSN) as conn: + rows = load_cards(conn, work_id) + diffs, lines = [], [] + for _, payload in rows: + name = payload.get("名称") + audit = payload.get("审核") or {} + if audit.get("批次") != batch or name not in golden: + continue + g, m = golden[name], audit["均分"] + diffs.append(m - g) + lines.append((abs(m - g), f" Δ{m - g:+.2f} M3={m} 金={g} 《{name}》")) + for _, ln in sorted(lines, reverse=True): + click.echo(ln) + if diffs: + click.echo(f"对照 {len(diffs)} 卡:平均偏差 {statistics.mean(diffs):+.2f}," + f"平均绝对偏差 {statistics.mean(map(abs, diffs)):.2f},最大 {max(map(abs, diffs)):.2f}") + click.echo("校准合格线(拍板前建议):平均绝对偏差 ≤0.5 且无 ≥1.5 的单卡背离") + + +if __name__ == "__main__": + try: + cli() + except (psycopg.Error, RuntimeError) as e: + click.echo(f"[错误] {type(e).__name__}: {e}", err=True) + sys.exit(1) diff --git a/README.md b/README.md index d0e2d7a..d4e6961 100644 --- a/README.md +++ b/README.md @@ -228,7 +228,9 @@ flowchart LR - **opus 试拆基准(workflow 已完成)**:机动风暴 1–3 章,范式卡 2 张入库(ch2/ch3 各 1 拒 1 越合同)+ch1 脚手架;opus 也犯 JSON 中文引号/缺逗号病(已被 llm skill 容错吸收)。此产物只作 M3 对比基准,不算正式拆书。 - **P2 全语料清洗收口(2026-07-13)**:8 书全清(门①创始人放行)——总删 1,685 段/约 6.1 万字(机破星河 2.4 万/机战无限 1.9 万/超神 0.6 万…),审计全在 example_clean_log(批次 P2-20260713 主删 + fix/fix2/fix3 补删 + P2-sweep 高频水印收割),全库空行归一 8,786 章。守卫体系放量长成:行级垃圾特征+书名豁免+水印裁剪+20%顶带下限+敏感窗备选模型降级(见 clean/SKILL.md)。误删实测 1 例 3 字已修复。已知残留待拍:机动风暴「重贴章题+(第N更 求月票)」嵌正文行变体(求票嫌疑 270 处主源)、感言/请假条整章、作者疲劳话散句。 - **B2 试拆收口(2026-07-13,门②已呈报)**:5 本×前 3 章 M3 直调完成——scaffold 15/15 全过(绝对字数上限+压缩重试对症后,细纲 2.9%–7.8%);范式卡三轮迭代后活卡 19 张(样张 `docs/试拆-门②样张.md`,opus 同章基准 `docs/试拆-opus基准-机动风暴.md`)。**M3 三病理已档**:①归型偏科——内容有型区分但 type 一律标 craft,prompt 两轮矫正无效,字段指纹改型又被「串型混填」挫败(一卡混两型字段);②重跑自噬——判重名录含本章旧卡+幂等软删+LLM 随机性组合损耗(已修:名录排除本章+0 卡不软删);③偶发脱敏违规/source 偷懒(守卫拦对+机械回填治)。 -- **未决**:①门② 试拆样张质检+craft 偏科处理方向(B4 环迭代 / 分型单 pass / 接受先行)②B2 放量(硬停,等创始人新指令)③机动残留变体与感言章处理方式。 +- **拆书流程增补(2026-07-13 创始人拍板+落地)**:①**窗级大纲聚合**——大纲不从单章抽(单章对大纲层可能零贡献),5–10 万字窗(多章细纲+正文)聚合一次,整本完后拿全体细纲终检(parse_outline.py + 93 表);②**三角色审核常设步骤**——番茄作家/起点作家/主编审核公共卡(成立性/AI 可用性/可参考性),**M3 执行**(review-cards skill);fable/opus 只做起量前校准+起量后总审核。校准已过:opus 三评审金标准入 golden/,M3 对照平均绝对偏差 0.45(合格线 0.5),四大系统病独立复现。首批 19 卡 M3 判定 pass 5 / revise 10 / reject 4。 +- **金标准评审结论(拆书 prompt 的 B4 改造清单,见 review-cards/SKILL.md)**:同功 family 撞车(19 卡实为 10–12 个独立技法)、命名黑话+专名泄漏、伪精确数字、伏笔框架硬套场景手法、失败模式才是干货位、采样偏科开局——七条改进已档,B4 环实施。 +- **未决**:①B2 放量(硬停,等创始人新指令;放量流程四步已固化=两 pass→窗大纲→终检→M3 审核)②B4 按金标准清单改造拆书 prompt/schema(craft 偏科等病的根治层)③机动残留变体与感言章处理方式。 - **教训入档**:StructuredOutput 工具 schema 属性名仅限 ASCII(中文键 API 400)——schema ASCII 键+入库脚本键名归一;Tailscale 长事务需 keepalive+批量写(逐行两万往返曾半死 16 分钟)。 ## 九·旧(2026-07-10 快照,留档)