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
重复和身份检查(在任何写入之前运行;它防止静默数据丢失):
- 通过内容搜索基本名称确认存在,或使用
test -f "<wiki_root>/papers/{filename}.md"。不要信任单个 glob 返回“未找到文件”:文件 glob 工具曾为存在的笔记返回假阴性,之后盲写的Write会覆盖一个完全传播的笔记。如果Write错误显示“文件尚未读取”,则证明笔记存在:读取它并就地更新,切勿从头重写。 - 如果现有笔记是
status: stub,不要假设它是同一篇论文。 从另一篇论文的引用上下文创建的存根携带临时元数据,有时是不同论文(错误的年份,论文与书籍章节,两篇相关论文混淆)。首先解析真实来源,并对照存根和引用笔记的参考文献列表比较作者、年份和期刊。如果是不同论文,将其导入为新笔记,并保留或改进存根。 - 如果确认为同一篇论文,就地更新;切勿创建重复项。一旦有了全文,文件名可能会合理更改为更具描述性的关键词。如果发生更改,重新链接每个
[[OldName]]并删除孤立的存根,然后重新运行wiki-lint以确认没有损坏的链接。 - 引用键身份保护。 同一篇论文的两个笔记可能带有不同的文件名,因此干净的基本名称探测不能证明身份。一旦参考文献管理器解析了项目,在
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 步中的每个概念:
- 检查
concepts/{Concept_Name}.md是否存在。 - 存在:在“关键发现”下使用带有
[[paper_note]]反向链接的发现追加。如果出现新链接,更新related_concepts。 - 不存在:首先应用
references/CONCEPT-PROPAGATION.md中的创建规则。
7. 传播到方法笔记
对于第 5 步中的每个方法:
- 检查
methods/{Method_Name}.md是否存在。 - 存在:在“使用此方法的论文”下添加该论文。
- 不存在:从
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 的正确部分下添加笔记(概念笔记、方法笔记、论文、书籍)
...
[为翻译截断]