你读过的东西,都去哪了

收藏夹里攒了 300 篇文章。读的时候觉得每一篇都很有用。两周后有人问你"那篇讲 MoE 架构的是什么",你想不起来在哪,甚至想不起来读过。

Notion 里有笔记,散的。问 ChatGPT,它不知道你读过什么。Obsidian 有双链,但维护双链本身就要花时间——你做的其实是在给未来的自己当秘书。

问题不是工具不够多,是工具都在帮你存储,没有一个在帮你综合

4 月 2 日,Andrej Karpathy 在 X 上发了一篇帖子,描述了他正在用的方法:让 LLM 把你丢进来的原始素材编译成一个结构化的 Wiki——有摘要页、有概念页、有交叉链接,LLM 自己维护这个 Wiki 的内部一致性。帖子 16M 阅读量,配套 Gist 几天内超过 5000 星。

下面是把它搭起来的全流程。半小时,一台笔记本,一个 Claude 账号,今天下午就能跑。


一、这套系统到底在做什么

它做的事:你把文章、论文、笔记、网页存进一个 raw/ 目录。每次加入新文件,LLM 读取原文,然后在 wiki/ 目录里生成或更新若干 Markdown 文件——这篇文章的摘要、涉及到的概念页、和其他概念的交叉链接。时间长了,wiki/ 会自然生长成一个有结构的百科库:概念互相链接、矛盾的地方被标记、新信息合并进已有页面而不是另起炉灶。

它不做的事:它不是 RAG——不做向量切块、不等你提问才去捞原文。它在你加入新文章的那一刻就开始工作,而不是等你提问。

Karpathy 说他在单个研究主题上,Wiki 已经自动生长到 100 篇文章、40 万字。他每天打开 Obsidian 浏览图谱视图,看 LLM 过夜之后新建了哪些节点、更新了哪些链接。

系统本身只有三层:

raw/         ← 你的原始素材(只进不改)
wiki/        ← LLM 编译出的结构化知识(持续生长)
CLAUDE.md    ← 告诉 LLM 如何维护这个 Wiki 的规则文件

够简单,但每一层都有讲究。


二、你需要准备什么

一个能读写本地文件的 LLM Agent。最顺手的是 Claude Code(命令行工具,免费/订阅制都可以用),其次是 Cursor 的 Agent 模式。本地部署的 Qwen3-Coder、GLM-4.7-Flash 接上 Cline 也能跑,但在概念识别和交叉链接的质量上,目前还是云端旗舰模型更稳。

Obsidian(可选但强烈推荐)。wiki/ 目录本身就是标准 Markdown + Wiki 链接格式,用 Obsidian 打开就能看图谱、点链接跳转。没有 Obsidian 的话 VS Code 也能读,但少了图谱视图,体验差一截。

一个你正在研究的主题。不要一上来就试图把所有素材都放进来。选一个你这两周在读的方向——新模型评测、某个哲学流派、某段历史、某个行业赛道——先跑通这一个主题。


三、搭起目录结构

新建一个文件夹,比如叫 my-wiki,在里面建好这些目录:

my-wiki/
├── raw/               ← 原始素材,只加不改
├── wiki/
│   ├── index.md       ← Wiki 总目录(LLM 维护)
│   ├── sources/       ← 每份原文的摘要页
│   ├── concepts/      ← 每个重要概念的实体页
│   └── queries/       ← 问答归档(可选)
├── logs/
│   └── ingest-log.md  ← 处理记录(LLM 维护)
└── CLAUDE.md          ← 系统规则文件(你来写)

几个约定必须守住:

  • raw/只读区。原始素材要保持原样——不排版、不改错别字、不删无关段落。你永远可能想回去看原文是怎么说的。
  • wiki/LLM 的工作区。可以自由浏览和阅读,但不要手动大幅改动,否则下一次 Lint 时 LLM 会按自己的理解把你的改动覆盖掉。
  • CLAUDE.md整个系统唯一需要你认真写的文件

四、写 CLAUDE.md——系统的大脑

这一步决定 Wiki 的质量上限。CLAUDE.md 要告诉 LLM 四件事:这个 Wiki 研究的是什么、目录结构是什么、每种工作流应该怎么执行、页面应该长什么样。

下面是一个可以直接复制使用的模板。把第一行的主题替换成自己的研究方向,其他部分先原样跑一遍,跑完再改:

# Wiki 规则:[你的研究主题,比如:AI Agent 架构研究]

## 目录结构

- raw/:原始素材,只读,永远不要修改
- wiki/index.md:所有 wiki 页面的总目录,每次更新后必须同步
- wiki/sources/:每份原文一个页面,文件名用原文标题的 slug
- wiki/concepts/:每个重要概念、人物、工具、方法一个页面
- wiki/queries/:归档的问答,每个问题一个文件
- logs/ingest-log.md:处理记录,每次 ingest 追加一行

## Ingest 工作流

当我说"ingest [文件名]"或"处理新文章"时,执行以下步骤:

1. 读取 raw/ 下的目标文件
2. 如有需要,向我确认这篇文章的重点关注角度
3. 在 wiki/sources/ 创建摘要页(格式见下)
4. 识别文中出现的重要概念、方法、人物、工具
5. 对每个概念:如果 wiki/concepts/ 已有该页面,更新它;否则新建
6. 检查新信息是否与已有 wiki 内容矛盾,如有,在相关页面打 ⚠️ 标记并说明
7. 更新 wiki/index.md,把新建和更新的页面加入目录
8. 在 logs/ingest-log.md 追加一行记录(日期 + 文件名 + 新建/更新了哪些页面)
9. 告诉我处理了什么,新建了几个页面,更新了几个页面

## Query 工作流

当我问问题时,执行以下步骤:

1. 读取 wiki/index.md,找到相关页面
2. 读取相关的 concept 页和 source 页
3. 基于 wiki 内容回答,引用具体页面
4. 询问我是否要把这次问答归档到 wiki/queries/

## Lint 工作流

当我说"lint"或"检查一下 wiki"时,执行以下步骤:

1. 扫描 wiki/concepts/ 下所有页面
2. 找出:孤立页面(没有任何其他页面链接到它)、矛盾标记(⚠️)、空白页面(缺少实质内容)
3. 列出发现的问题和建议的修复方案
4. 逐条询问我是否执行修复

## 页面格式

Source 页面(wiki/sources/文章slug.md):
  # [原文标题]
  来源:[URL 或文件名]
  日期:[发布/处理日期]
  ## 核心要点 / ## 详细摘要 / ## 相关概念

Concept 页面(wiki/concepts/概念名.md):
  # [概念名称]
  ## 定义 / ## 详细说明 / ## 关键属性
  ## 与其他概念的关系(上位/相关/对比)
  ## 来源

这个文件不需要一次写完美。Karpathy 在 Gist 里明确说过:你和 LLM 会共同演化这个规则文件。跑了几十篇文章之后,你会发现哪些分类不对、哪些字段其实没人看——那时候再改。第一版够用就行。

一个实操小技巧:如果你不确定怎么描述自己的研究主题,直接把这个模板丢给 Claude,让它问你几个问题(主题、要研究的问题、关键概念类型),然后帮你生成定制版的 CLAUDE.md。


五、第一次 Ingest:把一篇文章编译进去

素材的三种来源:

  • 网页:装 Obsidian Web Clipper(浏览器插件),一键把网页转成 Markdown 保存到 raw/
  • PDF:直接复制进 raw/,Claude Code 能读 PDF
  • 已有笔记:从别处搬过来就行

第一篇文章放进 raw/ 之后,在终端里:

cd my-wiki
claude
> ingest raw/你的文章文件名.md

Claude Code 会自动读 CLAUDE.md 的规则,然后按 Ingest 工作流走完一整轮:读原文 → 新建摘要页 → 识别概念 → 新建/更新概念页 → 更新索引 → 写入日志。

跑完之后,wiki/concepts/ 里会出现你的第一批概念页,大概长这样:

# 混合专家模型(MoE)

## 定义
一种神经网络架构,通过动态激活部分专家子网络,在大参数总量下实现低推理成本。

## 关键属性
- 总参数 >> 激活参数(GLM-4.7-Flash 总 30B,激活 3B)
- 需要路由网络决定专家选择
- 训练稳定性比稠密模型差

## 与其他概念的关系
- 上位概念:[[神经网络架构]]
- 对比概念:[[稠密 Transformer]]

## 来源
- [[sources/glm-47-flash-release]] — 介绍了 30B/3B 的 MoE 设计
- [[sources/deepseek-moe-paper]] — 路由机制的数学推导

这不是你自己写的。是 LLM 读完两篇文章之后自动生成、归纳、交叉引用的结果。

批量处理:如果你已经攒了一堆文章,不用一篇篇来:

> 批量 ingest raw/ 下所有文件,每处理完一篇告诉我进度。
> 遇到概念冲突时先标记 ⚠️,最后一起报给我。

六、Query:用 Wiki 回答问题

Wiki 里有内容之后就可以开始问:

> Transformer 的注意力机制和 MoE 架构在推理成本上各自的瓶颈是什么?

这和直接问 ChatGPT 的区别在两点:

一是它回答的是你读过的东西,不是它训练数据里的通用知识。你收进来的 10 篇文章,它都认识,能告诉你"这个结论是文章 A 说的,但文章 B 有不同说法,两者的分歧在 X 点上"。

二是每次回答都会加深 Wiki 本身

> 把这次问答存进 wiki/queries/,并更新相关概念页。

LLM 会新建归档文件,同时把回答里产生的新见解反向写回到相关的概念页——每一次提问都在给 Wiki 添加内容,而不是从 Wiki 里单向取出内容。


七、Lint:让 Wiki 自我修复

每加 20 篇左右,跑一次 Lint:

> lint

LLM 会扫描整个 wiki/concepts/ 目录,报告三类问题:

  • 孤立页面:没有任何其他页面链接到它(要么合并到相关概念,要么删掉)
  • 未解决的矛盾:之前打过 ⚠️ 标记但还没处理
  • 稀薄页面:只有定义、没有实质内容

Lint 的价值不只是维护整洁——每跑一次,LLM 都会对整个 Wiki 重新过一遍,经常会发现新的关联:两个看起来无关的概念其实共享同一个底层机制、三篇不同领域的文章其实指向同一个结论。


八、用 Obsidian 浏览你的 Wiki

my-wiki/ 整个作为 Vault 在 Obsidian 里打开。打开图谱视图(Graph View)——文章加到 50 篇左右之后,图谱会明显呈现出结构:中心节点是被反复提到的核心概念,边缘是只出现过一次的小节点。

Karpathy 描述他的工作流:Claude Code 开在左边,Obsidian 开在右边,LLM 在一侧编辑,他在另一侧跟着新增的链接跳转阅读。用他的原话:“Obsidian 是 IDE,LLM 是程序员,Wiki 是代码库。”

这是一种很不一样的阅读体验——你不是在消化知识,是看知识在你面前自己生长。


九、懒人方案:直接用开源实现

  • llmwiki(Web 界面):上传文档,通过 MCP 连接 Claude,自动生成 Wiki。适合不想碰命令行的用户。
  • wiki-skills(Claude Code 原生):把 Ingest/Query/Lint 封装成 skill,在 Claude Code 里直接 /ingest 就能用。
  • claude-obsidian(Obsidian 深度集成):支持 /wiki/save/autoresearch 指令,后者能让 Claude 自动搜索并填充概念空白页。

三者都在快速迭代,选一个试,不合适随时换。raw/ 里的原始素材是你的,换工具不会丢。


从哪里开始

挑一个你这两周在读的主题,放 10 到 20 篇文章,跑完一轮 Ingest,看看生成的 Wiki 里有什么。

第一次跑完,你大概率会发现两件事:有些概念它抓得比你想象的准;有些规则不够用。带着这些发现去改 CLAUDE.md,再跑第二轮。整个流程第一次跑通,半小时。


Karpathy 承认自己的实现还很粗糙——一堆脚本,没有产品化。但这套方法本身的意义在一个更根本的层面:

在此之前,所有知识管理工具都默认一件事——你来整理,工具来存储。 Notion、Obsidian、Logseq、Roam,本质都是在给你提供更好的存储格式。

Karpathy 的方法反转了这个关系:LLM 来整理,你来阅读。你的时间花在读原文和浏览 Wiki 上,不是花在建目录、打标签、维护双链上。

这两者的差别,比 “用不用 AI” 的差别,更根本。


参考资料