{/* 本页面由 website/scripts/generate-skill-docs.py 从技能 SKILL.md 自动生成。请编辑源 SKILL.md 而非本页面。 */}

LLM Wiki

Karpathy 的 LLM Wiki:构建/查询互链 Markdown 知识库。

技能元数据

来源内置(默认安装)
路径skills/research/llm-wiki
版本2.1.0
作者Hermes Agent
许可证MIT
平台linux, macos, windows
标签wiki, knowledge-base, research, notes, markdown, rag-alternative
相关技能obsidian, arxiv

参考:完整 SKILL.md

:::info 以下是此技能被触发时 Hermes 加载的完整技能定义。这是技能激活时代理所看到的指令。 :::

Karpathy 的 LLM Wiki

构建和维护一个持久、不断累积的知识库,形式为互链的 Markdown 文件。 基于 Andrej Karpathy 的 LLM Wiki 模式

与传统 RAG(每次查询从头重新发现知识)不同,wiki 一次性编译知识并保持其最新。交叉引用已经存在。矛盾已被标记。综合反映了所有已摄入的内容。

分工: 人类策划来源并指导分析。代理负责总结、交叉引用、归档和维护一致性。

激活时机

当用户:

  • 要求创建、构建或启动 wiki 或知识库
  • 要求向 wiki 摄入、添加或处理来源
  • 提出一个问题,且配置路径下存在现有的 wiki
  • 要求对 wiki 进行 lint、审计或健康检查
  • 在研究上下文中引用他们的 wiki、知识库或”笔记”

Wiki 位置

位置: 通过 WIKI_PATH 环境变量设置(例如在 ~/.hermes/.env 中)。

如果未设置,默认为 ~/wiki

WIKI="${WIKI_PATH:-$HOME/wiki}"

wiki 只是一个 Markdown 文件目录——在 Obsidian、VS Code 或任何编辑器中打开。无需数据库,无需特殊工具。

架构:三层

wiki/
├── SCHEMA.md           # 约定、结构规则、领域配置
├── index.md            # 带单行摘要的分节内容目录
├── log.md              # 按时间顺序的操作日志(仅追加,每年轮换)
├── raw/                # 第一层:不可变的源材料
│   ├── articles/       # 网络文章、剪报
│   ├── papers/         # PDF、arxiv 论文
│   ├── transcripts/    # 会议记录、访谈
│   └── assets/         # 来源引用的图片、图表
├── entities/           # 第二层:实体页面(人、组织、产品、模型)
├── concepts/           # 第二层:概念/主题页面
├── comparisons/        # 第二层:并排分析
└── queries/            # 第二层:值得保留的已归档查询结果

第一层——原始来源: 不可变。代理读取但从不修改这些。 第二层——Wiki: 代理拥有的 Markdown 文件。由代理创建、更新和交叉引用。 第三层——Schema: SCHEMA.md 定义结构、约定和标签分类法。

恢复现有 Wiki(关键——每个会话都要做)

当用户有现有 wiki 时,在做任何事情之前始终先定位自己

阅读 SCHEMA.md ——了解领域、约定和标签分类法。 ② 阅读 index.md ——了解存在哪些页面及其摘要。 ③ 扫描最近的 log.md ——阅读最后 20-30 条条目以了解最近的活动。

WIKI="${WIKI_PATH:-$HOME/wiki}"
# 会话开始时的定位读取
read_file "$WIKI/SCHEMA.md"
read_file "$WIKI/index.md"
read_file "$WIKI/log.md" offset=<last 30 lines>

只有在定位后才能进行摄入、查询或 lint。这可以防止:

  • 为已存在的实体创建重复页面
  • 错过对现有内容的交叉引用
  • 违反 schema 的约定
  • 重复已记录的工作

对于大型 wiki(100+ 页面),在创建任何新内容之前,还应对相关主题运行快速的 search_files

初始化新 Wiki

当用户要求创建或启动 wiki 时:

  1. 确定 wiki 路径(来自 $WIKI_PATH 环境变量,或询问用户;默认为 ~/wiki
  2. 创建上述目录结构
  3. 询问用户 wiki 涵盖什么领域——要具体
  4. 编写针对该领域定制的 SCHEMA.md(参见下面的模板)
  5. 编写初始 index.md,包含分节标题
  6. 编写初始 log.md,包含创建条目
  7. 确认 wiki 已就绪,并建议第一个要摄入的来源

SCHEMA.md 模板

根据用户领域进行调整。Schema 约束代理行为并确保一致性:

# Wiki Schema
 
## 领域
[此 wiki 涵盖的内容——例如"AI/ML 研究"、"个人健康"、"创业情报"]
 
## 约定
- 文件名:小写、连字符、无空格(例如 `transformer-architecture.md`
- 每个 wiki 页面以 YAML 前置元数据(frontmatter)开头(见下文)
- 使用 `[[wikilinks]]` 在页面间链接(每页至少 2 个出站链接)
- 更新页面时,始终更新 `updated` 日期
- 每个新页面必须添加到 `index.md` 的正确部分下
- 每个操作必须追加到 `log.md`
- **来源标记:** 在综合 3 个以上来源的页面上,在主张来自特定来源的段落末尾追加 `^[raw/articles/source-file.md]`。这使得读者无需重新阅读整个原始文件即可追溯每个主张。单源页面可选,其中 `sources:` 前置元数据已足够。
 
## 前置元数据(Frontmatter)
  ```yaml
  ---
  title: Page Title
  created: YYYY-MM-DD
  updated: YYYY-MM-DD
  type: entity | concept | comparison | query | summary
  tags: [来自下面的分类法]
  sources: [raw/articles/source-name.md]
  # 可选质量信号:
  confidence: high | medium | low        # 主张的支持程度
  contested: true                        # 当页面存在未解决的矛盾时设置
  contradictions: [other-page-slug]      # 与此页面冲突的页面
  ---

confidencecontested 是可选的,但推荐用于观点强烈或快速变化的话题。Lint 会显示 contested: trueconfidence: low 的页面以供审查,防止弱主张悄然固化为被接受的 wiki 事实。

raw/ 前置元数据

原始来源也获得一个小型前置元数据块,以便重新摄入时可以检测漂移:

---
source_url: https://example.com/article   # 原始 URL(如适用)
ingested: YYYY-MM-DD
sha256: &lt;前置元数据下方原始内容的十六进制摘要>
---

sha256: 允许将来对同一 URL 重新摄入时,在内容未更改时跳过处理,并在内容更改时标记漂移。仅对正文(关闭 --- 之后的所有内容)计算,不计算前置元数据本身。

标签分类法

[为领域定义 10-20 个顶级标签。使用它们之前先在此处添加新标签。]

AI/ML 示例:

  • 模型:model、architecture、benchmark、training
  • 人/组织:person、company、lab、open-source
  • 技术:optimization、fine-tuning、inference、alignment、data
  • 元:comparison、timeline、controversy、prediction

规则:页面上的每个标签必须出现在此分类法中。如果需要新标签,先在此处添加,然后使用它。这可以防止标签泛滥。

页面阈值

  • 创建页面:当实体/概念出现在 2+ 个来源中,或对于一个来源至关重要时
  • 添加到现有页面:当来源提到了已涵盖的内容时
  • 不要创建页面:对于顺便提及的内容、次要细节或领域外的事物
  • 拆分页面:当页面超过约 200 行时——拆分为子主题并添加交叉链接
  • 归档页面:当内容完全被取代时——移动到 _archive/,从索引中移除

实体页面

每个值得注意的实体一个页面。包括:

  • 概述/是什么
  • 关键事实和日期
  • 与其他实体的关系(wikilinks
  • 来源引用

概念页面

每个概念或主题一个页面。包括:

  • 定义/解释
  • 当前知识状态
  • 未解决的问题或争论
  • 相关概念(wikilinks

比较页面

并排分析。包括:

  • 比较的内容及原因
  • 比较维度(优先采用表格格式)
  • 结论或综合
  • 来源

更新策略

当新信息与现有内容冲突时:

  1. 检查日期——较新的来源通常取代较旧的
  2. 如果确实矛盾,记录两种立场并附上日期和来源
  3. 在前置元数据中标记矛盾:contradictions: [page-name]
  4. 在 lint 报告中标记以供用户审查

### index.md 模板

索引按类型分节。每个条目一行:wikilink + 摘要。

```markdown
# Wiki Index

> 内容目录。每个 wiki 页面列在其类型下,附有单行摘要。
> 先阅读此页面以找到任何查询的相关页面。
> 最后更新:YYYY-MM-DD | 总页数:N

## Entities
<!-- 按字母顺序排列在节内 -->

## Concepts

## Comparisons

## Queries

扩展规则: 当任何部分超过 50 条条目时,按首字母或子领域拆分为子部分。当索引总计超过 200 条条目时,创建 _meta/topic-map.md,按主题对页面进行分组以加快导航。

log.md 模板

# Wiki Log
 
> 所有 wiki 操作的按时间顺序记录。仅追加。
> 格式:`## [YYYY-MM-DD] action | subject`
> 操作:ingest、update、query、lint、create、archive、delete
> 当此文件超过 500 条条目时,轮换:重命名为 log-YYYY.md,开始新文件。
 
## [YYYY-MM-DD] create | Wiki initialized
- Domain: [domain]
- Structure created with SCHEMA.md, index.md, log.md

核心操作

1. 摄入(Ingest)

当用户提供来源(URL、文件、粘贴文本)时,将其集成到 wiki 中:

捕获原始来源:

  • URL → 使用 web_extract 获取 markdown,保存到 raw/articles/
  • PDF → 使用 web_extract(处理 PDF),保存到 raw/papers/
  • 粘贴文本 → 保存到适当的 raw/ 子目录
  • 文件名要有描述性:raw/articles/karpathy-llm-wiki-2026.md
  • 添加原始前置元数据source_urlingested、正文的 sha256)。 对同一 URL 重新摄入时:重新计算 sha256,与存储的值比较——如果相同则跳过,如果不同则标记漂移并更新。这足够廉价,可以在每次重新摄入时执行,并能捕获静默的源更改。

与用户讨论要点——哪些有趣,哪些对领域重要。(在自动化/定时任务上下文中跳过——直接继续。)

检查已有内容——搜索 index.md 并使用 search_files 查找涉及实体/概念的现有页面。这是不断增长的 wiki 与重复堆叠之间的区别。

编写或更新 wiki 页面:

  • 新实体/概念: 仅当它们满足 SCHEMA.md 中的页面阈值(2+ 来源提及,或对一个来源至关重要)时才创建页面
  • 现有页面: 添加新信息、更新事实、更新 updated 日期。当新信息与现有内容矛盾时,遵循更新策略。
  • 交叉引用: 每个新页面或更新页面必须通过 [[wikilinks]] 链接到至少 2 个其他页面。检查现有页面是否反向链接。
  • 标签: 仅使用 SCHEMA.md 分类法中的标签
  • 来源标记: 在综合 3 个以上来源的页面上,将 ^[raw/articles/source.md] 标记追加到其主张可追溯到特定来源的段落。
  • 置信度: 对于观点强烈、快速变化或单一来源的主张,在前置元数据中设置 confidence: mediumlow。除非主张在多个来源中得到良好支持,否则不要标记为 high

更新导航:

  • index.md 的正确部分下按字母顺序添加新页面
  • 更新索引标题中的”总页数”数和”最后更新”日期
  • 追加到 log.md## [YYYY-MM-DD] ingest | Source Title
  • 在日志条目中列出每个创建或更新的文件

报告更改内容——向用户列出每个创建或更新的文件。

单个来源可能触发 5-15 个 wiki 页面的更新。这是正常且期望的——这就是累积效应。

2. 查询(Query)

当用户询问关于 wiki 领域的问题时:

阅读 index.md 以识别相关页面。 ② 对于 100+ 页面的 wiki,还要在所有 .md 文件中 search_files 关键术语——索引本身可能遗漏相关内容。 ③ 使用 read_file 阅读相关页面。 ④ 综合答案,利用已编译的知识。引用你参考的 wiki 页面:“根据 page-apage-b…” ⑤ 将有价值答案归档——如果答案是实质性的比较、深入探讨或新颖的综合,在 queries/comparisons/ 中创建页面。不要归档琐碎的查询——仅归档那些重新推导会很痛苦的内容。 ⑥ 更新 log.md,记录查询内容及是否已归档。

3. Lint

当用户要求对 wiki 进行 lint、健康检查或审计时:

孤立页面: 查找没有来自其他页面的入站 [[wikilinks]] 的页面。

# 使用 execute_code 进行编程式扫描
import os, re
from collections import defaultdict
wiki = "<WIKI_PATH>"
# 扫描 entities/、concepts/、comparisons/、queries/ 中的所有 .md 文件
# 提取所有 [[wikilinks]]——构建入站链接映射
# 零入站链接的页面即为孤立页面

损坏的 wikilinks: 查找指向不存在页面的 [[links]]

索引完整性: 每个 wiki 页面应出现在 index.md 中。将文件系统与索引条目进行比较。

前置元数据验证: 每个 wiki 页面必须具有所有必填字段(title、created、updated、type、tags、sources)。标签必须在分类法中。

过时内容: updated 日期比提及相同实体的最近来源早 90 天以上的页面。

矛盾: 同一话题存在冲突主张的页面。查找共享标签/实体但陈述不同事实的页面。显示所有具有 contested: truecontradictions: 前置元数据的页面以供用户审查。

质量信号: 列出 confidence: low 的页面以及任何仅引用单一来源但未设置置信度字段的页面——这些是需要寻找佐证或将置信度降级为 medium 的候选对象。

来源漂移: 对于 raw/ 中具有 sha256: 前置元数据的每个文件,重新计算哈希值并标记不匹配。不匹配表示原始文件被编辑(不应发生——raw/ 是不可变的)或从已更改的 URL 摄入。不是硬错误,但值得报告。

页面大小: 标记超过 200 行的页面——需要拆分的候选对象。

标签审计: 列出所有使用中的标签,标记不在 SCHEMA.md 分类法中的标签。

日志轮换: 如果 log.md 超过 500 条条目,轮换它。

报告发现,包括特定文件路径和建议的操作,按严重程度分组(损坏链接 > 孤立页面 > 来源漂移 > 矛盾页面 > 过时内容 > 风格问题)。

追加到 log.md: ## [YYYY-MM-DD] lint | N issues found

使用 Wiki

搜索

# 按内容查找页面
search_files "transformer" path="$WIKI" file_glob="*.md"
 
# 按文件名查找页面
search_files "*.md" target="files" path="$WIKI"
 
# 按标签查找页面
search_files "tags:.*alignment" path="$WIKI" file_glob="*.md"
 
# 最近活动
read_file "$WIKI/log.md" offset=<last 20 lines>

批量摄入

同时摄入多个来源时,批量更新:

  1. 先读取所有来源
  2. 跨所有来源识别所有实体和概念
  3. 检查所有实体和概念的现有页面(一次搜索遍历,而非 N 次)
  4. 一次遍历创建/更新页面(避免重复更新)
  5. 最后一次性更新 index.md
  6. 编写涵盖批次的单条日志条目

归档

当内容完全被取代或领域范围改变时:

  1. 如果 _archive/ 目录不存在则创建
  2. 将页面移动到 _archive/,保留其原始路径(例如 _archive/entities/old-page.md
  3. index.md 中移除
  4. 更新链接到它的任何页面——将 wikilink 替换为纯文本 + “(archived)”
  5. 记录归档操作

Obsidian 集成

wiki 目录可直接作为 Obsidian 保管库(vault)使用:

  • [[wikilinks]] 渲染为可点击链接
  • 图谱视图可视化知识网络
  • YAML 前置元数据支持 Dataview 查询
  • raw/assets/ 文件夹保存通过 ![[image.png]] 引用的图片

Obsidian 无头模式(服务器和无头机器)

在没有显示器的机器上,使用 obsidian-headless 替代桌面应用。它通过 Obsidian Sync 同步保管库而无需 GUI——非常适合在服务器上运行、写入 wiki 的代理,而 Obsidian 桌面在另一台设备上读取它。

注意事项

  • 切勿修改 raw/ 中的文件——来源是不可变的。修正应放在 wiki 页面中。
  • 始终先定位——在新会话中执行任何操作之前阅读 SCHEMA + index + 最近的日志。跳过此步骤会导致重复和遗漏交叉引用。
  • 始终更新 index.md 和 log.md——跳过此步骤会使 wiki 退化。这些是导航的支柱。
  • 不要为顺便提及的内容创建页面——遵循 SCHEMA.md 中的页面阈值。一个在脚注中出现一次的名字不值得创建一个实体页面。
  • 不要创建没有交叉引用的页面——孤立的页面是不可见的。每个页面必须链接到至少 2 个其他页面。
  • 前置元数据是必需的——它支持搜索、筛选和过期检测。
  • 标签必须来自分类法——自由格式的标签会退化为噪音。先将新标签添加到 SCHEMA.md,然后再使用它们。
  • 保持页面可扫描——wiki 页面应在 30 秒内可读完。超过 200 行的页面请拆分。将详细分析移至专门的深入页面。
  • 批量更新前先询问——如果一次摄入会影响 10 个以上现有页面,先与用户确认范围。
  • 轮换日志——当 log.md 超过 500 条条目时,将其重命名为 log-YYYY.md 并开始新文件。代理应在 lint 期间检查日志大小。
  • 显式处理矛盾——不要悄悄覆盖。用日期记录两种主张,在前置元数据中标记,并标记以供用户审查。

相关工具

llm-wiki-compiler 是一个 Node.js CLI,它将源编译为概念 wiki,灵感同样来自 Karpathy。它与 Obsidian 兼容,因此想要定时/CLI 驱动的编译管道的用户可以将其指向此技能维护的同一保管库。权衡:它拥有页面生成(取代代理在页面创建上的判断),并针对小型语料库进行了调整。当你需要代理介入的策展时使用此技能;当你想要源目录的批量编译时使用 llmwiki。