8.0 KiB
Raw Blame History

name: parse-book description: 全书解析/拆书的功能合同(scenario: full_parse,分析槽位)。存量作品→规划逆向(大纲/细纲)+实体;参考书再加范式拆取(脱敏)。逐章内环复用 extract-knowledge。 disable-model-invocation: true

全书解析/拆书(scenario: full_parse | purpose: extraction | 槽位: 分析→extractor)

何时用:没拆过的完整/存量作品。与章后抽取(extraction)的分工:那边是"已有大纲细纲、写新章后抽增量";这边是"什么都没有,从全文逆向解析出规划层与知识面"。

两个子场景(产出归属不同)

子场景 产出 归属与确认
2a 用户存量作品(U7/C8) 章节结构+逐章细纲+全书大纲+实体/关系/事件+末章 narrative_state 全为候选,按章审阅确认(产品-03 §3.7);确认后成正式规划与 Local KB,作品才可续写;脱敏红线不适用自有稿
2b 系统参考书(G3/B1-B2,如封神演义) 同上解析产物作中间脚手架(拆书证据链,留档、不需逐章确认)+在脚手架上拆范式五型 范式卡(脱敏)入 Global,管理员确认=G3 门;脚手架标 internal

范式五型也是 entity-scope 的型,但与作品实体分两批:作品实体归 Local、范式归 Global 且吃脱敏红线。

元数据驱动

  • 规划逆向的结构=outline/chapter/scene/narrative_state 字段合同;实体=各实体型字段合同;范式=五型字段合同+「判据」归型——schema 加字段,解析产出立刻多一列。
  • 「细纲」是本仓先行的规划粒度层级(SoT 只有"正式规划项"),连同规划逆向本身都是对产品-03 §3.7 的增补(SoT 全书解析只列章节/实体/关系/事件)——待回填。

编排形态(拆书不是"一个 agent 跑到底")

一本完整的书=成百上千次顺序调用,单个 agent 的上下文装不下也不该装。分层:编排层是 workflow(确定性:分章循环/断点续跑/入库/进度统计——阶段一由主会话或 Workflow 工具驱动,阶段二=muse 功能链+任务调度);循环体才是 agent(extractor 的一次有界任务:输入=第 N 章原文+库里积累的脚手架,输出=本章细纲+实体增量,写回库)。关键约束:

  • 状态全在库,不在会话:前 N-1 章的细纲/实体是第 N 章的上下文,必须从库读——这正是 PG 基座先行的原因;
  • 断点续跑与幂等:已处理章号落库,重跑某章=按章号覆盖其 draft 行,随时可停可续;
  • 顺序性只来自增量判重(新实体要对着已积累实体判重合并),细纲逆推本身章间独立——先顺序跑保正确,并行化留作后续优化;
  • 进度每 10 章报一行(章号/新实体数/累计分型统计)。

M3 直调形态(创始人 2026-07-13 拍板,现行):循环体不再派 opus/haiku 子代理,改为 scripts/parse_llm.py 直调 New-API MiniMax-M3(经 llm skill)。

出卡权上移窗级(B4-S3 重构,现行):章级逐章出卡有三同根病(同功撞车/单章证不成跨章公式/间隔数字伪精确),治法=章级只产「范式候选线索」(并入脚手架 pass,正文只过一遍),出卡在窗级聚类归并——同一手法多章多次出现归并成一张母卡+实例章号,间隔章数由实例章号差机械计算(M3 禁自报数字)。跨窗/跨书同手法靠嵌入判重(初筛 ≥0.85 → M3 归并终判 merge/keep,拿不准保留)。大纲窗行(example_parse_outline,幂等键=窗起始章)是出卡窗的唯一切分依据。

放量全流程(每书五步,均 M3):

# ① 章级 pass(细纲+实体+范式候选线索;断点续跑,重跑自动补失败章)
.venv/bin/python .claude/skills/parse-book/scripts/parse_llm.py chapters --work-id 4 --from 1 --to 50
# ② 窗级大纲聚合(每 5–10 万字:多章细纲+正文→阶段大纲;书末残窗无论大小必成窗)
.venv/bin/python .claude/skills/parse-book/scripts/parse_outline.py window --work-id 4
# ③ 窗级聚类出卡(窗=②的窗行;线索+细纲+阶段大纲→母卡;守卫+判重在 parse_ingest cards)
.venv/bin/python .claude/skills/parse-book/scripts/parse_llm.py cards --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 且串型混填(治=合同动态渲染+字段指纹改型+窗级聚类);重跑自噬(治=窗级幂等软删+0 卡不软删,章级判重名录已随 S3 废除);source 偷懒(治=出处由实例机械生成)。parse_ingest 的 patterns 命令是 S3 前章级出卡入口,仅留作回滚保险。

窗行陷阱(放量首日实测):--window 参数变化后重切,旧窗行会按 from_order 占位,新的大窗被「已有大纲跳过」→ 中间章域永远漏出卡(验收期 1–3 章小窗占住 from_order=1,放量 1–34 章大窗被跳过)。换窗参数重切前必须先删该书全部窗行(窗行是可再生中间产物;卡挂「窗起」,cards 重出时按窗软删重出)。

作品面升格执行器 scripts/parse_upgrade.py(与上面范式拆书管线并行的另一条线,命令 windows/run/status):把参考书正文按窗抽成「会随剧情长大的实体卡」(升格卡,source_type=upgrade_book),设计见 docs/2026-07-16-升格卡改造设计.md。run 默认不发嵌入;加 --semantic-dedup 开语义判重(治改名/跨型漏并)时,每窗按读→算→写三段式短连接跑——观察/近邻召回/M3 终判都在无长连接段发 LLM 与嵌入 HTTP(不再持窗级连接跨调用存活),写段只查预判结果落库;并边抽边嵌:本窗新建/更新卡在窗事务提交后增量嵌入落库(软删旧向量+upsert 新行),后窗即可语义召回前窗刚长成的卡,不再依赖"同书须预先全量 embed"。嵌段失败只告警、不牵连已 done 的窗。

步骤(自底向上,与创作期规划的自顶向下互为镜像)

  1. 静态分章:import skill(规则,LLM 不参与);
  2. 逐章内环——复用 extract-knowledge 的字段 checklist:逆推本章细纲(章目标/关键事件/出场/伏笔动作/钩子)+抽实体增量;上下文=前 N-1 章已积累的细纲与实体(知识库从空增量生长,作品+元数据+知识库+当前章公式在此逐章成立);
  3. 自底向上聚合:章细纲→卷粗纲→主线一句话;伏笔跨章连线(哪章埋哪章收)在聚合时补;
  4. 2a 补末章 narrative_state;2b 在脚手架上跑范式拆取(判据归型/字段成卡/判重合并例证);
  5. 汇报:分章数/细纲覆盖率/实体分型统计/(2b)范式分型统计+设计发现。

比例约束(防"摘要化伪装成结构化";创始人已拍板@2026-07-09,权威值在 outline schema 字段说明)

  • 章细纲/章正文 ≈ 3–5%(3000 字章→100–150 字);卷粗纲/卷正文 ≈ 0.3–0.5%;主线一句话 ≤50 字。
  • 细纲是结构骨架,不是缩写:超比例=机械退回重解析的判据——比例约束的价值不只是省 token,是防解析退化成压缩复述。

脱敏红线(仅 2b 系统级)

只写抽象结构与手法归纳,严禁抄录原文;≥15 连续字与原文重合=违规;每卡带出处(书名+回目+一句话情节定位)。

输出合同

文件版:2a 落 works/<书>/(候选);2b 脚手架落参考书目录、范式卡入 knowledge/范式/(草稿)。PG 版(B2):结构化清单经主会话 db skill 写入(draft)+embed 嵌入。均不提交/不自确认。