SIGNAL / llm-wiki-implementation-guide
如何搭建一个 LLM Wiki:从 Karpathy 的 idea 到可运行的知识编译系统
基于一个实际运行的 LLM Wiki 仓库,分享如何从零搭建由 LLM 持续维护的个人知识编译系统:四层架构、规则体系、核心 Workflow 和落地建议。
前言
2026 年 4 月,Andrej Karpathy 发布了一篇名为 LLM Wiki 的 Gist,描述了一种让 LLM 持续维护个人知识库的模式。它的核心主张很简单:不要让 LLM 在每次提问时重新从原始文档检索和拼装答案,而是让它持续维护一个结构化的 wiki——一个会随着新来源和新问题不断演化的编译产物。
这个想法很吸引人,但 Karpathy 的原文是一个 idea file,不是工程文档。从 idea 到可运行系统之间有大量细节需要填充:目录怎么组织、页面类型有哪些、命名规则是什么、workflow 怎么定义、规则怎么约束 LLM 的行为。本文基于一个实际运行的 LLM Wiki 仓库,分享如何从零搭建这样一个系统。
四层架构
Karpathy 原文提出三层:raw sources、wiki、schema。在实际落地中,我把它扩展为四层:
raw/ 原始资料层(只读)
wiki/ 知识编译层(LLM 维护)
output/ 产出层(面向交付)
schema/ 规则与 workflow 层
raw/ 保存采集的原始内容。文章、论文、官方文档、个人笔记、GitHub 仓库的 README——不管来源是什么,进入 raw 后就不再修改。这是事实来源,是后续核对和重新编译的基础。
wiki/ 是 LLM 主动维护的知识编译层。它不保存原文,而是把原始资料加工成可浏览、可链接、可演化的知识结构。这里有来源导读页(单篇资料的提炼)、概念页(跨来源综合)、主题页(领域综述)和索引页(导航)。
output/ 是知识库的"最后一公里"。wiki 中的知识是结构化的、面向机器和深度阅读的;output 则把这些知识转化为面向特定受众的交付物——文章草稿、演讲大纲、技术报告、教程。output 单向消费 wiki,wiki 不反向引用 output。
schema/ 是规则和 workflow 的定义层。它告诉 LLM 目录怎么组织、页面怎么命名、frontmatter 有哪些字段、ingest/query/produce/lint 各自怎么执行。这是让 LLM 从通用聊天机器人变成知识库维护者的关键约束。
项目目录结构
以下是当前实际运行的 wiki 项目的完整目录结构:
wiki/
├── AGENTS.md # 全局约束入口,定义四层模型和 workflow
├── raw/ # 原始资料层
│ ├── article/ # 网页文章
│ │ ├── harness-engineering-is-cybernetics.md
│ │ ├── ai-first-engineering-strategy.md
│ │ └── ...
│ ├── paper/ # 学术论文
│ ├── reference/ # 官方文档、API 文档
│ │ └── openai-prompt-guidance-gpt-5-5.md
│ ├── note/ # 个人笔记
│ │ └── llm-wiki.md # Karpathy 的 LLM Wiki idea
│ ├── repository/ # GitHub 仓库
│ │ └── karpathy-inspired-claude-code-guidelines.md
│ └── assets/ # 二进制附件(PDF、图片)
│ └── <slug>/
├── wiki/ # 知识编译层
│ ├── index.md # 全局导航入口
│ ├── sources/ # 来源导读页
│ │ ├── llm-wiki.md
│ │ ├── harness-engineering-is-cybernetics.md
│ │ └── ...
│ ├── concepts/ # 概念页
│ │ ├── llm-maintained-wiki.md
│ │ ├── harness-engineering.md
│ │ ├── agent-memory.md
│ │ └── ...
│ └── topics/ # 主题
│ ├── knowledge-management/
│ │ ├── index.md # 主题导航
│ │ └── overview.md # 主题综述
│ ├── ai-assisted-software-engineering/
│ │ ├── index.md
│ │ └── overview.md
│ └── ai-models/
│ ├── index.md
│ └── overview.md
├── output/ # 产出层
│ ├── article-draft/ # 文章草稿
│ ├── talk-outline/ # 演讲大纲
│ ├── tutorial/ # 教程
│ ├── newsletter/ # 通讯
│ ├── report/ # 技术报告
│ ├── brief/ # 简报
│ └── assets/ # 产出物附件
└── schema/ # 规则与 workflow 层
├── rules/ # 规则定义
│ ├── index.md # 规则导航和任务映射
│ ├── structure.md # 目录职责和路径规则
│ ├── source-kind.md # 来源类型判定
│ ├── output-kind.md # 产出类型判定
│ ├── frontmatter.md # 元数据契约
│ ├── slug.md # 命名规则
│ ├── governance.md # 治理规则
│ └── obsidian-markdown.md # 写作风格
└── skills/ # Workflow 实现
├── ingest/
│ ├── SKILL.md # ingest 核心逻辑
│ └── references/examples.md
├── query/
│ ├── SKILL.md
│ └── references/examples.md
├── produce/
│ ├── SKILL.md
│ └── references/examples.md
└── lint/
├── SKILL.md
└── references/examples.md
几个关键设计决策:
raw 按来源类型分目录。 article、paper、reference、note、repository 五种类型,每种一个子目录。判定优先级是固定的:GitHub 仓库 → 官方文档 → 学术论文 → 个人笔记 → 其余网页。这消除了分类时的歧义。
wiki 按页面职责分目录。 sources 存单篇来源的导读,concepts 存跨来源综合的概念,topics 存领域综述。每个 topic 有自己的子目录,包含 index.md(导航)和 overview.md(综述)。
schema 分 rules 和 skills。 rules 是稳定的规则定义,不在 workflow 中重复;skills 是 workflow 的具体实现,执行时按需加载对应规则。这避免了规则散落在多处导致的不一致。
AGENTS.md 是唯一入口。 LLM 启动时只需读这一个文件,就知道项目结构、允许的页面类型、workflow 入口和规则加载顺序。它不包含具体规则,只指向 schema/rules/index.md。
规则驱动,而不是 prompt 驱动
Karpathy 原文把 schema 描述为"一个文档"(比如 CLAUDE.md)。在实践中,我发现单一文档很快会变得臃肿且难以维护。更好的做法是把规则拆成独立文件,按职责分离:
schema/rules/
├── structure.md 目录职责和路径规则
├── source-kind.md 来源类型定义和判定优先级
├── output-kind.md 产出类型定义和判定规则
├── frontmatter.md 所有页面的元数据契约
├── slug.md 命名规则
├── governance.md 冲突处理、回写边界、治理规则
└── obsidian-markdown.md 写作风格规范
每个规则文件只负责一个维度。LLM 执行 workflow 时,按任务类型加载对应的规则子集,而不是每次都读完全部规则。这让规则可以独立演化,也让 lint 可以逐条检查。
规则的核心价值是可预测性。没有规则约束的 LLM 会随机决定页面放在哪里、字段叫什么名字、什么时候新建页面什么时候更新已有页面。有了规则,每次 ingest 的行为是确定的:来源类型怎么判定、slug 怎么生成、frontmatter 填什么字段、来源页按什么模板写、概念页和主题页怎么同步更新。
四个核心 Workflow
ingest:采集与编译
ingest 是知识库的输入通道。给 LLM 一个 URL 或本地文件,它会:
- 采集原始内容,判定来源类型(article/paper/reference/note/repository)
- 生成语义化 slug,写入
raw/<source_kind>/<slug>.md - 创建来源导读页
wiki/sources/<slug>.md,提炼核心观点、论证结构、证据和限制条件 - 更新相关的概念页和主题页,把新来源的贡献融入已有综合
- 同步索引页
一次 ingest 通常触及 5-10 个 wiki 页面。我偏好一次处理一个来源,检查 LLM 的提炼是否准确,引导它强调什么、忽略什么。这比批量导入再事后修正更高效。
query:检索与综合
query 基于 wiki 中已编译的知识回答问题。LLM 先读索引定位相关页面,再读具体的概念页、主题页和来源页,最后综合出答案。
关键设计:高价值的 query 结果可以回写到 wiki。一次深入的对比分析、一个新发现的概念关联——这些不应该消失在聊天历史里,而应该成为知识库的一部分。但回写有边界:只允许写入已有的主题页或概念页,不允许创建新的页面类型。
produce:知识转化为交付物
produce 是 output 层的 workflow。它消费 wiki 中的编译知识,按目标受众和格式生成交付物。比如:
- 基于 harness engineering 相关的多篇来源,写一篇面向技术 lead 的实践文章
- 把本周新增的来源整理成 newsletter
- 准备一个 20 分钟的 agentic coding 技术分享大纲
produce 不修改 wiki 或 raw,只读取和转化。如果 wiki 中的知识不足以支撑产出,它会明确告知缺口,建议先 ingest 补充来源。
lint:健康检查
lint 周期性检查知识库的结构健康:命名是否符合规则、frontmatter 是否完整、是否有孤立页面、是否有概念被提及但没有自己的页面、是否有过时的来源计数。它只诊断和建议,不直接修复。
Frontmatter 是知识的骨架
每个 wiki 页面都有 YAML frontmatter,记录类型、关联主题、关联概念、来源计数、创建和更新日期。这不是装饰,而是知识库的结构骨架。
# 来源页
type: source
source_id: llm-wiki
title: "LLM Wiki"
topic: [knowledge-management]
source_kind: note
concepts: [llm-maintained-wiki, retrieval-augmented-generation]
created_date: 2026-04-27
updated_date: 2026-04-27
# 概念页
type: concept
concept: llm-maintained-wiki
topics: [knowledge-management]
aliases: [LLM Wiki, AI-maintained wiki]
source_count: 3
created_date: 2026-04-27
updated_date: 2026-04-30
frontmatter 让 Obsidian 的 Dataview 插件可以动态查询("列出所有 source_count > 3 的概念"),让 lint 可以自动检查一致性("概念页的 source_count 是否与实际引用它的来源页数量匹配"),也让 LLM 在 ingest 时可以快速定位需要更新的页面。
实际效果
这个规模下,wiki/index.md 作为全局导航完全够用,不需要引入向量搜索或 BM25。LLM 读索引 → 定位页面 → 读具体内容的三步检索在 100 个来源以内都能高效工作。
更重要的是知识的复利效应。当我 ingest 第 8 篇关于 harness engineering 的文章时,概念页已经综合了前 7 篇的观点。LLM 不需要从零理解这个概念,而是在已有综合的基础上判断新来源贡献了什么增量——是新的视角、新的证据、还是与已有结论的冲突。这正是 Karpathy 说的"知识被编译一次,然后持续维护"。
工具选择
Obsidian 作为阅读和浏览界面。wikilink 让页面之间的关系可点击,graph view 让知识结构可视化,frontmatter 作为 Properties 可以被 Dataview 查询。LLM 写 wiki,人在 Obsidian 里读 wiki——这个分工很自然。
Claude Code 作为 LLM Agent。它可以直接读写本地文件系统,执行 schema 中定义的 workflow,遵守 AGENTS.md 中的全局约束。每次 ingest 就是一次 Claude Code 会话:给它一个 URL,它按规则采集、编译、同步。
Git 作为版本控制。wiki 就是一个 git repo,每次 ingest 一个提交。可以 diff、可以回滚、可以看演化历史。这比任何数据库方案都简单。
落地建议
如果你想从零开始搭建自己的 LLM Wiki,以下是我的建议:
从小开始。 不要一开始就设计完美的规则体系。先 ingest 3-5 篇你真正关心的文章,让 LLM 帮你建立最初的来源页和概念页。在这个过程中你会发现哪些规则是必要的(命名规则、frontmatter 字段),哪些可以后加。
规则要具体。 "保持一致性"不是规则,"所有日期字段使用 YYYY-MM-DD"才是规则。LLM 需要明确的、可检查的约束,而不是模糊的原则。
一次一个来源。 批量导入看起来高效,但你会失去对编译质量的控制。一次处理一个来源,检查 LLM 的提炼,纠正偏差,引导强调点。前 10 个来源的质量决定了后续 100 个来源的编译基线。
分离关注点。 raw 只存原文,wiki 只存编译结果,schema 只存规则。不要让 LLM 在 raw 里写摘要,不要让 wiki 页面保存原文,不要把规则散落在各处。
让 LLM 做维护,人做判断。 你负责选择什么值得 ingest、提出什么问题、判断编译质量是否合格。LLM 负责摘要、交叉引用、归档、一致性维护——这些是它擅长且人类容易放弃的工作。
接受不完美。 知识库是持续演化的,不需要一步到位。概念页的综合会随着新来源不断丰富,主题页的结论会随着新证据修正。这正是"持续编译"的意义:知识不是写完就定稿,而是随时间变得更准确、更完整。
从个人到团队
Karpathy 的原文主要面向个人使用。但这个模式可以扩展到团队场景。一个团队的 LLM Wiki 可以被 Slack 消息、会议记录、项目文档、客户反馈持续喂养,由 LLM 维护知识结构,人类审核更新。
团队场景需要额外的治理机制:知识的成熟度分级(draft → verified → proven)、引用追踪(哪些知识被实际使用了)、自动衰减(长期未引用的知识降级)、贡献暂存和异步合并。这些机制让知识库不会变成只进不出的资料堆。
但核心思想不变:让 LLM 做维护,让知识持续编译,让每次交互都为下一次交互积累价值。