你读过的东西,都去哪了
收藏夹里攒了 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” 的差别,更根本。
参考资料