Skip to content

Renakoni/graph-every-novel

Repository files navigation

Graph Every Novel logo

Graph Every Novel

release license demo platform python

把长篇小说整理成可解释、可导出、可供图谱前端消费的人物关系图谱。 📚
本地工作区驱动,逐章分析,最终导出 character_graph.json。 🕸️
适合把一本书从原始文本慢慢整理成一张能读、能查、也能展示的人物关系图谱。

在线演示 · 维护入口 · 导出契约 · 配套前端

📚 目录

✨ 项目简介

Graph Every Novel 是一个面向长篇小说分析的本地桌面应用。

它的主链路很明确:导入小说文本,逐章抽取人物、事件、互动与关系线索,在本地持续累计状态,再导出一份适合图谱展示的 character_graph.json。这份导出文件不是单章结果的简单拼接,而是经过名称对齐、状态累计、量化和稳定图筛选之后留下来的最终图状态。

当前系统围绕工作区运行。一本书对应一个工作区,分析快照、SQLite 状态、导出文件和日志都保存在本地,便于持续分析、重复导出和事后排查。

(回到顶部)

🎬 成果展示

以《红楼梦》为例,Graph Every Novel 可以把长篇小说整理成人物关系图谱,并导出供前端消费的图谱结果。

红楼梦人物关系图谱示意

🧩 它能做什么

Graph Every Novel 当前可以:

  • 导入 EPUB、TXT、JAR 小说文件
  • 自动整理章节顺序
  • 调用兼容 OpenAI 接口的大模型完成章节抽取
  • 识别人、事件、互动与关系线索
  • 在本地持续累计人物状态与关系状态
  • 对人物重要度、双人关系支持度和图结构支持度进行量化
  • 导出稳定的人物关系图谱 JSON
  • 通过桌面 UI 完成导入、分析、浏览、导出与排查

如果只看单章,看到的是局部剧情;如果跑完整本书,再经过后续整理,得到的才是更适合展示和阅读的人物关系图谱。

(回到顶部)

🚀 快速开始

1. 启动应用

如果已经下载发布版,直接运行安装版或便携版中的 Graph Every Novel.exe

如果是在源码目录里直接运行,先安装依赖,再启动应用:

pip install -e .
python tools/run_project_ui.py

2. 创建或打开工作区

启动后先创建一个新的工作区,或者打开一个已有工作区。

工作区会保存这本书的章节数据、累计状态、导出文件和日志。后续所有分析都围绕这个目录进行。

3. 配置模型提供方

在应用里填写并保存模型配置。至少需要确认:

  • base URL
  • API Key
  • model

保存后先做一次接口测试,再开始正式分析。

主模型与关系裁决器

应用里的模型配置分成两部分:

  • 主模型:负责章节抽取、人物与关系线索生成
  • 关系裁决器:负责对仍然不稳定的双人共享关系做定点裁决

⚠️ 强烈建议启用关系裁决器。 它能进一步收束一些模糊、冲突或还不够稳定的关系结果,通常比只启用主模型更稳。

推荐模型

模型 适合场景 速度 人物覆盖倾向 说明
gemini-3.1-flash-lite-preview 日常分析、快速试跑、低成本批量处理 很快 中等 默认推荐。速度优先时优先选它。
gemini-3-flash-preview 想在速度和质量之间做更稳一点的平衡 中等偏高 比 lite 更重一些,适合常规整本分析。
doubao-seed-2-0-lite-260215 希望尽可能多保留人物、配角和龙套信息 中等 人物覆盖优先时推荐。适合想尽量少漏人的场景。
gpt-5.4-mini 希望尽可能多保留人物,同时保持较稳的综合表现 中等 适合人物覆盖优先、同时希望结果更稳一些的场景。
  • 速度优先:推荐 gemini-3.1-flash-lite-preview
  • 人物尽可能全:优先 doubao-seed-2-0-lite-260215gpt-5.4-mini
  • 如果不想分开配两套模型,也可以主模型和关系裁决器直接使用同一个模型

成本与耗时参考

以《红楼梦》120 章、约 858,628 个字符为例,使用 gemini-3.1-flash-lite-preview 的一次完整跑书,可粗略参考下面这组数据:

  • 输入 token:3,659,440
  • 输出 token:897,498
  • 总 token:4,556,938
  • 估算成本:约 ¥5.43(按 doubao-seed-2-0-lite-260215 官方 ≤32k 档价格粗算,不计算缓存)
  • 总耗时:约 1 小时 45 分钟
  • 单章耗时区间:约 19 秒2 分 13 秒

这是一组便于估算的参考值。实际费用和耗时会受到单次请求长度、是否进入更高计价档位、是否启用关系裁决器,以及具体跑书策略影响。

参考接入文档

如果你的服务商提供 OpenAI-compatible 接口,也可以直接把对应的 base URLAPI Keymodel 填进应用里使用。

4. 导入小说

当前支持导入:

  • EPUB
  • TXT
  • JAR

导入后,Graph Every Novel 会整理章节顺序,并允许继续检查章节、重命名章节、拆分章节或合并章节。

5. 运行分析

可以按需要:

  • 只分析单章
  • 分析整本书

分析过程中,系统会逐章抽取人物、事件、互动与关系,并把累计状态持续写回工作区。

6. 导出图谱

分析完成后,最重要的导出文件是:

<workspace>/export/character_graph.json

如果还需要做兼容调试或检查更宽的项目导出,也可以查看:

<workspace>/export/project.json

7. 在配套前端中查看

把下面这个文件交给配套图谱前端:

<workspace>/export/character_graph.json

🔗 协议边界

Graph Every Novel 负责什么

Graph Every Novel 负责:

  • 导入小说文本
  • 运行章节分析
  • 维护本地累计状态
  • 量化人物与关系
  • 导出图谱结果
  • 提供日志与诊断入口

配套前端负责什么

配套前端负责:

  • 图谱展示
  • 交互浏览
  • 人物与关系的可视化探索

配套前端仓库: https://github.com/Renakoni/novel-graph-viz

当前主交付边界是什么

当前两边的主交付边界是:

<workspace>/export/character_graph.json

这意味着:

  • Graph Every Novel 要对这份导出的结构和语义负责
  • 配套前端应该消费这份导出,而不是直接依赖工作区内部状态
  • <workspace>/export/project.json 是兼容型项目导出,不是当前图谱前端的主输入

如果后续要调整协议,应该优先从这条边界讨论,而不是先改前端展示再倒推导出语义。

(回到顶部)

🗂️ 工作区结构

一个典型工作区通常会包含这些关键结果:

<workspace>/
  analysis/                       # 章节分析快照
  state/analysis.sqlite          # 本地状态与累计记忆
  export/project.json            # 兼容型项目导出
  export/character_graph.json    # 配套前端直接输入
  logs/                          # 调试与诊断日志

其中最重要的是:

export/character_graph.json

这是当前推荐的图谱导出文件,主要包含:

  • 人物节点
  • 有向关系边
  • 双人关系边
  • 导出增强层的新鲜度状态
  • 稳定图筛选后的最终结果

export/project.json

这是兼容型导出,保留的信息更宽,适合调试、检查或后续协议扩展。

(回到顶部)

🔍 为什么结果不会停在单章抽取

Graph Every Novel 不会把某一章里的一次模型输出原样交给前端。

长篇小说的关系结构天然是累计出来的。人物会反复出现,称呼会变化,关系会推进,某一章里很强的一次互动,放回整本书里未必还是稳定结构。真正需要保留下来的,不是单章瞬时判断,而是跨章节、跨上下文、还能站得住的结果。

所以主链路在章节抽取之后,还会继续做这些事:

  • 对齐名称和别名
  • 把多章信息累计到本地状态
  • 对人物重要度做量化
  • 对双人关系和图结构做支持度计算
  • 在导出前做稳定图筛选

这样导出的结果更适合拿来做整本书视角的人物关系图谱,而不是章节级的临时快照。

(回到顶部)

🛠️ 调试与排查

如果要排查某一章为什么抽取不理想,优先看:

<workspace>/logs/diagnostic/latest_chapter_diagnostic.json

如果要查看完整原始请求与响应,优先看:

<workspace>/logs/ai_raw/
<workspace>/logs/ai_debug.jsonl

如果要做跨会话问题复盘,优先看:

<workspace>/logs/exports/bundles/debug_bundle_<timestamp>.zip

(回到顶部)

🧪 技术栈

Graph Every Novel 当前主要建立在这些组件之上:

  • Python 3.11
  • Flet 桌面 UI
  • SQLite 本地状态存储
  • Pydantic 数据模型与导出 schema
  • NetworkX 图结构计算
  • OpenAI-compatible LLM API

这些技术栈对应的是当前产品形态:本地桌面应用、本地工作区、模型驱动抽取、本地累计状态,以及面向图谱前端的稳定导出。

(回到顶部)

📖 文档入口

如果想继续了解 Graph Every Novel 的链路、量化和导出契约,建议从这些文档开始:

(回到顶部)

⚖️ 许可证

本项目采用 MIT License。

许可证全文见:LICENSE

MIT 是宽松许可证。保留版权声明和许可证文本的前提下,可以复制、修改、分发和商用。

(回到顶部)

🙏 致谢

Graph Every Novel 的量化设计、图结构判断、导出组织和部分工程实现,参考了下列理论工作、开源项目与设计启发。

理论与算法参考

  • 人物重要度:Page, Lawrence; Brin, Sergey; Motwani, Rajeev; Winograd, Terry. The PageRank Citation Ranking: Bringing Order to the Web. 1999.
  • 近期出场分与关系衰减:Ebbinghaus, Hermann. Über das Gedächtnis. 1885;Rutherford, Ernest; Soddy, Frederick. "The Cause and Nature of Radioactivity." 1902.
  • 分数整理:Tukey, John W. Exploratory Data Analysis. 1977.
  • 图结构支持:Jaccard, Paul. 1901;Adamic, Lada A.; Adar, Eytan. 2003;Zhou, Tao; Lü, Linyuan; Zhang, Yi-Cheng. 2009;Barabási, Albert-László; Albert, Réka. 1999.
  • 多证据融合与重排序:Manning, Christopher D.; Raghavan, Prabhakar; Schütze, Hinrich. Introduction to Information Retrieval. 2008.
  • 双向不对称关系建模启发:IEEE Xplore Document 11195182。

Prompt 设计参考

开源项目与工程参考

  • Flet:桌面 UI 框架与应用壳层。
  • Pydantic:导出 schema、结构校验与数据模型。
  • NetworkX:图结构计算与关系网络处理。
  • SQLite:本地状态存储。

设计启发

(回到顶部)

About

A local-first engine that turns long-form novels into explainable character graphs for visualization.

Topics

Resources

License

Stars

Watchers

Forks

Contributors