Repository navigation
Releases: wanqili857-byte/fictionforge
Release list
v0.4.2 · 外部交叉评审后的修复与一次公开订正
v0.4.2 · 外部交叉评审后的修复与一次公开订正
v0.4.1 之后,我们用自研的交叉审计工具 quorum 组织了一轮外部独立复核:三个审核员(kimi-k2.7-code / doubao-seed-2-1-pro / codex)各自独立进程、干净上下文、互不可见,审同一份工单与材料快照。
记录、逐条核验与修复计划:reviews/dispose.md(附三家原始结论与处置台账)。
🔴 致命:真跑批的生成路径是断的
call_model() 在 HTTP 200 时隐式返回 None——一次重构把解析块留在了 break 之后,成了死代码。任何真实生成在第一次成功调用后就 AttributeError。v0.4.1 带着一条断掉的生成路径发布,而 CHANGELOG 里那条「网关 200 + 坏 body 并入重试」是不可达代码(复审还发现 ParseError 压根不在可重试集合里)。
根因是既有约定「网络层不测」。现在用传输层打桩补上了。
🔴 更重要:我们推翻了自己的一条主张
曾把「注入上下文让 glm 变差」写成反直觉发现、跨两期复现。审核员独立指认其中大半是缺陷:
| 修复 | 该差值 |
|---|---|
| 初版 | −2.06 |
| 修掉判定器 4 条误报(定语从句被当成「死者活动」) | −0.92 |
再修掉 2 条被 max_tokens 截断的残章(146 字 / 563 字) |
−0.18(k=1 噪声内) |
改成能站住的说法:裸写最弱的模型从上下文工程里受益最大(豆包 +5.51、deepseek +2.62),裸写最强的 glm 几乎不敏感。
口径缺陷会伪装成模型差异。
其余修复
截断章当完整章 · 续跑只信 manifest 自报 · 门禁配对未套剔除规则 · 校准的「零误报」是空测(补三项对照:中性注入 / 正对照 / 可测性标注)· 不变量分类并逐条补阴性对照 · 榜单补绝对违反数 · 复现协议的分支名与报表路径 · CI 覆盖 MCP SDK 版 · generated_at 被重判刷新。
流程上
quorum verify抓了它主人一回:初版处置台账 12 行里 8 行的断言当时就通过——回滚修复照样绿。已全部改成「今天必红、修完才绿」- 审核员本身被权限白名单卡住(三家全判 FAILED),导致最强的一类发现(可执行验证)没拿到。第二轮会放行本地只读脚本
仍然没做(诚实清单)
真实长篇上的误报率未测(需正确账本)· 时间线倒退与物品双持有在合成宇宙无正例 · 知识边界的语义判定未实装 · k=1,精确归因需 k≥3。
Full Changelog: v0.4.1...v0.4.2
v0.4.1 · 发布后审计修复
v0.4.1 · 发布后审计修复
v0.4.0 发布后做了一轮三方审计:代码正确性审查、文档数字对账(270 项)、仓库卫生(泄露/产物/CI)。这个版本是审计结果。
跑批数字未变——修的是统计口径与文档,不是判定结论。
修复:三处会静默出错的报表缺陷
| 缺陷 | 形态 | 后果 |
|---|---|---|
| 门禁贡献漏统计 | not [...].get("post_fix") ——空列表为假 |
门禁擦得最干净的运行(修后零违反)被当「无数据」跳过 |
| 残缺 run 冒充零违反 | 判决文件缺失时兜底成空清单 | 该运行以「0 违反」身份上榜,且续跑永不修复 |
| 部分完成混入汇总 | 按「本批最大完成度」剔除 | 全体同样残缺时全员入选,与脚注「不参与汇总」自相矛盾 |
还有两处:榜单把按量模型的计费显示成 0.0(读起来是「免费」),以及榜单生成器有实现有单测却从没被调用过(--write 的报表此前不含榜单)。
修复:判定器
- 行首引号吞掉整行旁白:
“这是我的。”我蹲进凹陷。曾整行漏判(POV / 人称 / 状态判定同病)。改为剥离引文后继续判定。判据版本m0.2.0→m0.3.0 - 网关返回 200 但 body 不可解析时,并入退避重试
实测后决定不修(写明边界)
- 比喻/传闻词(像 / 仿佛 / 听说)会整句豁免「死人活动」判据,会漏掉「老周走过来,像往常一样…」这类真复活。试过收窄:db-lite 一章新增 4 条误报(全是比喻框与定语从句),真阳性 0 条——误报 4 : 真阳性 0,收窄不划算。边界写进判据文档,交给后续的 Kappa 校准
- 相对天数只豁免「第二天」这一惯用式,「第三天」按绝对天数比对(中文叙事里它通常就是故事第 3 天)
工程
- CI 此前只跑 4 个旧套件——徽章绿不绿与 LCB 是否可用无关。现在 LCB 的 10 个套件全部纳入
- 修掉两处假测试(断言恒真:用了一个不会被判据命中的句子做夹具,以及一条查的是本次根本没跑的档位目录)
- 文档对账 270 项,9 处不一致全修(含一处表格错格、章节标题与正文矛盾、误报归属批次错、README 与同段表格口径不符)
自己验
git clone https://github.com/wanqili857-byte/fictionforge.git && cd fictionforge
python3 tests/test_report_metrics.py # 73 项,含本次三处报表缺陷的回归
python3 tests/test_mechanical.py # 45 项Full Changelog: v0.4.0...v0.4.1
v0.4.0 · LCB 长程一致性基准
v0.4.0 · LCB 长程一致性基准
写长篇最难的不是文笔,是一致性:第 2 章死的人第 4 章又活了、第 5 章才该知道的事第 3 章就说了出来。这是 agent 的长程状态追踪问题——和记忆、上下文腐坏同一类。LCB(Long-horizon Consistency Bench)把框架里的一致性判定器抽出来,做成可自动判定的基准。
全链内容
- 判定器(
bench/judges/,m0.2.0):约束遵守(禁词/篇幅/POV/人称)+ 状态一致(死人复活/物品瞬移/时间倒流/双持有)。纯函数、零 LLM、零网络,可精确单测 - 合成宇宙(
bench/universe/):seed → 一部可跑的小说包,零 LLM、逐字节可复现,不变量自检含阴性对照 - 跑批(
bench/runner/):模型 × 三档 harness(裸/注入/满)× k 次;逐章用量账本、断点续跑(残缺 run 不冒充完成)、瞬态错误退避重试、per-spec 超时 - 指标(
bench/report/):密度与绝对数成对、分族统计、门禁配对测量、自助法 CI、静态榜单 - 抗刷分(
bench/attacks/):注水/复制/术语轰炸三攻击自测 + 滑窗重复率判据 - 复现协议:
docs/BENCH_PROTOCOL.md——宇宙 sha256 校准表、manifest 校验清单、榜单准入规则 - MCP server(
bench/mcpserver/+scripts/lcb_mcp.py):手写协议层 + 官方 SDK 双实现,五个工具
首期结果(3 厂商 × 3 档 × 6 章)
| 模型 | bare | mid | full(修后) |
|---|---|---|---|
| glm-5.3-flash | 2.52 | 4.58 | 0.0 |
| deepseek-v4.1-flash | 4.28 | 1.66 | 0.74 |
| doubao-seed-2-1-lite | 8.33 | 4.93 | 0.0 |
(核心违反/万字。裸写 glm 最强;上下文注入对 glm 家族负贡献且跨两期复现;门禁配对测量修前 9 → 修后 1。详见 docs/lcb-results-v2.md,方法文 docs/lcb-writeup.md。)
自己跑一遍(全离线零 token)
git clone https://github.com/wanqili857-byte/fictionforge.git
cd fictionforge
python3 tests/test_universe.py && python3 tests/test_mechanical.pyFull Changelog: v0.3.0...v0.4.0
修订感知管线——AI 草稿 + 人工修订 + 修订回灌
定位:从「日更流水线」转「精品生产线」——框架把人工修订变成一等公民
核心件
- canon/drafts 分家 —— AI 草稿落
chapters/drafts/(+.ai.md 快照),人工定稿晋升为 canon,生成管线永不覆盖你改过的字;章节顺序锁改读 canon - promote.py —— diff(定稿, AI 原稿) → LLM 逐条标注修订原因(AI味/节奏/素材/逻辑/结构/润色/弃用)→ canon 晋升 + 修订记录 + 状态重提取 + canon 前门禁(anti-AI/verve 复查)
- distill.py —— 修订记录蒸馏素材库:只存人改后的好句(例对>规则句),配额新进旧出,注入 system prompt——prompt 不膨胀,越用越懂作者
- M4 局部重生成 ——
gen.py --resection <节id>:目标节重写、其余节复用(字节级保留),草稿被人改过时守卫拦截 - spec-canon 漂移注记 —— 情节级差异自动回流:promote 提「逻辑/结构」差异 → 下一章生成注入「上章修订要点(作者定稿为准)」
- docs/DESIGN.md —— 五层两循环 + 五铁律(canon 唯一真源 / 例对>规则句 / 给内容>锁语法 / 知识边界 / 配额经济)
实证
试点章节实测:AI 草稿 4839 字 → 人工修订 3979 字(砍掉「头顶监视器」式逐帧动作描写 18%);M4 真自测:未重写节字节级保持 ✅;回归测试 92/92 ✅
背景
网文平台已明牌治理「脱离人工精修」的批量 AI 生成内容。这套管线把「人工精修」做成框架的结构件:你改的每个字,都是下一章的教材。
v0.2.0 — 认知反转引擎 (Cognitive Reversal Engine)
认知反转引擎
核心新层:Theory of Mind (ToM) — 角色持有的知识 ≠ 世界真相,引擎用作者维护的真相表推导信息差 (info_gaps),让角色错误认知成为 A/B 型反转素材,而不是全知叙述。
新增
framework/theory_of_mind.py— 真相表解析、知识同步、跨角色 ToM、A 型反转检测、info_gaps 渲染。真相表不进生成 prompt 全文,只注入推导结果,避免泄谜底framework/chapter_coordinator.py— 顶层章节协调器,gen/engine/hybrid 三路分发,依赖可注入、确定性 tick 便于测试scripts/run_chapter.py— CLI:run_chapter.py novels/<n> --chapter N [--mode ...]novels/静默轨道/bible/真相表.md— 示例真相表 T-01..T-06(含 false 假信念行)- 测试:
test_theory_of_mind30 例 +test_chapter_coordinator12 例,已接入 CI
改动
gen.py抽取run_generation()供协调器复用agent_base/tick_runner/vault_sync/narrator— 认知持久化(beliefs/knowledge/tom)novel_config.py—get_pipeline_mode配置分层:cli > arc > chapter > default > gen- 文档:ARCHITECTURE / VERSION_PLAN / AGENTS.md(替代 CLAUDE.md)
验证
ToM 30/30 · coordinator 12/12 · engine_core 24/24 · split_scenes 5/5
v0.1.1 — 框架可用性优化
定位:第二版 · 框架可用性优化
- 📦 外挂内容包(Option B) — spec 用
novel_dir指向外部包,换小说的第二种姿势:外部包也能跑,框架依然一行不改 - 🎯
divergence_vibe接线 — 每节注入「发散方向」,normal/expanded 两处 prompt 都读。角色内心方向不再是死字段 - ⚙️ CI 基建 — 双测试套件(引擎 + 生成管线)全入库,去 pip cache
- 📖 README — quickstart 修正
完整:框架与小说解耦 + 双管线(弧级引擎 / 章节级生成)+ 质量门禁。历史见 v0.1.0。
v0.1.0 — FictionForge 第一版
FictionForge v0.1 —— 多智能体小说写作框架首个发布。
这个版本有什么
- 多 agent 引擎:角色各自带记忆/信念/视角,并行感知世界、独立决策
- 叙事合成:多视角事件线 → 结构化章节 spec,标注反转落点
- 生成管线 + 质量门禁:禁词/AI腔/比喻密度/感官温度体检,不过关自动返工
- 框架/内容包解耦:换小说只改内容包,引擎零改动
- 参考示例《静默轨道》(科幻),全流程适配实证
快速开始
pip install requests
# key 放 ~/.env:OPENROUTER_API_KEY 或 DEEPSEEK_API_KEY
python server/gen_proxy.py
python scripts/gen.py novels/静默轨道/specs/ch1.jsonMIT License。文档与适配示例持续完善中。