Jeong-jin-Han/NodeGraph
GitHub: Jeong-jin-Han/NodeGraph
一款 VS Code 扩展,利用 AI agent 将学术论文 PDF 自动转化为可验证的知识图谱,每个论断均可溯源至原文。
Stars: 28 | Forks: 2
利用 AI 将研究论文转化为可验证的知识图谱。
将 AI agent(Claude Code、Codex、Cursor、Antigravity)指向一个 PDF,它就会阅读论文并自行构建整个图谱,将每个论断链接回其出处原文。更愿意自己动手构建?创建一个空白的 `.nodegraph.json` 文件,手动使用同样互动的画布,完全无需 agent。不要盲信 AI 摘要。一键针对原始论文验证每一个论断。
## 快速一览
An agent reading a paper it had never seen before and building the full nodegraph end to end, sped up — see Benchmark below for the real numbers
**只需四个步骤即可完成:** 1. 从 VS Code Marketplace 安装 **NodeGraph** 2. 右键点击你的论文所在文件夹,并运行 `NodeGraph: Copy Agent Spec to Workspace` 3. 将生成的 `.prompt/english.md`(或 `korean.md`)粘贴到你的 agent 中,并填入 PDF 的路径 4. 打开生成的 `.nodegraph.json` 文件 ## 适用场景 - **真正理解一篇论文**,而不是走马观花,通过将论证过程还原为其所收敛自的发散思想 - **没有幻觉风险的 AI 辅助笔记**,因为每一个论断都可以追溯到确切的来源引文 - **充满公式和表格的论文**,其他笔记工具会搞乱表格内的 LaTeX,而本工具不会 - **在 VS Code 之外分享笔记**,因为每个图谱都可以导出为一个独立的 HTML 文件,无需安装扩展 ## 动机 写论文意味着首先**发散**(探索分支、死胡同、替代框架),然后将其**收敛**成一个干净、线性的叙述。真正剖析一篇论文,理解*为什么*做出了这个选择而不是另一个,意味着反向执行这个过程:将收敛后的文本重新拆解回它所源自的发散思想。这天然就应该是**一个节点图,而不是线性文档**。这也正是最初采用这种思维导图形式的原因。 现有工具并不能完全胜任。Obsidian 风格的 Markdown 笔记非常适合关联想法,但 **LaTeX 无法在表格中渲染**,这对于那些对比表格中充满符号的论文来说是个真正的阻碍。NodeGraph 将这些工具的优势融合到一个单独的节点中:GFM 表格、LaTeX(通过 KaTeX 渲染)和内联图片都可以在同一张卡片中一起渲染。 它还围绕**使用 agent 而非鼠标操作**而设计。在阅读时手动放置每个节点非常繁琐,足以打断思维的连贯性。相反,将 agent 指向内置的 `.agent/NODEGRAPH_SPEC.md` 文件,它就能(基于你当前向它提出的问题)决定新想法应归属于图谱的哪个位置,并自行在那里写入节点,因此与 agent 的对话可以直接转化为结构,而不必停下来手动归档每个笔记。 由 agent 代写笔记会引发一个显而易见的担忧:幻觉。这正是 **Original 标签**存在的意义所在。每个论断都可以承载其所依据的确切源文本引文,点击它即可直接跳转到源 PDF 并高亮匹配的句子,这样你就可以**一键针对论文验证 agent 的论断**,而不是盲目信任它。 既然你并不总是希望在 VS Code 中重温自己的笔记,因此每个图谱都可以**导出为一个独立的 HTML 文件**。在任何浏览器中打开它,无需安装扩展。 ## 截图
Editor and exported HTML side by side — same layout, same content
Debug grid and Ctrl+F search
hop-level/main-topic-cluster boundaries, plus in-canvas search with matching nodes highlighted, in both the editor and the export
PDF quote-jump
right-click an original-text quote to open the source PDF and highlight the matching sentence (red box/arrow added for illustration)
完整控制参考(画布、节点、工具栏、搜索)
### 画布 | 操作 | 控制 | |--------|---------| | 平移画布 | 在背景上左键拖拽 | | 取消选择 / 关闭搜索 | 在背景上左键点击 | | 缩放 (0.05×–8×) | 滚轮 — 以光标为中心 | | 框选节点和图片 | 在背景上右键拖拽 | | 选择节点 | 左键点击节点上的任意位置 | | 添加到选区 | `Shift`/`Ctrl`+点击 | | **拖拽节点** | **左键拖拽标签徽章**(例如 "Gap / Idea")— 放下后会根据其落点在具有相同父节点、相同侧边的同级节点中重新排序,而不是仅仅将其放置在自由位置;如果是多选,所有选中的节点将一起移动(不进行单个节点放下时的重新排序) | | 固定生成高亮 | 点击标签徽章 — 节点 + 父节点 + 子节点 + 连线变红 | | 清除高亮 / 选区 | `Escape`(点击背景会保持高亮) | | 删除所选内容 | `Delete` 或 `Backspace` — 优先删除画布图片,然后是选中的连线,最后是节点 | | 选择连线 | 左键点击连线(变蓝) | | 绘制边缘 | 从一个端口圆点(悬停时出现)拖拽到另一个节点的主体上,方向不限 — 仅在两个 Main topic 节点之间会变成箭头,其他情况则为普通线条 | ### 节点 | 操作 | 控制 | |--------|---------| | **折叠 / 展开内容** | **点击节点标题** | | **编辑节点标题** | **右键点击节点标题** | | 编辑内容 / 原文 | 点击文本区域 | | **在 PDF 中搜索原文引用** | **右键点击原文引文**(需要 `source.pdf`) | | 添加图片 | 复制一张图片,然后在选中或悬停节点时按 `Ctrl+V` — 作为 `[[IMG:...]]` token 插入;在背景上粘贴会创建一个浮动的画布图片,可以将其拖拽到节点或表格单元格中 | | 添加折叠项 / 原文 / 链接 | 展开节点底部的 `+ Toggle` · `+ Original` · `+ Link` 按钮 | | 调整节点大小 | 拖拽展开节点的右侧 / 底部 / 角落手柄(最小 160×60) | ### 工具栏 工具栏分为两行 — 顶部是编辑控制,下方是视图/图谱导航控制: | 行 | 控制 | 描述 | |-----|---------|-------------| | Edit | Undo / Redo | 历史记录(也可使用 `Ctrl+Z` / `Ctrl+Y` / `Ctrl+Shift+Z`) | | Edit | 模板下拉菜单 + `+ Add Node` | 当恰好选中一个节点时,向其添加所选类型的子节点(自动定位到层级布局中);当未选中或选中多个节点时,在视图中心最近的空白处创建一个无父节点的节点 | | Edit | Delete | 删除所有选中的节点(一旦选中多个节点,会显示实时计数,例如 `Delete (3)`) | | Edit | 类型和字体控制 | 选中节点时显示 — 切换节点的模板;通过输入数字或选择预设来设置字体大小 (8–72) | | View | Collapse / Expand | 折叠/展开选中的子树,未选中任何内容时则应用于所有节点 — 折叠*所有内容*时还会自动执行 Fit View | | View | 节点类型过滤器(位于 Collapse/Expand 旁边) | 当设置为某种类型而非 `None` 时:`Collapse` 会关闭所有内容,`Expand` 仅打开该类型的节点并关闭其余节点 | | View | Fit View | 缩放以适应所有节点 | | View | Grid | 切换布局调试网格(层级垂直线,主要主题集群水平线) | | View | Export HTML | 在 JSON 文件旁写入 `入门指南
1. 运行 **NodeGraph: New Graph** (`Ctrl+Shift+P`) 创建一个 `.nodegraph.json` 文件 — 或者打开一个现有的文件,自定义编辑器会自动打开 2. 通过彩色的标签徽章**拖拽节点**;**点击标题**进行折叠/展开;**右键点击标题**进行重命名 3. 使用工具栏 — **Expand / Collapse / Fit View / Export HTML / Reload / Help** — 以及 **Ctrl+F** 进行搜索 直接从 `.vsix` 安装: ``` code --install-extension packages/nodegraph-完整 JSON schema 示例
``` { "version": "1.0.0", "title": "My Research Graph", "created": "2026-07-06T00:00:00.000Z", "modified": "2026-07-06T00:00:00.000Z", "source": { // optional — omit entirely if there's no source PDF "pdf": "paper.pdf", "authors": "Author et al.", "venue": "NeurIPS 2017", "doi": "arXiv:1706.03762", "pages": 15 }, "nodeTemplates": { "main_topic": { "label": "Main topic", "color": "#4B8BBE", "icon": "file-text", "shape": "sharp" }, "question": { "label": "Question", "color": "#E5A835", "icon": "help-circle", "shape": "rounded" } }, "nodes": [ { "id": "node_001", "template": "main_topic", "title": "Introduction", "content": "Summary text with $\\LaTeX$ and\n[[IMG:figure1.png:500x300]]", "original": { "title": "Optional custom label", "text": "Exact quote from paper.", "location": "§1, p.1" }, "toggleItems": [ // optional — omit if the node has no toggle sections { "id": "toggle_001", "title": "Table 1", "content": "| Col | Val |\n|-----|-----|\n| A | 1 |", "expanded": false } ], "contentExpanded": true, "originalExpanded": false, "childrenExpanded": false, "position": { "x": 0, "y": 0 }, "children": ["node_002"], "links": [], // { type: 'url'|'pdf'|'obsidian'|'internal', target, label }[] "fontSize": 14, // optional — per-node title font size override "nodeWidth": 432, // optional — persisted card width after a manual resize "nodeHeight": 220, // optional — persisted card height after a manual resize "nodeNaturalY": 0 // optional — Y position as last set by dragging; leave this to the editor } ], "edges": [ { "id": "edge_001", "source": "node_001", "target": "node_002", "type": "arrow", "label": "" }, { "id": "edge_002", "source": "node_002", "target": "node_003", "type": "line", "label": "" } ], "viewport": { "x": 0, "y": 0, "zoom": 1 }, "canvasImages": [] // optional — floating images pasted onto the background, not into a node } ```标签:AI 辅助阅读, Homebrew安装, SOC Prime, VS Code 扩展, 多模态安全, 学术研究, 开发工具, 文档解析, 自动化攻击, 防御加固