Community研究与数据分析github.com

MinorBaek/wiki-ingest

将科学论文导入 Markdown 格式的知识维基(兼容 Obsidian)。创建或更新笔记,并将研究成果传播到概念和方法笔记中,同时进行来源保真度检查。

wiki-ingest 是什么?

wiki-ingest 技能实现了 LLM-wiki 导入模式,专为科学知识库设计。它能将科学论文解析为结构化笔记,不仅创建单独的笔记,还通过传播研究成果到概念和方法笔记中,创建可追溯、累积的知识体系。该技能支持默认导入模式和验证模式:默认模式根据论文全文创建或更新笔记并传播;验证模式则对比现有笔记与原文,报告差异而不修改。它基于文件系统,无需数据库或插件,兼容 Obsidian。技能会通过 `WIKI_SCHEMA.md` 定义知识图谱的标准,包括状态规则(如 `final`、`draft`、`stub`)、研究路线路由和来源保真度检查。支持从参考管理器(如 Zotero MCP)、PubMed、开放获取 XML(PMC)或手动输入等多种来源解析论文。导入过程包括解析来源、检查重复、创建/更新笔记、提取发现、传播到概念和方法笔记、更新索引和日志。其严格的质量控制机制确保每个发现都有对应的原始引用,并记录来源验证。

兼容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/MinorBaek/science-wiki-kit/tree/HEAD/skills/wiki-ingest

Installed? Explore more 研究与数据分析 skills: affaan-m/uspto-database, affaan-m/scholar-evaluation, affaan-m/literature-review · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

wiki-ingest 是做什么的?

对科学知识库实现 LLM-wiki 导入模式。 每篇导入的论文都会创建可追溯的、累积的知识,而不仅仅是孤立的笔记。

在首次导入之前,请阅读工具包中的 docs/GOTCHAS.md(关于导入、综合和 lint 的操作注意事项)。

模式

  • 默认(导入): /wiki-ingest <paper> 创建或更新论文笔记,并传播到概念和方法(默认工作流)。
  • 验证模式: /wiki-ingest verify:<PaperNote> 根据论文全文重新验证现有笔记,并报告差异,而不重新生成或覆盖任何内容(参见 references/VERIFY-DIFF-MODE.md)。除非用户确认每个编辑,否则为只读。

角色和边界

执行:创建或更新论文笔记,传播到概念和方法笔记,更新索引和日志,报告每次更改。

不执行:发明引用,为一次性概念创建概念笔记,或写入数据库。所有写入都通过主机的文件工具(Read/Write/Edit)进行。

文件位置

路径来自 wiki.config.json(存储库根目录、维基根目录、文件夹名称、语言、阈值)。默认值:

<vault_root>/
  <wiki_root>/            # 默认:wiki/
    papers/  concepts/  methods/  books/  fields/  debates/
    WIKI_SCHEMA.md        # frontmatter 合约、命名规则、分类法、导入协议
    index.md  log.md
  templates/              # paper.md, concept.md, method.md, book.md, chapter.md, submoc.md, synthesis.md

下面的 <kit> 表示包含 tools/(seal.py、pmc_tables.py)的 science-wiki-kit 检出目录。其路径是 wiki.config.json 中的 kit_dir 键,由安装程序写入;如果缺失,则当技能从检出目录链接时,位于此技能目录上方两级。

在开始之前始终读取 WIKI_SCHEMA.md。 它定义了此维基的 frontmatter 合约、命名规则和领域分类法。

相关技能

  • wiki-lint:共享 wiki.config.json(用于索引更新的短横线命名到标题命名映射)。每次导入后运行它以验证没有引入偏差。
  • wiki-ingest-book:书籍和章节的配套技能。相同的状态规则和索引路由适用。
  • wiki-synthesize:消费此技能生成的笔记。

初始状态决定(应用于每个新笔记)

有目的地设置 status。不要保留模板默认值。下面的 N 是配置中的 min_distinct_sources_for_final(默认值 2)。

笔记类型条件初始 status
论文摘要 + 至少提取了 2 个有来源的发现read
论文仅 DOI/标题元数据,无全文stub + > [!warning] 存根:待导入。 标注
概念至少 2 个来自 N 个或更多不同来源作品 的有来源发现final
概念至少 2 个有来源的发现,全部来自 单个来源作品draft(单一来源综合)
概念定义 + 1 个有来源的发现draft
概念仅定义,无关键发现stub + > [!warning] 存根:尚无有来源的发现。 标注
方法定义 + N 个或更多不同来源作品 在“使用此方法的论文”下final
方法定义且仅 1 个来源作品draft(单一来源)
方法定义但无来源引用draft
方法只有骨架stub

晋升为 final 需要 N 个不同的来源作品。 “不同”计数独立的论文或书籍:一本书的父笔记及其自身章节笔记(Author_2025 + Author_2025_Ch01 + Author_2025_Ch02)合并为 一个 作品,同一本书的多个章节也是如此。单个丰富的来源(系统评价、教科书章节)可能会创建一个概念并产生几个发现,但笔记保持 draft,直到第二个独立来源支持它。当向 draft 笔记添加发现时,在编辑后计数不同的作品,仅当计数达到 N 时才提升,并在导入报告中记录提升。单一来源的 draft 笔记在正文中包含简短的一行“单一来源综合,摄入第二个来源时请确认”。

默认工作流

1. 读取模式

读取 WIKI_SCHEMA.md。

2. 解析论文来源

按顺序尝试,使用您环境提供的任何方式:

  • 参考文献管理器(支持 Zotero MCP 适配器):搜索,然后元数据,然后全文。序列和搜索注意事项见 references/INGEST-WORKFLOW.md。
  • 出版商 XML 表格(PMC 中的开放获取):如果 DOI 有 PMCID,则可以从 Europe PMC JATS 逐个单元格提取表格,独立于 PDF 文本层:python <kit>/tools/pmc_tables.py <DOI> --out _temp/<stem>_pmc.md --body(退出码 2 表示无 PMCID)。在打开页面图像前对照 JATS 检查表格编号;在 JATS 与 PDF 不一致的情况下,打印的 PDF 胜出,并记录差异。无 PMCID:使用 PDF。
  • PubMed MCP(论文不在参考文献管理器中):按关键词搜索,然后通过 PMID 获取(DOI 可能返回空的 full_text)。将 PMID 存储在论文笔记的 notes: 字段中。仅用于生物医学论文,并在用户确认论文不在其库中后使用。
  • 仅 DOI:记录它;不要编造元数据。
  • 网络文章(开放获取 HTML/URL):首先使用网络转 Markdown 工具(例如 defuddle 技能)转换为干净的 Markdown,然后将输出视为摘要和正文。当没有 DOI 时,使用 URL 作为引用来源。
  • 手动:用户粘贴摘要或文本。提取元数据并标记未知内容。

PDF 所在位置很重要:笔记绝不能引用将被清理的工作文件夹(Downloads/、临时目录)。在编写笔记之前,将 PDF 整理到您团队使用的库位置,并在 source_verification 中记录。如果论文不在库中,或者正确的集合不明确,请在移动任何内容之前询问用户。

3. 确定论文笔记文件名

格式:FirstAuthor_Year_Keyword.md

  • FirstAuthor = 第一作者的姓氏(仅 ASCII,无重音,无空格)
  • Year = 4 位数字
  • Keyword = 1 到 3 个单词的描述符(CamelCase 或下划线,无空格)
  • 示例:Smith_2023_Eccentric_Training.md

重复和身份检查(在任何写入之前运行;它防止静默数据丢失):

  1. 通过内容搜索基本名称确认存在,或使用 test -f "<wiki_root>/papers/{filename}.md"。不要信任单个 glob 返回“未找到文件”:文件 glob 工具曾为存在的笔记返回假阴性,之后盲写的 Write 会覆盖一个完全传播的笔记。如果 Write 错误显示“文件尚未读取”,则证明笔记存在:读取它并就地更新,切勿从头重写。
  2. 如果现有笔记是 status: stub,不要假设它是同一篇论文。 从另一篇论文的引用上下文创建的存根携带临时元数据,有时是不同论文(错误的年份,论文与书籍章节,两篇相关论文混淆)。首先解析真实来源,并对照存根和引用笔记的参考文献列表比较作者、年份和期刊。如果是不同论文,将其导入为新笔记,并保留或改进存根。
  3. 如果确认为同一篇论文,就地更新;切勿创建重复项。一旦有了全文,文件名可能会合理更改为更具描述性的关键词。如果发生更改,重新链接每个 [[OldName]] 并删除孤立的存根,然后重新运行 wiki-lint 以确认没有损坏的链接。
  4. 引用键身份保护。 同一篇论文的两个笔记可能带有不同的文件名,因此干净的基本名称探测不能证明身份。一旦参考文献管理器解析了项目,在 papers/ 中搜索您即将写入的确切引用键(grep -l '^citekey: "\?{citekey}"\?$' papers/*.md)。在另一个文件名上匹配意味着该论文已导入:更新该笔记。精确字符串匹配,因此无假阳性。

4. 创建或更新论文笔记

从 templates/paper.md 写入 <wiki_root>/papers/{filename}.md。用已解析的元数据填充每个 frontmatter 字段。将 last_verified 设置为今天的日期(导入是一个验证事件)。从 WIKI_SCHEMA.md 中的分类法 slug 分配 research_lines。

5. 提取和评估

对摘要、结果和讨论进行一次遍历,同时完成以下所有操作:

  • 识别 3 到 8 个领域概念(经验结构、变量)和 1 到 4 个主要方法。启发式方法在 references/INGEST-WORKFLOW.md 中。
  • 分类 evidence_level:研究设计,来自 WIKI_SCHEMA.md 中的受控词汇表(SR-MA、RCT、cohort 等)。这是实时综合层权重的设计轴。测量质量轴在相关时保持在每个发现的内联中((MRI)、(anthropometric estimate)),绝不在 frontmatter 中。
  • 研究路线路由:将论文与 WIKI_SCHEMA.md 中的研究路线进行匹配。如果相关内容没有匹配的路线,则在传播之前向模式添加一个(追加一个 slug + 标签对;切勿重命名或删除现有路线)。如果模棱两可,使用最接近的路线并在报告中标记。
  • 概念与方法路由:经验发现进入 concepts/;统计工具、研究设计和测量协议进入 methods/。在此处决定。
  • 纯方法论快捷方式:如果论文没有经验性声明,跳过第 6 步,直接转到第 7 步。

5b. 证据表,在任何传播之前

对于每个将到达 concepts/ 或 methods/ 中笔记的发现(包括“使用此方法的论文”下的声明),在临时文件中写入一行(绝不在维基中):

| 目标笔记 | 发现,将按原样写入 | 来自来源的逐字引用 | 页面(PDF/印刷版) | 章节、表格或图形 |

  • 来源是 PDF(或表格单元格的 JATS)。仅摘要或无 PDF:在文本中标记发现为 abstract only 并在报告中说明。
  • 每个具体内容都需要其引用:每个图形、人群、设备、机制、命名实体和强度动词。拆分发现,或使用多个引用,直到全部涵盖。
  • 阅读命中点周围的整个段落或表格行,而不仅仅是匹配的数字。
  • 表格、图形、符号、置信区间和 ±:渲染页面并查看它。文本提取是一个假设,图像是证据。某些 PDF 在文本层中丢失减号(-5.2% 提取为 25.2%),产生看似合理的错误数字。
  • 缺乏需要正面搜索,在布局和非布局文本中,并使用拼写变体,然后再将任何内容写为“论文不……”。

5c. 在写入前检查表格

在触及任何笔记之前,对照其引用读取每一行。如果子代理提取了论文,则在 PDF 中重新读取每一行,而不仅仅是带有图形或符号的行。需要判断的缺陷类别:超出来源的推断、归因错误、错误数字、丢失修饰语、无根据的 superlative、错误实体、编造细节、遗漏。

  • 引用不支持的行被缩减为引用所说的内容,或删除。源笔记不是证据:它来自相同的提取。
  • 保留来源的修饰语(“可能”、“似乎”、“可能是由于”)及其人群。
  • 维基自身的阅读被标记为维基的;切勿将其写为来源的行为或结论。

只有通过的行才能进入第 6 步和第 7 步。

6. 传播到概念笔记

对于第 5 步中的每个概念:

  1. 检查 concepts/{Concept_Name}.md 是否存在。
  2. 存在:在“关键发现”下使用带有 [[paper_note]] 反向链接的发现追加。如果出现新链接,更新 related_concepts。
  3. 不存在:首先应用 references/CONCEPT-PROPAGATION.md 中的创建规则。

7. 传播到方法笔记

对于第 5 步中的每个方法:

  1. 检查 methods/{Method_Name}.md 是否存在。
  2. 存在:在“使用此方法的论文”下添加该论文。
  3. 不存在:从 templates/method.md 创建。

8. 更新论文笔记 frontmatter

用创建或更新的概念和方法笔记填充 concepts_touched。

写入后验证:concepts_touched 中的每个名称都必须解析为 concepts/ 或 methods/ 中的现有笔记。写入后,重新检查每个基本名称。如果有一个未解析,则立即创建缺失的存根或删除该名称。悬空引用会变成静默的 lint 偏差。

8b. 密封源笔记

在论文笔记的 source_verification 中记录验证(一行:参考文献管理器键、日期、对照什么检查了什么)。然后密封每个接收发现且其行通过 5c 的(笔记,作品)对:编写一个小的 JSON 规范并运行 python <kit>/tools/seal.py spec.json --dry-run,然后不带 --dry-run 运行(格式和规则见 docs/SEALS.md)。仅对照摘要检查的作品不获得密封。从系统时钟获取日期(date +%F),切勿估算。

9. 收尾

三次编辑,然后是报告。使用 wiki.config.json 中的 field_titlecase_map 为每个新概念或方法找到正确的子部分;切勿追加到章节末尾的带日期通用块。

  • index.md:如果索引嵌入了 Obsidian Bases 视图(配置中的 index_mode: bases),则不要维护每个笔记的列表;只更新策划的 ## Quick Stats 计数和相关的 ## Coverage by Field 行,然后重新读取表格(新鲜维基没有这两个部分:跳过此操作,在您添加它们之前不会偏离)。在 manual 模式下,将笔记添加到正确的字母顺序位置。切勿触碰冻结的旧索引。
  • 子 MOC 路由(参见 WIKI_SCHEMA.md,子 MOC 架构):解析笔记的 field + subfield,计算 fields/{field-slug}/MOC_{Title_Case_Underscore(subfield)}.md(短横线命名转 Title_Case,确定性,无需映射)。如果不存在,从 templates/submoc.md 创建,并向领域 MOC 的子 MOC 索引添加一行。在子 MOC 的正确部分下添加笔记(概念笔记、方法笔记、论文、书籍)

...

[为翻译截断]

Individual skills in this repo

This repo contains 3 individual skills — each has its own dedicated page.

相关技能