Repository navigation
Releases: cong7781/novel
Releases · cong7781/novel
Release list
0.3.0 — 合并与命名、大图显示、宿主适配器
第二轮改动,来自一次 45 万字真实长篇小说的运行(135 个角色 / 625 条关系)。暴露的是合并与命名的问题,不是能不能跑。
所有数字都来自 --resume 重算同一批分块(0 次模型调用),可复现。
修复:合并与命名(可信度)
- 规范名不再被最短标签抢走。 旧实现用纯子串计数投票:一个全名里包含短名时,短名会把全名的每一次出现都算成自己,
于是节点名变成那个短名,并挂上一长串别名。现在按独立出现计数(被同簇更长名字覆盖的出现不计),
再按「独立出现数 → 文中首次出现 → 更长拼写」定名,节点显示的是读者认得的完整名字。 - 别名吸收需要证据。 只有三种情况允许把某个名字并进另一个人:拼写变体(短名是长名的一部分)、双向声称
(两个名字互相把对方列为别名)、或该名字本身几乎不单独出现。否则拒绝合并、保留两个节点,并写进merge-report.json,
不会再出现「把一个人静默并进另一个人」。 - 同块共现仍是硬否决:两个名字在同一块里作为不同人物出现过,就永不合并(父子、两个真人的情况)。
- 泛称不再当人物。 ~140 个身份/集体名词(护士、老板、中年人、船员们…)+ 「们」「…的人」规则;
这次运行剔掉 49 个,牵连的边计入dropped: generic-name,页面上写清计数和例子。 - 每个合并决定落盘:
out/runs/<run>/merge-report.json(节点独立出现次数、拒绝合并清单及原因、泛称、存疑组)。
修复:大图显示(人一多就成毛线)
- 每对人物只画一条线:同一对的多条证据不再叠成多条线,画一条(最强证据着色,额外节拍加粗),证据仍在两人面板里逐条列出。
- 默认只画出场最多的 40 人,「运行与技术信息 → 显示」可切 20 / 40 / 80 / 全部;布局按当前可见的人重新填满画布。
- 节点与文字随人数缩小:半径
23 × √(20 / 人数)(98 人时约 10px),字号 8–12px。 - 标签贪心避让:会与已放标签重叠的先不显示,选中的一定显示。
- 密集时边降噪:超过 80 / 160 条时整层透明度降到 0.55 / 0.42;选中两人时其余自动退到背景。
- 卡片上限 40 人并写明「共 98 位,N 位未画」;
?run=<目录名>直接打开某次历史运行。
修复:宿主适配器(真实会话里才会遇到的)
- 从
ctx.llm流里读真实 usage(tokens.estimated: false),不再按字符数估算。 - 模型只回空正文(思考过程吃掉了输出额度)时,按 2× 预算重试,最终给出说明「其中 N tokens 是思考过程」的报错。
- 角色扫描预算 900 → 2048。
- RAG 计划为空时不再报「所有 0 个分块失败」,改为分因报错(扫描全失败 / 没认出角色 / 没有候选块)。
esbuild在受限沙箱里无法 spawn 时,build-viewer.mjs回退到内联打包(页面仍自包含)。
数据契约
nodes[].independent(独立出现次数)。stats.genericDropped、stats.genericExamples、stats.aliasRefusals、stats.pairCapTop、stats.mergeReport。
实测(同一份 45 万字文本)
| 0.2.0 | 0.3.0 | |
|---|---|---|
| 角色 / 关系 | 135 / 625 | 98 / 539 |
| 泛称作节点 | 17+ | 0(49 个被剔除) |
| 节点命名 | 短名抢走命名,带一长串别名 | 完整名字(短名降为别名) |
| 错误合并 | 会把一个人并进另一个人 | 拒绝并记录(aliasRefusals) |
| 逐字证据通过率 | 100% | 100%(核对失败 0 条) |
100k 字合成文本回归:12 角色 / 159 边 / 100% 通过,与 0.2.0 一致。
已知代价
- 保守合并会拆开「正式名和常用名都高频出现」的同一个人(本次运行出现 2 例):原文没有「本名/真名」式的句子,
无法自动证伪,所以拆开而不是并错;两者都记录为 refusal / suspect,可在merge-report.json里逐条核对。
想要更激进的合并可以调lib/merge.js的CHARACTER_ALIAS_LIMIT,或后续加人工白名单。 - 未做:
其他关系占比偏高(26%)、前缀缓存未优化(每块 user 消息开头就是可变序号)、
宿主工具产物仍在%TEMP%、工具结果还没有warnings[]。
0.2.0 — 首个公开版本(60 万字 RAG 抽取)
首个公开版本。
- 滑动窗口分块(3,500 字/块、12% 重叠)+ 逐块抽取 + 逐块逐字证据闸门 + 全局合并。
- 5 万字以上先扫角色表,再用 BM25 字 bigram 检索挑候选块做精细抽取(不依赖 embedding 接口)。
- 中间产物落盘(
blocks/*.json、cast.json、plan.json、result.json)与断点续跑。 - 60 万字全量实测:195 块 / 207 次调用 / 664k 输入 tokens / $0.42 / 118s(并发 6),证据通过率 100%。
- 独立查看器:任务式进度、成本与丢弃原因面板、「这两个人之间的情节」原文检索、历史产物切换。